New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

xlsjs

Package Overview
Dependencies
Maintainers
1
Versions
39
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

xlsjs - npm Package Compare versions

Comparing version 0.6.20 to 0.6.21

.jscs.json

2

bits/01_version.js

@@ -1,1 +0,1 @@

XLS.version = '0.6.20';
XLS.version = '0.6.21';

@@ -7,3 +7,3 @@ function new_buf(len) {

function readIEEE754(buf, idx, isLE, nl, ml) {
if(typeof isLE === 'undefined') isLE = true;
if(isLE === undefined) isLE = true;
if(!nl) nl = 8;

@@ -182,8 +182,10 @@ if(!ml && nl === 8) ml = 52;

function prep_blob(blob, pos) {
blob.read_shift = ReadShift.bind(blob);
blob.l = pos || 0;
//var read = ReadShift.bind(blob), chk = CheckField.bind(blob);
//blob.read_shift = read;
//blob.chk = chk;
blob.read_shift = ReadShift;
blob.chk = CheckField;
blob.l = pos || 0;
var read = ReadShift.bind(blob), chk = CheckField.bind(blob);
return [read, chk];
//return [read, chk];
}

@@ -8,3 +8,3 @@ /* ssf.js (C) 2013-2014 SheetJS -- http://sheetjs.com */

function rpad(v,d,c){var t=String(v);return t.length>=d?t:(t+fill(c||0,d-t.length));}
SSF.version = '0.7.0';
SSF.version = '0.7.1';
/* Options */

@@ -256,3 +256,6 @@ var opts_fmt = {

if(fmt.match(/^00+$/)) return (val<0?"-":"")+pad(Math.round(aval),fmt.length);
if(fmt.match(/^[#?]+$/)) return String(Math.round(val)).replace(/^0$/,"");
if(fmt.match(/^[#?]+$/)) {
o = String(Math.round(val)).replace(/^0$/,"");
return o.length > fmt.length ? o : fmt.substr(0,fmt.length-o.length).replace(/#/g,"").replace(/[?]/g," ") + o;
}
if((r = fmt.match(/^#*0*\.(0+)/))) {

@@ -283,8 +286,20 @@ o = Math.round(val * Math.pow(10,r[1].length));

}
if((r = fmt.match(/^([?]+)([ ]?)\/([ ]?)([?]+)/))) {
rr = Math.min(Math.max(r[1].length, r[4].length),7);
var oa = "";
if((r = fmt.match(/^([#0?]+)([ ]?)\/([ ]?)([#0?]+)/))) {
o="";
rr = Math.min(r[4].length,7);
ff = frac(aval, Math.pow(10,rr)-1, false);
return sign + (ff[0]||(ff[1] ? "" : "0")) + (ff[1] ? pad(ff[1],rr," ") + r[2] + "/" + r[3] + rpad(ff[2],rr," "): fill(" ", 2*rr+1 + r[2].length + r[3].length));
o += sign;
oa = write_num("n", r[1], ff[1]);
if(oa[oa.length-1] == " ") oa = oa.substr(0,oa.length-1) + "0";
o += oa;
o += r[2];
o += "/";
o += r[3];
oa = rpad(ff[2],rr," ");
if(oa.length < r[4].length) oa = r[4].substr(r[4].length-oa.length).replace(/[?]/g," ").replace(/#/g,"") + oa;
o += oa;
return o;
}
if((r = fmt.match(/^# ([?]+)([ ]?)\/([ ]?)([?]+)/))) {
if((r = fmt.match(/^# ([#0?]+)([ ]?)\/([ ]?)([#0?]+)/))) {
rr = Math.min(Math.max(r[1].length, r[4].length),7);

@@ -294,6 +309,6 @@ ff = frac(aval, Math.pow(10,rr)-1, true);

}
if((r = fmt.match(/^[#0]+$/))) {
if((r = fmt.match(/^[#0?]+$/))) {
o = "" + Math.round(val);
if(fmt.length <= o.length) return o;
return fmt.substr(0,fmt.length - o.length).replace(/#/g,"") + o;
return fmt.substr(0,fmt.length-o.length).replace(/#/g,"").replace(/\?/g," ") + o;
}

@@ -514,3 +529,5 @@ if((r = fmt.match(/^([#0]+)\.([#0]+)$/))) {

}
return out.map(function(x){return x.v;}).join("");
var retval = "";
for(i=0; i != out.length; ++i) if(out[i]) retval += out[i].v;
return retval;
}

@@ -517,0 +534,0 @@ SSF._eval = eval_fmt;

@@ -5,4 +5,3 @@ /* [MS-DTYP] 2.3.3 FILETIME */

function parse_FILETIME(blob) {
var read = ReadShift.bind(blob), chk = CheckField.bind(blob);
var dwLowDateTime = read(4), dwHighDateTime = read(4);
var dwLowDateTime = blob.read_shift(4), dwHighDateTime = blob.read_shift(4);
return new Date(((dwHighDateTime/1e7*Math.pow(2,32) + dwLowDateTime/1e7) - 11644473600)*1000).toISOString().replace(/\.000/,"");

@@ -13,4 +12,3 @@ }

function parse_lpstr(blob, type, pad) {
var read = ReadShift.bind(blob), chk = CheckField.bind(blob);
var str = read('lpstr');
var str = blob.read_shift('lpstr');
if(pad) blob.l += (4 - ((str.length+1) % 4)) % 4;

@@ -22,4 +20,3 @@ return str;

function parse_lpwstr(blob, type, pad) {
var read = ReadShift.bind(blob), chk = CheckField.bind(blob);
var str = read('lpwstr');
var str = blob.read_shift('lpwstr');
if(pad) blob.l += (4 - ((str.length+1) % 4)) % 4;

@@ -46,6 +43,5 @@ return str;

function parse_VtVecUnalignedLpstrValue(blob) {
var read = ReadShift.bind(blob), chk = CheckField.bind(blob);
var length = read(4);
var length = blob.read_shift(4);
var ret = [];
for(var i = 0; i != length; ++i) ret[i] = read('lpstr');
for(var i = 0; i != length; ++i) ret[i] = blob.read_shift('lpstr');
return ret;

@@ -82,3 +78,3 @@ }

function parse_dictionary(blob,CodePage) {
var read = ReadShift.bind(blob), chk = CheckField.bind(blob);
var read = ReadShift.bind(blob);
var cnt = read(4);

@@ -126,3 +122,3 @@ var dict = {};

function parse_TypedPropertyValue(blob, type, _opts) {
var read = ReadShift.bind(blob), chk = CheckField.bind(blob);
var read = ReadShift.bind(blob);
var t = read(2), ret, opts = _opts||{};

@@ -164,3 +160,3 @@ read(2);

var start_addr = blob.l;
var read = ReadShift.bind(blob), chk = CheckField.bind(blob);
var read = ReadShift.bind(blob);
var size = read(4);

@@ -167,0 +163,0 @@ var NumProps = read(4);

@@ -147,9 +147,10 @@ /* [MS-CFB] v20130118 */

var chkd = new Array(sectors.length), sector_list = [];
var get_sector = function get_sector(k) { return sectors[k]; };
var buf_chain = [];
for(i=0; i != sectors.length; ++i) {
var buf = [], k = (i + dir_start) % sectors.length;
buf_chain = [];
if(chkd[k]) continue;
for(j=k; j<=MAXREGSECT; buf.push(j),j=get_next_sector(j)) chkd[j] = true;
for(j=k; j<=MAXREGSECT; buf.push(j),buf_chain.push(sectors[j]),j=get_next_sector(j)) chkd[j] = true;
sector_list[k] = {nodes: buf};
sector_list[k].data = __toBuffer(Array(buf.map(get_sector)));
sector_list[k].data = __toBuffer(Array(buf_chain));
}

@@ -156,0 +157,0 @@ sector_list[dir_start].name = "!Directory";

@@ -24,3 +24,3 @@

function parseuint16(blob, length) { return blob.read_shift(2, 'u'); }
function parseuint16(blob) { return blob.read_shift(2, 'u'); }
function parseuint16a(blob, length) { return parslurp(blob,length,parseuint16);}

@@ -41,8 +41,7 @@

function parse_ShortXLUnicodeString(blob) {
var read = blob.read_shift.bind(blob);
var cch = read(1);
var fHighByte = read(1);
var cch = blob.read_shift(1);
var fHighByte = blob.read_shift(1);
var retval;
var width = 1 + (fHighByte === 0 ? 0 : 1), encoding = fHighByte ? 'dbcs' : 'sbcs';
retval = cch ? read(encoding, cch) : "";
retval = cch ? blob.read_shift(encoding, cch) : "";
return retval;

@@ -53,4 +52,3 @@ }

function parse_XLUnicodeRichExtendedString(blob) {
var read_shift = blob.read_shift.bind(blob);
var cch = read_shift(2), flags = read_shift(1);
var cch = blob.read_shift(2), flags = blob.read_shift(1);
var fHighByte = flags & 0x1, fExtSt = flags & 0x4, fRichSt = flags & 0x8;

@@ -60,6 +58,6 @@ var width = 1 + (flags & 0x1); // 0x0 -> utf8, 0x1 -> dbcs

var z = {};
if(fRichSt) cRun = read_shift(2);
if(fExtSt) cbExtRst = read_shift(4);
if(fRichSt) cRun = blob.read_shift(2);
if(fExtSt) cbExtRst = blob.read_shift(4);
var encoding = (flags & 0x1) ? 'dbcs' : 'sbcs';
var msg = cch === 0 ? "" : read_shift(encoding, cch);
var msg = cch === 0 ? "" : blob.read_shift(encoding, cch);
if(fRichSt) blob.l += 4 * cRun; //TODO: parse this

@@ -74,4 +72,3 @@ if(fExtSt) blob.l += cbExtRst; //TODO: parse this

function parse_XLUnicodeStringNoCch(blob, cch) {
var read = blob.read_shift.bind(blob);
var fHighByte = read(1);
var fHighByte = blob.read_shift(1);
var retval;

@@ -91,3 +88,3 @@ if(fHighByte===0) { retval = __utf8(blob,blob.l, blob.l+cch); blob.l += cch; }

/* 2.5.342 Xnum */
function parse_Xnum(blob, length) { return blob.read_shift('ieee754'); }
function parse_Xnum(blob) { return blob.read_shift('ieee754'); }

@@ -94,0 +91,0 @@ /* 2.5.61 ControlInfo */

@@ -14,1 +14,2 @@ function isval(x) { return typeof x !== "undefined" && x !== null; }

}

@@ -13,6 +13,5 @@

function parse_frtHeader(blob) {
var read = blob.read_shift.bind(blob);
var rt = read(2);
var flags = read(2); // TODO: parse these flags
read(8);
var rt = blob.read_shift(2);
var flags = blob.read_shift(2); // TODO: parse these flags
blob.l += 8;
return {type: rt, flags: flags};

@@ -31,4 +30,3 @@ }

function parse_XTI(blob, length) {
var read = blob.read_shift.bind(blob);
var iSupBook = read(2), itabFirst = read(2,'i'), itabLast = read(2,'i');
var iSupBook = blob.read_shift(2), itabFirst = blob.read_shift(2,'i'), itabLast = blob.read_shift(2,'i');
return [iSupBook, itabFirst, itabLast];

@@ -184,6 +182,5 @@ }

function parse_BoundSheet8(blob, length) {
var read = blob.read_shift.bind(blob);
var pos = read(4);
var hidden = read(1) >> 6;
var dt = read(1);
var pos = blob.read_shift(4);
var hidden = blob.read_shift(1) >> 6;
var dt = blob.read_shift(1);
switch(dt) {

@@ -201,5 +198,4 @@ case 0: dt = 'Worksheet'; break;

function parse_SST(blob, length) {
var read = blob.read_shift.bind(blob);
var cnt = read(4);
var ucnt = read(4);
var cnt = blob.read_shift(4);
var ucnt = blob.read_shift(4);
var strs = [];

@@ -215,6 +211,5 @@ for(var i = 0; i != ucnt; ++i) {

function parse_ExtSST(blob, length) {
var read = blob.read_shift.bind(blob);
var extsst = {};
extsst.dsst = read(2);
blob.read_shift(length-2);
extsst.dsst = blob.read_shift(2);
blob.l += length-2;
return extsst;

@@ -226,8 +221,7 @@ }

function parse_Row(blob, length) {
var read = blob.read_shift.bind(blob);
var rw = read(2), col = read(2), Col = read(2), rht = read(2);
read(4); // reserved(2), unused(2)
var flags = read(1); // various flags
read(1); // reserved
read(2); //ixfe, other flags
var rw = blob.read_shift(2), col = blob.read_shift(2), Col = blob.read_shift(2), rht = blob.read_shift(2);
blob.read_shift(4); // reserved(2), unused(2)
var flags = blob.read_shift(1); // various flags
blob.read_shift(1); // reserved
blob.read_shift(2); //ixfe, other flags
return {r:rw, c:col, cnt:Col-col};

@@ -337,5 +331,4 @@ }

function parse_XF(blob, length) {
var read = blob.read_shift.bind(blob);
var o = {};
o.ifnt = read(2); o.ifmt = read(2); o.flags = read(2);
o.ifnt = blob.read_shift(2); o.ifmt = blob.read_shift(2); o.flags = blob.read_shift(2);
o.fStyle = (o.flags >> 2) & 0x01;

@@ -342,0 +335,0 @@ length -= 6;

var _chr = function(c) { return String.fromCharCode(c); };
var attregexg=/(\w+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g;
var attregex=/(\w+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/;
function parsexmltag(tag) {
var attregexg=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g;
var attregex=/([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/;
function parsexmltag(tag, skip_root) {
var words = tag.split(/\s+/);
var z = {'0': words[0]};
var z = []; if(!skip_root) z[0] = words[0];
if(words.length === 1) return z;
(tag.match(attregexg) || []).map(
function(x){var y=x.match(attregex); z[y[1]] = unescapexml(y[2].substr(1,y[2].length-2)); });
var m = tag.match(attregexg), y, j, w, i;
if(m) for(i = 0; i != m.length; ++i) {
y = m[i].match(attregex);
if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].substr(1,y[2].length-2);
else {
if(y[1].substr(0,6) === "xmlns:") w = "xmlns"+y[1].substr(6);
else w = y[1].substr(j+1);
z[w] = y[2].substr(1,y[2].length-2);
}
}
return z;

@@ -11,0 +19,0 @@ }

@@ -41,16 +41,13 @@ /* [MS-OLEDS] 2.3.8 CompObjStream */

function slurp(R, blob, length, opts) {
var read = blob.read_shift.bind(blob);
var l = length;
var bufs = [];
var d = blob.slice(blob.l,blob.l+l);
if(opts.enc && opts.enc.insitu_decrypt) {
switch(R.n) {
case 'BOF': case 'FilePass': case 'FileLock': case 'InterfaceHdr': case 'RRDInfo': case 'RRDHead': case 'UsrExcl': break;
default:
if(d.length === 0) break;
opts.enc.insitu_decrypt(d);
}
if(opts.enc && opts.enc.insitu_decrypt) switch(R.n) {
case 'BOF': case 'FilePass': case 'FileLock': case 'InterfaceHdr': case 'RRDInfo': case 'RRDHead': case 'UsrExcl': break;
default:
if(d.length === 0) break;
opts.enc.insitu_decrypt(d);
}
bufs.push(d);
blob.l += length;
blob.l += l;
var next = (RecordEnum[__readUInt16LE(blob,blob.l)]);

@@ -70,2 +67,13 @@ while(next && next.n === 'Continue') {

function safe_format_xf(cell, options) {
if(cell.XF) try {
cell.w=SSF.format(cell.XF.ifmt||0, cell.v);
if(options.cellNF) cell.z = SSF._table[cell.XF.ifmt||0];
} catch(e) { if(options.WTF) throw e; }
}
function make_cell(val, ixfe, t) {
return {v:val, ixfe:ixfe, t:t};
}
// 2.3.2

@@ -75,5 +83,4 @@ function parse_workbook(blob, options) {

var Sheets = {};
var out = [];
var out = {};
var read = blob.read_shift.bind(blob);
var lst = [], seen = {};
var Directory = {};

@@ -92,12 +99,17 @@ var found_sheet = false;

var XFs = []; /* XF records */
function addline(cell, line, options) {
var addline = function(cell, line, options) {
if(!cell_valid) return;
lastcell = cell;
last_cell = encode_cell(cell);
if(range.s && cell.r < range.s.r) range.s.r = cell.r;
if(range.s && cell.c < range.s.c) range.s.c = cell.c;
if(range.e && cell.r > range.e.r) range.e.r = cell.r;
if(range.e && cell.c > range.e.c) range.e.c = cell.c;
if(range.s) {
if(cell.r < range.s.r) range.s.r = cell.r;
if(cell.c < range.s.c) range.s.c = cell.c;
}
if(range.e) {
if(cell.r > range.e.r) range.e.r = cell.r;
if(cell.c > range.e.c) range.e.c = cell.c;
}
if(options.sheetRows && lastcell.r >= options.sheetRows) cell_valid = false;
else out[last_cell] = line;
}
};
var opts = {

@@ -182,3 +194,3 @@ enc: false, // encrypted

case 'WsBool': break; // TODO
/*
case 'Header': break; // TODO

@@ -218,5 +230,5 @@ case 'Footer': break; // TODO

case 'Fbi': case 'Fbi2': case 'GelFrame': break;
case 'Font': break; // TODO
case 'Font': break; // TODO */
case 'XF': XFs.push(val); break;
case 'XFCRC': break; // TODO
/* case 'XFCRC': break; // TODO
case 'XFExt': break; // TODO

@@ -233,18 +245,18 @@ case 'Style': break; // TODO

case 'BkHim': break;
*/
/* Protection */
case 'ScenarioProtect': break;
case 'ObjProtect': break;
/* case 'ScenarioProtect': break;
case 'ObjProtect': break; */
/* Conditional Formatting */
case 'CondFmt12': break;
/* case 'CondFmt12': break; */
/* Table */
case 'Table': break; // TODO
/* case 'Table': break; // TODO
case 'TableStyles': break; // TODO
case 'TableStyle': break; // TODO
case 'TableStyleElement': break; // TODO
*/
/* PivotTable */
case 'SXStreamID': break; // TODO
/* case 'SXStreamID': break; // TODO
case 'SXVS': break; // TODO

@@ -261,22 +273,22 @@ case 'DConRef': break; // TODO

case 'SxDXF': break; // TODO
*/
/* Scenario Manager */
case 'ScenMan': break;
// case 'ScenMan': break;
/* Data Consolidation */
case 'DCon': break;
// case 'DCon': break;
/* Watched Cell */
case 'CellWatch': break;
// case 'CellWatch': break;
/* Print Settings */
case 'PrintRowCol': break;
/* case 'PrintRowCol': break;
case 'PrintGrid': break;
case 'PrintSize': break;
*/
case 'SupBook': supbooks[++sbc] = [val]; sbci = 0; break;
case 'ExternName': supbooks[sbc][++sbci] = val; break;
case 'XCT': break;
/* case 'XCT': break;
case 'CRN': break;
*/
case 'Index': break; // TODO

@@ -296,3 +308,2 @@ case 'Lbl': supbooks[0][++sbcli] = val; break;

if(--file_depth) break;
var nout = {};
if(range.e) {

@@ -308,4 +319,4 @@ out["!range"] = range;

}
for(y in out) if(out.hasOwnProperty(y)) nout[y] = out[y];
if(cur_sheet === "") Preamble = nout; else Sheets[cur_sheet] = nout;
if(cur_sheet === "") Preamble = out; else Sheets[cur_sheet] = out;
out = {};
} break;

@@ -317,3 +328,2 @@ case 'BOF': {

cur_sheet = (Directory[s] || {name:""}).name;
lst.push([R.n, s, val, Directory[s]]);
mergecells = [];

@@ -324,6 +334,3 @@ objects = [];

temp_val = {ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.val, t:'n'};
if(temp_val.XF) try {
temp_val.w=SSF.format(temp_val.XF.ifmt||0, temp_val.v);
if(options.cellNF) temp_val.z = SSF._table[temp_val.XF.ifmt||0];
} catch(e) { if(options.WTF) throw e; }
if(temp_val.XF) safe_format_xf(temp_val, options);
addline({c:val.c, r:val.r}, temp_val, options);

@@ -333,6 +340,3 @@ } break;

temp_val = {ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.val, t:val.t};
if(temp_val.XF) try {
temp_val.w=SSF.format(temp_val.XF.ifmt||0, temp_val.v);
if(options.cellNF) temp_val.z = SSF._table[temp_val.XF.ifmt||0];
} catch(e) { if(options.WTF) throw e; }
if(temp_val.XF) safe_format_xf(temp_val, options);
addline({c:val.c, r:val.r}, temp_val, options);

@@ -342,6 +346,3 @@ } break;

temp_val = {ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.rknum, t:'n'};
if(temp_val.XF) try {
temp_val.w=SSF.format(temp_val.XF.ifmt||0, temp_val.v);
if(options.cellNF) temp_val.z = SSF._table[temp_val.XF.ifmt||0];
} catch(e) { if(options.WTF) throw e; }
if(temp_val.XF) safe_format_xf(temp_val, options);
addline({c:val.c, r:val.r}, temp_val, options);

@@ -353,6 +354,3 @@ } break;

temp_val= {ixfe:ixfe, XF:XFs[ixfe], v:val.rkrec[j-val.c][1], t:'n'};
if(temp_val.XF) try {
temp_val.w=SSF.format(temp_val.XF.ifmt||0, temp_val.v);
if(options.cellNF) temp_val.z = SSF._table[temp_val.XF.ifmt||0];
} catch(e) { if(options.WTF) throw e; }
if(temp_val.XF) safe_format_xf(temp_val, options);
addline({c:j, r:val.r}, temp_val, options);

@@ -369,6 +367,3 @@ }

if(options.cellFormula) temp_val.f = "="+stringify_formula(val.formula,range,val.cell,supbooks);
if(temp_val.XF) try {
temp_val.w=SSF.format(temp_val.XF.ifmt||0, temp_val.v);
if(options.cellNF) temp_val.z = SSF._table[temp_val.XF.ifmt||0];
} catch(e) { if(options.WTF) throw e; }
if(temp_val.XF) safe_format_xf(temp_val, options);
addline(val.cell, temp_val, options);

@@ -384,6 +379,3 @@ last_formula = val;

if(options.cellFormula) temp_val.f = "="+stringify_formula(last_formula.formula, range, last_formula.cell, supbooks);
if(temp_val.XF) try {
temp_val.w=SSF.format(temp_val.XF.ifmt||0, temp_val.v);
if(options.cellNF) temp_val.z = SSF._table[temp_val.XF.ifmt||0];
} catch(e) { if(options.WTF) throw e; }
if(temp_val.XF) safe_format_xf(temp_val, options);
addline(last_formula.cell, temp_val, options);

@@ -402,20 +394,17 @@ last_formula = null;

} break;
case 'LabelSst': {
temp_val={v:sst[val.isst].t, ixfe:val.ixfe, t:'s'};
case 'LabelSst':
//temp_val={v:sst[val.isst].t, ixfe:val.ixfe, t:'s'};
temp_val=make_cell(sst[val.isst].t, val.ixfe, 's');
temp_val.XF = XFs[temp_val.ixfe];
if(temp_val.XF) try {
temp_val.w=SSF.format(temp_val.XF.ifmt||0, temp_val.v);
if(options.cellNF) temp_val.z = SSF._table[temp_val.XF.ifmt||0];
} catch(e) { if(options.WTF) throw e; }
if(temp_val.XF) safe_format_xf(temp_val, options);
addline({c:val.c, r:val.r}, temp_val, options);
} break;
case 'Label': {
break;
case 'Label':
/* Some writers erroneously write Label */
temp_val = {v:val.val, ixfe:val.ixfe, XF:XFs[val.ixfe], t:'s'};
if(temp_val.XF) try {
temp_val.w=SSF.format(temp_val.XF.ifmt||0, temp_val.v);
if(options.cellNF) temp_val.z = SSF._table[temp_val.XF.ifmt||0];
} catch(e) { if(options.WTF) throw e; }
//temp_val = {v:val.val, ixfe:val.ixfe, XF:XFs[val.ixfe], t:'s'};
temp_val=make_cell(val.val, val.ixfe, 's');
temp_val.XF = XFs[temp_val.ixfe];
if(temp_val.XF) safe_format_xf(temp_val, options);
addline({c:val.c, r:val.r}, temp_val, options);
} break;
break;
case 'Dimensions': {

@@ -430,14 +419,14 @@ if(file_depth === 1) range = val; /* TODO: stack */

} break;
case 'Scl': {
//case 'Scl': {
//console.log("Zoom Level:", val[0]/val[1],val);
} break;
case 'SheetExt': {
//} break;
//case 'SheetExt': {
} break;
case 'SheetExtOptional': {
//} break;
//case 'SheetExtOptional': {
} break;
//} break;
/* VBA */
case 'ObNoMacros': {
/* case 'ObNoMacros': {

@@ -454,3 +443,3 @@ } break;

} break;
*/
case 'MergeCells': mergecells = mergecells.concat(val); break;

@@ -474,25 +463,25 @@

case 'WOpt': break; // TODO: WTF?
/* case 'WOpt': break; // TODO: WTF?
case 'PhoneticInfo': break;
case 'OleObjectSize': break;
*/
/* Differential Formatting */
case 'DXF': case 'DXFN': case 'DXFN12': case 'DXFN12List': case 'DXFN12NoCB': break;
/* case 'DXF': case 'DXFN': case 'DXFN12': case 'DXFN12List': case 'DXFN12NoCB': break;
*/
/* Data Validation */
case 'Dv': case 'DVal': break;
/* case 'Dv': case 'DVal': break;
*/
/* Data Series */
case 'BRAI': case 'Series': case 'SeriesText': break;
/* case 'BRAI': case 'Series': case 'SeriesText': break;
*/
/* Data Connection */
case 'DConn': break;
/* case 'DConn': break;
case 'DbOrParamQry': break;
case 'DBQueryExt': break;
*/
/* Formatting */
case 'IFmtRecord': break;
/* case 'IFmtRecord': break;
case 'CondFmt': case 'CF': case 'CF12': case 'CFEx': break;
*/
/* Comments */

@@ -510,3 +499,3 @@ case 'Note': {

/* Chart */
case 'Dat':
/* case 'Dat':
case 'Begin': case 'End':

@@ -534,11 +523,14 @@ case 'StartBlock': case 'EndBlock':

case 'AttachedLabel': break;
*/
/* Chart Group */
case 'Line': case 'Bar': break;
/* case 'Line': case 'Bar': break;
case 'Surf': break;
*/
/* Axis Group */
case 'AxisParent': break;
/* case 'AxisParent': break;
case 'Pos': break;
case 'ValueRange': break;
*/
/* Pivot Chart */
case 'SXViewEx9': break; // TODO
/* case 'SXViewEx9': break; // TODO
case 'SXViewLink': break;

@@ -548,12 +540,14 @@ case 'PivotChartBits': break;

case 'TextPropsStream': break;
*/
/* Chart Misc */
case 'LnExt': break;
/* case 'LnExt': break;
case 'MkrExt': break;
case 'CrtCoopt': break;
*/
/* Query Table */
case 'Qsi': case 'Qsif': case 'Qsir': case 'QsiSXTag': break;
/* case 'Qsi': case 'Qsif': case 'Qsir': case 'QsiSXTag': break;
case 'TxtQry': break;
*/
/* Filter */
case 'FilterMode': break;
/* case 'FilterMode': break;
case 'AutoFilter': case 'AutoFilterInfo': break;

@@ -564,33 +558,31 @@ case 'AutoFilter12': break;

case 'SortData': break;
*/
/* Drawing */
case 'ShapePropsStream': break;
/* case 'ShapePropsStream': break;
case 'MsoDrawing': case 'MsoDrawingGroup': case 'MsoDrawingSelection': break;
case 'ImData': break;
case 'ImData': break;*/
/* Explicitly Ignored */
case 'Excel9File': break;
/* case 'Excel9File': break;
case 'Units': break;
case 'InterfaceHdr': case 'Mms': case 'InterfaceEnd': case 'DSF': case 'BuiltInFnGroupCount':
case 'InterfaceHdr': case 'Mms': case 'InterfaceEnd': case 'DSF': case 'BuiltInFnGroupCount':*/
/* View Stuff */
case 'Window1': case 'Window2': case 'HideObj': case 'GridSet': case 'Guts':
/* case 'Window1': case 'Window2': case 'HideObj': case 'GridSet': case 'Guts':
case 'UserBView': case 'UserSViewBegin': case 'UserSViewEnd':
case 'Pane':
case 'Pane':*/
/* Pub Stuff */
case 'WebPub': case 'AutoWebPub':
/* case 'WebPub': case 'AutoWebPub':
*/
/* Print Stuff */
case 'RightMargin': case 'LeftMargin': case 'TopMargin': case 'BottomMargin':
/* case 'RightMargin': case 'LeftMargin': case 'TopMargin': case 'BottomMargin':
case 'HeaderFooter': case 'HFPicture': case 'PLV':
case 'HorizontalPageBreaks': case 'VerticalPageBreaks':
case 'HorizontalPageBreaks': case 'VerticalPageBreaks':*/
/* Behavioral */
case 'Backup': case 'CompressPictures': case 'Compat12': break;
/* case 'Backup': case 'CompressPictures': case 'Compat12': break;*/
/* Should not Happen */
case 'Continue': case 'ContinueFrt12': break;
/* case 'Continue': case 'ContinueFrt12': break;*/
default: if(options.WTF) throw 'Unrecognized Record ' + R.n;
}
lst.push([R.n, s, val]);
continue;
}
lst.push(['Unrecognized', Number(RecordType).toString(16), RecordType]);
read(length);
} else read(length);
}

@@ -597,0 +589,0 @@ var sheetnamesraw = Object.keys(Directory).sort(function(a,b) { return Number(a) - Number(b); }).map(function(x){return Directory[x].name;});

// TODO: CP remap (need to read file version to determine OS)
function unescapexml(text){
var s = text + '';
for(var y in encodings) s = s.replace(new RegExp(y,'g'), encodings[y]);
return s.replace(/_x([0-9a-fA-F]*)_/g,function(m,c) {return _chr(parseInt(c,16));});
function unescapexml(s){
if(s.indexOf("&") > -1) s = s.replace(/&[a-z]*;/g, function($$) { return encodings[$$]; });
return s.indexOf("_") === -1 ? s : s.replace(/_x([0-9a-fA-F]*)_/g,function(m,c) {return _chr(parseInt(c,16));});
}
/*
function escapexml(text){
var s = text + '';
rencstr.forEach(function(y){s=s.replace(new RegExp(y,'g'), rencoding[y]);});
return s;
}
*/

@@ -23,21 +15,2 @@ function parsexmlbool(value, tag) {

/*
var utf8read = function(orig) {
var out = [], i = 0, c = 0, c1 = 0, c2 = 0, c3 = 0;
while (i < orig.length) {
c = orig.charCodeAt(i++);
if (c < 128) out.push(_chr(c));
else {
c2 = orig.charCodeAt(i++);
if (c>191 && c<224) out.push(_chr((c & 31) << 6 | c2 & 63));
else {
c3 = orig.charCodeAt(i++);
out.push(_chr((c & 15) << 12 | (c2 & 63) << 6 | c3 & 63));
}
}
}
return out.join("");
};
*/
// matches <foo>...</foo> extracts content

@@ -44,0 +17,0 @@ function matchtag(f,g) {return new RegExp('<'+f+'(?: xml:space="preserve")?>([^\u2603]*)</'+f+'>',(g||"")+"m");}

@@ -45,2 +45,9 @@ var everted_BERR = evert(BERR);

function safe_format_xlml(cell, nf, o) {
try {
cell.w = xlml_format(nf||"General", cell.v);
if(o.cellNF) cell.z = magic_formats[nf]||nf||"General";
} catch(e) { if(o.WTF) throw e; }
}
/* TODO: there must exist some form of OSP-blessed spec */

@@ -77,6 +84,3 @@ function parse_xlml_data(xml, ss, data, cell, base, styles, csty, o) {

}
if(cell.t !== 'e') try {
cell.w = xlml_format(nf||"General", cell.v);
if(o.cellNF) cell.z = magic_formats[nf]||nf||"General";
} catch(e) { if(o.WTF) throw e; }
if(cell.t !== 'e') safe_format_xlml(cell, nf, o);
if(o.cellFormula && cell.Formula) {

@@ -89,13 +93,20 @@ cell.f = rc_to_a1(unescapexml(cell.Formula), base);

function xlml_clean_comment(comment) {
comment.t = comment.v;
delete comment.v; delete comment.w; delete comment.ixfe;
}
function xlml_normalize(d) {
if(typeof Buffer!=='undefined'&&d instanceof Buffer) return d.toString('utf8');
if(typeof d === 'string') return d;
throw "badf";
}
/* TODO: Everything */
function parse_xlml_xml(d, opts) {
var str;
if(typeof Buffer!=='undefined'&&d instanceof Buffer) str = d.toString('utf8');
else if(typeof d === 'string') str = d;
else throw "badf";
var str = xlml_normalize(d);
var re = /<(\/?)([a-z0-9]*:|)([A-Za-z_0-9]+)[^>]*>/mg, Rn;
var state = [], tmp;
var out = {};
var sheets = {}, sheetnames = [], cursheet = {}, sheetname = "";
var table = {}, cell = {}, row = {}, ddata = "", dtag, didx;
var table = {}, cell = {}, row = {}, dtag, didx;
var c = 0, r = 0;

@@ -110,15 +121,14 @@ var refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} };

while((Rn = re.exec(str))) switch(Rn[3]) {
case 'Data': {
case 'Data':
if(state[state.length-1][1]) break;
if(Rn[1]==='/') parse_xlml_data(str.slice(didx, Rn.index), ss, dtag, state[state.length-1][0]=="Comment"?comment:cell, {c:c,r:r}, styles, cstys[c], opts);
else { ss = ""; dtag = parsexmltag(Rn[0]); didx = Rn.index + Rn[0].length; }
} break;
case 'Cell': {
break;
case 'Cell':
if(Rn[1]==='/'){
delete cell[0];
if(comments.length > 0) cell.c = comments;
if((!opts.sheetRows || opts.sheetRows > r) && typeof cell.v !== 'undefined') cursheet[encode_cell({c:c,r:r})] = cell;
if((!opts.sheetRows || opts.sheetRows > r) && typeof cell.v !== 'undefined') cursheet[encode_col(c) + encode_row(r)] = cell;
if(cell.HRef) {
cell.l = {Target:cell.HRef, tooltip:cell.HRefScreenTip};
delete cell.HRef; delete cell.HRefScreenTip;
cell.HRef = cell.HRefScreenTip = undefined;
}

@@ -133,15 +143,15 @@ if(cell.MergeAcross || cell.MergeDown) {

} else {
cell = parsexmltag(Rn[0]);
cell = parsexmltag(Rn[0], true);
if(cell.Index) c = +cell.Index - 1;
if(c < refguess.s.c) refguess.s.c = c;
if(c > refguess.e.c) refguess.e.c = c;
if(Rn[0].match(/\/>$/)) ++c;
if(Rn[0].substr(-2) === "/>") ++c;
comments = [];
}
} break;
case 'Row': {
if(Rn[1]==='/' || Rn[0].match(/\/>$/)) {
break;
case 'Row':
if(Rn[1]==='/' || Rn[0].substr(-2) === "/>") {
if(r < refguess.s.r) refguess.s.r = r;
if(r > refguess.e.r) refguess.e.r = r;
if(Rn[0].match(/\/>$/)) {
if(Rn[0].substr(-2) === "/>") {
row = parsexmltag(Rn[0]);

@@ -155,4 +165,4 @@ if(row.Index) r = +row.Index - 1;

}
} break;
case 'Worksheet': { /* TODO: read range from FullRows/FullColumns */
break;
case 'Worksheet': /* TODO: read range from FullRows/FullColumns */
if(Rn[1]==='/'){

@@ -173,4 +183,4 @@ if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;

}
} break;
case 'Table': {
break;
case 'Table':
if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;}

@@ -183,15 +193,14 @@ else if(Rn[0].slice(-2) == "/>") break;

}
} break;
break;
case 'Style': {
if(Rn[1]==='/') {
styles[stag.ID] = stag;
} else stag = parsexmltag(Rn[0]);
} break;
case 'Style':
if(Rn[1]==='/') styles[stag.ID] = stag;
else stag = parsexmltag(Rn[0]);
break;
case 'NumberFormat': {
case 'NumberFormat':
stag.nf = parsexmltag(Rn[0]).Format || "General";
} break;
break;
case 'Column': {
case 'Column':
if(state[state.length-1][0] !== 'Table') break;

@@ -201,3 +210,3 @@ csty = parsexmltag(Rn[0]);

for(var i = 0; i < +csty.Span; ++i) cstys[cstys.length] = csty;
} break;
break;

@@ -216,7 +225,7 @@ case 'NamedRange': break;

case 'Borders': break;
case 'Font': {
if(Rn[0].match(/\/>$/)) break;
case 'Font':
if(Rn[0].substr(-2) === "/>") break;
else if(Rn[1]==="/") ss += str.slice(fidx, Rn.index);
else fidx = Rn.index + Rn[0].length;
} break;
break;
case 'Interior': break;

@@ -240,11 +249,11 @@ case 'Protection': break;

case 'HyperlinkBase':
case 'Manager': {
if(Rn[0].match(/\/>$/)) break;
case 'Manager':
if(Rn[0].substr(-2) === "/>") break;
else if(Rn[1]==="/") xlml_set_prop(Props, Rn[3], str.slice(pidx, Rn.index));
else pidx = Rn.index + Rn[0].length;
} break;
break;
case 'Paragraphs': break;
/* OfficeDocumentSettings */
case 'AllowPNG': break;
/* case 'AllowPNG': break;
case 'RemovePersonalInformation': break;

@@ -259,6 +268,6 @@ case 'DownloadComponents': break;

case 'TargetScreenSize': break;
case 'ReadOnlyRecommended': break;
case 'ReadOnlyRecommended': break; */
/* ComponentOptions */
case 'Toolbar': break;
/* case 'Toolbar': break;
case 'HideOfficeLogo': break;

@@ -270,6 +279,6 @@ case 'SpreadsheetAutoFit': break;

case 'MaxWidth': break;
case 'NextSheetNumber': break;
case 'NextSheetNumber': break; */
/* ExcelWorkbook */
case 'WindowHeight': break;
/* case 'WindowHeight': break;
case 'WindowWidth': break;

@@ -314,11 +323,11 @@ case 'WindowTopX': break;

case 'NoAutoRecover': break;
case 'PublishObjects': break;
case 'PublishObjects': break; */
/* WorkbookOptions */
case 'OWCVersion': break;
/* case 'OWCVersion': break;
case 'Height': break;
case 'Width': break;
case 'Width': break; */
/* WorksheetOptions */
case 'Unsynced': break;
/* case 'Unsynced': break;
case 'Visible': break;

@@ -393,6 +402,6 @@ case 'Print': break;

case 'Selection': break;
case 'ProtectContents': break;
case 'ProtectContents': break; */
/* PivotTable */
case 'ImmediateItemsOnDrop': break;
/* case 'ImmediateItemsOnDrop': break;
case 'ShowPageMultipleItemLabel': break;

@@ -433,6 +442,6 @@ case 'CompactRowIndent': break;

case 'PrintSetTitles': break;
case 'MergeLabels': break;
case 'MergeLabels': break; */
/* PageBreaks */
case 'ColBreaks': break;
/* case 'ColBreaks': break;
case 'ColBreak': break;

@@ -443,6 +452,6 @@ case 'RowBreaks': break;

case 'ColEnd': break;
case 'RowEnd': break;
case 'RowEnd': break; */
/* Version */
case 'DefaultVersion': break;
/* case 'DefaultVersion': break;
case 'RefreshName': break;

@@ -455,6 +464,6 @@ case 'RefreshDate': break;

case 'VersionUpdateableMin': break;
case 'VersionRefreshableMin': break;
case 'VersionRefreshableMin': break; */
/* ConditionalFormatting */
case 'Range': break;
/* case 'Range': break;
case 'Condition': break;

@@ -464,13 +473,12 @@ case 'Qualifier': break;

case 'Value2': break;
case 'Format': break;
case 'Format': break; */
/* AutoFilter */
case 'AutoFilter': break;
case 'AutoFilterColumn': break;
/* case 'AutoFilterColumn': break;
case 'AutoFilterCondition': break;
case 'AutoFilterAnd': break;
case 'AutoFilterOr': break;
case 'AutoFilterOr': break; */
/* QueryTable */
case 'Name': break;
/* case 'Name': break;
case 'Id': break;

@@ -504,9 +512,8 @@ case 'AutoFormatFont': break;

case 'Comma': break;
case 'AutoFormatName': break;
case 'AutoFormatName': break; */
/* DataValidation */
case 'Type': break;
/* case 'Type': break;
case 'Min': break;
case 'Max': break;
case 'Sorting': break;
case 'Sort': break;

@@ -524,6 +531,6 @@ case 'Descending': break;

case 'ComboHide': break;
case 'InputHide': break;
case 'InputHide': break; */
/* MapInfo (schema) */
case 'Schema': break;
/* case 'Schema': break;
case 'Map': break;

@@ -536,5 +543,5 @@ case 'Entry': break;

case 'ElementType': break;
case 'AttributeType': break;
case 'AttributeType': break; */
/* These are from xsd (XML Schema Definition) */
case 'schema':
/* case 'schema':
case 'element':

@@ -547,15 +554,14 @@ case 'complexType':

case 'data': case 'row': break;
case 'data': case 'row': break; */
case 'Styles':
case 'Workbook': {
case 'Workbook':
if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;}
else state.push([Rn[3], false]);
} break;
break;
case 'Comment': {
case 'Comment':
if(Rn[1]==='/'){
if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;
comment.t = comment.v;
delete comment.v; delete comment.w; delete comment.ixfe;
xlml_clean_comment(comment);
comments.push(comment);

@@ -567,3 +573,3 @@ } else {

}
} break;
break;
case 'ComponentOptions':

@@ -580,9 +586,11 @@ case 'DocumentProperties':

case 'DataValidation':
case 'AutoFilter':
case 'Sorting':
case 'ConditionalFormatting':
case 'ExcelWorkbook':
case 'WorkbookOptions':
case 'WorksheetOptions': {
case 'WorksheetOptions':
if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;}
else state.push([Rn[3], true]);
} break;
break;

@@ -593,3 +601,3 @@ /* CustomDocumentProperties */

if(state[state.length-1][0]==='CustomDocumentProperties') {
if(Rn[0].match(/\/>$/)) break;
if(Rn[0].substr(-2) === "/>") break;
else if(Rn[1]==="/") xlml_set_custprop(Custprops, Rn, cp, str.slice(pidx, Rn.index));

@@ -601,2 +609,3 @@ else { cp = Rn; pidx = Rn.index + Rn[0].length; }

}
var out = {};
if(!opts.bookSheets && !opts.bookProps) out.Sheets = sheets;

@@ -603,0 +612,0 @@ out.SheetNames = sheetnames;

@@ -12,2 +12,4 @@ function firstbyte(f,o) {

function xlsread(f, o) {
if(!o) o = {};
if(!o.type) o.type = (typeof Buffer !== 'undefined' && f instanceof Buffer) ? "buffer" : "base64";
switch(firstbyte(f, o)) {

@@ -14,0 +16,0 @@ case 0xD0: return parse_xlscfb(CFB.read(f, o), o);

{
"name": "xlsjs",
"version": "0.6.20",
"version": "0.6.21",
"author": "sheetjs",
"description": "XLS (Excel 97-2004 Spreadsheet) and XML (2003/2004) parser",
"keywords": [ "xls", "office", "excel", "spreadsheet" ],
"description": "Excel 97-2004 spreadsheet (XLS/XML) parser",
"keywords": [ "excel", "xls", "office", "spreadsheet" ],
"bin": {

@@ -12,4 +12,4 @@ "xls": "./bin/xls.njs"

"dependencies": {
"ssf":"~0.7.0",
"codepage":"1.x",
"ssf":"~0.7.1",
"codepage":"~1.2.0",
"cfb":">=0.9.1",

@@ -20,2 +20,3 @@ "commander":""

"mocha":"",
"xlsx":"",
"uglify-js":""

@@ -22,0 +23,0 @@ },

@@ -7,3 +7,6 @@ /* vim: set ts=2: */

var opts = {cellNF: true};
if(process.env.WTF) opts.WTF = true;
if(process.env.WTF) {
opts.WTF = true;
opts.cellStyles = true;
}
var fullex = [".xls", ".xml"];

@@ -30,2 +33,4 @@ var ex = fullex;

cp2: dir + 'custom_properties.xls.xml',
css1: dir + 'cell_style_simple.xls',
css2: dir + 'cell_style_simple.xml',
cst1: dir + 'comments_stress_test.xls',

@@ -52,2 +57,3 @@ cst2: dir + 'comments_stress_test.xls.xml',

ext = (ext ? " [" + ext + "]": "");
if(!full && ext) return;
describe(x + ext + ' should have all bits', function() {

@@ -59,3 +65,3 @@ var sname = dir + '2011/' + x + '.sheetnames';

it('should have the right sheet names', fs.existsSync(sname) ? function() {
var file = fs.readFileSync(sname, 'utf-8');
var file = fs.readFileSync(sname, 'utf-8').replace(/\r/g,"");
var names = wb.SheetNames.map(fixsheetname).join("\n") + "\n";

@@ -88,10 +94,10 @@ assert.equal(names, file);

var getfile = function(dir, x, i, type) {
var name = (dir + x + '.' + i + type);
if(x.substr(-4) === ".xls") {
root = x.slice(0,-4);
if(!fs.existsSync(name)) name=(dir + root + '.xlsx.' + i + type);
if(!fs.existsSync(name)) name=(dir + root + '.xlsm.' + i + type);
if(!fs.existsSync(name)) name=(dir + root + '.xlsb.' + i + type);
}
return name;
var name = (dir + x + '.' + i + type);
if(x.substr(-4) === ".xls") {
root = x.slice(0,-4);
if(!fs.existsSync(name)) name=(dir + root + '.xlsx.' + i + type);
if(!fs.existsSync(name)) name=(dir + root + '.xlsm.' + i + type);
if(!fs.existsSync(name)) name=(dir + root + '.xlsb.' + i + type);
}
return name;
};

@@ -139,2 +145,4 @@ describe(x + ext + ' should generate correct CSV output', function() {

var wbtable = {};
describe('should parse test files', function() {

@@ -145,2 +153,3 @@ files.forEach(function(x) {

var wb = X.readFile(dir + x, opts);
wbtable[dir + x] = wb;
parsetest(x, wb, true);

@@ -222,2 +231,24 @@ });

});
it('should not generate cell styles by default', function() {
var wb = X.readFile(paths.css1);
wb.SheetNames.forEach(function(s) {
var ws = wb.Sheets[s];
Object.keys(ws).forEach(function(addr) {
if(addr[0] === "!" || !ws.hasOwnProperty(addr)) return;
assert(typeof ws[addr].s === 'undefined');
});
});
});
it.skip('should generate cell styles when requested', function() {
var wb = X.readFile(paths.css1, {cellStyles:true});
var found = false;
wb.SheetNames.forEach(function(s) {
var ws = wb.Sheets[s];
Object.keys(ws).forEach(function(addr) {
if(addr[0] === "!" || !ws.hasOwnProperty(addr)) return;
if(typeof ws[addr].s !== 'undefined') return found = true;
});
});
assert(found);
});
});

@@ -292,3 +323,3 @@ describe('sheet', function() {

var ckf = function(wb, fields, exists) { fields.forEach(function(f) {
assert((typeof wb[f] !== 'undefined') == exists);
assert((typeof wb[f] !== 'undefined') == exists);
}); };

@@ -327,2 +358,12 @@ it('should not generate book files by default', function() {

});
it('should infer buffer type', function() {
X.read(fs.readFileSync(paths.cst1));
X.read(fs.readFileSync(paths.cst2));
});
it('should default to base64 type', function() {
assert.throws(function() { X.read(fs.readFileSync(paths.cst1, 'binary')); });
assert.throws(function() { X.read(fs.readFileSync(paths.cst2, 'binary')); });
X.read(fs.readFileSync(paths.cst1, 'base64'));
X.read(fs.readFileSync(paths.cst2, 'base64'));
});
});

@@ -348,2 +389,30 @@

function cmparr(x){ for(var i=1;i!=x.length;++i) assert.deepEqual(x[0], x[i]); }
function deepcmp(x,y,k,m,c) {
var s = k.indexOf(".");
m = (m||"") + "|" + (s > -1 ? k.substr(0,s) : k);
if(s < 0) return assert[c<0?'notEqual':'equal'](x[k], y[k], m);
return deepcmp(x[k.substr(0,s)],y[k.substr(0,s)],k.substr(s+1),m,c)
}
var styexc = [
'A2|H10|bgColor.rgb',
'F6|H1|patternType'
]
var stykeys = [
"patternType",
"fgColor.rgb",
"bgColor.rgb"
];
function diffsty(ws, r1,r2) {
var c1 = ws[r1].s, c2 = ws[r2].s;
stykeys.forEach(function(m) {
var c = -1;
if(styexc.indexOf(r1+"|"+r2+"|"+m) > -1) c = 1;
else if(styexc.indexOf(r2+"|"+r1+"|"+m) > -1) c = 1;
deepcmp(c1,c2,m,r1+","+r2,c);
});
}
describe('parse features', function() {

@@ -447,2 +516,31 @@ it('should have comment as part of cell properties', function(){

describe.skip('should correctly handle styles', function() {
var ws, rn, rn2;
before(function() {
ws=X.readFile(paths.css1, {cellStyles:true}).Sheets.Sheet1;
rn = function(range) {
var r = X.utils.decode_range(range);
var out = [];
for(var R = r.s.r; R <= r.e.r; ++R) for(var C = r.s.c; C <= r.e.c; ++C)
out.push(X.utils.encode_cell({c:C,r:R}));
return out;
};
rn2 = function(r) { return [].concat.apply([], r.split(",").map(rn)); };
});
var ranges = [
'A1:D1,F1:G1', 'A2:D2,F2:G2', /* rows */
'A3:A10', 'B3:B10', 'E1:E10', 'F6:F8', /* cols */
'H1:J4', 'H10' /* blocks */
];
ranges.forEach(function(rng) {
it(rng,function(){cmparr(rn2(rng).map(function(x){ return ws[x].s; }));});
});
it('different styles', function() {
for(var i = 0; i != ranges.length-1; ++i) {
for(var j = i+1; j != ranges.length; ++j) {
diffsty(ws, rn2(ranges[i])[0], rn2(ranges[j])[0]);
}
}
});
});
});

@@ -499,33 +597,35 @@

});
describe('json output', function() {
function datenum(v, date1904) {
if(date1904) v+=1462;
var epoch = Date.parse(v);
return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
}
function sheet_from_array_of_arrays(data, opts) {
var ws = {};
var range = {s: {c:10000000, r:10000000}, e: {c:0, r:0 }};
for(var R = 0; R != data.length; ++R) {
for(var C = 0; C != data[R].length; ++C) {
if(range.s.r > R) range.s.r = R;
if(range.s.c > C) range.s.c = C;
if(range.e.r < R) range.e.r = R;
if(range.e.c < C) range.e.c = C;
var cell = {v: data[R][C] };
if(cell.v == null) continue;
var cell_ref = X.utils.encode_cell({c:C,r:R});
if(typeof cell.v === 'number') cell.t = 'n';
else if(typeof cell.v === 'boolean') cell.t = 'b';
else if(cell.v instanceof Date) {
cell.t = 'n'; cell.z = X.SSF._table[14];
cell.v = datenum(cell.v);
}
else cell.t = 's';
ws[cell_ref] = cell;
function datenum(v, date1904) {
if(date1904) v+=1462;
var epoch = Date.parse(v);
return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
}
function sheet_from_array_of_arrays(data, opts) {
var ws = {};
var range = {s: {c:10000000, r:10000000}, e: {c:0, r:0 }};
for(var R = 0; R != data.length; ++R) {
for(var C = 0; C != data[R].length; ++C) {
if(range.s.r > R) range.s.r = R;
if(range.s.c > C) range.s.c = C;
if(range.e.r < R) range.e.r = R;
if(range.e.c < C) range.e.c = C;
var cell = {v: data[R][C] };
if(cell.v == null) continue;
var cell_ref = X.utils.encode_cell({c:C,r:R});
if(typeof cell.v === 'number') cell.t = 'n';
else if(typeof cell.v === 'boolean') cell.t = 'b';
else if(cell.v instanceof Date) {
cell.t = 'n'; cell.z = X.SSF._table[14];
cell.v = datenum(cell.v);
}
else cell.t = 's';
ws[cell_ref] = cell;
}
if(range.s.c < 10000000) ws['!ref'] = X.utils.encode_range(range);
return ws;
}
if(range.s.c < 10000000) ws['!ref'] = X.utils.encode_range(range);
return ws;
}
describe('json output', function() {
function seeker(json, keys, val) {

@@ -600,2 +700,52 @@ for(var i = 0; i != json.length; ++i) {

});
describe('corner cases', function() {
it('output functions', function() {
var data = [
[1,2,3],
[true, false, null, "sheetjs"],
["foo","bar",new Date("2014-02-19T14:30Z"), "0.3"],
["baz", null, "q\"ux"]
];
ws = sheet_from_array_of_arrays(data);
ws.A1.f = ""; ws.A1.w = "";
delete ws.C3.w; delete ws.C3.z; ws.C3.XF = {ifmt:14};
ws.A4.t = "e";
X.utils.get_formulae(ws);
X.utils.make_csv(ws);
X.utils.make_json(ws);
ws['!cols'] = [ {wch:6}, {wch:7}, {wch:10}, {wch:20} ];
var wb = {SheetNames:['sheetjs'], Sheets:{sheetjs:ws}};
//X.write(wb, {type: "binary", bookType: 'xlsx'});
//X.write(wb, {type: "buffer", bookType: 'xlsm'});
//X.write(wb, {type: "base64", bookType: 'xlsb'});
ws.A2.t = "f";
assert.throws(function() { X.utils.make_json(ws); });
});
it('SSF', function() {
X.SSF.format("General", "dafuq");
assert.throws(function(x) { return X.SSF.format("General", {sheet:"js"});});
X.SSF.format("b e ddd hh AM/PM", 41722.4097222222);
X.SSF.format("b ddd hh m", 41722.4097222222);
["hhh","hhh A/P","hhmmm","sss","[hhh]","G eneral"].forEach(function(f) {
assert.throws(function(x) { return X.SSF.format(f, 12345.6789);});
});
["[m]","[s]"].forEach(function(f) {
assert.doesNotThrow(function(x) { return X.SSF.format(f, 12345.6789);});
});
});
it('SSF oddities', function() {
var ssfdata = require('./misc/ssf.json');
ssfdata.forEach(function(d) {
for(j=1;j<d.length;++j) {
if(d[j].length == 2) {
var expected = d[j][1], actual = X.SSF.format(d[0], d[j][0], {});
assert.equal(actual, expected);
} else if(d[j][2] !== "#") assert.throws(function() { SSF.format(d[0], d[j][0]); });
}
});
});
});
describe('encryption', function() {

@@ -602,0 +752,0 @@ password_files.forEach(function(x) {

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc