jshint passes

This commit is contained in:
SheetJS 2013-04-16 21:32:20 -04:00
parent c5c3eebb09
commit 247fd22c06
4 changed files with 88 additions and 82 deletions

View File

@ -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);}
/* Options */
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;
opts_fmt.date1904 = 0;
opts_fmt.output = ""
opts_fmt.output = "";
opts_fmt.mode = "";
var table_fmt = {
1: '0',
@ -62,17 +62,17 @@ var months = [
['S', 'Sep', 'September'],
['O', 'Oct', 'October'],
['N', 'Nov', 'November'],
['D', 'Dec', 'December'],
['D', 'Dec', 'December']
];
var general_fmt = function(v) {
if(typeof v === 'boolean') return v ? "TRUE" : "FALSE";
}
};
SSF._general = general_fmt;
var parse_date_code = function parse_date_code(v,opts) {
var date = Math.floor(v), time = Math.round(86400 * (v - date)), dow=0;
var dout=[], out={D:date, T:time}; fixopts(opts = (opts||{}));
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 {
if(date > 60) --date;
/* 1 = Jan 1 1900 */
@ -95,7 +95,7 @@ var write_date = function(type, fmt, val) {
case 'y': switch(fmt) { /* year */
case 'y': case 'yy': return pad(val.y % 100,2);
default: return val.y;
}; break;
} break;
case 'm': switch(fmt) { /* month */
case 'm': return val.m;
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 'mmmmm': return months[val.m-1][0];
default: throw 'bad month format: ' + fmt;
}; break;
} break;
case 'd': switch(fmt) { /* day */
case 'd': return val.d;
case 'dd': return pad(val.d,2);
case 'ddd': return days[val.q][0];
case 'dddd': return days[val.q][1];
default: throw 'bad day format: ' + fmt;
}; break;
} break;
case 'h': switch(fmt) { /* 12-hour */
case 'h': return 1+(val.H+11)%12;
case 'hh': return pad(1+(val.H+11)%12, 2);
default: throw 'bad hour format: ' + fmt;
}; break;
} break;
case 'H': switch(fmt) { /* 24-hour */
case 'h': return val.H;
case 'hh': return pad(val.H, 2);
default: throw 'bad hour format: ' + fmt;
}; break;
} break;
case 'M': switch(fmt) { /* minutes */
case 'm': return val.M;
case 'mm': return pad(val.M, 2);
default: throw 'bad minute format: ' + fmt;
}; break;
} break;
case 's': switch(fmt) { /* seconds */
case 's': return val.S;
case 'ss': return pad(val.S, 2);
default: throw 'bad second format: ' + fmt;
}; break;
} break;
/* TODO: handle the ECMA spec format ee -> yy */
case 'e': { return val.y; } break;
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) {
var out = [], o = "", i = 0, c = "", lst='t', q = {}, dt;
fixopts(opts = (opts || {}));
var hr='H'
var hr='H';
/* Tokenize */
while(i < fmt.length) {
switch(c = fmt[i]) {
switch((c = fmt[i])) {
case '"': /* Literal text */
for(o="";fmt[++i] !== '"';) o += fmt[(fmt[i] === '\\' ? ++i : i)];
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;
case 'A':
q={t:c,v:"A"};
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' }
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 q.t = "t";
out.push(q); lst = c; break;
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;
function choose_fmt(fmt, v) {
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];
}
@ -211,7 +211,7 @@ var format = function format(fmt,v,o) {
if(typeof fmt === 'number') fmt = table_fmt[fmt];
var f = choose_fmt(fmt, v, o);
return eval_fmt(f, v, o);
}
};
SSF._choose = choose_fmt;
SSF._table = table_fmt;

View File

@ -186,7 +186,7 @@ function parseSheet(data) {
/* formatting */
if(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.rawt = p.t;
try {
@ -270,23 +270,23 @@ function parseProps(data) {
if(cur && cur.length > 0) q[f] = cur[1];
});
if(q["HeadingPairs"] && q["TitlesOfParts"]) {
var v = parseVector(q["HeadingPairs"]);
if(q.HeadingPairs && q.TitlesOfParts) {
var v = parseVector(q.HeadingPairs);
var j = 0, widx = 0;
for(var i = 0; i !== v.length; ++i) {
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
default: console.error("Unrecognized key in Heading Pairs: " + v[i++].v);
}
}
var parts = parseVector(q["TitlesOfParts"]).map(utf8read);
p["SheetNames"] = parts.slice(widx, widx + p["Worksheets"]);
var parts = parseVector(q.TitlesOfParts).map(utf8read);
p.SheetNames = parts.slice(widx, widx + p.Worksheets);
}
p["Creator"] = q["dc:creator"];
p["LastModifiedBy"] = q["cp:lastModifiedBy"];
p["CreatedDate"] = new Date(q["dcterms:created"]);
p["ModifiedDate"] = new Date(q["dcterms:modified"]);
p.Creator = q["dc:creator"];
p.LastModifiedBy = q["cp:lastModifiedBy"];
p.CreatedDate = new Date(q["dcterms:created"]);
p.ModifiedDate = new Date(q["dcterms:modified"]);
return p;
}
@ -310,9 +310,9 @@ function parseDeps(data) {
var ctext = {};
function parseCT(data) {
if(!data) return data;
var ct = { workbooks: [], sheets: [], calcchains: [], themes: [], styles: [],
coreprops: [], extprops: [], strs:[], xmlns: "" };
if(data == null) return data;
data.match(/<[^>]*>/g).forEach(function(x) {
var y = parsexmltag(x);
switch(y[0]) {
@ -441,11 +441,11 @@ function parseWB(data) {
var z;
/* defaults */
for(z in WBPropsDef) if(null == wb.WBProps[z]) wb.WBProps[z] = WBPropsDef[z];
for(z in CalcPrDef) if(null == wb.CalcPr[z]) wb.CalcPr[z] = CalcPrDef[z];
for(z in WBPropsDef) if(typeof wb.WBProps[z] === 'undefined') wb.WBProps[z] = WBPropsDef[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.Sheets.forEach(function(w){for(var z in SheetDef) if(null==w[z]) w[z]=SheetDef[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(typeof w[z] === 'undefined') w[z]=SheetDef[z]; });
_ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904, 'date1904');
@ -455,7 +455,7 @@ function parseWB(data) {
/* 18.8.31 numFmts CT_NumFmts */
function parseNumFmts(t) {
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) {
var y = parsexmltag(x);
switch(y[0]) {
@ -501,7 +501,7 @@ function parseStyles(data) {
var t;
/* numFmts CT_NumFmts ? */
if(t=data.match(/<numFmts([^>]*)>.*<\/numFmts>/)) parseNumFmts(t);
if((t=data.match(/<numFmts([^>]*)>.*<\/numFmts>/))) parseNumFmts(t);
/* fonts CT_Fonts ? */
/* fills CT_Fills ? */
@ -509,7 +509,7 @@ function parseStyles(data) {
/* cellStyleXfs CT_CellStyleXfs ? */
/* cellXfs CT_CellXfs ? */
if(t=data.match(/<cellXfs([^>]*)>.*<\/cellXfs>/)) parseCXfs(t);
if((t=data.match(/<cellXfs([^>]*)>.*<\/cellXfs>/))) parseCXfs(t);
/* dxfs CT_Dxfs ? */
/* tableStyles CT_TableStyles ? */
@ -569,7 +569,7 @@ function parseZip(zip) {
}
var _fs, jszip;
if(typeof JSZip !== "undefined") jszip = JSZip;
if(typeof JSZip !== 'undefined') jszip = JSZip;
if (typeof exports !== 'undefined') {
if (typeof module !== 'undefined' && module.exports) {
if(typeof jszip === 'undefined') jszip = require('./jszip').JSZip;

View File

@ -66,7 +66,9 @@ function sheet_to_csv(sheet) {
var stringify = function stringify(val) {
switch(val.t){
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 'e': return ""; /* throw out value in case of error */
default: throw 'unrecognized type ' + val.t;
@ -89,13 +91,14 @@ function sheet_to_csv(sheet) {
function get_formulae(ws) {
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 = "";
if(x.f) val = x.f;
else if(typeof x.v === 'number') val = x.v;
else val = x.v;
cmds.push(y + "=" + val);
})(y,ws[y]);
}
return cmds;
}

85
xlsx.js
View File

@ -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);}
/* Options */
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;
opts_fmt.date1904 = 0;
opts_fmt.output = ""
opts_fmt.output = "";
opts_fmt.mode = "";
var table_fmt = {
1: '0',
@ -64,17 +64,17 @@ var months = [
['S', 'Sep', 'September'],
['O', 'Oct', 'October'],
['N', 'Nov', 'November'],
['D', 'Dec', 'December'],
['D', 'Dec', 'December']
];
var general_fmt = function(v) {
if(typeof v === 'boolean') return v ? "TRUE" : "FALSE";
}
};
SSF._general = general_fmt;
var parse_date_code = function parse_date_code(v,opts) {
var date = Math.floor(v), time = Math.round(86400 * (v - date)), dow=0;
var dout=[], out={D:date, T:time}; fixopts(opts = (opts||{}));
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 {
if(date > 60) --date;
/* 1 = Jan 1 1900 */
@ -97,7 +97,7 @@ var write_date = function(type, fmt, val) {
case 'y': switch(fmt) { /* year */
case 'y': case 'yy': return pad(val.y % 100,2);
default: return val.y;
}; break;
} break;
case 'm': switch(fmt) { /* month */
case 'm': return val.m;
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 'mmmmm': return months[val.m-1][0];
default: throw 'bad month format: ' + fmt;
}; break;
} break;
case 'd': switch(fmt) { /* day */
case 'd': return val.d;
case 'dd': return pad(val.d,2);
case 'ddd': return days[val.q][0];
case 'dddd': return days[val.q][1];
default: throw 'bad day format: ' + fmt;
}; break;
} break;
case 'h': switch(fmt) { /* 12-hour */
case 'h': return 1+(val.H+11)%12;
case 'hh': return pad(1+(val.H+11)%12, 2);
default: throw 'bad hour format: ' + fmt;
}; break;
} break;
case 'H': switch(fmt) { /* 24-hour */
case 'h': return val.H;
case 'hh': return pad(val.H, 2);
default: throw 'bad hour format: ' + fmt;
}; break;
} break;
case 'M': switch(fmt) { /* minutes */
case 'm': return val.M;
case 'mm': return pad(val.M, 2);
default: throw 'bad minute format: ' + fmt;
}; break;
} break;
case 's': switch(fmt) { /* seconds */
case 's': return val.S;
case 'ss': return pad(val.S, 2);
default: throw 'bad second format: ' + fmt;
}; break;
} break;
/* TODO: handle the ECMA spec format ee -> yy */
case 'e': { return val.y; } break;
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) {
var out = [], o = "", i = 0, c = "", lst='t', q = {}, dt;
fixopts(opts = (opts || {}));
var hr='H'
var hr='H';
/* Tokenize */
while(i < fmt.length) {
switch(c = fmt[i]) {
switch((c = fmt[i])) {
case '"': /* Literal text */
for(o="";fmt[++i] !== '"';) o += fmt[(fmt[i] === '\\' ? ++i : i)];
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;
case 'A':
q={t:c,v:"A"};
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' }
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 q.t = "t";
out.push(q); lst = c; break;
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;
function choose_fmt(fmt, v) {
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];
}
@ -213,7 +213,7 @@ var format = function format(fmt,v,o) {
if(typeof fmt === 'number') fmt = table_fmt[fmt];
var f = choose_fmt(fmt, v, o);
return eval_fmt(f, v, o);
}
};
SSF._choose = choose_fmt;
SSF._table = table_fmt;
@ -410,7 +410,7 @@ function parseSheet(data) {
/* formatting */
if(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.rawt = p.t;
try {
@ -494,23 +494,23 @@ function parseProps(data) {
if(cur && cur.length > 0) q[f] = cur[1];
});
if(q["HeadingPairs"] && q["TitlesOfParts"]) {
var v = parseVector(q["HeadingPairs"]);
if(q.HeadingPairs && q.TitlesOfParts) {
var v = parseVector(q.HeadingPairs);
var j = 0, widx = 0;
for(var i = 0; i !== v.length; ++i) {
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
default: console.error("Unrecognized key in Heading Pairs: " + v[i++].v);
}
}
var parts = parseVector(q["TitlesOfParts"]).map(utf8read);
p["SheetNames"] = parts.slice(widx, widx + p["Worksheets"]);
var parts = parseVector(q.TitlesOfParts).map(utf8read);
p.SheetNames = parts.slice(widx, widx + p.Worksheets);
}
p["Creator"] = q["dc:creator"];
p["LastModifiedBy"] = q["cp:lastModifiedBy"];
p["CreatedDate"] = new Date(q["dcterms:created"]);
p["ModifiedDate"] = new Date(q["dcterms:modified"]);
p.Creator = q["dc:creator"];
p.LastModifiedBy = q["cp:lastModifiedBy"];
p.CreatedDate = new Date(q["dcterms:created"]);
p.ModifiedDate = new Date(q["dcterms:modified"]);
return p;
}
@ -534,9 +534,9 @@ function parseDeps(data) {
var ctext = {};
function parseCT(data) {
if(!data) return data;
var ct = { workbooks: [], sheets: [], calcchains: [], themes: [], styles: [],
coreprops: [], extprops: [], strs:[], xmlns: "" };
if(data == null) return data;
data.match(/<[^>]*>/g).forEach(function(x) {
var y = parsexmltag(x);
switch(y[0]) {
@ -665,11 +665,11 @@ function parseWB(data) {
var z;
/* defaults */
for(z in WBPropsDef) if(null == wb.WBProps[z]) wb.WBProps[z] = WBPropsDef[z];
for(z in CalcPrDef) if(null == wb.CalcPr[z]) wb.CalcPr[z] = CalcPrDef[z];
for(z in WBPropsDef) if(typeof wb.WBProps[z] === 'undefined') wb.WBProps[z] = WBPropsDef[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.Sheets.forEach(function(w){for(var z in SheetDef) if(null==w[z]) w[z]=SheetDef[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(typeof w[z] === 'undefined') w[z]=SheetDef[z]; });
_ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904, 'date1904');
@ -679,7 +679,7 @@ function parseWB(data) {
/* 18.8.31 numFmts CT_NumFmts */
function parseNumFmts(t) {
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) {
var y = parsexmltag(x);
switch(y[0]) {
@ -725,7 +725,7 @@ function parseStyles(data) {
var t;
/* numFmts CT_NumFmts ? */
if(t=data.match(/<numFmts([^>]*)>.*<\/numFmts>/)) parseNumFmts(t);
if((t=data.match(/<numFmts([^>]*)>.*<\/numFmts>/))) parseNumFmts(t);
/* fonts CT_Fonts ? */
/* fills CT_Fills ? */
@ -733,7 +733,7 @@ function parseStyles(data) {
/* cellStyleXfs CT_CellStyleXfs ? */
/* cellXfs CT_CellXfs ? */
if(t=data.match(/<cellXfs([^>]*)>.*<\/cellXfs>/)) parseCXfs(t);
if((t=data.match(/<cellXfs([^>]*)>.*<\/cellXfs>/))) parseCXfs(t);
/* dxfs CT_Dxfs ? */
/* tableStyles CT_TableStyles ? */
@ -793,7 +793,7 @@ function parseZip(zip) {
}
var _fs, jszip;
if(typeof JSZip !== "undefined") jszip = JSZip;
if(typeof JSZip !== 'undefined') jszip = JSZip;
if (typeof exports !== 'undefined') {
if (typeof module !== 'undefined' && module.exports) {
if(typeof jszip === 'undefined') jszip = require('./jszip').JSZip;
@ -893,7 +893,9 @@ function sheet_to_csv(sheet) {
var stringify = function stringify(val) {
switch(val.t){
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 'e': return ""; /* throw out value in case of error */
default: throw 'unrecognized type ' + val.t;
@ -916,13 +918,14 @@ function sheet_to_csv(sheet) {
function get_formulae(ws) {
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 = "";
if(x.f) val = x.f;
else if(typeof x.v === 'number') val = x.v;
else val = x.v;
cmds.push(y + "=" + val);
})(y,ws[y]);
}
return cmds;
}