139 lines
2.8 KiB
JavaScript
139 lines
2.8 KiB
JavaScript
/**
|
|
* SheetClip - Spreadsheet Clipboard Parser
|
|
* version 0.3
|
|
*
|
|
* This tiny library transforms JavaScript arrays to strings that are pasteable by LibreOffice, OpenOffice,
|
|
* Google Docs and Microsoft Excel.
|
|
*
|
|
* Copyright 2012, Marcin Warpechowski
|
|
* Licensed under the MIT license.
|
|
* http://github.com/warpech/sheetclip/
|
|
*/
|
|
/*jslint white: true*/
|
|
(function (scope)
|
|
{
|
|
"use strict";
|
|
|
|
// Class Definition
|
|
function SheetClip ()
|
|
{
|
|
|
|
}
|
|
|
|
SheetClip.prototype = Object.create(Object.prototype,
|
|
{
|
|
parse:
|
|
{
|
|
value: function (str)
|
|
{
|
|
var r, rlen, rows, arr = [], a = 0, c, clen, multiline, last;
|
|
rows = str.split('\n');
|
|
|
|
if (rows.length > 1 && rows[rows.length - 1] === '')
|
|
rows.pop();
|
|
|
|
for (r = 0, rlen = rows.length; r < rlen; r += 1)
|
|
{
|
|
rows[r] = rows[r].split('\t');
|
|
|
|
for (c = 0, clen = rows[r].length; c < clen; c += 1)
|
|
{
|
|
if (!arr[a])
|
|
arr[a] = [];
|
|
|
|
if (multiline && c === 0)
|
|
{
|
|
last = arr[a].length - 1;
|
|
arr[a][last] = arr[a][last] + '\n' + rows[r][0];
|
|
|
|
if (multiline && (countQuotes(rows[r][0]) & 1))
|
|
{ //& 1 is a bitwise way of performing mod 2
|
|
multiline = false;
|
|
arr[a][last] = arr[a][last].substring(0, arr[a][last].length - 1).replace(/""/g, '"');
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (c === clen - 1 && rows[r][c].indexOf('"') === 0 && (countQuotes(rows[r][c]) & 1))
|
|
{
|
|
arr[a].push(rows[r][c].substring(1).replace(/""/g, '"'));
|
|
multiline = true;
|
|
}
|
|
else
|
|
{
|
|
arr[a].push(rows[r][c].replace(/""/g, '"'));
|
|
multiline = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!multiline)
|
|
a += 1;
|
|
}
|
|
|
|
return arr;
|
|
},
|
|
enumerable: true,
|
|
configurable: false,
|
|
writable: false
|
|
},
|
|
|
|
stringify:
|
|
{
|
|
value: function (arr)
|
|
{
|
|
var r, rlen, c, clen, str = '', val;
|
|
|
|
for (r = 0, rlen = arr.length; r < rlen; r += 1)
|
|
{
|
|
for (c = 0, clen = arr[r].length; c < clen; c += 1)
|
|
{
|
|
if (c > 0)
|
|
str += '\t';
|
|
|
|
val = arr[r][c];
|
|
|
|
if (typeof val === 'string')
|
|
{
|
|
if (val.indexOf('\n') > -1)
|
|
{
|
|
str += '"' + val.replace(/"/g, '""') + '"';
|
|
}
|
|
else
|
|
{
|
|
str += val;
|
|
}
|
|
}
|
|
else
|
|
if (val === null || val === void 0)
|
|
{ //void 0 resolves to undefined
|
|
str += '';
|
|
}
|
|
else
|
|
{
|
|
str += val;
|
|
}
|
|
}
|
|
|
|
str += '\n';
|
|
}
|
|
return str;
|
|
},
|
|
enumerable: true,
|
|
configurable: false,
|
|
writable: false
|
|
}
|
|
});
|
|
|
|
// Private Static Functions
|
|
function countQuotes(str)
|
|
{
|
|
return str.split('"').length - 1;
|
|
}
|
|
|
|
if (typeof module !== "undefined" && module.exports)
|
|
module.exports = SheetClip;
|
|
else
|
|
scope.SheetClip = SheetClip;
|
|
|
|
}(this)); |