core-jgi/fitnesse/FitNesseRoot/files/javascript/SpreadsheetTranslator.js

155 lines
3.3 KiB
JavaScript

// Copyright (C) 2004 by Alain Bienvenue. All rights reserved.
// Released under the terms of the GNU General Public License version 2 or later.
function SpreadsheetTranslator()
{
this.currentLine;
this.rows;
this.fitNesseTables;
this.isImplicitTableStart = function(index)
{
if (this.rows[index][0].match("^[A-Za-z][0-9A-Za-z]*\\.[A-Za-z][0-9A-Za-z]*"))
{
return true;
}
var i;
for (i = index; i < this.rows.length; i++)
{
if ((this.rows[i][0] == '!') || this.lineSize(this.rows[i]) == 0)
{
return false;
}
if (this.lineSize(this.rows[i]) > 1)
{
return true;
}
}
return false;
}
this.isExplicitTableStart = function(rows, index)
{
return (rows[index][0] == "!");
}
this.isNotTableLine = function(currentLine, columnsToSkip)
{
var row = this.rows[currentLine];
if (this.lineSize(row) == 0)
{
return true;
}
var i;
for (i = 0; i < columnsToSkip; i++)
{
if (row[i] != '')
{
return true;
}
}
return false;
}
this.lineSize = function(row)
{
var x;
for (x = row.length - 1; x >= 0; x--)
{
if (row[x] != '') return x + 1;
}
return 0;
}
this.parseExcelTable = function(excelTable)
{
var table = this.removeCarriageReturns(excelTable);
var lines = table.split("\n");
this.rows = new Array;
for (i = 0; i < lines.length; i++)
{
this.rows[i] = lines[i].split("\t");
}
}
this.removeCarriageReturns = function(str)
{
return str.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
}
this.getFitNesseTables = function()
{
this.currentLine = 0;
this.fitNesseTables = new String();
while (this.currentLine < this.rows.length)
{
if (this.isExplicitTableStart(this.rows, this.currentLine))
{
this.processTable(1);
}
else if (this.isImplicitTableStart(this.currentLine))
{
if (this.rows[this.currentLine][0] == '')
{
this.processTable(1);
}
else
{
this.processTable(0);
}
}
else
{
this.fitNesseTables += "\n" + this.rows[this.currentLine][0];
}
this.currentLine++;
}
return this.fitNesseTables.substring(1);
}
this.processTable = function(columnsToSkip)
{
var tableFirstLine = this.currentLine;
var tableSize;
while (this.currentLine < this.rows.length)
{
var row = this.rows[this.currentLine];
if (this.currentLine > tableFirstLine && this.isNotTableLine(this.currentLine, columnsToSkip))
{
this.currentLine--;
return;
}
this.fitNesseTables += "\n";
var lineSize = 0;
if (this.currentLine == tableFirstLine)
{
this.fitNesseTables += "!";
lineSize = this.lineSize(row);
}
else if (this.currentLine == tableFirstLine + 1)
{
lineSize = this.lineSize(row);
tableSize = lineSize;
}
else
{
lineSize = Math.max(tableSize, this.lineSize(row));
lineSize = Math.min(lineSize, row.length);
}
this.fitNesseTables += "|";
var j;
for (j = columnsToSkip; j < lineSize; j++)
{
this.fitNesseTables += row[j] + "|";
}
this.currentLine++;
}
}
}