Skip to content

Commit 7149728

Browse files
committed
version bump 0.12.4: zip cleanup
- PK magic number bound (fixes SheetJS#1013 h/t @wlpeter) - removed JSZip conflict (fixes SheetJS#1017 h/t @seanmars) - updated CFB to 1.0.5 - demo HTML conversion `string`
1 parent 5dd16ae commit 7149728

36 files changed

+322
-254
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ This log is intended to keep track of backwards-incompatible changes, including
44
but not limited to API changes and file location changes. Minor behavioral
55
changes may not be included if they are not expected to break existing code.
66

7+
## 0.12.4 (2018-03-04)
8+
9+
* `JSZip` renamed to `JSZipSync`
10+
711
## 0.12.0 (2018-02-08)
812

913
* Extendscript target script in NPM package

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ tslint: $(TARGET) ## Run typescript checks
192192

193193
.PHONY: flow
194194
flow: lint ## Run flow checker
195-
@flow check --all --show-all-errors
195+
@flow check --all --show-all-errors --include-warnings
196196

197197
.PHONY: cov
198198
cov: misc/coverage.html ## Run coverage test

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1720,7 +1720,7 @@ expected number of rows or columns. Extracting the range is extremely simple:
17201720

17211721
```js
17221722
var range = XLSX.utils.decode_range(worksheet['!ref']);
1723-
var ncols = range.e.c - range.r.c + 1, nrows = range.e.r - range.s.r + 1;
1723+
var ncols = range.e.c - range.s.c + 1, nrows = range.e.r - range.s.r + 1;
17241724
```
17251725

17261726
</details>

bits/01_version.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
XLSX.version = '0.12.3';
1+
XLSX.version = '0.12.4';

bits/04_base64.js

+13-10
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ var Base64 = (function make_b64(){
66
var c1=0, c2=0, c3=0, e1=0, e2=0, e3=0, e4=0;
77
for(var i = 0; i < input.length; ) {
88
c1 = input.charCodeAt(i++);
9+
e1 = (c1 >> 2);
10+
911
c2 = input.charCodeAt(i++);
10-
c3 = input.charCodeAt(i++);
11-
e1 = c1 >> 2;
1212
e2 = ((c1 & 3) << 4) | (c2 >> 4);
13+
14+
c3 = input.charCodeAt(i++);
1315
e3 = ((c2 & 15) << 2) | (c3 >> 6);
14-
e4 = c3 & 63;
16+
e4 = (c3 & 63);
1517
if (isNaN(c2)) { e3 = e4 = 64; }
1618
else if (isNaN(c3)) { e4 = 64; }
1719
o += map.charAt(e1) + map.charAt(e2) + map.charAt(e3) + map.charAt(e4);
@@ -20,19 +22,20 @@ var Base64 = (function make_b64(){
2022
},
2123
decode: function b64_decode(input/*:string*/)/*:string*/ {
2224
var o = "";
23-
var c1=0, c2=0, c3=0;
24-
var e1=0, e2=0, e3=0, e4=0;
25-
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
25+
var c1=0, c2=0, c3=0, e1=0, e2=0, e3=0, e4=0;
26+
input = input.replace(/[^\w\+\/\=]/g, "");
2627
for(var i = 0; i < input.length;) {
2728
e1 = map.indexOf(input.charAt(i++));
2829
e2 = map.indexOf(input.charAt(i++));
29-
e3 = map.indexOf(input.charAt(i++));
30-
e4 = map.indexOf(input.charAt(i++));
3130
c1 = (e1 << 2) | (e2 >> 4);
32-
c2 = ((e2 & 15) << 4) | (e3 >> 2);
33-
c3 = ((e3 & 3) << 6) | e4;
3431
o += String.fromCharCode(c1);
32+
33+
e3 = map.indexOf(input.charAt(i++));
34+
c2 = ((e2 & 15) << 4) | (e3 >> 2);
3535
if (e3 !== 64) { o += String.fromCharCode(c2); }
36+
37+
e4 = map.indexOf(input.charAt(i++));
38+
c3 = ((e3 & 3) << 6) | e4;
3639
if (e4 !== 64) { o += String.fromCharCode(c3); }
3740
}
3841
return o;

bits/18_cfb.js

+9-7
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ type SectorList = {
3535
}
3636
type CFBFiles = {[n:string]:CFBEntry};
3737
*/
38-
/* [MS-CFB] v20130118 */
38+
/* [MS-CFB] v20171201 */
3939
var CFB = (function _CFB(){
4040
var exports/*:CFBModule*/ = /*::(*/{}/*:: :any)*/;
41-
exports.version = '1.0.3';
41+
exports.version = '1.0.5';
4242
/* [MS-CFB] 2.6.4 */
4343
function namecmp(l/*:string*/, r/*:string*/)/*:number*/ {
4444
var L = l.split("/"), R = r.split("/");
@@ -62,6 +62,7 @@ function filename(p/*:string*/)/*:string*/ {
6262
var fs/*:: = require('fs'); */;
6363
function get_fs() { return fs || (fs = require('fs')); }
6464
function parse(file/*:RawBytes*/, options/*:CFBReadOpts*/)/*:CFBContainer*/ {
65+
if(file.length < 512) throw new Error("CFB file size " + file.length + " < 512");
6566
var mver = 3;
6667
var ssz = 512;
6768
var nmfs = 0; // number of mini FAT sectors
@@ -218,7 +219,7 @@ function build_full_paths(FI/*:CFBFileIndex*/, FP/*:Array<string>*/, Paths/*:Arr
218219
if(L !== -1) { dad[L] = dad[i]; q.push(L); }
219220
if(R !== -1) { dad[R] = dad[i]; q.push(R); }
220221
}
221-
for(i=1; i !== pl; ++i) if(dad[i] === i) {
222+
for(i=1; i < pl; ++i) if(dad[i] === i) {
222223
if(R !== -1 /*NOSTREAM*/ && dad[R] !== R) dad[i] = dad[R];
223224
else if(L !== -1 && dad[L] !== L) dad[i] = dad[L];
224225
}
@@ -610,7 +611,6 @@ function _write(cfb/*:CFBContainer*/, options/*:CFBWriteOpts*/)/*:RawBytes*/ {
610611
}
611612
/* [MS-CFB] 2.6.4 (Unicode 3.0.1 case conversion) */
612613
function find(cfb/*:CFBContainer*/, path/*:string*/)/*:?CFBEntry*/ {
613-
//return cfb.find(path);
614614
var UCFullPaths/*:Array<string>*/ = cfb.FullPaths.map(function(x) { return x.toUpperCase(); });
615615
var UCPaths/*:Array<string>*/ = UCFullPaths.map(function(x) { var y = x.split("/"); return y[y.length - (x.slice(-1) == "/" ? 2 : 1)]; });
616616
var k/*:boolean*/ = false;
@@ -620,10 +620,12 @@ function find(cfb/*:CFBContainer*/, path/*:string*/)/*:?CFBEntry*/ {
620620
var w/*:number*/ = k === true ? UCFullPaths.indexOf(UCPath) : UCPaths.indexOf(UCPath);
621621
if(w !== -1) return cfb.FileIndex[w];
622622

623-
UCPath = UCPath.replace(chr0,'').replace(chr1,'!');
623+
var m = !UCPath.match(chr1);
624+
UCPath = UCPath.replace(chr0,'');
625+
if(m) UCPath = UCPath.replace(chr1,'!');
624626
for(w = 0; w < UCFullPaths.length; ++w) {
625-
if(UCFullPaths[w].replace(chr0,'').replace(chr1,'!') == UCPath) return cfb.FileIndex[w];
626-
if(UCPaths[w].replace(chr0,'').replace(chr1,'!') == UCPath) return cfb.FileIndex[w];
627+
if((m ? UCFullPaths[w].replace(chr1,'!') : UCFullPaths[w]).replace(chr0,'') == UCPath) return cfb.FileIndex[w];
628+
if((m ? UCPaths[w].replace(chr1,'!') : UCPaths[w]).replace(chr0,'') == UCPath) return cfb.FileIndex[w];
627629
}
628630
return null;
629631
}

bits/21_ziputils.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@ function zipentries(zip) {
5858
}
5959

6060
var jszip;
61-
/*:: declare var JSZip:any; */
62-
/*global JSZip:true */
63-
if(typeof JSZip !== 'undefined') jszip = JSZip;
61+
/*:: declare var JSZipSync:any; */
62+
/*global JSZipSync:true */
63+
if(typeof JSZipSync !== 'undefined') jszip = JSZipSync;
6464
if(typeof exports !== 'undefined') {
6565
if(typeof module !== 'undefined' && module.exports) {
6666
if(typeof jszip === 'undefined') jszip = require('./jszip.js');

bits/62_fxls.js

-1
Original file line numberDiff line numberDiff line change
@@ -648,7 +648,6 @@ function parse_Rgce(blob, length, opts) {
648648
R = PtgTypes[id];
649649
if(id === 0x18 || id === 0x19) R = (id === 0x18 ? Ptg18 : Ptg19)[blob[blob.l + 1]];
650650
if(!R || !R.f) { /*ptgs.push*/(parsenoop(blob, length)); }
651-
// $FlowIgnore
652651
else { ptgs.push([R.n, R.f(blob, length, opts)]); }
653652
}
654653
return ptgs;

bits/68_wsbin.js

-1
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,6 @@ function parse_BrtBeginWsView(data/*::, length, opts*/) {
343343
function write_BrtBeginWsView(ws, Workbook, o) {
344344
if(o == null) o = new_buf(30);
345345
var f = 0x39c;
346-
// $FlowIgnore
347346
if((((Workbook||{}).Views||[])[0]||{}).RTL) f |= 0x20;
348347
o.write_shift(2, f); // bit flag
349348
o.write_shift(4, 0);

bits/75_xlml.js

-1
Original file line numberDiff line numberDiff line change
@@ -952,7 +952,6 @@ function write_ws_xlml_wsopts(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workb
952952

953953
/* LeftColumnVisible */
954954

955-
// $FlowIgnore
956955
if(((((wb||{}).Workbook||{}).Views||[])[0]||{}).RTL) o.push("<DisplayRightToLeft/>");
957956

958957
/* GridlineColorIndex */

bits/82_sheeter.js

-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ var write_dif_str = write_obj_str(DIF);
1919
var write_prn_str = write_obj_str(PRN);
2020
var write_rtf_str = write_obj_str(RTF);
2121
var write_txt_str = write_obj_str({from_sheet:sheet_to_txt});
22-
// $FlowIgnore
2322
var write_dbf_buf = write_obj_str(DBF);
2423
var write_eth_str = write_obj_str(ETH);
2524

bits/87_read.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ function readSync(data/*:RawData*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
9191
case 0x3C: return parse_xlml(d, o);
9292
case 0x49: if(n[1] === 0x44) return read_wb_ID(d, o); break;
9393
case 0x54: if(n[1] === 0x41 && n[2] === 0x42 && n[3] === 0x4C) return DIF.to_workbook(d, o); break;
94-
case 0x50: if(n[1] === 0x4B && n[2] < 0x20 && n[3] < 0x20) return read_zip(d, o); break;
94+
case 0x50: return (n[1] === 0x4B && n[2] < 0x09 && n[3] < 0x09) ? read_zip(d, o) : read_prn(data, d, o, str);
9595
case 0xEF: return n[3] === 0x3C ? parse_xlml(d, o) : read_prn(data, d, o, str);
9696
case 0xFF: if(n[1] === 0xFE) { return read_utf16(d, o); } break;
9797
case 0x00: if(n[1] === 0x00 && n[2] >= 0x02 && n[3] === 0x00) return WK_.to_workbook(d, o); break;

bits/88_write.js

-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ function write_zip_type(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:any*/ {
1313
}
1414
if(o.type === "file") return write_dl(o.file, z.generate(oopts));
1515
var out = z.generate(oopts);
16-
// $FlowIgnore
1716
return o.type == "string" ? utf8read(out) : out;
1817
}
1918

@@ -90,7 +89,6 @@ function writeSync(wb/*:Workbook*/, opts/*:?WriteOpts*/) {
9089
case 'txt': return write_stxt_type(write_txt_str(wb, o), o);
9190
case 'csv': return write_string_type(write_csv_str(wb, o), o, "\ufeff");
9291
case 'dif': return write_string_type(write_dif_str(wb, o), o);
93-
// $FlowIgnore
9492
case 'dbf': return write_binary_type(write_dbf_buf(wb, o), o);
9593
case 'prn': return write_string_type(write_prn_str(wb, o), o);
9694
case 'rtf': return write_string_type(write_rtf_str(wb, o), o);

demos/browserify/app.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ var process_wb = (function() {
6262
var to_html = function to_html(workbook) {
6363
HTMLOUT.innerHTML = "";
6464
workbook.SheetNames.forEach(function(sheetName) {
65-
var htmlstr = X.write(workbook, {sheet:sheetName, type:'binary', bookType:'html'});
65+
var htmlstr = X.write(workbook, {sheet:sheetName, type:'string', bookType:'html'});
6666
HTMLOUT.innerHTML += htmlstr;
6767
});
6868
return "";

demos/parcel/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ var process_wb = (function() {
5555
var to_html = function to_html(workbook) {
5656
HTMLOUT.innerHTML = "";
5757
workbook.SheetNames.forEach(function(sheetName) {
58-
var htmlstr = X.write(workbook, {sheet:sheetName, type:'binary', bookType:'html'});
58+
var htmlstr = X.write(workbook, {sheet:sheetName, type:'string', bookType:'html'});
5959
HTMLOUT.innerHTML += htmlstr;
6060
});
6161
return "";

demos/requirejs/app.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ var process_wb = (function() {
5454
var to_html = function to_html(workbook) {
5555
HTMLOUT.innerHTML = "";
5656
workbook.SheetNames.forEach(function(sheetName) {
57-
var htmlstr = X.write(workbook, {sheet:sheetName, type:'binary', bookType:'html'});
57+
var htmlstr = X.write(workbook, {sheet:sheetName, type:'string', bookType:'html'});
5858
HTMLOUT.innerHTML += htmlstr;
5959
});
6060
return "";

demos/rollup/app.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ var process_wb = (function() {
5555
var to_html = function to_html(workbook) {
5656
HTMLOUT.innerHTML = "";
5757
workbook.SheetNames.forEach(function(sheetName) {
58-
var htmlstr = X.write(workbook, {sheet:sheetName, type:'binary', bookType:'html'});
58+
var htmlstr = X.write(workbook, {sheet:sheetName, type:'string', bookType:'html'});
5959
HTMLOUT.innerHTML += htmlstr;
6060
});
6161
return "";

demos/systemjs/main.js

+3-21
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ var process_wb = (function() {
5555
var to_html = function to_html(workbook) {
5656
HTMLOUT.innerHTML = "";
5757
workbook.SheetNames.forEach(function(sheetName) {
58-
var htmlstr = X.write(workbook, {sheet:sheetName, type:'binary', bookType:'html'});
58+
var htmlstr = X.write(workbook, {sheet:sheetName, type:'string', bookType:'html'});
5959
HTMLOUT.innerHTML += htmlstr;
6060
});
6161
return "";
@@ -92,33 +92,15 @@ var do_file = (function() {
9292
var domrabs = document.getElementsByName("userabs")[0];
9393
if(!rABS) domrabs.disabled = !(domrabs.checked = false);
9494

95-
var use_worker = typeof Worker !== 'undefined';
96-
var domwork = document.getElementsByName("useworker")[0];
97-
if(!use_worker) domwork.disabled = !(domwork.checked = false);
98-
99-
var xw = function xw(data, cb) {
100-
var worker = new Worker(XW.worker);
101-
worker.onmessage = function(e) {
102-
switch(e.data.t) {
103-
case 'ready': break;
104-
case 'e': console.error(e.data.d); break;
105-
case XW.msg: cb(JSON.parse(e.data.d)); break;
106-
}
107-
};
108-
worker.postMessage({d:data,b:rABS?'binary':'array'});
109-
};
110-
11195
return function do_file(files) {
11296
rABS = domrabs.checked;
113-
use_worker = domwork.checked;
11497
var f = files[0];
11598
var reader = new FileReader();
11699
reader.onload = function(e) {
117-
if(typeof console !== 'undefined') console.log("onload", new Date(), rABS, use_worker);
100+
if(typeof console !== 'undefined') console.log("onload", new Date(), rABS);
118101
var data = e.target.result;
119102
if(!rABS) data = new Uint8Array(data);
120-
if(use_worker) xw(data, process_wb);
121-
else process_wb(X.read(data, {type: rABS ? 'binary' : 'array'}));
103+
process_wb(X.read(data, {type: rABS ? 'binary' : 'array'}));
122104
};
123105
if(rABS) reader.readAsBinaryString(f);
124106
else reader.readAsArrayBuffer(f);

demos/systemjs/systemjs.html

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<!DOCTYPE html>
2+
<!-- xlsx.js (C) 2013-present SheetJS http://sheetjs.com -->
3+
<!-- vim: set ts=2: -->
4+
<html>
5+
<head>
6+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
7+
<title>SheetJS Live Demo</title>
8+
<style>
9+
#drop{
10+
border:2px dashed #bbb;
11+
-moz-border-radius:5px;
12+
-webkit-border-radius:5px;
13+
border-radius:5px;
14+
padding:25px;
15+
text-align:center;
16+
font:20pt bold,"Vollkorn";color:#bbb
17+
}
18+
#b64data{
19+
width:100%;
20+
}
21+
a { text-decoration: none }
22+
</style>
23+
</head>
24+
<body>
25+
<pre>
26+
<b><a href="http://sheetjs.com">SheetJS Data Preview Live Demo</a></b>
27+
(Base64 text works back to IE6; drag and drop works back to IE10)
28+
29+
<a href="https://github.com/SheetJS/js-xlsx">Source Code Repo</a>
30+
<a href="https://github.com/SheetJS/js-xlsx/issues">Issues? Something look weird? Click here and report an issue</a>
31+
Output Format: <select name="format" onchange="setfmt()">
32+
<option value="csv" selected> CSV</option>
33+
<option value="json"> JSON</option>
34+
<option value="form"> FORMULAE</option>
35+
<option value="html"> HTML</option>
36+
</select><br />
37+
<div id="drop">Drop a spreadsheet file here to see sheet data</div>
38+
<input type="file" name="xlfile" id="xlf" /> ... or click here to select a file
39+
40+
<textarea id="b64data">... or paste a base64-encoding here</textarea>
41+
<input type="button" id="dotext" value="Click here to process the base64 text" onclick="b64it();"/><br />
42+
<b>Advanced Demo Options:</b>
43+
Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" checked>
44+
</pre>
45+
<pre id="out"></pre>
46+
<div id="htmlout"></div>
47+
<br />
48+
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.20.16/system.js"></script>
49+
<script>
50+
SystemJS.config({
51+
meta: {
52+
'xlsx': {
53+
exports: 'XLSX'
54+
}
55+
},
56+
map: {
57+
'xlsx': 'xlsx.full.min.js',
58+
'fs': '',
59+
'crypto': '',
60+
'stream': ''
61+
}
62+
});
63+
SystemJS.import('main.js');
64+
</script>
65+
<script type="text/javascript">
66+
/* eslint no-use-before-define:0 */
67+
var _gaq = _gaq || [];
68+
_gaq.push(['_setAccount', 'UA-36810333-1']);
69+
_gaq.push(['_trackPageview']);
70+
71+
(function() {
72+
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
73+
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
74+
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
75+
})();
76+
</script>
77+
</body>
78+
</html>

demos/webpack/app.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ var process_wb = (function() {
5454
var to_html = function to_html(workbook) {
5555
HTMLOUT.innerHTML = "";
5656
workbook.SheetNames.forEach(function(sheetName) {
57-
var htmlstr = X.write(workbook, {sheet:sheetName, type:'binary', bookType:'html'});
57+
var htmlstr = X.write(workbook, {sheet:sheetName, type:'string', bookType:'html'});
5858
HTMLOUT.innerHTML += htmlstr;
5959
});
6060
return "";

0 commit comments

Comments
 (0)