forked from sheetjs/sheetjs
jshint passes
This commit is contained in:
parent
c5c3eebb09
commit
247fd22c06
@ -7,10 +7,10 @@ function fill(c,l) { return new Array(l+1).join(c); }
|
|||||||
function pad(v,d){var t=String(v);return t.length>=d?t:(fill(0,d-t.length)+t);}
|
function pad(v,d){var t=String(v);return t.length>=d?t:(fill(0,d-t.length)+t);}
|
||||||
/* Options */
|
/* Options */
|
||||||
var opts_fmt = {};
|
var opts_fmt = {};
|
||||||
function fixopts(o){for(y in opts_fmt) if(o[y]===undefined) o[y]=opts_fmt[y];}
|
function fixopts(o){for(var y in opts_fmt) if(o[y]===undefined) o[y]=opts_fmt[y];}
|
||||||
SSF.opts = opts_fmt;
|
SSF.opts = opts_fmt;
|
||||||
opts_fmt.date1904 = 0;
|
opts_fmt.date1904 = 0;
|
||||||
opts_fmt.output = ""
|
opts_fmt.output = "";
|
||||||
opts_fmt.mode = "";
|
opts_fmt.mode = "";
|
||||||
var table_fmt = {
|
var table_fmt = {
|
||||||
1: '0',
|
1: '0',
|
||||||
@ -62,17 +62,17 @@ var months = [
|
|||||||
['S', 'Sep', 'September'],
|
['S', 'Sep', 'September'],
|
||||||
['O', 'Oct', 'October'],
|
['O', 'Oct', 'October'],
|
||||||
['N', 'Nov', 'November'],
|
['N', 'Nov', 'November'],
|
||||||
['D', 'Dec', 'December'],
|
['D', 'Dec', 'December']
|
||||||
];
|
];
|
||||||
var general_fmt = function(v) {
|
var general_fmt = function(v) {
|
||||||
if(typeof v === 'boolean') return v ? "TRUE" : "FALSE";
|
if(typeof v === 'boolean') return v ? "TRUE" : "FALSE";
|
||||||
}
|
};
|
||||||
SSF._general = general_fmt;
|
SSF._general = general_fmt;
|
||||||
var parse_date_code = function parse_date_code(v,opts) {
|
var parse_date_code = function parse_date_code(v,opts) {
|
||||||
var date = Math.floor(v), time = Math.round(86400 * (v - date)), dow=0;
|
var date = Math.floor(v), time = Math.round(86400 * (v - date)), dow=0;
|
||||||
var dout=[], out={D:date, T:time}; fixopts(opts = (opts||{}));
|
var dout=[], out={D:date, T:time}; fixopts(opts = (opts||{}));
|
||||||
if(opts.date1904) date += 1462;
|
if(opts.date1904) date += 1462;
|
||||||
if(date === 60) dout = [1900,2,29], dow=3;
|
if(date === 60) (dout = [1900,2,29], dow=3); /* JSHint bug (issue #1010) */
|
||||||
else {
|
else {
|
||||||
if(date > 60) --date;
|
if(date > 60) --date;
|
||||||
/* 1 = Jan 1 1900 */
|
/* 1 = Jan 1 1900 */
|
||||||
@ -95,7 +95,7 @@ var write_date = function(type, fmt, val) {
|
|||||||
case 'y': switch(fmt) { /* year */
|
case 'y': switch(fmt) { /* year */
|
||||||
case 'y': case 'yy': return pad(val.y % 100,2);
|
case 'y': case 'yy': return pad(val.y % 100,2);
|
||||||
default: return val.y;
|
default: return val.y;
|
||||||
}; break;
|
} break;
|
||||||
case 'm': switch(fmt) { /* month */
|
case 'm': switch(fmt) { /* month */
|
||||||
case 'm': return val.m;
|
case 'm': return val.m;
|
||||||
case 'mm': return pad(val.m,2);
|
case 'mm': return pad(val.m,2);
|
||||||
@ -103,34 +103,34 @@ var write_date = function(type, fmt, val) {
|
|||||||
case 'mmmm': return months[val.m-1][2];
|
case 'mmmm': return months[val.m-1][2];
|
||||||
case 'mmmmm': return months[val.m-1][0];
|
case 'mmmmm': return months[val.m-1][0];
|
||||||
default: throw 'bad month format: ' + fmt;
|
default: throw 'bad month format: ' + fmt;
|
||||||
}; break;
|
} break;
|
||||||
case 'd': switch(fmt) { /* day */
|
case 'd': switch(fmt) { /* day */
|
||||||
case 'd': return val.d;
|
case 'd': return val.d;
|
||||||
case 'dd': return pad(val.d,2);
|
case 'dd': return pad(val.d,2);
|
||||||
case 'ddd': return days[val.q][0];
|
case 'ddd': return days[val.q][0];
|
||||||
case 'dddd': return days[val.q][1];
|
case 'dddd': return days[val.q][1];
|
||||||
default: throw 'bad day format: ' + fmt;
|
default: throw 'bad day format: ' + fmt;
|
||||||
}; break;
|
} break;
|
||||||
case 'h': switch(fmt) { /* 12-hour */
|
case 'h': switch(fmt) { /* 12-hour */
|
||||||
case 'h': return 1+(val.H+11)%12;
|
case 'h': return 1+(val.H+11)%12;
|
||||||
case 'hh': return pad(1+(val.H+11)%12, 2);
|
case 'hh': return pad(1+(val.H+11)%12, 2);
|
||||||
default: throw 'bad hour format: ' + fmt;
|
default: throw 'bad hour format: ' + fmt;
|
||||||
}; break;
|
} break;
|
||||||
case 'H': switch(fmt) { /* 24-hour */
|
case 'H': switch(fmt) { /* 24-hour */
|
||||||
case 'h': return val.H;
|
case 'h': return val.H;
|
||||||
case 'hh': return pad(val.H, 2);
|
case 'hh': return pad(val.H, 2);
|
||||||
default: throw 'bad hour format: ' + fmt;
|
default: throw 'bad hour format: ' + fmt;
|
||||||
}; break;
|
} break;
|
||||||
case 'M': switch(fmt) { /* minutes */
|
case 'M': switch(fmt) { /* minutes */
|
||||||
case 'm': return val.M;
|
case 'm': return val.M;
|
||||||
case 'mm': return pad(val.M, 2);
|
case 'mm': return pad(val.M, 2);
|
||||||
default: throw 'bad minute format: ' + fmt;
|
default: throw 'bad minute format: ' + fmt;
|
||||||
}; break;
|
} break;
|
||||||
case 's': switch(fmt) { /* seconds */
|
case 's': switch(fmt) { /* seconds */
|
||||||
case 's': return val.S;
|
case 's': return val.S;
|
||||||
case 'ss': return pad(val.S, 2);
|
case 'ss': return pad(val.S, 2);
|
||||||
default: throw 'bad second format: ' + fmt;
|
default: throw 'bad second format: ' + fmt;
|
||||||
}; break;
|
} break;
|
||||||
/* TODO: handle the ECMA spec format ee -> yy */
|
/* TODO: handle the ECMA spec format ee -> yy */
|
||||||
case 'e': { return val.y; } break;
|
case 'e': { return val.y; } break;
|
||||||
case 'A': return (val.h>=12 ? 'P' : 'A') + fmt.substr(1);
|
case 'A': return (val.h>=12 ? 'P' : 'A') + fmt.substr(1);
|
||||||
@ -144,10 +144,10 @@ SSF._split = split_fmt;
|
|||||||
function eval_fmt(fmt, v, opts) {
|
function eval_fmt(fmt, v, opts) {
|
||||||
var out = [], o = "", i = 0, c = "", lst='t', q = {}, dt;
|
var out = [], o = "", i = 0, c = "", lst='t', q = {}, dt;
|
||||||
fixopts(opts = (opts || {}));
|
fixopts(opts = (opts || {}));
|
||||||
var hr='H'
|
var hr='H';
|
||||||
/* Tokenize */
|
/* Tokenize */
|
||||||
while(i < fmt.length) {
|
while(i < fmt.length) {
|
||||||
switch(c = fmt[i]) {
|
switch((c = fmt[i])) {
|
||||||
case '"': /* Literal text */
|
case '"': /* Literal text */
|
||||||
for(o="";fmt[++i] !== '"';) o += fmt[(fmt[i] === '\\' ? ++i : i)];
|
for(o="";fmt[++i] !== '"';) o += fmt[(fmt[i] === '\\' ? ++i : i)];
|
||||||
out.push({t:'t', v:o}); break;
|
out.push({t:'t', v:o}); break;
|
||||||
@ -163,8 +163,8 @@ function eval_fmt(fmt, v, opts) {
|
|||||||
q={t:c, v:o}; out.push(q); lst = c; break;
|
q={t:c, v:o}; out.push(q); lst = c; break;
|
||||||
case 'A':
|
case 'A':
|
||||||
q={t:c,v:"A"};
|
q={t:c,v:"A"};
|
||||||
if(fmt.substr(i, 3) === "A/P") hr = 'h',i+=3;
|
if(fmt.substr(i, 3) === "A/P") (hr = 'h',i+=3);
|
||||||
else if(fmt.substr(i,5) === "AM/PM") { q.v = "AM"; i+=5; hr = 'h' }
|
else if(fmt.substr(i,5) === "AM/PM") { q.v = "AM"; i+=5; hr = 'h'; }
|
||||||
else q.t = "t";
|
else q.t = "t";
|
||||||
out.push(q); lst = c; break;
|
out.push(q); lst = c; break;
|
||||||
case '[': /* TODO: Fix this -- ignore all conditionals and formatting */
|
case '[': /* TODO: Fix this -- ignore all conditionals and formatting */
|
||||||
@ -196,12 +196,12 @@ function eval_fmt(fmt, v, opts) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return out.map(function(x){return x.v}).join("");
|
return out.map(function(x){return x.v;}).join("");
|
||||||
}
|
}
|
||||||
SSF._eval = eval_fmt;
|
SSF._eval = eval_fmt;
|
||||||
function choose_fmt(fmt, v) {
|
function choose_fmt(fmt, v) {
|
||||||
if(typeof fmt === "string") fmt = split_fmt(fmt);
|
if(typeof fmt === "string") fmt = split_fmt(fmt);
|
||||||
if(!(typeof v === "number")) return fmt[3];
|
if(typeof v !== "number") return fmt[3];
|
||||||
return v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];
|
return v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,7 +211,7 @@ var format = function format(fmt,v,o) {
|
|||||||
if(typeof fmt === 'number') fmt = table_fmt[fmt];
|
if(typeof fmt === 'number') fmt = table_fmt[fmt];
|
||||||
var f = choose_fmt(fmt, v, o);
|
var f = choose_fmt(fmt, v, o);
|
||||||
return eval_fmt(f, v, o);
|
return eval_fmt(f, v, o);
|
||||||
}
|
};
|
||||||
|
|
||||||
SSF._choose = choose_fmt;
|
SSF._choose = choose_fmt;
|
||||||
SSF._table = table_fmt;
|
SSF._table = table_fmt;
|
||||||
|
@ -186,7 +186,7 @@ function parseSheet(data) {
|
|||||||
/* formatting */
|
/* formatting */
|
||||||
if(cell.s) {
|
if(cell.s) {
|
||||||
var cf = styles.CellXf[cell.s];
|
var cf = styles.CellXf[cell.s];
|
||||||
if(cf && cf.numFmtId && cf.numFmtId != 0) {
|
if(cf && cf.numFmtId && cf.numFmtId !== 0) {
|
||||||
p.raw = p.v;
|
p.raw = p.v;
|
||||||
p.rawt = p.t;
|
p.rawt = p.t;
|
||||||
try {
|
try {
|
||||||
@ -270,23 +270,23 @@ function parseProps(data) {
|
|||||||
if(cur && cur.length > 0) q[f] = cur[1];
|
if(cur && cur.length > 0) q[f] = cur[1];
|
||||||
});
|
});
|
||||||
|
|
||||||
if(q["HeadingPairs"] && q["TitlesOfParts"]) {
|
if(q.HeadingPairs && q.TitlesOfParts) {
|
||||||
var v = parseVector(q["HeadingPairs"]);
|
var v = parseVector(q.HeadingPairs);
|
||||||
var j = 0, widx = 0;
|
var j = 0, widx = 0;
|
||||||
for(var i = 0; i !== v.length; ++i) {
|
for(var i = 0; i !== v.length; ++i) {
|
||||||
switch(v[i].v) {
|
switch(v[i].v) {
|
||||||
case "Worksheets": widx = j; p["Worksheets"] = +v[++i]; break;
|
case "Worksheets": widx = j; p.Worksheets = +v[++i]; break;
|
||||||
case "Named Ranges": ++i; break; // TODO: Handle Named Ranges
|
case "Named Ranges": ++i; break; // TODO: Handle Named Ranges
|
||||||
default: console.error("Unrecognized key in Heading Pairs: " + v[i++].v);
|
default: console.error("Unrecognized key in Heading Pairs: " + v[i++].v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var parts = parseVector(q["TitlesOfParts"]).map(utf8read);
|
var parts = parseVector(q.TitlesOfParts).map(utf8read);
|
||||||
p["SheetNames"] = parts.slice(widx, widx + p["Worksheets"]);
|
p.SheetNames = parts.slice(widx, widx + p.Worksheets);
|
||||||
}
|
}
|
||||||
p["Creator"] = q["dc:creator"];
|
p.Creator = q["dc:creator"];
|
||||||
p["LastModifiedBy"] = q["cp:lastModifiedBy"];
|
p.LastModifiedBy = q["cp:lastModifiedBy"];
|
||||||
p["CreatedDate"] = new Date(q["dcterms:created"]);
|
p.CreatedDate = new Date(q["dcterms:created"]);
|
||||||
p["ModifiedDate"] = new Date(q["dcterms:modified"]);
|
p.ModifiedDate = new Date(q["dcterms:modified"]);
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -310,9 +310,9 @@ function parseDeps(data) {
|
|||||||
var ctext = {};
|
var ctext = {};
|
||||||
|
|
||||||
function parseCT(data) {
|
function parseCT(data) {
|
||||||
|
if(!data) return data;
|
||||||
var ct = { workbooks: [], sheets: [], calcchains: [], themes: [], styles: [],
|
var ct = { workbooks: [], sheets: [], calcchains: [], themes: [], styles: [],
|
||||||
coreprops: [], extprops: [], strs:[], xmlns: "" };
|
coreprops: [], extprops: [], strs:[], xmlns: "" };
|
||||||
if(data == null) return data;
|
|
||||||
data.match(/<[^>]*>/g).forEach(function(x) {
|
data.match(/<[^>]*>/g).forEach(function(x) {
|
||||||
var y = parsexmltag(x);
|
var y = parsexmltag(x);
|
||||||
switch(y[0]) {
|
switch(y[0]) {
|
||||||
@ -441,11 +441,11 @@ function parseWB(data) {
|
|||||||
|
|
||||||
var z;
|
var z;
|
||||||
/* defaults */
|
/* defaults */
|
||||||
for(z in WBPropsDef) if(null == wb.WBProps[z]) wb.WBProps[z] = WBPropsDef[z];
|
for(z in WBPropsDef) if(typeof wb.WBProps[z] === 'undefined') wb.WBProps[z] = WBPropsDef[z];
|
||||||
for(z in CalcPrDef) if(null == wb.CalcPr[z]) wb.CalcPr[z] = CalcPrDef[z];
|
for(z in CalcPrDef) if(typeof wb.CalcPr[z] === 'undefined') wb.CalcPr[z] = CalcPrDef[z];
|
||||||
|
|
||||||
wb.WBView.forEach(function(w){for(var z in WBViewDef) if(null==w[z]) w[z]=WBViewDef[z]; });
|
wb.WBView.forEach(function(w){for(var z in WBViewDef) if(typeof w[z] === 'undefined') w[z]=WBViewDef[z]; });
|
||||||
wb.Sheets.forEach(function(w){for(var z in SheetDef) if(null==w[z]) w[z]=SheetDef[z]; });
|
wb.Sheets.forEach(function(w){for(var z in SheetDef) if(typeof w[z] === 'undefined') w[z]=SheetDef[z]; });
|
||||||
|
|
||||||
_ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904, 'date1904');
|
_ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904, 'date1904');
|
||||||
|
|
||||||
@ -455,7 +455,7 @@ function parseWB(data) {
|
|||||||
/* 18.8.31 numFmts CT_NumFmts */
|
/* 18.8.31 numFmts CT_NumFmts */
|
||||||
function parseNumFmts(t) {
|
function parseNumFmts(t) {
|
||||||
styles.NumberFmt = [];
|
styles.NumberFmt = [];
|
||||||
for(y in SSF._table) styles.NumberFmt[y] = SSF._table[y];
|
for(var y in SSF._table) styles.NumberFmt[y] = SSF._table[y];
|
||||||
t[0].match(/<[^>]*>/g).forEach(function(x) {
|
t[0].match(/<[^>]*>/g).forEach(function(x) {
|
||||||
var y = parsexmltag(x);
|
var y = parsexmltag(x);
|
||||||
switch(y[0]) {
|
switch(y[0]) {
|
||||||
@ -501,7 +501,7 @@ function parseStyles(data) {
|
|||||||
var t;
|
var t;
|
||||||
|
|
||||||
/* numFmts CT_NumFmts ? */
|
/* numFmts CT_NumFmts ? */
|
||||||
if(t=data.match(/<numFmts([^>]*)>.*<\/numFmts>/)) parseNumFmts(t);
|
if((t=data.match(/<numFmts([^>]*)>.*<\/numFmts>/))) parseNumFmts(t);
|
||||||
|
|
||||||
/* fonts CT_Fonts ? */
|
/* fonts CT_Fonts ? */
|
||||||
/* fills CT_Fills ? */
|
/* fills CT_Fills ? */
|
||||||
@ -509,7 +509,7 @@ function parseStyles(data) {
|
|||||||
/* cellStyleXfs CT_CellStyleXfs ? */
|
/* cellStyleXfs CT_CellStyleXfs ? */
|
||||||
|
|
||||||
/* cellXfs CT_CellXfs ? */
|
/* cellXfs CT_CellXfs ? */
|
||||||
if(t=data.match(/<cellXfs([^>]*)>.*<\/cellXfs>/)) parseCXfs(t);
|
if((t=data.match(/<cellXfs([^>]*)>.*<\/cellXfs>/))) parseCXfs(t);
|
||||||
|
|
||||||
/* dxfs CT_Dxfs ? */
|
/* dxfs CT_Dxfs ? */
|
||||||
/* tableStyles CT_TableStyles ? */
|
/* tableStyles CT_TableStyles ? */
|
||||||
@ -569,7 +569,7 @@ function parseZip(zip) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var _fs, jszip;
|
var _fs, jszip;
|
||||||
if(typeof JSZip !== "undefined") jszip = JSZip;
|
if(typeof JSZip !== 'undefined') jszip = JSZip;
|
||||||
if (typeof exports !== 'undefined') {
|
if (typeof exports !== 'undefined') {
|
||||||
if (typeof module !== 'undefined' && module.exports) {
|
if (typeof module !== 'undefined' && module.exports) {
|
||||||
if(typeof jszip === 'undefined') jszip = require('./jszip').JSZip;
|
if(typeof jszip === 'undefined') jszip = require('./jszip').JSZip;
|
||||||
|
@ -66,7 +66,9 @@ function sheet_to_csv(sheet) {
|
|||||||
var stringify = function stringify(val) {
|
var stringify = function stringify(val) {
|
||||||
switch(val.t){
|
switch(val.t){
|
||||||
case 'n': return String(val.v);
|
case 'n': return String(val.v);
|
||||||
case 's': case 'str': return JSON.stringify(val.v);
|
case 's': case 'str':
|
||||||
|
if(typeof val.v === 'undefined') return "";
|
||||||
|
return JSON.stringify(val.v);
|
||||||
case 'b': return val.v ? "TRUE" : "FALSE";
|
case 'b': return val.v ? "TRUE" : "FALSE";
|
||||||
case 'e': return ""; /* throw out value in case of error */
|
case 'e': return ""; /* throw out value in case of error */
|
||||||
default: throw 'unrecognized type ' + val.t;
|
default: throw 'unrecognized type ' + val.t;
|
||||||
@ -89,13 +91,14 @@ function sheet_to_csv(sheet) {
|
|||||||
|
|
||||||
function get_formulae(ws) {
|
function get_formulae(ws) {
|
||||||
var cmds = [];
|
var cmds = [];
|
||||||
for(y in ws) if(y[0] !=='!' && ws.hasOwnProperty(y)) (function(y,x) {
|
for(var y in ws) if(y[0] !=='!' && ws.hasOwnProperty(y)) {
|
||||||
|
var x = ws[y];
|
||||||
var val = "";
|
var val = "";
|
||||||
if(x.f) val = x.f;
|
if(x.f) val = x.f;
|
||||||
else if(typeof x.v === 'number') val = x.v;
|
else if(typeof x.v === 'number') val = x.v;
|
||||||
else val = x.v;
|
else val = x.v;
|
||||||
cmds.push(y + "=" + val);
|
cmds.push(y + "=" + val);
|
||||||
})(y,ws[y]);
|
}
|
||||||
return cmds;
|
return cmds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
85
xlsx.js
85
xlsx.js
@ -9,10 +9,10 @@ function fill(c,l) { return new Array(l+1).join(c); }
|
|||||||
function pad(v,d){var t=String(v);return t.length>=d?t:(fill(0,d-t.length)+t);}
|
function pad(v,d){var t=String(v);return t.length>=d?t:(fill(0,d-t.length)+t);}
|
||||||
/* Options */
|
/* Options */
|
||||||
var opts_fmt = {};
|
var opts_fmt = {};
|
||||||
function fixopts(o){for(y in opts_fmt) if(o[y]===undefined) o[y]=opts_fmt[y];}
|
function fixopts(o){for(var y in opts_fmt) if(o[y]===undefined) o[y]=opts_fmt[y];}
|
||||||
SSF.opts = opts_fmt;
|
SSF.opts = opts_fmt;
|
||||||
opts_fmt.date1904 = 0;
|
opts_fmt.date1904 = 0;
|
||||||
opts_fmt.output = ""
|
opts_fmt.output = "";
|
||||||
opts_fmt.mode = "";
|
opts_fmt.mode = "";
|
||||||
var table_fmt = {
|
var table_fmt = {
|
||||||
1: '0',
|
1: '0',
|
||||||
@ -64,17 +64,17 @@ var months = [
|
|||||||
['S', 'Sep', 'September'],
|
['S', 'Sep', 'September'],
|
||||||
['O', 'Oct', 'October'],
|
['O', 'Oct', 'October'],
|
||||||
['N', 'Nov', 'November'],
|
['N', 'Nov', 'November'],
|
||||||
['D', 'Dec', 'December'],
|
['D', 'Dec', 'December']
|
||||||
];
|
];
|
||||||
var general_fmt = function(v) {
|
var general_fmt = function(v) {
|
||||||
if(typeof v === 'boolean') return v ? "TRUE" : "FALSE";
|
if(typeof v === 'boolean') return v ? "TRUE" : "FALSE";
|
||||||
}
|
};
|
||||||
SSF._general = general_fmt;
|
SSF._general = general_fmt;
|
||||||
var parse_date_code = function parse_date_code(v,opts) {
|
var parse_date_code = function parse_date_code(v,opts) {
|
||||||
var date = Math.floor(v), time = Math.round(86400 * (v - date)), dow=0;
|
var date = Math.floor(v), time = Math.round(86400 * (v - date)), dow=0;
|
||||||
var dout=[], out={D:date, T:time}; fixopts(opts = (opts||{}));
|
var dout=[], out={D:date, T:time}; fixopts(opts = (opts||{}));
|
||||||
if(opts.date1904) date += 1462;
|
if(opts.date1904) date += 1462;
|
||||||
if(date === 60) dout = [1900,2,29], dow=3;
|
if(date === 60) (dout = [1900,2,29], dow=3); /* JSHint bug (issue #1010) */
|
||||||
else {
|
else {
|
||||||
if(date > 60) --date;
|
if(date > 60) --date;
|
||||||
/* 1 = Jan 1 1900 */
|
/* 1 = Jan 1 1900 */
|
||||||
@ -97,7 +97,7 @@ var write_date = function(type, fmt, val) {
|
|||||||
case 'y': switch(fmt) { /* year */
|
case 'y': switch(fmt) { /* year */
|
||||||
case 'y': case 'yy': return pad(val.y % 100,2);
|
case 'y': case 'yy': return pad(val.y % 100,2);
|
||||||
default: return val.y;
|
default: return val.y;
|
||||||
}; break;
|
} break;
|
||||||
case 'm': switch(fmt) { /* month */
|
case 'm': switch(fmt) { /* month */
|
||||||
case 'm': return val.m;
|
case 'm': return val.m;
|
||||||
case 'mm': return pad(val.m,2);
|
case 'mm': return pad(val.m,2);
|
||||||
@ -105,34 +105,34 @@ var write_date = function(type, fmt, val) {
|
|||||||
case 'mmmm': return months[val.m-1][2];
|
case 'mmmm': return months[val.m-1][2];
|
||||||
case 'mmmmm': return months[val.m-1][0];
|
case 'mmmmm': return months[val.m-1][0];
|
||||||
default: throw 'bad month format: ' + fmt;
|
default: throw 'bad month format: ' + fmt;
|
||||||
}; break;
|
} break;
|
||||||
case 'd': switch(fmt) { /* day */
|
case 'd': switch(fmt) { /* day */
|
||||||
case 'd': return val.d;
|
case 'd': return val.d;
|
||||||
case 'dd': return pad(val.d,2);
|
case 'dd': return pad(val.d,2);
|
||||||
case 'ddd': return days[val.q][0];
|
case 'ddd': return days[val.q][0];
|
||||||
case 'dddd': return days[val.q][1];
|
case 'dddd': return days[val.q][1];
|
||||||
default: throw 'bad day format: ' + fmt;
|
default: throw 'bad day format: ' + fmt;
|
||||||
}; break;
|
} break;
|
||||||
case 'h': switch(fmt) { /* 12-hour */
|
case 'h': switch(fmt) { /* 12-hour */
|
||||||
case 'h': return 1+(val.H+11)%12;
|
case 'h': return 1+(val.H+11)%12;
|
||||||
case 'hh': return pad(1+(val.H+11)%12, 2);
|
case 'hh': return pad(1+(val.H+11)%12, 2);
|
||||||
default: throw 'bad hour format: ' + fmt;
|
default: throw 'bad hour format: ' + fmt;
|
||||||
}; break;
|
} break;
|
||||||
case 'H': switch(fmt) { /* 24-hour */
|
case 'H': switch(fmt) { /* 24-hour */
|
||||||
case 'h': return val.H;
|
case 'h': return val.H;
|
||||||
case 'hh': return pad(val.H, 2);
|
case 'hh': return pad(val.H, 2);
|
||||||
default: throw 'bad hour format: ' + fmt;
|
default: throw 'bad hour format: ' + fmt;
|
||||||
}; break;
|
} break;
|
||||||
case 'M': switch(fmt) { /* minutes */
|
case 'M': switch(fmt) { /* minutes */
|
||||||
case 'm': return val.M;
|
case 'm': return val.M;
|
||||||
case 'mm': return pad(val.M, 2);
|
case 'mm': return pad(val.M, 2);
|
||||||
default: throw 'bad minute format: ' + fmt;
|
default: throw 'bad minute format: ' + fmt;
|
||||||
}; break;
|
} break;
|
||||||
case 's': switch(fmt) { /* seconds */
|
case 's': switch(fmt) { /* seconds */
|
||||||
case 's': return val.S;
|
case 's': return val.S;
|
||||||
case 'ss': return pad(val.S, 2);
|
case 'ss': return pad(val.S, 2);
|
||||||
default: throw 'bad second format: ' + fmt;
|
default: throw 'bad second format: ' + fmt;
|
||||||
}; break;
|
} break;
|
||||||
/* TODO: handle the ECMA spec format ee -> yy */
|
/* TODO: handle the ECMA spec format ee -> yy */
|
||||||
case 'e': { return val.y; } break;
|
case 'e': { return val.y; } break;
|
||||||
case 'A': return (val.h>=12 ? 'P' : 'A') + fmt.substr(1);
|
case 'A': return (val.h>=12 ? 'P' : 'A') + fmt.substr(1);
|
||||||
@ -146,10 +146,10 @@ SSF._split = split_fmt;
|
|||||||
function eval_fmt(fmt, v, opts) {
|
function eval_fmt(fmt, v, opts) {
|
||||||
var out = [], o = "", i = 0, c = "", lst='t', q = {}, dt;
|
var out = [], o = "", i = 0, c = "", lst='t', q = {}, dt;
|
||||||
fixopts(opts = (opts || {}));
|
fixopts(opts = (opts || {}));
|
||||||
var hr='H'
|
var hr='H';
|
||||||
/* Tokenize */
|
/* Tokenize */
|
||||||
while(i < fmt.length) {
|
while(i < fmt.length) {
|
||||||
switch(c = fmt[i]) {
|
switch((c = fmt[i])) {
|
||||||
case '"': /* Literal text */
|
case '"': /* Literal text */
|
||||||
for(o="";fmt[++i] !== '"';) o += fmt[(fmt[i] === '\\' ? ++i : i)];
|
for(o="";fmt[++i] !== '"';) o += fmt[(fmt[i] === '\\' ? ++i : i)];
|
||||||
out.push({t:'t', v:o}); break;
|
out.push({t:'t', v:o}); break;
|
||||||
@ -165,8 +165,8 @@ function eval_fmt(fmt, v, opts) {
|
|||||||
q={t:c, v:o}; out.push(q); lst = c; break;
|
q={t:c, v:o}; out.push(q); lst = c; break;
|
||||||
case 'A':
|
case 'A':
|
||||||
q={t:c,v:"A"};
|
q={t:c,v:"A"};
|
||||||
if(fmt.substr(i, 3) === "A/P") hr = 'h',i+=3;
|
if(fmt.substr(i, 3) === "A/P") (hr = 'h',i+=3);
|
||||||
else if(fmt.substr(i,5) === "AM/PM") { q.v = "AM"; i+=5; hr = 'h' }
|
else if(fmt.substr(i,5) === "AM/PM") { q.v = "AM"; i+=5; hr = 'h'; }
|
||||||
else q.t = "t";
|
else q.t = "t";
|
||||||
out.push(q); lst = c; break;
|
out.push(q); lst = c; break;
|
||||||
case '[': /* TODO: Fix this -- ignore all conditionals and formatting */
|
case '[': /* TODO: Fix this -- ignore all conditionals and formatting */
|
||||||
@ -198,12 +198,12 @@ function eval_fmt(fmt, v, opts) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return out.map(function(x){return x.v}).join("");
|
return out.map(function(x){return x.v;}).join("");
|
||||||
}
|
}
|
||||||
SSF._eval = eval_fmt;
|
SSF._eval = eval_fmt;
|
||||||
function choose_fmt(fmt, v) {
|
function choose_fmt(fmt, v) {
|
||||||
if(typeof fmt === "string") fmt = split_fmt(fmt);
|
if(typeof fmt === "string") fmt = split_fmt(fmt);
|
||||||
if(!(typeof v === "number")) return fmt[3];
|
if(typeof v !== "number") return fmt[3];
|
||||||
return v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];
|
return v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,7 +213,7 @@ var format = function format(fmt,v,o) {
|
|||||||
if(typeof fmt === 'number') fmt = table_fmt[fmt];
|
if(typeof fmt === 'number') fmt = table_fmt[fmt];
|
||||||
var f = choose_fmt(fmt, v, o);
|
var f = choose_fmt(fmt, v, o);
|
||||||
return eval_fmt(f, v, o);
|
return eval_fmt(f, v, o);
|
||||||
}
|
};
|
||||||
|
|
||||||
SSF._choose = choose_fmt;
|
SSF._choose = choose_fmt;
|
||||||
SSF._table = table_fmt;
|
SSF._table = table_fmt;
|
||||||
@ -410,7 +410,7 @@ function parseSheet(data) {
|
|||||||
/* formatting */
|
/* formatting */
|
||||||
if(cell.s) {
|
if(cell.s) {
|
||||||
var cf = styles.CellXf[cell.s];
|
var cf = styles.CellXf[cell.s];
|
||||||
if(cf && cf.numFmtId && cf.numFmtId != 0) {
|
if(cf && cf.numFmtId && cf.numFmtId !== 0) {
|
||||||
p.raw = p.v;
|
p.raw = p.v;
|
||||||
p.rawt = p.t;
|
p.rawt = p.t;
|
||||||
try {
|
try {
|
||||||
@ -494,23 +494,23 @@ function parseProps(data) {
|
|||||||
if(cur && cur.length > 0) q[f] = cur[1];
|
if(cur && cur.length > 0) q[f] = cur[1];
|
||||||
});
|
});
|
||||||
|
|
||||||
if(q["HeadingPairs"] && q["TitlesOfParts"]) {
|
if(q.HeadingPairs && q.TitlesOfParts) {
|
||||||
var v = parseVector(q["HeadingPairs"]);
|
var v = parseVector(q.HeadingPairs);
|
||||||
var j = 0, widx = 0;
|
var j = 0, widx = 0;
|
||||||
for(var i = 0; i !== v.length; ++i) {
|
for(var i = 0; i !== v.length; ++i) {
|
||||||
switch(v[i].v) {
|
switch(v[i].v) {
|
||||||
case "Worksheets": widx = j; p["Worksheets"] = +v[++i]; break;
|
case "Worksheets": widx = j; p.Worksheets = +v[++i]; break;
|
||||||
case "Named Ranges": ++i; break; // TODO: Handle Named Ranges
|
case "Named Ranges": ++i; break; // TODO: Handle Named Ranges
|
||||||
default: console.error("Unrecognized key in Heading Pairs: " + v[i++].v);
|
default: console.error("Unrecognized key in Heading Pairs: " + v[i++].v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var parts = parseVector(q["TitlesOfParts"]).map(utf8read);
|
var parts = parseVector(q.TitlesOfParts).map(utf8read);
|
||||||
p["SheetNames"] = parts.slice(widx, widx + p["Worksheets"]);
|
p.SheetNames = parts.slice(widx, widx + p.Worksheets);
|
||||||
}
|
}
|
||||||
p["Creator"] = q["dc:creator"];
|
p.Creator = q["dc:creator"];
|
||||||
p["LastModifiedBy"] = q["cp:lastModifiedBy"];
|
p.LastModifiedBy = q["cp:lastModifiedBy"];
|
||||||
p["CreatedDate"] = new Date(q["dcterms:created"]);
|
p.CreatedDate = new Date(q["dcterms:created"]);
|
||||||
p["ModifiedDate"] = new Date(q["dcterms:modified"]);
|
p.ModifiedDate = new Date(q["dcterms:modified"]);
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -534,9 +534,9 @@ function parseDeps(data) {
|
|||||||
var ctext = {};
|
var ctext = {};
|
||||||
|
|
||||||
function parseCT(data) {
|
function parseCT(data) {
|
||||||
|
if(!data) return data;
|
||||||
var ct = { workbooks: [], sheets: [], calcchains: [], themes: [], styles: [],
|
var ct = { workbooks: [], sheets: [], calcchains: [], themes: [], styles: [],
|
||||||
coreprops: [], extprops: [], strs:[], xmlns: "" };
|
coreprops: [], extprops: [], strs:[], xmlns: "" };
|
||||||
if(data == null) return data;
|
|
||||||
data.match(/<[^>]*>/g).forEach(function(x) {
|
data.match(/<[^>]*>/g).forEach(function(x) {
|
||||||
var y = parsexmltag(x);
|
var y = parsexmltag(x);
|
||||||
switch(y[0]) {
|
switch(y[0]) {
|
||||||
@ -665,11 +665,11 @@ function parseWB(data) {
|
|||||||
|
|
||||||
var z;
|
var z;
|
||||||
/* defaults */
|
/* defaults */
|
||||||
for(z in WBPropsDef) if(null == wb.WBProps[z]) wb.WBProps[z] = WBPropsDef[z];
|
for(z in WBPropsDef) if(typeof wb.WBProps[z] === 'undefined') wb.WBProps[z] = WBPropsDef[z];
|
||||||
for(z in CalcPrDef) if(null == wb.CalcPr[z]) wb.CalcPr[z] = CalcPrDef[z];
|
for(z in CalcPrDef) if(typeof wb.CalcPr[z] === 'undefined') wb.CalcPr[z] = CalcPrDef[z];
|
||||||
|
|
||||||
wb.WBView.forEach(function(w){for(var z in WBViewDef) if(null==w[z]) w[z]=WBViewDef[z]; });
|
wb.WBView.forEach(function(w){for(var z in WBViewDef) if(typeof w[z] === 'undefined') w[z]=WBViewDef[z]; });
|
||||||
wb.Sheets.forEach(function(w){for(var z in SheetDef) if(null==w[z]) w[z]=SheetDef[z]; });
|
wb.Sheets.forEach(function(w){for(var z in SheetDef) if(typeof w[z] === 'undefined') w[z]=SheetDef[z]; });
|
||||||
|
|
||||||
_ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904, 'date1904');
|
_ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904, 'date1904');
|
||||||
|
|
||||||
@ -679,7 +679,7 @@ function parseWB(data) {
|
|||||||
/* 18.8.31 numFmts CT_NumFmts */
|
/* 18.8.31 numFmts CT_NumFmts */
|
||||||
function parseNumFmts(t) {
|
function parseNumFmts(t) {
|
||||||
styles.NumberFmt = [];
|
styles.NumberFmt = [];
|
||||||
for(y in SSF._table) styles.NumberFmt[y] = SSF._table[y];
|
for(var y in SSF._table) styles.NumberFmt[y] = SSF._table[y];
|
||||||
t[0].match(/<[^>]*>/g).forEach(function(x) {
|
t[0].match(/<[^>]*>/g).forEach(function(x) {
|
||||||
var y = parsexmltag(x);
|
var y = parsexmltag(x);
|
||||||
switch(y[0]) {
|
switch(y[0]) {
|
||||||
@ -725,7 +725,7 @@ function parseStyles(data) {
|
|||||||
var t;
|
var t;
|
||||||
|
|
||||||
/* numFmts CT_NumFmts ? */
|
/* numFmts CT_NumFmts ? */
|
||||||
if(t=data.match(/<numFmts([^>]*)>.*<\/numFmts>/)) parseNumFmts(t);
|
if((t=data.match(/<numFmts([^>]*)>.*<\/numFmts>/))) parseNumFmts(t);
|
||||||
|
|
||||||
/* fonts CT_Fonts ? */
|
/* fonts CT_Fonts ? */
|
||||||
/* fills CT_Fills ? */
|
/* fills CT_Fills ? */
|
||||||
@ -733,7 +733,7 @@ function parseStyles(data) {
|
|||||||
/* cellStyleXfs CT_CellStyleXfs ? */
|
/* cellStyleXfs CT_CellStyleXfs ? */
|
||||||
|
|
||||||
/* cellXfs CT_CellXfs ? */
|
/* cellXfs CT_CellXfs ? */
|
||||||
if(t=data.match(/<cellXfs([^>]*)>.*<\/cellXfs>/)) parseCXfs(t);
|
if((t=data.match(/<cellXfs([^>]*)>.*<\/cellXfs>/))) parseCXfs(t);
|
||||||
|
|
||||||
/* dxfs CT_Dxfs ? */
|
/* dxfs CT_Dxfs ? */
|
||||||
/* tableStyles CT_TableStyles ? */
|
/* tableStyles CT_TableStyles ? */
|
||||||
@ -793,7 +793,7 @@ function parseZip(zip) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var _fs, jszip;
|
var _fs, jszip;
|
||||||
if(typeof JSZip !== "undefined") jszip = JSZip;
|
if(typeof JSZip !== 'undefined') jszip = JSZip;
|
||||||
if (typeof exports !== 'undefined') {
|
if (typeof exports !== 'undefined') {
|
||||||
if (typeof module !== 'undefined' && module.exports) {
|
if (typeof module !== 'undefined' && module.exports) {
|
||||||
if(typeof jszip === 'undefined') jszip = require('./jszip').JSZip;
|
if(typeof jszip === 'undefined') jszip = require('./jszip').JSZip;
|
||||||
@ -893,7 +893,9 @@ function sheet_to_csv(sheet) {
|
|||||||
var stringify = function stringify(val) {
|
var stringify = function stringify(val) {
|
||||||
switch(val.t){
|
switch(val.t){
|
||||||
case 'n': return String(val.v);
|
case 'n': return String(val.v);
|
||||||
case 's': case 'str': return JSON.stringify(val.v);
|
case 's': case 'str':
|
||||||
|
if(typeof val.v === 'undefined') return "";
|
||||||
|
return JSON.stringify(val.v);
|
||||||
case 'b': return val.v ? "TRUE" : "FALSE";
|
case 'b': return val.v ? "TRUE" : "FALSE";
|
||||||
case 'e': return ""; /* throw out value in case of error */
|
case 'e': return ""; /* throw out value in case of error */
|
||||||
default: throw 'unrecognized type ' + val.t;
|
default: throw 'unrecognized type ' + val.t;
|
||||||
@ -916,13 +918,14 @@ function sheet_to_csv(sheet) {
|
|||||||
|
|
||||||
function get_formulae(ws) {
|
function get_formulae(ws) {
|
||||||
var cmds = [];
|
var cmds = [];
|
||||||
for(y in ws) if(y[0] !=='!' && ws.hasOwnProperty(y)) (function(y,x) {
|
for(var y in ws) if(y[0] !=='!' && ws.hasOwnProperty(y)) {
|
||||||
|
var x = ws[y];
|
||||||
var val = "";
|
var val = "";
|
||||||
if(x.f) val = x.f;
|
if(x.f) val = x.f;
|
||||||
else if(typeof x.v === 'number') val = x.v;
|
else if(typeof x.v === 'number') val = x.v;
|
||||||
else val = x.v;
|
else val = x.v;
|
||||||
cmds.push(y + "=" + val);
|
cmds.push(y + "=" + val);
|
||||||
})(y,ws[y]);
|
}
|
||||||
return cmds;
|
return cmds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user