first commit
This commit is contained in:
@@ -0,0 +1,139 @@
|
||||
/**
|
||||
* 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));
|
||||
Reference in New Issue
Block a user