Skip to content

Commit d616110

Browse files
committed
works minutiae
1 parent b3bc49a commit d616110

20 files changed

+184
-81
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@ tmp
1515
*.[pP][dD][fF]
1616
*.[sS][lL][kK]
1717
*.socialcalc
18-
*.[xX][lL][sSwWcCaAtTmM]
18+
*.[xX][lL][sSwWcCaAtTmMrR]
1919
*.[xX][lL][sSaAtT][xXmMbB]
2020
*.[oO][dD][sS]
2121
*.[fF][oO][dD][sS]
2222
*.[xX][mM][lL]
2323
*.[uU][oO][sS]
2424
*.[wW][kKqQbB][S1234567890]
2525
*.[qQ][pP][wW]
26+
*.[fF][mM][3tT]
2627
*.[bB][iI][fF][fF][23458]
2728
*.[rR][tT][fF]
2829
*.[eE][tT][hH]

.spelling

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,15 @@ webpack
5959
weex
6060

6161
# Other terms
62+
1.x
63+
2.x
64+
3.x
65+
4.x
66+
5.x
67+
6.x
68+
7.x
69+
8.x
70+
9.x
6271
ActiveX
6372
APIs
6473
ArrayBuffer

Makefile

Lines changed: 4 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ FLOWAUX=$(patsubst %.js,%.flow.js,$(AUXTARGETS))
2525
AUXSCPTS=xlsxworker.js
2626
FLOWTGTS=$(TARGET) $(AUXTARGETS) $(AUXSCPTS) $(MINITGT)
2727
UGLIFYOPTS=--support-ie8 -m
28-
# CLOSURE=/usr/local/lib/node_modules/google-closure-compiler/compiler.jar
28+
CLOSURE=/usr/local/lib/node_modules/google-closure-compiler/compiler.jar
2929

3030
## Main Targets
3131

@@ -73,7 +73,7 @@ DISTHDR=misc/suppress_export.js
7373
.PHONY: dist
7474
dist: dist-deps $(TARGET) bower.json ## Prepare JS files for distribution
7575
mkdir -p dist
76-
<$(TARGET) sed "s/require('stream')/{}/g;s/require('....*')/undefined/g" > dist/$(TARGET)
76+
<$(TARGET) sed "s/require('....*')/undefined/g" > dist/$(TARGET)
7777
cp LICENSE dist/
7878
uglifyjs shim.js $(UGLIFYOPTS) -o dist/shim.min.js --preamble "$$(head -n 1 bits/00_header.js)"
7979
uglifyjs $(DISTHDR) dist/$(TARGET) $(UGLIFYOPTS) -o dist/$(LIB).min.js --source-map dist/$(LIB).min.map --preamble "$$(head -n 1 bits/00_header.js)"
@@ -148,47 +148,6 @@ ctest: ## Build browser test fixtures
148148
ctestserv: ## Start a test server on port 8000
149149
@cd tests && python -mSimpleHTTPServer
150150

151-
## Demos
152-
153-
DEMOS=angular angular-new browserify requirejs rollup systemjs webpack
154-
DEMOTGTS=$(patsubst %,demo-%,$(DEMOS))
155-
.PHONY: demos
156-
demos: $(DEMOTGTS)
157-
158-
.PHONY: demo-angular
159-
demo-angular: ## Run angular demo build
160-
#make -C demos/angular
161-
@echo "start a local server and go to demos/angular/angular.html"
162-
163-
.PHONY: demo-angular-new
164-
demo-angular-new: ## Run angular 2 demo build
165-
make -C demos/angular2
166-
@echo "go to demos/angular/angular.html and run 'ng serve'"
167-
168-
.PHONY: demo-browserify
169-
demo-browserify: ## Run browserify demo build
170-
make -C demos/browserify
171-
@echo "start a local server and go to demos/browserify/browserify.html"
172-
173-
.PHONY: demo-webpack
174-
demo-webpack: ## Run webpack demo build
175-
make -C demos/webpack
176-
@echo "start a local server and go to demos/webpack/webpack.html"
177-
178-
.PHONY: demo-requirejs
179-
demo-requirejs: ## Run requirejs demo build
180-
make -C demos/requirejs
181-
@echo "start a local server and go to demos/requirejs/requirejs.html"
182-
183-
.PHONY: demo-rollup
184-
demo-rollup: ## Run rollup demo build
185-
make -C demos/rollup
186-
@echo "start a local server and go to demos/rollup/rollup.html"
187-
188-
.PHONY: demo-systemjs
189-
demo-systemjs: ## Run systemjs demo build
190-
make -C demos/systemjs
191-
192151
## Code Checking
193152

194153
.PHONY: fullint
@@ -197,7 +156,7 @@ fullint: lint mdlint ## Run all checks (removed: old-lint, tslint, flow)
197156
.PHONY: lint
198157
lint: $(TARGET) $(AUXTARGETS) ## Run eslint checks
199158
@./node_modules/.bin/eslint --ext .js,.njs,.json,.html,.htm $(TARGET) $(AUXTARGETS) $(CMDS) $(HTMLLINT) package.json bower.json
200-
if [ -n "$(CLOSURE-)" ] && [ -e "${CLOSURE}" ]; then java -jar $(CLOSURE) $(REQS) $(FLOWTARGET) --jscomp_warning=reportUnknownTypes >/dev/null; fi
159+
@if [ -x "$(CLOSURE)" ]; then java -jar $(CLOSURE) $(REQS) $(FLOWTARGET) --jscomp_warning=reportUnknownTypes >/dev/null; fi
201160

202161
.PHONY: old-lint
203162
old-lint: $(TARGET) $(AUXTARGETS) ## Run jshint and jscs checks
@@ -206,7 +165,7 @@ old-lint: $(TARGET) $(AUXTARGETS) ## Run jshint and jscs checks
206165
@./node_modules/.bin/jshint --show-non-errors package.json bower.json test.js
207166
@./node_modules/.bin/jshint --show-non-errors --extract=always $(HTMLLINT)
208167
@./node_modules/.bin/jscs $(TARGET) $(AUXTARGETS) test.js
209-
if [ -e $(CLOSURE) ]; then java -jar $(CLOSURE) $(REQS) $(FLOWTARGET) --jscomp_warning=reportUnknownTypes >/dev/null; fi
168+
@if [ -x "$(CLOSURE)" ]; then java -jar $(CLOSURE) $(REQS) $(FLOWTARGET) --jscomp_warning=reportUnknownTypes >/dev/null; fi
210169

211170
.PHONY: tslint
212171
tslint: $(TARGET) ## Run typescript checks

bin/xlsx.njs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
var n = "xlsx";
66
var X = require('../');
77
try { X = require('../xlsx.flow'); } catch(e) {}
8-
require('exit-on-epipe');
8+
try { require('exit-on-epipe'); } catch(e) {}
99
var fs = require('fs'), program;
1010
try { program = require('commander'); } catch(e) {
1111
[

bits/31_rels.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ function parse_rels(data/*:?string*/, currentFilePath/*:string*/) {
3030
var y = parsexmltag(x);
3131
/* 9.3.2.2 OPC_Relationships */
3232
if (y[0] === '<Relationship') {
33-
var rel = {}; rel.Type = y.Type; rel.Target = y.Target; rel.Id = y.Id; rel.TargetMode = y.TargetMode;
33+
var rel = {}; rel.Type = y.Type; rel.Target = y.Target; rel.Id = y.Id; if(y.TargetMode) rel.TargetMode = y.TargetMode;
3434
var canonictarget = y.TargetMode === 'External' ? y.Target : resolve_path(y.Target, currentFilePath);
3535
rels[canonictarget] = rel;
3636
hash[y.Id] = rel;

bits/39_xlsbiff.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,9 @@ function parse_Lbl(blob, length, opts) {
701701
var name = parse_XLUnicodeStringNoCch(blob, cch, opts);
702702
if(flags & 0x20) name = XLSLblBuiltIn[name.charCodeAt(0)];
703703
var npflen = target - blob.l; if(opts && opts.biff == 2) --npflen;
704+
/*jshint -W018 */
704705
var rgce = (target == blob.l || cce === 0 || !(npflen > 0)) ? [] : parse_NameParsedFormula(blob, npflen, opts, cce);
706+
/*jshint +W018 */
705707
return {
706708
chKey: chKey,
707709
Name: name,

bits/41_lotus.js

Lines changed: 79 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,18 @@ var WK_ = /*#__PURE__*/ (function() {
2828
if(!d) return d;
2929
var o = opts || {};
3030
if(DENSE != null && o.dense == null) o.dense = DENSE;
31-
var s/*:Worksheet*/ = ((o.dense ? [] : {})/*:any*/), n = "Sheet1", sidx = 0;
32-
var sheets = {}, snames = [n], realnames = [];
31+
var s/*:Worksheet*/ = ((o.dense ? [] : {})/*:any*/), n = "Sheet1", next_n = "", sidx = 0;
32+
var sheets = {}, snames = [], realnames = [];
3333

3434
var refguess = {s: {r:0, c:0}, e: {r:0, c:0} };
3535
var sheetRows = o.sheetRows || 0;
3636

37+
if(d[2] == 0x00) {
38+
if(d[3] == 0x08 || d[3] == 0x09) {
39+
if(d.length >= 16 && d[14] == 0x05 && d[15] === 0x6c) throw new Error("Unsupported Works 3 for Mac file");
40+
}
41+
}
42+
3743
if(d[2] == 0x02) {
3844
o.Enum = WK1Enum;
3945
lotushopper(d, function(val, R, RT) { switch(RT) {
@@ -42,6 +48,8 @@ var WK_ = /*#__PURE__*/ (function() {
4248
if(val >= 0x1000) o.qpro = true;
4349
break;
4450
case 0x06: refguess = val; break; /* RANGE */
51+
case 0xCC: if(val) next_n = val; break; /* SHEETNAMECS */
52+
case 0xDE: next_n = val; break; /* SHEETNAMELP */
4553
case 0x0F: /* LABEL */
4654
case 0x33: /* STRING */
4755
if(!o.qpro) val[1].v = val[1].v.slice(1);
@@ -54,6 +62,18 @@ var WK_ = /*#__PURE__*/ (function() {
5462
val[1].z = o.dateNF || SSF._table[14];
5563
if(o.cellDates) { val[1].t = 'd'; val[1].v = numdate(val[1].v); }
5664
}
65+
66+
if(o.qpro) {
67+
if(val[3] > sidx) {
68+
s["!ref"] = encode_range(refguess);
69+
sheets[n] = s;
70+
snames.push(n);
71+
s = (o.dense ? [] : {});
72+
refguess = {s: {r:0, c:0}, e: {r:0, c:0} };
73+
sidx = val[3]; n = next_n || "Sheet" + (sidx + 1); next_n = "";
74+
}
75+
}
76+
5777
var tmpcell = o.dense ? (s[val[0].r]||[])[val[0].c] : s[encode_cell(val[0])];
5878
if(tmpcell) {
5979
tmpcell.t = val[1].t; tmpcell.v = val[1].v;
@@ -72,6 +92,7 @@ var WK_ = /*#__PURE__*/ (function() {
7292
o.Enum = WK3Enum;
7393
if(d[2] == 0x0E) { o.qpro = true; d.l = 0; }
7494
lotushopper(d, function(val, R, RT) { switch(RT) {
95+
case 0xCC: n = val; break; /* SHEETNAMECS */
7596
case 0x16: /* LABEL16 */
7697
val[1].v = val[1].v.slice(1);
7798
/* falls through */
@@ -84,10 +105,10 @@ var WK_ = /*#__PURE__*/ (function() {
84105
if(val[3] > sidx) {
85106
s["!ref"] = encode_range(refguess);
86107
sheets[n] = s;
108+
snames.push(n);
87109
s = (o.dense ? [] : {});
88110
refguess = {s: {r:0, c:0}, e: {r:0, c:0} };
89111
sidx = val[3]; n = "Sheet" + (sidx + 1);
90-
snames.push(n);
91112
}
92113
if(sheetRows > 0 && val[0].r >= sheetRows) break;
93114
if(o.dense) {
@@ -100,17 +121,23 @@ var WK_ = /*#__PURE__*/ (function() {
100121
case 0x1B: /* XFORMAT */
101122
if(val[0x36b0]) realnames[val[0x36b0][0]] = val[0x36b0][1];
102123
break;
124+
case 0x0601: /* SHEETINFOQP */
125+
realnames[val[0]] = val[1]; if(val[0] == sidx) n = val[1]; break;
103126
default: break;
104127
}}, o);
105128
} else throw new Error("Unrecognized LOTUS BOF " + d[2]);
106-
107129
s["!ref"] = encode_range(refguess);
108-
sheets[n] = s;
130+
sheets[next_n || n] = s;
131+
snames.push(next_n || n);
109132
if(!realnames.length) return { SheetNames: snames, Sheets: sheets };
110133
var osheets = {}, rnames = [];
134+
/* TODO: verify no collisions */
111135
for(var i = 0; i < realnames.length; ++i) if(sheets[snames[i]]) {
136+
rnames.push(realnames[i] || snames[i]);
137+
osheets[realnames[i]] = sheets[realnames[i]] || sheets[snames[i]];
138+
} else {
112139
rnames.push(realnames[i]);
113-
osheets[realnames[i]] = sheets[snames[i]];
140+
osheets[realnames[i]] = ({ "!ref": "A1" });
114141
}
115142
return { SheetNames: rnames, Sheets: osheets };
116143
}
@@ -126,7 +153,8 @@ var WK_ = /*#__PURE__*/ (function() {
126153

127154
write_biff_rec(ba, 0x00, write_BOF_WK1(0x0406));
128155
write_biff_rec(ba, 0x06, write_RANGE(range));
129-
for(var R = range.s.r; R <= range.e.r; ++R) {
156+
var max_R = Math.min(range.e.r, 8191);
157+
for(var R = range.s.r; R <= max_R; ++R) {
130158
var rr = encode_row(R);
131159
for(var C = range.s.c; C <= range.e.c; ++C) {
132160
if(R === range.s.r) cols[C] = encode_col(C);
@@ -165,7 +193,8 @@ var WK_ = /*#__PURE__*/ (function() {
165193
var range = safe_decode_range(ws["!ref"]);
166194
var dense = Array.isArray(ws);
167195
var cols = [];
168-
for(var R = range.s.r; R <= range.e.r; ++R) {
196+
var max_R = Math.min(range.e.r, 8191);
197+
for(var R = range.s.r; R <= max_R; ++R) {
169198
var rr = encode_row(R);
170199
for(var C = range.s.c; C <= range.e.c; ++C) {
171200
if(R === range.s.r) cols[C] = encode_col(C);
@@ -211,6 +240,7 @@ var WK_ = /*#__PURE__*/ (function() {
211240
if(rows < range.e.r) rows = range.e.r;
212241
if(cols < range.e.c) cols = range.e.c;
213242
}
243+
if(rows > 8191) rows = 8191;
214244
out.write_shift(2, rows);
215245
out.write_shift(1, wscnt);
216246
out.write_shift(1, cols);
@@ -223,12 +253,23 @@ var WK_ = /*#__PURE__*/ (function() {
223253
return out;
224254
}
225255

226-
function parse_RANGE(blob) {
256+
function parse_RANGE(blob, length, opts) {
227257
var o = {s:{c:0,r:0},e:{c:0,r:0}};
258+
if(length == 8 && opts.qpro) {
259+
o.s.c = blob.read_shift(1);
260+
blob.l++;
261+
o.s.r = blob.read_shift(2);
262+
o.e.c = blob.read_shift(1);
263+
blob.l++;
264+
o.e.r = blob.read_shift(2);
265+
return o;
266+
}
228267
o.s.c = blob.read_shift(2);
229268
o.s.r = blob.read_shift(2);
269+
if(length == 12 && opts.qpro) blob.l += 2;
230270
o.e.c = blob.read_shift(2);
231271
o.e.r = blob.read_shift(2);
272+
if(length == 12 && opts.qpro) blob.l += 2;
232273
if(o.s.c == 0xFFFF) o.s.c = o.e.c = o.s.r = o.e.r = 0;
233274
return o;
234275
}
@@ -242,10 +283,10 @@ var WK_ = /*#__PURE__*/ (function() {
242283
}
243284

244285
function parse_cell(blob, length, opts) {
245-
var o = [{c:0,r:0}, {t:'n',v:0}, 0];
286+
var o = [{c:0,r:0}, {t:'n',v:0}, 0, 0];
246287
if(opts.qpro && opts.vers != 0x5120) {
247288
o[0].c = blob.read_shift(1);
248-
blob.l++;
289+
o[3] = blob.read_shift(1);
249290
o[0].r = blob.read_shift(2);
250291
blob.l+=2;
251292
} else {
@@ -357,7 +398,7 @@ var WK_ = /*#__PURE__*/ (function() {
357398

358399
function wk1_fmla_to_csf(blob, o) {
359400
prep_blob(blob, 0);
360-
var out = [], argc = 0, R = "", C = "";
401+
var out = [], argc = 0, R = "", C = "", argL = "", argR = "";
361402
while(blob.l < blob.length) {
362403
var cc = blob[blob.l++];
363404
switch(cc) {
@@ -390,7 +431,7 @@ var WK_ = /*#__PURE__*/ (function() {
390431
case 0x16: out.push("NOT(" + out.pop() + ")"); break;
391432

392433
case 0x14: case 0x15: {
393-
var argR = out.pop(), argL = out.pop();
434+
argR = out.pop(); argL = out.pop();
394435
out.push(["AND", "OR"][cc - 0x14] + "(" + argL + "," + argR + ")");
395436
} break;
396437

@@ -536,6 +577,27 @@ var WK_ = /*#__PURE__*/ (function() {
536577
return o;
537578
}
538579

580+
function parse_SHEETNAMECS(blob, length) {
581+
return blob[blob.l + length - 1] == 0 ? blob.read_shift(length, 'cstr') : "";
582+
}
583+
584+
function parse_SHEETNAMELP(blob, length) {
585+
var len = blob[blob.l++];
586+
if(len > length - 1) len = length - 1;
587+
var o = ""; while(o.length < len) o += String.fromCharCode(blob[blob.l++]);
588+
return o;
589+
}
590+
591+
function parse_SHEETINFOQP(blob, length, opts) {
592+
if(!opts.qpro || length < 21) return;
593+
var id = blob.read_shift(1);
594+
blob.l += 17;
595+
var len = blob.read_shift(1);
596+
blob.l += 2;
597+
var nm = blob.read_shift(length - 21, 'cstr');
598+
return [id, nm];
599+
}
600+
539601
function parse_XFORMAT(blob, length) {
540602
var o = {}, tgt = blob.l + length;
541603
while(blob.l < tgt) {
@@ -623,6 +685,8 @@ var WK_ = /*#__PURE__*/ (function() {
623685
/*::[*/0x0067/*::]*/: { n:"RRANGES??" },
624686
/*::[*/0x0068/*::]*/: { n:"FNAME??" },
625687
/*::[*/0x0069/*::]*/: { n:"MRANGES??" },
688+
/*::[*/0x00CC/*::]*/: { n:"SHEETNAMECS", f:parse_SHEETNAMECS },
689+
/*::[*/0x00DE/*::]*/: { n:"SHEETNAMELP", f:parse_SHEETNAMELP },
626690
/*::[*/0xFFFF/*::]*/: { n:"" }
627691
};
628692

@@ -688,6 +752,7 @@ var WK_ = /*#__PURE__*/ (function() {
688752
/*::[*/0x00BC/*::]*/: { n:"??" },
689753
/*::[*/0x00C3/*::]*/: { n:"??" },
690754
/*::[*/0x00C9/*::]*/: { n:"??" },
755+
/*::[*/0x00CC/*::]*/: { n:"SHEETNAMECS", f:parse_SHEETNAMECS },
691756
/*::[*/0x00CD/*::]*/: { n:"??" },
692757
/*::[*/0x00CE/*::]*/: { n:"??" },
693758
/*::[*/0x00CF/*::]*/: { n:"??" },
@@ -732,6 +797,7 @@ var WK_ = /*#__PURE__*/ (function() {
732797
/*::[*/0x029A/*::]*/: { n:"??" },
733798
/*::[*/0x0300/*::]*/: { n:"??" },
734799
/*::[*/0x0304/*::]*/: { n:"??" },
800+
/*::[*/0x0601/*::]*/: { n:"SHEETINFOQP", f:parse_SHEETINFOQP },
735801
/*::[*/0x0640/*::]*/: { n:"??" },
736802
/*::[*/0x0642/*::]*/: { n:"??" },
737803
/*::[*/0x0701/*::]*/: { n:"??" },

bits/76_xls.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,9 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
855855
if(!options.bookSheets) wb.Sheets=Sheets;
856856
if(!wb.SheetNames.length && Preamble["!ref"]) {
857857
wb.SheetNames.push("Sheet1");
858+
/*jshint -W069 */
858859
if(wb.Sheets) wb.Sheets["Sheet1"] = Preamble;
860+
/*jshint +W069 */
859861
} else wb.Preamble=Preamble;
860862
if(wb.Sheets) FilterDatabases.forEach(function(r,i) { wb.Sheets[wb.SheetNames[i]]['!autofilter'] = r; });
861863
wb.Strings = sst;
@@ -950,6 +952,8 @@ else/*:: if(cfb instanceof CFBContainer) */ {
950952
else if((_data=CFB.find(cfb, 'PerfectOffice_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));
951953
/* Quattro Pro 9 */
952954
else if((_data=CFB.find(cfb, 'NativeContent_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));
955+
/* Works 4 for Mac */
956+
else if((_data=CFB.find(cfb, 'MN0')) && _data.content) throw new Error("Unsupported Works 4 for Mac file");
953957
else throw new Error("Cannot find Workbook stream");
954958
if(options.bookVBA && cfb.FullPaths && CFB.find(cfb, '/_VBA_PROJECT_CUR/VBA/dir')) WorkbookP.vbaraw = make_vba_xls(cfb);
955959
}

0 commit comments

Comments
 (0)