155 lines
3.3 KiB
JavaScript
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++;
|
||
|
}
|
||
|
}
|
||
|
}
|