forked from sheetjs/sheetjs
		
	version bump 0.11.18: infrastructure
- updated dependencies - fixed eslint config - fusebox demo
This commit is contained in:
		
							parent
							
								
									376db8fe9f
								
							
						
					
					
						commit
						c2ec7555fb
					
				
							
								
								
									
										21
									
								
								.eslintrc
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										21
									
								
								.eslintrc
									
									
									
									
									
								
							@ -2,20 +2,23 @@
 | 
			
		||||
	"env": { "shared-node-browser":true },
 | 
			
		||||
	"globals": {},
 | 
			
		||||
	"parserOptions": {
 | 
			
		||||
		"ecmaVersion": 3,
 | 
			
		||||
		"ecmaVersion": 3
 | 
			
		||||
	},
 | 
			
		||||
	"plugins": [ "html", "json" ],
 | 
			
		||||
	"!extends": "eslint:recommended",
 | 
			
		||||
	"extends": "eslint:recommended",
 | 
			
		||||
	"rules": {
 | 
			
		||||
		"comma-style": [ 2, "last" ],
 | 
			
		||||
		"comma-dangle": [ 2, "never" ],
 | 
			
		||||
		"curly": 0,
 | 
			
		||||
		"no-bitwise": 0,
 | 
			
		||||
		"no-console": 0,
 | 
			
		||||
		"no-control-regex": 0,
 | 
			
		||||
		"no-empty": 0,
 | 
			
		||||
		"no-trailing-spaces": 2,
 | 
			
		||||
		"no-use-before-define": [ 1, {
 | 
			
		||||
			"functions":false, "classes":true, "variables":false
 | 
			
		||||
		}],
 | 
			
		||||
		"no-console": 0,
 | 
			
		||||
		"no-bitwise": 0,
 | 
			
		||||
		"curly": 0,
 | 
			
		||||
		"comma-style": [ 2, "last" ],
 | 
			
		||||
		"no-trailing-spaces": 2,
 | 
			
		||||
		"semi": [ 2, "always" ],
 | 
			
		||||
		"comma-dangle": [ 2, "never" ]
 | 
			
		||||
		"no-useless-escape": 0,
 | 
			
		||||
		"semi": [ 2, "always" ]
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -70,6 +70,7 @@ deduplication
 | 
			
		||||
destructuring
 | 
			
		||||
embeddable
 | 
			
		||||
filesystem
 | 
			
		||||
globals
 | 
			
		||||
javascript
 | 
			
		||||
metadata
 | 
			
		||||
natively
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,8 @@
 | 
			
		||||
#!/usr/bin/env node
 | 
			
		||||
/* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */
 | 
			
		||||
/* eslint-env node */
 | 
			
		||||
var n = "xlsx";
 | 
			
		||||
/* vim: set ts=2 ft=javascript: */
 | 
			
		||||
var n = "xlsx";
 | 
			
		||||
var X = require('../');
 | 
			
		||||
require('exit-on-epipe');
 | 
			
		||||
var fs = require('fs'), program = require('commander');
 | 
			
		||||
@ -26,7 +26,7 @@ program
 | 
			
		||||
	//.option('-4, --biff4','emit XLS  to <sheetname> or <file>.xls (BIFF4)')
 | 
			
		||||
	//.option('-3, --biff3','emit XLS  to <sheetname> or <file>.xls (BIFF3)')
 | 
			
		||||
	.option('-2, --biff2','emit XLS  to <sheetname> or <file>.xls (BIFF2)')
 | 
			
		||||
	.option('-i, --xla', 'emit XLA to <sheetname> or <file>.xla')
 | 
			
		||||
	.option('-i, --xla',  'emit XLA to <sheetname> or <file>.xla')
 | 
			
		||||
	.option('-6, --xlml', 'emit SSML to <sheetname> or <file>.xls (2003 XML)')
 | 
			
		||||
	.option('-T, --fods', 'emit FODS to <sheetname> or <file>.fods (Flat ODS)')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
 | 
			
		||||
/* vim: set ts=2: */
 | 
			
		||||
/*exported XLSX */
 | 
			
		||||
/*global global, exports, module, require:false, process:false, Buffer:false */
 | 
			
		||||
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
 | 
			
		||||
var XLSX = {};
 | 
			
		||||
(function make_xlsx(XLSX){
 | 
			
		||||
 | 
			
		||||
@ -1 +1 @@
 | 
			
		||||
XLSX.version = '0.11.17';
 | 
			
		||||
XLSX.version = '0.11.18';
 | 
			
		||||
 | 
			
		||||
@ -38,7 +38,7 @@ type CFBFiles = {[n:string]:CFBEntry};
 | 
			
		||||
/* [MS-CFB] v20130118 */
 | 
			
		||||
var CFB = (function _CFB(){
 | 
			
		||||
var exports/*:CFBModule*/ = /*::(*/{}/*:: :any)*/;
 | 
			
		||||
exports.version = '1.0.1';
 | 
			
		||||
exports.version = '1.0.2';
 | 
			
		||||
/* [MS-CFB] 2.6.4 */
 | 
			
		||||
function namecmp(l/*:string*/, r/*:string*/)/*:number*/ {
 | 
			
		||||
	var L = l.split("/"), R = r.split("/");
 | 
			
		||||
@ -474,6 +474,7 @@ function rebuild_cfb(cfb/*:CFBContainer*/, f/*:?boolean*/)/*:void*/ {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _write(cfb/*:CFBContainer*/, options/*:CFBWriteOpts*/)/*:RawBytes*/ {
 | 
			
		||||
	var _opts = options || {};
 | 
			
		||||
	rebuild_cfb(cfb);
 | 
			
		||||
	var L = (function(cfb/*:CFBContainer*/)/*:Array<number>*/{
 | 
			
		||||
		var mini_size = 0, fat_size = 0;
 | 
			
		||||
@ -482,9 +483,10 @@ function _write(cfb/*:CFBContainer*/, options/*:CFBWriteOpts*/)/*:RawBytes*/ {
 | 
			
		||||
			if(!file.content) continue;
 | 
			
		||||
			/*:: if(file.content == null) throw new Error("unreachable"); */
 | 
			
		||||
			var flen = file.content.length;
 | 
			
		||||
			if(flen === 0){}
 | 
			
		||||
			else if(flen < 0x1000) mini_size += (flen + 0x3F) >> 6;
 | 
			
		||||
			else fat_size += (flen + 0x01FF) >> 9;
 | 
			
		||||
			if(flen > 0){
 | 
			
		||||
				if(flen < 0x1000) mini_size += (flen + 0x3F) >> 6;
 | 
			
		||||
				else fat_size += (flen + 0x01FF) >> 9;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		var dir_cnt = (cfb.FullPaths.length +3) >> 2;
 | 
			
		||||
		var mini_cnt = (mini_size + 7) >> 3;
 | 
			
		||||
@ -569,8 +571,9 @@ function _write(cfb/*:CFBContainer*/, options/*:CFBWriteOpts*/)/*:RawBytes*/ {
 | 
			
		||||
		}
 | 
			
		||||
		file = cfb.FileIndex[i];
 | 
			
		||||
		if(i === 0) file.start = file.size ? file.start - 1 : ENDOFCHAIN;
 | 
			
		||||
		flen = 2*(file.name.length+1);
 | 
			
		||||
		o.write_shift(64, file.name, "utf16le");
 | 
			
		||||
		var _nm/*:string*/ = (i === 0 && _opts.root) || file.name;
 | 
			
		||||
		flen = 2*(_nm.length+1);
 | 
			
		||||
		o.write_shift(64, _nm, "utf16le");
 | 
			
		||||
		o.write_shift(2, flen);
 | 
			
		||||
		o.write_shift(1, file.type);
 | 
			
		||||
		o.write_shift(1, file.color);
 | 
			
		||||
 | 
			
		||||
@ -55,7 +55,7 @@ var unescapexml/*:StringConv*/ = (function() {
 | 
			
		||||
})();
 | 
			
		||||
 | 
			
		||||
var decregex=/[&<>'"]/g, charegex = /[\u0000-\u0008\u000b-\u001f]/g;
 | 
			
		||||
function escapexml(text/*:string*/, xml/*:?boolean*/)/*:string*/{
 | 
			
		||||
function escapexml(text/*:string*/)/*:string*/{
 | 
			
		||||
	var s = text + '';
 | 
			
		||||
	return s.replace(decregex, function(y) { return rencoding[y]; }).replace(charegex,function(s) { return "_x" + ("000"+s.charCodeAt(0).toString(16)).slice(-4) + "_";});
 | 
			
		||||
}
 | 
			
		||||
@ -82,7 +82,7 @@ var xlml_unfixstr/*:StringConv*/ = (function() {
 | 
			
		||||
	return function xlml_unfixstr(str/*:string*/)/*:string*/ { return str.replace(/(\r\n|[\r\n])/g,"\
"); };
 | 
			
		||||
})();
 | 
			
		||||
 | 
			
		||||
function parsexmlbool(value/*:any*/, tag/*:?string*/)/*:boolean*/ {
 | 
			
		||||
function parsexmlbool(value/*:any*/)/*:boolean*/ {
 | 
			
		||||
	switch(value) {
 | 
			
		||||
		case 1: case true: case '1': case 'true': case 'TRUE': return true;
 | 
			
		||||
		/* case '0': case 'false': case 'FALSE':*/
 | 
			
		||||
 | 
			
		||||
@ -32,7 +32,6 @@ var ___utf16le = __utf16le;
 | 
			
		||||
var __hexlify = function(b/*:RawBytes|CFBlob*/,s/*:number*/,l/*:number*/)/*:string*/ { var ss/*:Array<string>*/=[]; for(var i=s; i<s+l; ++i) ss.push(("0" + b[i].toString(16)).slice(-2)); return ss.join(""); };
 | 
			
		||||
var ___hexlify = __hexlify;
 | 
			
		||||
var __utf8 = function(b/*:RawBytes|CFBlob*/,s/*:number*/,e/*:number*/) { var ss=[]; for(var i=s; i<e; i++) ss.push(String.fromCharCode(__readUInt8(b,i))); return ss.join(""); };
 | 
			
		||||
var ___utf8 = __utf8;
 | 
			
		||||
var __lpstr = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
 | 
			
		||||
var ___lpstr = __lpstr;
 | 
			
		||||
var __cpstr = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
 | 
			
		||||
@ -80,9 +79,6 @@ var __readUInt32LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/
 | 
			
		||||
var __readInt32LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; };
 | 
			
		||||
var __readInt32BE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return (b[idx]<<24)|(b[idx+1]<<16)|(b[idx+2]<<8)|b[idx+3]; };
 | 
			
		||||
 | 
			
		||||
var ___unhexlify = function(s/*:string*/)/*:Array<number>*/ { return (s.match(/../g)||[]).map(function(x) { return parseInt(x,16);}); };
 | 
			
		||||
var __unhexlify = typeof Buffer !== "undefined" ? function(s/*:string*/)/*:Array<number>|Buffer*/ { return Buffer.isBuffer(s) ? new Buffer(s, 'hex') : ___unhexlify(s); } : ___unhexlify;
 | 
			
		||||
 | 
			
		||||
function ReadShift(size/*:number*/, t/*:?string*/)/*:number|string*/ {
 | 
			
		||||
	var o="", oI/*:: :number = 0*/, oR, oo=[], w, vv, i, loc;
 | 
			
		||||
	switch(t) {
 | 
			
		||||
 | 
			
		||||
@ -11,8 +11,6 @@ function unfix_col(cstr/*:string*/)/*:string*/ { return cstr.replace(/^\$([A-Z])
 | 
			
		||||
function split_cell(cstr/*:string*/)/*:Array<string>*/ { return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/,"$1,$2").split(","); }
 | 
			
		||||
function decode_cell(cstr/*:string*/)/*:CellAddress*/ { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }
 | 
			
		||||
function encode_cell(cell/*:CellAddress*/)/*:string*/ { return encode_col(cell.c) + encode_row(cell.r); }
 | 
			
		||||
function fix_cell(cstr/*:string*/)/*:string*/ { return fix_col(fix_row(cstr)); }
 | 
			
		||||
function unfix_cell(cstr/*:string*/)/*:string*/ { return unfix_col(unfix_row(cstr)); }
 | 
			
		||||
function decode_range(range/*:string*/)/*:Range*/ { var x =range.split(":").map(decode_cell); return {s:x[0],e:x[x.length-1]}; }
 | 
			
		||||
/*# if only one arg, it is assumed to be a Range.  If 2 args, both are cell addresses */
 | 
			
		||||
function encode_range(cs/*:CellAddrSpec|Range*/,ce/*:?CellAddrSpec*/)/*:string*/ {
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@ function write_XLWideString(data/*:string*/, o) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.5.143 */
 | 
			
		||||
function parse_StrRun(data, length/*:?number*/) {
 | 
			
		||||
function parse_StrRun(data) {
 | 
			
		||||
	return { ich: data.read_shift(2), ifnt: data.read_shift(2) };
 | 
			
		||||
}
 | 
			
		||||
function write_StrRun(run, o) {
 | 
			
		||||
@ -71,7 +71,7 @@ function parse_XLSBCell(data)/*:any*/ {
 | 
			
		||||
	var col = data.read_shift(4);
 | 
			
		||||
	var iStyleRef = data.read_shift(2);
 | 
			
		||||
	iStyleRef += data.read_shift(1) <<16;
 | 
			
		||||
	var fPhShow = data.read_shift(1);
 | 
			
		||||
	data.l++; //var fPhShow = data.read_shift(1);
 | 
			
		||||
	return { c:col, iStyleRef: iStyleRef };
 | 
			
		||||
}
 | 
			
		||||
function write_XLSBCell(cell/*:any*/, o/*:?Block*/) {
 | 
			
		||||
@ -101,7 +101,7 @@ function write_XLNullableWideString(data/*:string*/, o) {
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.5.165 */
 | 
			
		||||
var parse_XLNameWideString = parse_XLWideString;
 | 
			
		||||
var write_XLNameWideString = write_XLWideString;
 | 
			
		||||
//var write_XLNameWideString = write_XLWideString;
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.5.114 */
 | 
			
		||||
var parse_RelID = parse_XLNullableWideString;
 | 
			
		||||
@ -154,7 +154,7 @@ var write_UncheckedRfX = write_RfX;
 | 
			
		||||
/* [MS-XLSB] 2.5.171 */
 | 
			
		||||
/* [MS-XLS] 2.5.342 */
 | 
			
		||||
/* TODO: error checking, NaN and Infinity values are not valid Xnum */
 | 
			
		||||
function parse_Xnum(data, length/*:?number*/) { return data.read_shift(8, 'f'); }
 | 
			
		||||
function parse_Xnum(data/*::, length*/) { return data.read_shift(8, 'f'); }
 | 
			
		||||
function write_Xnum(data, o) { return (o || new_buf(8)).write_shift(8, data, 'f'); }
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.5.198.2 */
 | 
			
		||||
@ -172,11 +172,11 @@ var BErr = {
 | 
			
		||||
var RBErr = evert_num(BErr);
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.4.321 BrtColor */
 | 
			
		||||
function parse_BrtColor(data, length/*:number*/) {
 | 
			
		||||
function parse_BrtColor(data/*::, length*/) {
 | 
			
		||||
	var out = {};
 | 
			
		||||
	var d = data.read_shift(1);
 | 
			
		||||
 | 
			
		||||
	var fValidRGB = d & 1;
 | 
			
		||||
	//var fValidRGB = d & 1;
 | 
			
		||||
	var xColorType = d >>> 1;
 | 
			
		||||
 | 
			
		||||
	var index = data.read_shift(1);
 | 
			
		||||
@ -184,7 +184,7 @@ function parse_BrtColor(data, length/*:number*/) {
 | 
			
		||||
	var bR = data.read_shift(1);
 | 
			
		||||
	var bG = data.read_shift(1);
 | 
			
		||||
	var bB = data.read_shift(1);
 | 
			
		||||
	var bAlpha = data.read_shift(1);
 | 
			
		||||
	data.l++; //var bAlpha = data.read_shift(1);
 | 
			
		||||
 | 
			
		||||
	switch(xColorType) {
 | 
			
		||||
		case 0: out.auto = 1; break;
 | 
			
		||||
@ -236,7 +236,7 @@ function write_BrtColor(color, o) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.5.52 */
 | 
			
		||||
function parse_FontFlags(data, length/*:number*/, opts) {
 | 
			
		||||
function parse_FontFlags(data/*::, length, opts*/) {
 | 
			
		||||
	var d = data.read_shift(1);
 | 
			
		||||
	data.l++;
 | 
			
		||||
	var out = {
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@ var VT_VARIANT  = 0x000C;
 | 
			
		||||
//var VT_UI2      = 0x0012;
 | 
			
		||||
var VT_UI4      = 0x0013;
 | 
			
		||||
//var VT_I8       = 0x0014;
 | 
			
		||||
var VT_UI8      = 0x0015;
 | 
			
		||||
//var VT_UI8      = 0x0015;
 | 
			
		||||
//var VT_INT      = 0x0016;
 | 
			
		||||
//var VT_UINT     = 0x0017;
 | 
			
		||||
var VT_LPSTR    = 0x001E;
 | 
			
		||||
 | 
			
		||||
@ -198,7 +198,7 @@ function new_ct()/*:any*/ {
 | 
			
		||||
		TODO:[], xmlns: "" }/*:any*/);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function parse_ct(data/*:?string*/, opts) {
 | 
			
		||||
function parse_ct(data/*:?string*/) {
 | 
			
		||||
	var ct = new_ct();
 | 
			
		||||
	if(!data || !data.match) return ct;
 | 
			
		||||
	var ctext = {};
 | 
			
		||||
 | 
			
		||||
@ -20,7 +20,7 @@ function parse_manifest(d, opts) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_manifest(manifest/*:Array<Array<string> >*/, opts)/*:string*/ {
 | 
			
		||||
function write_manifest(manifest/*:Array<Array<string> >*/)/*:string*/ {
 | 
			
		||||
	var o = [XML_HEADER];
 | 
			
		||||
	o.push('<manifest:manifest xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" manifest:version="1.2">\n');
 | 
			
		||||
	o.push('  <manifest:file-entry manifest:full-path="/" manifest:version="1.2" manifest:media-type="application/vnd.oasis.opendocument.spreadsheet"/>\n');
 | 
			
		||||
@ -44,7 +44,7 @@ function write_rdf_has(base/*:string*/, file/*:string*/) {
 | 
			
		||||
		'  </rdf:Description>\n'
 | 
			
		||||
	].join("");
 | 
			
		||||
}
 | 
			
		||||
function write_rdf(rdf, opts) {
 | 
			
		||||
function write_rdf(rdf) {
 | 
			
		||||
	var o = [XML_HEADER];
 | 
			
		||||
	o.push('<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">\n');
 | 
			
		||||
	for(var i = 0; i != rdf.length; ++i) {
 | 
			
		||||
@ -58,7 +58,7 @@ function write_rdf(rdf, opts) {
 | 
			
		||||
/* TODO: pull properties */
 | 
			
		||||
var write_meta_ods/*:{(wb:Workbook, opts:any):string}*/ = (function() {
 | 
			
		||||
	var payload = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><office:document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xlink="http://www.w3.org/1999/xlink" office:version="1.2"><office:meta><meta:generator>Sheet' + 'JS ' + XLSX.version + '</meta:generator></office:meta></office:document-meta>';
 | 
			
		||||
	return function wmo(wb/*:Workbook*/, opts) {
 | 
			
		||||
	return function wmo(/*:: wb: Workbook, opts: any*/)/*:string*/ {
 | 
			
		||||
		return payload;
 | 
			
		||||
	};
 | 
			
		||||
})();
 | 
			
		||||
 | 
			
		||||
@ -83,8 +83,8 @@ var EXT_PROPS_XML_ROOT = writextag('Properties', null, {
 | 
			
		||||
	'xmlns:vt': XMLNS.vt
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
function write_ext_props(cp, opts)/*:string*/ {
 | 
			
		||||
	var o/*:Array<string>*/ = [], p = {}, W = writextag;
 | 
			
		||||
function write_ext_props(cp/*::, opts*/)/*:string*/ {
 | 
			
		||||
	var o/*:Array<string>*/ = [], W = writextag;
 | 
			
		||||
	if(!cp) cp = {};
 | 
			
		||||
	cp.Application = "SheetJS";
 | 
			
		||||
	o[o.length] = (XML_HEADER);
 | 
			
		||||
 | 
			
		||||
@ -22,7 +22,7 @@ function parse_cust_props(data/*:string*/, opts) {
 | 
			
		||||
						p[name] = unescapexml(text);
 | 
			
		||||
						break;
 | 
			
		||||
					case 'bool':
 | 
			
		||||
						p[name] = parsexmlbool(text, '<vt:bool>');
 | 
			
		||||
						p[name] = parsexmlbool(text);
 | 
			
		||||
						break;
 | 
			
		||||
					case 'i1': case 'i2': case 'i4': case 'i8': case 'int': case 'uint':
 | 
			
		||||
						p[name] = parseInt(text, 10);
 | 
			
		||||
@ -52,7 +52,7 @@ var CUST_PROPS_XML_ROOT = writextag('Properties', null, {
 | 
			
		||||
	'xmlns:vt': XMLNS.vt
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
function write_cust_props(cp, opts)/*:string*/ {
 | 
			
		||||
function write_cust_props(cp/*::, opts*/)/*:string*/ {
 | 
			
		||||
	var o = [XML_HEADER, CUST_PROPS_XML_ROOT];
 | 
			
		||||
	if(!cp) return o.join("");
 | 
			
		||||
	var pid = 1;
 | 
			
		||||
 | 
			
		||||
@ -57,7 +57,7 @@ function xlml_write_docprops(Props, opts) {
 | 
			
		||||
	});
 | 
			
		||||
	return writextag('DocumentProperties', o.join(""), {xmlns:XLMLNS.o });
 | 
			
		||||
}
 | 
			
		||||
function xlml_write_custprops(Props, Custprops, opts) {
 | 
			
		||||
function xlml_write_custprops(Props, Custprops/*::, opts*/) {
 | 
			
		||||
	var BLACKLIST = ["Worksheets","SheetNames"];
 | 
			
		||||
	var T = 'CustomDocumentProperties';
 | 
			
		||||
	var o/*:Array<string>*/ = [];
 | 
			
		||||
 | 
			
		||||
@ -97,17 +97,6 @@ function parse_ClipboardData(blob) {
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-OLEPS] 2.14 Vector and Array Property Types */
 | 
			
		||||
function parse_VtVector(blob, cb) {
 | 
			
		||||
	/* [MS-OLEPS] 2.14.2 VectorHeader */
 | 
			
		||||
/*	var Length = blob.read_shift(4);
 | 
			
		||||
	var o = [];
 | 
			
		||||
	for(var i = 0; i != Length; ++i) {
 | 
			
		||||
		o.push(cb(blob));
 | 
			
		||||
	}
 | 
			
		||||
	return o;*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-OLEPS] 2.15 TypedPropertyValue */
 | 
			
		||||
function parse_TypedPropertyValue(blob, type/*:number*/, _opts)/*:any*/ {
 | 
			
		||||
	var t = blob.read_shift(2), ret, opts = _opts||{};
 | 
			
		||||
@ -131,17 +120,6 @@ function parse_TypedPropertyValue(blob, type/*:number*/, _opts)/*:any*/ {
 | 
			
		||||
		default: throw new Error("TypedPropertyValue unrecognized type " + type + " " + t);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
/* [MS-OLEPS] 2.14.2 VectorHeader */
 | 
			
		||||
/*function parse_VTVectorVariant(blob) {
 | 
			
		||||
	var Length = blob.read_shift(4);
 | 
			
		||||
 | 
			
		||||
	if(Length & 1 !== 0) throw new Error("VectorHeader Length=" + Length + " must be even");
 | 
			
		||||
	var o = [];
 | 
			
		||||
	for(var i = 0; i != Length; ++i) {
 | 
			
		||||
		o.push(parse_TypedPropertyValue(blob, VT_VARIANT));
 | 
			
		||||
	}
 | 
			
		||||
	return o;
 | 
			
		||||
}*/
 | 
			
		||||
 | 
			
		||||
/* [MS-OLEPS] 2.20 PropertySet */
 | 
			
		||||
function parse_PropertySet(blob, PIDSI) {
 | 
			
		||||
@ -243,7 +221,7 @@ function parse_PropertySetStream(file, PIDSI) {
 | 
			
		||||
	var NumSets, FMTID0, FMTID1, Offset0, Offset1 = 0;
 | 
			
		||||
	blob.chk('feff', 'Byte Order: ');
 | 
			
		||||
 | 
			
		||||
	var vers = blob.read_shift(2); // TODO: check version
 | 
			
		||||
	/*var vers = */blob.read_shift(2); // TODO: check version
 | 
			
		||||
	var SystemIdentifier = blob.read_shift(4);
 | 
			
		||||
	blob.chk(CFB.utils.consts.HEADER_CLSID, 'CLSID: ');
 | 
			
		||||
	NumSets = blob.read_shift(4);
 | 
			
		||||
@ -303,14 +281,14 @@ function write_Bes(v, t/*:string*/, o) {
 | 
			
		||||
/* [MS-XLS] 2.5.240 ShortXLUnicodeString */
 | 
			
		||||
function parse_ShortXLUnicodeString(blob, length, opts) {
 | 
			
		||||
	var cch = blob.read_shift(opts && opts.biff >= 12 ? 2 : 1);
 | 
			
		||||
	var width = 1, encoding = 'sbcs-cont';
 | 
			
		||||
	var encoding = 'sbcs-cont';
 | 
			
		||||
	var cp = current_codepage;
 | 
			
		||||
	if(opts && opts.biff >= 8) current_codepage = 1200;
 | 
			
		||||
	if(!opts || opts.biff == 8 ) {
 | 
			
		||||
		var fHighByte = blob.read_shift(1);
 | 
			
		||||
		if(fHighByte) { width = 2; encoding = 'dbcs-cont'; }
 | 
			
		||||
		if(fHighByte) { encoding = 'dbcs-cont'; }
 | 
			
		||||
	} else if(opts.biff == 12) {
 | 
			
		||||
		width = 2; encoding = 'wstr';
 | 
			
		||||
		encoding = 'wstr';
 | 
			
		||||
	}
 | 
			
		||||
	if(opts.biff >= 2 && opts.biff <= 5) encoding = 'cpstr';
 | 
			
		||||
	var o = cch ? blob.read_shift(cch, encoding) : "";
 | 
			
		||||
@ -323,7 +301,7 @@ function parse_XLUnicodeRichExtendedString(blob) {
 | 
			
		||||
	var cp = current_codepage;
 | 
			
		||||
	current_codepage = 1200;
 | 
			
		||||
	var cch = blob.read_shift(2), flags = blob.read_shift(1);
 | 
			
		||||
	var fHighByte = flags & 0x1, fExtSt = flags & 0x4, fRichSt = flags & 0x8;
 | 
			
		||||
	var /*fHighByte = flags & 0x1,*/ fExtSt = flags & 0x4, fRichSt = flags & 0x8;
 | 
			
		||||
	var width = 1 + (flags & 0x1); // 0x0 -> utf8, 0x1 -> dbcs
 | 
			
		||||
	var cRun = 0, cbExtRst;
 | 
			
		||||
	var z = {};
 | 
			
		||||
@ -375,7 +353,7 @@ function write_XLUnicodeString(str, opts, o) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLS] 2.5.61 ControlInfo */
 | 
			
		||||
function parse_ControlInfo(blob, length, opts) {
 | 
			
		||||
function parse_ControlInfo(blob/*::, length, opts*/) {
 | 
			
		||||
	var flags = blob.read_shift(1);
 | 
			
		||||
	blob.l++;
 | 
			
		||||
	var accel = blob.read_shift(2);
 | 
			
		||||
@ -399,10 +377,10 @@ function parse_URLMoniker(blob/*::, length, opts*/) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-OSHARED] 2.3.7.8 FileMoniker TODO: all fields */
 | 
			
		||||
function parse_FileMoniker(blob, length) {
 | 
			
		||||
	var cAnti = blob.read_shift(2);
 | 
			
		||||
function parse_FileMoniker(blob/*::, length*/) {
 | 
			
		||||
	blob.l += 2; //var cAnti = blob.read_shift(2);
 | 
			
		||||
	var ansiPath = blob.read_shift(0, 'lpstr-ansi');
 | 
			
		||||
	var endServer = blob.read_shift(2);
 | 
			
		||||
	blob.l += 2; //var endServer = blob.read_shift(2);
 | 
			
		||||
	if(blob.read_shift(2) != 0xDEAD) throw new Error("Bad FileMoniker");
 | 
			
		||||
	var sz = blob.read_shift(4);
 | 
			
		||||
	if(sz === 0) return ansiPath.replace(/\\/g,"/");
 | 
			
		||||
@ -423,7 +401,7 @@ function parse_HyperlinkMoniker(blob, length) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-OSHARED] 2.3.7.9 HyperlinkString */
 | 
			
		||||
function parse_HyperlinkString(blob, length) {
 | 
			
		||||
function parse_HyperlinkString(blob/*::, length*/) {
 | 
			
		||||
	var len = blob.read_shift(4);
 | 
			
		||||
	var o = len > 0 ? blob.read_shift(len, 'utf16le').replace(chr0, "") : "";
 | 
			
		||||
	return o;
 | 
			
		||||
@ -436,19 +414,23 @@ function parse_Hyperlink(blob, length)/*:Hyperlink*/ {
 | 
			
		||||
	if(sVer !== 2) throw new Error("Unrecognized streamVersion: " + sVer);
 | 
			
		||||
	var flags = blob.read_shift(2);
 | 
			
		||||
	blob.l += 2;
 | 
			
		||||
	var displayName, targetFrameName, moniker, oleMoniker, Location="", guid, fileTime;
 | 
			
		||||
	var displayName, targetFrameName, moniker, oleMoniker, Loc="", guid, fileTime;
 | 
			
		||||
	if(flags & 0x0010) displayName = parse_HyperlinkString(blob, end - blob.l);
 | 
			
		||||
	if(flags & 0x0080) targetFrameName = parse_HyperlinkString(blob, end - blob.l);
 | 
			
		||||
	if((flags & 0x0101) === 0x0101) moniker = parse_HyperlinkString(blob, end - blob.l);
 | 
			
		||||
	if((flags & 0x0101) === 0x0001) oleMoniker = parse_HyperlinkMoniker(blob, end - blob.l);
 | 
			
		||||
	if(flags & 0x0008) Location = parse_HyperlinkString(blob, end - blob.l);
 | 
			
		||||
	if(flags & 0x0008) Loc = parse_HyperlinkString(blob, end - blob.l);
 | 
			
		||||
	if(flags & 0x0020) guid = blob.read_shift(16);
 | 
			
		||||
	if(flags & 0x0040) fileTime = parse_FILETIME(blob/*, 8*/);
 | 
			
		||||
	blob.l = end;
 | 
			
		||||
	var target = targetFrameName||moniker||oleMoniker||"";
 | 
			
		||||
	if(target && Location) target+="#"+Location;
 | 
			
		||||
	if(!target) target = "#" + Location;
 | 
			
		||||
	return {Target: target};
 | 
			
		||||
	if(target && Loc) target+="#"+Loc;
 | 
			
		||||
	if(!target) target = "#" + Loc;
 | 
			
		||||
	var out = ({Target:target}/*:any*/);
 | 
			
		||||
	if(guid) out.guid = guid;
 | 
			
		||||
	if(fileTime) out.time = fileTime;
 | 
			
		||||
	if(displayName) out.Tooltip = displayName;
 | 
			
		||||
	return out;
 | 
			
		||||
}
 | 
			
		||||
function write_Hyperlink(hl) {
 | 
			
		||||
	var out = new_buf(512), i = 0;
 | 
			
		||||
@ -485,7 +467,7 @@ function write_Hyperlink(hl) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.178 LongRGBA */
 | 
			
		||||
function parse_LongRGBA(blob, length) { var r = blob.read_shift(1), g = blob.read_shift(1), b = blob.read_shift(1), a = blob.read_shift(1); return [r,g,b,a]; }
 | 
			
		||||
function parse_LongRGBA(blob/*::, length*/) { var r = blob.read_shift(1), g = blob.read_shift(1), b = blob.read_shift(1), a = blob.read_shift(1); return [r,g,b,a]; }
 | 
			
		||||
 | 
			
		||||
/* 2.5.177 LongRGB */
 | 
			
		||||
function parse_LongRGB(blob, length) { var x = parse_LongRGBA(blob, length); x[3] = 0; return x; }
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
/* --- MS-XLS --- */
 | 
			
		||||
 | 
			
		||||
/* 2.5.19 */
 | 
			
		||||
function parse_XLSCell(blob, length)/*:Cell*/ {
 | 
			
		||||
function parse_XLSCell(blob/*::, length*/)/*:Cell*/ {
 | 
			
		||||
	var rw = blob.read_shift(2); // 0-indexed
 | 
			
		||||
	var col = blob.read_shift(2);
 | 
			
		||||
	var ixfe = blob.read_shift(2);
 | 
			
		||||
@ -35,7 +35,7 @@ function parse_XTI(blob, length, opts) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.218 */
 | 
			
		||||
function parse_RkRec(blob, length) {
 | 
			
		||||
function parse_RkRec(blob) {
 | 
			
		||||
	var ixfe = blob.read_shift(2);
 | 
			
		||||
	var RK = parse_RkNumber(blob);
 | 
			
		||||
	return [ixfe, RK];
 | 
			
		||||
@ -54,7 +54,7 @@ function parse_AddinUdf(blob, length, opts) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.209 TODO: Check sizes */
 | 
			
		||||
function parse_Ref8U(blob, length) {
 | 
			
		||||
function parse_Ref8U(blob/*::, length*/) {
 | 
			
		||||
	var rwFirst = blob.read_shift(2);
 | 
			
		||||
	var rwLast = blob.read_shift(2);
 | 
			
		||||
	var colFirst = blob.read_shift(2);
 | 
			
		||||
@ -71,7 +71,7 @@ function write_Ref8U(r/*:Range*/, o) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.211 */
 | 
			
		||||
function parse_RefU(blob, length) {
 | 
			
		||||
function parse_RefU(blob/*::, length*/) {
 | 
			
		||||
	var rwFirst = blob.read_shift(2);
 | 
			
		||||
	var rwLast = blob.read_shift(2);
 | 
			
		||||
	var colFirst = blob.read_shift(1);
 | 
			
		||||
@ -83,7 +83,7 @@ function parse_RefU(blob, length) {
 | 
			
		||||
var parse_Ref = parse_RefU;
 | 
			
		||||
 | 
			
		||||
/* 2.5.143 */
 | 
			
		||||
function parse_FtCmo(blob, length) {
 | 
			
		||||
function parse_FtCmo(blob/*::, length*/) {
 | 
			
		||||
	blob.l += 4;
 | 
			
		||||
	var ot = blob.read_shift(2);
 | 
			
		||||
	var id = blob.read_shift(2);
 | 
			
		||||
@ -93,7 +93,7 @@ function parse_FtCmo(blob, length) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.149 */
 | 
			
		||||
function parse_FtNts(blob, length) {
 | 
			
		||||
function parse_FtNts(blob) {
 | 
			
		||||
	var out = {};
 | 
			
		||||
	blob.l += 4;
 | 
			
		||||
	blob.l += 16; // GUID TODO
 | 
			
		||||
@ -103,7 +103,7 @@ function parse_FtNts(blob, length) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.142 */
 | 
			
		||||
function parse_FtCf(blob, length) {
 | 
			
		||||
function parse_FtCf(blob) {
 | 
			
		||||
	var out = {};
 | 
			
		||||
	blob.l += 4;
 | 
			
		||||
	blob.cf = blob.read_shift(2);
 | 
			
		||||
@ -111,7 +111,7 @@ function parse_FtCf(blob, length) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.140 - 2.5.154 and friends */
 | 
			
		||||
function parse_FtSkip(blob, length) { blob.l += 2; blob.l += blob.read_shift(2); }
 | 
			
		||||
function parse_FtSkip(blob) { blob.l += 2; blob.l += blob.read_shift(2); }
 | 
			
		||||
var FtTab = {
 | 
			
		||||
	/*::[*/0x00/*::]*/: parse_FtSkip,      /* FtEnd */
 | 
			
		||||
	/*::[*/0x04/*::]*/: parse_FtSkip,      /* FtMacro */
 | 
			
		||||
@ -133,7 +133,7 @@ var FtTab = {
 | 
			
		||||
	/*::[*/0x14/*::]*/: parse_FtSkip,      /* FtCblsFmla */
 | 
			
		||||
	/*::[*/0x15/*::]*/: parse_FtCmo
 | 
			
		||||
};
 | 
			
		||||
function parse_FtArray(blob, length, ot) {
 | 
			
		||||
function parse_FtArray(blob, length/*::, ot*/) {
 | 
			
		||||
	var tgt = blob.l + length;
 | 
			
		||||
	var fts = [];
 | 
			
		||||
	while(blob.l < tgt) {
 | 
			
		||||
@ -194,8 +194,7 @@ function write_BOF(wb/*:Workbook*/, t/*:number*/, o) {
 | 
			
		||||
/* 2.4.146 */
 | 
			
		||||
function parse_InterfaceHdr(blob, length) {
 | 
			
		||||
	if(length === 0) return 0x04b0;
 | 
			
		||||
	var q;
 | 
			
		||||
	if((q=blob.read_shift(2))!==0x04b0){/* empty */}
 | 
			
		||||
	if((blob.read_shift(2))!==0x04b0){/* empty */}
 | 
			
		||||
	return 0x04b0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -205,7 +204,7 @@ function parse_WriteAccess(blob, length, opts) {
 | 
			
		||||
	if(opts.enc) { blob.l += length; return ""; }
 | 
			
		||||
	var l = blob.l;
 | 
			
		||||
	// TODO: make sure XLUnicodeString doesnt overrun
 | 
			
		||||
	var UserName = parse_XLUnicodeString(blob, 0, opts);
 | 
			
		||||
	var UserName = parse_XLUnicodeString2(blob, 0, opts);
 | 
			
		||||
	blob.read_shift(length + l - blob.l);
 | 
			
		||||
	return UserName;
 | 
			
		||||
}
 | 
			
		||||
@ -276,7 +275,7 @@ function parse_ExtSST(blob, length) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* 2.4.221 TODO: check BIFF2-4 */
 | 
			
		||||
function parse_Row(blob, length) {
 | 
			
		||||
function parse_Row(blob) {
 | 
			
		||||
	var z = ({}/*:any*/);
 | 
			
		||||
	z.r = blob.read_shift(2);
 | 
			
		||||
	z.c = blob.read_shift(2);
 | 
			
		||||
@ -294,7 +293,7 @@ function parse_Row(blob, length) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* 2.4.125 */
 | 
			
		||||
function parse_ForceFullCalculation(blob, length) {
 | 
			
		||||
function parse_ForceFullCalculation(blob) {
 | 
			
		||||
	var header = parse_frtHeader(blob);
 | 
			
		||||
	if(header.type != 0x08A3) throw new Error("Invalid Future Record " + header.type);
 | 
			
		||||
	var fullcalc = blob.read_shift(4);
 | 
			
		||||
@ -306,7 +305,7 @@ function parse_ForceFullCalculation(blob, length) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* 2.4.215 rt */
 | 
			
		||||
function parse_RecalcId(blob, length) {
 | 
			
		||||
function parse_RecalcId(blob) {
 | 
			
		||||
	blob.read_shift(2);
 | 
			
		||||
	return blob.read_shift(4);
 | 
			
		||||
}
 | 
			
		||||
@ -326,14 +325,14 @@ function parse_DefaultRowHeight(blob, length, opts) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.4.345 TODO */
 | 
			
		||||
function parse_Window1(blob, length) {
 | 
			
		||||
function parse_Window1(blob) {
 | 
			
		||||
	var xWn = blob.read_shift(2), yWn = blob.read_shift(2), dxWn = blob.read_shift(2), dyWn = blob.read_shift(2);
 | 
			
		||||
	var flags = blob.read_shift(2), iTabCur = blob.read_shift(2), iTabFirst = blob.read_shift(2);
 | 
			
		||||
	var ctabSel = blob.read_shift(2), wTabRatio = blob.read_shift(2);
 | 
			
		||||
	return { Pos: [xWn, yWn], Dim: [dxWn, dyWn], Flags: flags, CurTab: iTabCur,
 | 
			
		||||
		FirstTab: iTabFirst, Selected: ctabSel, TabRatio: wTabRatio };
 | 
			
		||||
}
 | 
			
		||||
function write_Window1(opts) {
 | 
			
		||||
function write_Window1(/*::opts*/) {
 | 
			
		||||
	var o = new_buf(18);
 | 
			
		||||
	o.write_shift(2, 0);
 | 
			
		||||
	o.write_shift(2, 0);
 | 
			
		||||
@ -379,7 +378,7 @@ function parse_Font(blob, length, opts) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.4.149 */
 | 
			
		||||
function parse_LabelSst(blob, length) {
 | 
			
		||||
function parse_LabelSst(blob) {
 | 
			
		||||
	var cell = parse_XLSCell(blob);
 | 
			
		||||
	cell.isst = blob.read_shift(4);
 | 
			
		||||
	return cell;
 | 
			
		||||
@ -434,7 +433,7 @@ function write_Dimensions(range, opts) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.4.220 */
 | 
			
		||||
function parse_RK(blob, length) {
 | 
			
		||||
function parse_RK(blob) {
 | 
			
		||||
	var rw = blob.read_shift(2), col = blob.read_shift(2);
 | 
			
		||||
	var rkrec = parse_RkRec(blob);
 | 
			
		||||
	return {r:rw, c:col, ixfe:rkrec[0], rknum:rkrec[1]};
 | 
			
		||||
@ -504,8 +503,8 @@ function parse_CellStyleXF(blob, length, style, opts) {
 | 
			
		||||
	o.fsxButton = (d >> 14) & 0x01;
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
function parse_CellXF(blob, length, opts) {return parse_CellStyleXF(blob,length,0, opts);}
 | 
			
		||||
function parse_StyleXF(blob, length, opts) {return parse_CellStyleXF(blob,length,1, opts);}
 | 
			
		||||
//function parse_CellXF(blob, length, opts) {return parse_CellStyleXF(blob,length,0, opts);}
 | 
			
		||||
//function parse_StyleXF(blob, length, opts) {return parse_CellStyleXF(blob,length,1, opts);}
 | 
			
		||||
 | 
			
		||||
/* 2.4.353 TODO: actually do this right */
 | 
			
		||||
function parse_XF(blob, length, opts) {
 | 
			
		||||
@ -518,7 +517,7 @@ function parse_XF(blob, length, opts) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.4.134 */
 | 
			
		||||
function parse_Guts(blob, length) {
 | 
			
		||||
function parse_Guts(blob) {
 | 
			
		||||
	blob.l += 4;
 | 
			
		||||
	var out = [blob.read_shift(2), blob.read_shift(2)];
 | 
			
		||||
	if(out[0] !== 0) out[0]--;
 | 
			
		||||
@ -551,13 +550,13 @@ function write_BoolErr(R/*:number*/, C/*:number*/, v, opts, t/*:string*/) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.4.180 Number */
 | 
			
		||||
function parse_Number(blob, length) {
 | 
			
		||||
function parse_Number(blob) {
 | 
			
		||||
	var cell = parse_XLSCell(blob, 6);
 | 
			
		||||
	var xnum = parse_Xnum(blob, 8);
 | 
			
		||||
	cell.val = xnum;
 | 
			
		||||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
function write_Number(R/*:number*/, C/*:number*/, v, opts) {
 | 
			
		||||
function write_Number(R/*:number*/, C/*:number*/, v/*::, opts*/) {
 | 
			
		||||
	var o = new_buf(14);
 | 
			
		||||
	write_XLSCell(R, C, 0, o);
 | 
			
		||||
	write_Xnum(v, o);
 | 
			
		||||
@ -649,6 +648,7 @@ function parse_ExternSheet(blob, length, opts) {
 | 
			
		||||
	var o = [], target = blob.l + length, len = blob.read_shift(opts.biff > 8 ? 4 : 2);
 | 
			
		||||
	while(len-- !== 0) o.push(parse_XTI(blob, opts.biff > 8 ? 12 : 6, opts));
 | 
			
		||||
		// [iSupBook, itabFirst, itabLast];
 | 
			
		||||
	if(blob.l != target) throw new Error("Bad ExternSheet: " + blob.l + " != " + target);
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
function parse_BIFF5ExternSheet(blob, length, opts) {
 | 
			
		||||
@ -689,7 +689,7 @@ function parse_Array(blob, length, opts) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.4.173 */
 | 
			
		||||
function parse_MTRSettings(blob, length) {
 | 
			
		||||
function parse_MTRSettings(blob) {
 | 
			
		||||
	var fMTREnabled = blob.read_shift(4) !== 0x00;
 | 
			
		||||
	var fUserSetThreadCount = blob.read_shift(4) !== 0x00;
 | 
			
		||||
	var cUserThreadCount = blob.read_shift(4);
 | 
			
		||||
@ -735,14 +735,14 @@ function parse_Obj(blob, length, opts) {
 | 
			
		||||
}
 | 
			
		||||
/* from older spec */
 | 
			
		||||
var parse_BIFF5OT = [];
 | 
			
		||||
parse_BIFF5OT[0x08] = function(blob, length, opts) {
 | 
			
		||||
parse_BIFF5OT[0x08] = function(blob, length) {
 | 
			
		||||
	var tgt = blob.l + length;
 | 
			
		||||
	blob.l += 10; // todo
 | 
			
		||||
	var cf = blob.read_shift(2);
 | 
			
		||||
	blob.l += 4;
 | 
			
		||||
	var cbPictFmla = blob.read_shift(2);
 | 
			
		||||
	blob.l += 2; //var cbPictFmla = blob.read_shift(2);
 | 
			
		||||
	blob.l += 2;
 | 
			
		||||
	var grbit = blob.read_shift(2);
 | 
			
		||||
	blob.l += 2; //var grbit = blob.read_shift(2);
 | 
			
		||||
	blob.l += 4;
 | 
			
		||||
	var cchName = blob.read_shift(1);
 | 
			
		||||
	blob.l += cchName; // TODO: stName
 | 
			
		||||
@ -751,19 +751,19 @@ parse_BIFF5OT[0x08] = function(blob, length, opts) {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function parse_BIFF5Obj(blob, length, opts) {
 | 
			
		||||
	var cnt = blob.read_shift(4);
 | 
			
		||||
	blob.l += 4; //var cnt = blob.read_shift(4);
 | 
			
		||||
	var ot = blob.read_shift(2);
 | 
			
		||||
	var id = blob.read_shift(2);
 | 
			
		||||
	var grbit = blob.read_shift(2);
 | 
			
		||||
	var colL = blob.read_shift(2);
 | 
			
		||||
	var dxL = blob.read_shift(2);
 | 
			
		||||
	var rwT = blob.read_shift(2);
 | 
			
		||||
	var dyT = blob.read_shift(2);
 | 
			
		||||
	var colR = blob.read_shift(2);
 | 
			
		||||
	var dxR = blob.read_shift(2);
 | 
			
		||||
	var rwB = blob.read_shift(2);
 | 
			
		||||
	var dyB = blob.read_shift(2);
 | 
			
		||||
	var cbMacro = blob.read_shift(2);
 | 
			
		||||
	blob.l += 2; //var colL = blob.read_shift(2);
 | 
			
		||||
	blob.l += 2; //var dxL = blob.read_shift(2);
 | 
			
		||||
	blob.l += 2; //var rwT = blob.read_shift(2);
 | 
			
		||||
	blob.l += 2; //var dyT = blob.read_shift(2);
 | 
			
		||||
	blob.l += 2; //var colR = blob.read_shift(2);
 | 
			
		||||
	blob.l += 2; //var dxR = blob.read_shift(2);
 | 
			
		||||
	blob.l += 2; //var rwB = blob.read_shift(2);
 | 
			
		||||
	blob.l += 2; //var dyB = blob.read_shift(2);
 | 
			
		||||
	blob.l += 2; //var cbMacro = blob.read_shift(2);
 | 
			
		||||
	blob.l += 6;
 | 
			
		||||
	length -= 36;
 | 
			
		||||
	var fts = [];
 | 
			
		||||
@ -778,12 +778,12 @@ function parse_TxO(blob, length, opts) {
 | 
			
		||||
try {
 | 
			
		||||
	blob.l += 4;
 | 
			
		||||
	var ot = (opts.lastobj||{cmo:[0,0]}).cmo[1];
 | 
			
		||||
	var controlInfo;
 | 
			
		||||
	var controlInfo; // eslint-disable-line no-unused-vars
 | 
			
		||||
	if([0,5,7,11,12,14].indexOf(ot) == -1) blob.l += 6;
 | 
			
		||||
	else controlInfo = parse_ControlInfo(blob, 6, opts);
 | 
			
		||||
	var cchText = blob.read_shift(2);
 | 
			
		||||
	var cbRuns = blob.read_shift(2);
 | 
			
		||||
	var ifntEmpty = parseuint16(blob, 2);
 | 
			
		||||
	/*var cbRuns = */blob.read_shift(2);
 | 
			
		||||
	/*var ifntEmpty = */parseuint16(blob, 2);
 | 
			
		||||
	var len = blob.read_shift(2);
 | 
			
		||||
	blob.l += len;
 | 
			
		||||
	//var fmla = parse_ObjFmla(blob, s + length - blob.l);
 | 
			
		||||
@ -831,7 +831,6 @@ function write_HLink(hl) {
 | 
			
		||||
 | 
			
		||||
/* 2.4.141 */
 | 
			
		||||
function parse_HLinkTooltip(blob, length) {
 | 
			
		||||
	var end = blob.l + length;
 | 
			
		||||
	blob.read_shift(2);
 | 
			
		||||
	var ref = parse_Ref8U(blob, 8);
 | 
			
		||||
	var wzTooltip = blob.read_shift((length-10)/2, 'dbcs-cont');
 | 
			
		||||
@ -851,7 +850,7 @@ function write_HLinkTooltip(hl) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.4.63 */
 | 
			
		||||
function parse_Country(blob, length)/*:[string|number, string|number]*/ {
 | 
			
		||||
function parse_Country(blob)/*:[string|number, string|number]*/ {
 | 
			
		||||
	var o = [0,0], d;
 | 
			
		||||
	d = blob.read_shift(2); o[0] = CountryEnum[d] || d;
 | 
			
		||||
	d = blob.read_shift(2); o[1] = CountryEnum[d] || d;
 | 
			
		||||
@ -865,7 +864,7 @@ function write_Country(o) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.4.50 ClrtClient */
 | 
			
		||||
function parse_ClrtClient(blob, length) {
 | 
			
		||||
function parse_ClrtClient(blob) {
 | 
			
		||||
	var ccv = blob.read_shift(2);
 | 
			
		||||
	var o = [];
 | 
			
		||||
	while(ccv-->0) o.push(parse_LongRGB(blob, 8));
 | 
			
		||||
@ -873,7 +872,7 @@ function parse_ClrtClient(blob, length) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.4.188 */
 | 
			
		||||
function parse_Palette(blob, length) {
 | 
			
		||||
function parse_Palette(blob) {
 | 
			
		||||
	var ccv = blob.read_shift(2);
 | 
			
		||||
	var o = [];
 | 
			
		||||
	while(ccv-->0) o.push(parse_LongRGB(blob, 8));
 | 
			
		||||
@ -881,7 +880,7 @@ function parse_Palette(blob, length) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.4.354 */
 | 
			
		||||
function parse_XFCRC(blob, length) {
 | 
			
		||||
function parse_XFCRC(blob) {
 | 
			
		||||
	blob.l += 2;
 | 
			
		||||
	var o = {cxfs:0, crc:0};
 | 
			
		||||
	o.cxfs = blob.read_shift(2);
 | 
			
		||||
@ -904,7 +903,7 @@ function parse_ColInfo(blob, length, opts) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.4.257 */
 | 
			
		||||
function parse_Setup(blob, length, opts) {
 | 
			
		||||
function parse_Setup(blob/*, length*/) {
 | 
			
		||||
	var o = {};
 | 
			
		||||
	blob.l += 16;
 | 
			
		||||
	o.header = parse_Xnum(blob, 8);
 | 
			
		||||
@ -934,8 +933,7 @@ var parse_Scl = parseuint16a; /* 2.4.247 num, den */
 | 
			
		||||
var parse_String = parse_XLUnicodeString; /* 2.4.268 */
 | 
			
		||||
 | 
			
		||||
/* --- Specific to versions before BIFF8 --- */
 | 
			
		||||
function parse_ImData(blob, length, opts) {
 | 
			
		||||
	var tgt = blob.l + length;
 | 
			
		||||
function parse_ImData(blob) {
 | 
			
		||||
	var cf = blob.read_shift(2);
 | 
			
		||||
	var env = blob.read_shift(2);
 | 
			
		||||
	var lcb = blob.read_shift(4);
 | 
			
		||||
@ -944,11 +942,6 @@ function parse_ImData(blob, length, opts) {
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function parse_BIFF5String(blob) {
 | 
			
		||||
	var len = blob.read_shift(1);
 | 
			
		||||
	return blob.read_shift(len, 'sbcs-cont');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* BIFF2_??? where ??? is the name from [XLS] */
 | 
			
		||||
function parse_BIFF2STR(blob, length, opts) {
 | 
			
		||||
	var cell = parse_XLSCell(blob, 6);
 | 
			
		||||
@ -959,7 +952,7 @@ function parse_BIFF2STR(blob, length, opts) {
 | 
			
		||||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function parse_BIFF2NUM(blob, length, opts) {
 | 
			
		||||
function parse_BIFF2NUM(blob/*::, length*/) {
 | 
			
		||||
	var cell = parse_XLSCell(blob, 6);
 | 
			
		||||
	++blob.l;
 | 
			
		||||
	var num = parse_Xnum(blob, 8);
 | 
			
		||||
@ -974,7 +967,7 @@ function write_BIFF2NUM(r/*:number*/, c/*:number*/, val/*:number*/) {
 | 
			
		||||
	return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function parse_BIFF2INT(blob, length) {
 | 
			
		||||
function parse_BIFF2INT(blob) {
 | 
			
		||||
	var cell = parse_XLSCell(blob, 6);
 | 
			
		||||
	++blob.l;
 | 
			
		||||
	var num = blob.read_shift(2);
 | 
			
		||||
@ -989,7 +982,7 @@ function write_BIFF2INT(r/*:number*/, c/*:number*/, val/*:number*/) {
 | 
			
		||||
	return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function parse_BIFF2STRING(blob, length) {
 | 
			
		||||
function parse_BIFF2STRING(blob) {
 | 
			
		||||
	var cch = blob.read_shift(1);
 | 
			
		||||
	if(cch === 0) { blob.l++; return ""; }
 | 
			
		||||
	return blob.read_shift(cch, 'sbcs-cont');
 | 
			
		||||
 | 
			
		||||
@ -66,17 +66,17 @@ function dbf_to_aoa(buf, opts)/*:AOA*/ {
 | 
			
		||||
		case 0xF5: memo = true; break;
 | 
			
		||||
		default: throw new Error("DBF Unsupported Version: " + ft.toString(16));
 | 
			
		||||
	}
 | 
			
		||||
	var filedate = new Date(), nrow = 0, fpos = 0;
 | 
			
		||||
	var /*filedate = new Date(),*/ nrow = 0, fpos = 0;
 | 
			
		||||
	if(ft == 0x02) nrow = d.read_shift(2);
 | 
			
		||||
	filedate = new Date(d.read_shift(1) + 1900, d.read_shift(1) - 1, d.read_shift(1));
 | 
			
		||||
	/*filedate = new Date(d.read_shift(1) + 1900, d.read_shift(1) - 1, d.read_shift(1));*/d.l += 3;
 | 
			
		||||
	if(ft != 0x02) nrow = d.read_shift(4);
 | 
			
		||||
	if(ft != 0x02) fpos = d.read_shift(2);
 | 
			
		||||
	var rlen = d.read_shift(2);
 | 
			
		||||
 | 
			
		||||
	var flags = 0, current_cp = 1252;
 | 
			
		||||
	var /*flags = 0,*/ current_cp = 1252;
 | 
			
		||||
	if(ft != 0x02) {
 | 
			
		||||
	d.l+=16;
 | 
			
		||||
	flags = d.read_shift(1);
 | 
			
		||||
	/*flags = */d.read_shift(1);
 | 
			
		||||
	//if(memo && ((flags & 0x02) === 0)) throw new Error("DBF Flags " + flags.toString(16) + " ft " + ft.toString(16));
 | 
			
		||||
 | 
			
		||||
	/* codepage present in FoxPro */
 | 
			
		||||
@ -407,7 +407,7 @@ var SYLK = (function() {
 | 
			
		||||
 | 
			
		||||
	function sylk_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ { return sheet_to_workbook(sylk_to_sheet(d, opts), opts); }
 | 
			
		||||
 | 
			
		||||
	function write_ws_cell_sylk(cell/*:Cell*/, ws/*:Worksheet*/, R/*:number*/, C/*:number*/, opts)/*:string*/ {
 | 
			
		||||
	function write_ws_cell_sylk(cell/*:Cell*/, ws/*:Worksheet*/, R/*:number*/, C/*:number*//*::, opts*/)/*:string*/ {
 | 
			
		||||
		var o = "C;Y" + (R+1) + ";X" + (C+1) + ";K";
 | 
			
		||||
		switch(cell.t) {
 | 
			
		||||
			case 'n':
 | 
			
		||||
@ -484,7 +484,7 @@ var DIF = (function() {
 | 
			
		||||
		}
 | 
			
		||||
		throw new Error("Unrecognized type " + opts.type);
 | 
			
		||||
	}
 | 
			
		||||
	function dif_to_aoa_str(str/*:string*/, opts)/*:AOA*/ {
 | 
			
		||||
	function dif_to_aoa_str(str/*:string*//*::, opts*/)/*:AOA*/ {
 | 
			
		||||
		var records = str.split('\n'), R = -1, C = -1, ri = 0, arr/*:AOA*/ = [];
 | 
			
		||||
		for (; ri !== records.length; ++ri) {
 | 
			
		||||
			if (records[ri].trim() === 'BOT') { arr[++R] = []; C = 0; continue; }
 | 
			
		||||
@ -528,7 +528,7 @@ var DIF = (function() {
 | 
			
		||||
			o.push(type + "," + v);
 | 
			
		||||
			o.push(type == 1 ? '"' + s.replace(/"/g,'""') + '"' : s);
 | 
			
		||||
		};
 | 
			
		||||
		return function sheet_to_dif(ws/*:Worksheet*/, opts/*:?any*/)/*:string*/ {
 | 
			
		||||
		return function sheet_to_dif(ws/*:Worksheet*//*::, opts:?any*/)/*:string*/ {
 | 
			
		||||
			var o/*:Array<string>*/ = [];
 | 
			
		||||
			var r = safe_decode_range(ws['!ref']), cell/*:Cell*/;
 | 
			
		||||
			var dense = Array.isArray(ws);
 | 
			
		||||
@ -585,7 +585,7 @@ var ETH = (function() {
 | 
			
		||||
	function decode(s/*:string*/)/*:string*/ { return s.replace(/\\b/g,"\\").replace(/\\c/g,":").replace(/\\n/g,"\n"); }
 | 
			
		||||
	function encode(s/*:string*/)/*:string*/ { return s.replace(/\\/g, "\\b").replace(/:/g, "\\c").replace(/\n/g,"\\n"); }
 | 
			
		||||
 | 
			
		||||
	function eth_to_aoa(str/*:string*/, opts)/*:AOA*/ {
 | 
			
		||||
	function eth_to_aoa(str/*:string*//*::, opts*/)/*:AOA*/ {
 | 
			
		||||
		var records = str.split('\n'), R = -1, C = -1, ri = 0, arr/*:AOA*/ = [];
 | 
			
		||||
		for (; ri !== records.length; ++ri) {
 | 
			
		||||
			var record = records[ri].trim().split(":");
 | 
			
		||||
@ -668,7 +668,7 @@ var ETH = (function() {
 | 
			
		||||
		return o.join("\n");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	function sheet_to_eth(ws/*:Worksheet*/, opts/*:?any*/)/*:string*/ {
 | 
			
		||||
	function sheet_to_eth(ws/*:Worksheet*//*::, opts:?any*/)/*:string*/ {
 | 
			
		||||
		return [header, sep, meta, sep, sheet_to_eth_data(ws), end].join("\n");
 | 
			
		||||
		// return ["version:1.5", sheet_to_eth_data(ws)].join("\n"); // clipboard form
 | 
			
		||||
	}
 | 
			
		||||
@ -836,7 +836,7 @@ var PRN = (function() {
 | 
			
		||||
 | 
			
		||||
	function prn_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ { return sheet_to_workbook(prn_to_sheet(d, opts), opts); }
 | 
			
		||||
 | 
			
		||||
	function sheet_to_prn(ws/*:Worksheet*/, opts/*:?any*/)/*:string*/ {
 | 
			
		||||
	function sheet_to_prn(ws/*:Worksheet*//*::, opts:?any*/)/*:string*/ {
 | 
			
		||||
		var o/*:Array<string>*/ = [];
 | 
			
		||||
		var r = safe_decode_range(ws['!ref']), cell/*:Cell*/;
 | 
			
		||||
		var dense = Array.isArray(ws);
 | 
			
		||||
 | 
			
		||||
@ -95,7 +95,7 @@ var WK_ = (function() {
 | 
			
		||||
		return { SheetNames: snames, Sheets:sheets };
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	function parse_RANGE(blob, length) {
 | 
			
		||||
	function parse_RANGE(blob) {
 | 
			
		||||
		var o = {s:{c:0,r:0},e:{c:0,r:0}};
 | 
			
		||||
		o.s.c = blob.read_shift(2);
 | 
			
		||||
		o.s.r = blob.read_shift(2);
 | 
			
		||||
@ -159,7 +159,7 @@ var WK_ = (function() {
 | 
			
		||||
		return o;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	function parse_cell_3(blob, length) {
 | 
			
		||||
	function parse_cell_3(blob/*::, length*/) {
 | 
			
		||||
		var o = [{c:0,r:0}, {t:'n',v:0}, 0];
 | 
			
		||||
		o[0].r = blob.read_shift(2); o[3] = blob[blob.l++]; o[0].c = blob[blob.l++];
 | 
			
		||||
		return o;
 | 
			
		||||
@ -198,7 +198,7 @@ var WK_ = (function() {
 | 
			
		||||
		var e = blob.read_shift(2);
 | 
			
		||||
		if(e == 0xFFFF) { o[1].v = 0; return o; }
 | 
			
		||||
		var s = e & 0x8000; e = (e&0x7FFF) - 16446;
 | 
			
		||||
		o[1].v = ((e > 0 ? (v2 << e) : (v2 >>> -e)) + (e > -32 ? (v1 << (e + 32)) : (v1 >>> -(e + 32))));
 | 
			
		||||
		o[1].v = (s*2 - 1) * ((e > 0 ? (v2 << e) : (v2 >>> -e)) + (e > -32 ? (v1 << (e + 32)) : (v1 >>> -(e + 32))));
 | 
			
		||||
		return o;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -123,12 +123,12 @@ var parse_rs = (function parse_rs_factory() {
 | 
			
		||||
	function parse_r(r) {
 | 
			
		||||
		var terms/*:[Array<string>, string, Array<string>]*/ = [[],"",[]];
 | 
			
		||||
		/* 18.4.12 t ST_Xstring */
 | 
			
		||||
		var t = r.match(tregex), cp = 65001;
 | 
			
		||||
		var t = r.match(tregex)/*, cp = 65001*/;
 | 
			
		||||
		if(!t) return "";
 | 
			
		||||
		terms[1] = t[1];
 | 
			
		||||
 | 
			
		||||
		var rpr = r.match(rpregex);
 | 
			
		||||
		if(rpr) cp = parse_rpr(rpr[1], terms[0], terms[2]);
 | 
			
		||||
		if(rpr) /*cp = */parse_rpr(rpr[1], terms[0], terms[2]);
 | 
			
		||||
 | 
			
		||||
		return terms[0].join("") + terms[1].replace(nlregex,'<br/>') + terms[2].join("");
 | 
			
		||||
	}
 | 
			
		||||
@ -144,7 +144,7 @@ function parse_si(x, opts) {
 | 
			
		||||
	var html = opts ? opts.cellHTML : true;
 | 
			
		||||
	var z = {};
 | 
			
		||||
	if(!x) return null;
 | 
			
		||||
	var y;
 | 
			
		||||
	//var y;
 | 
			
		||||
	/* 18.4.12 t ST_Xstring (Plaintext String) */
 | 
			
		||||
	// TODO: is whitespace actually valid here?
 | 
			
		||||
	if(x.match(/^\s*<(?:\w+:)?t[^>]*>/)) {
 | 
			
		||||
@ -153,7 +153,7 @@ function parse_si(x, opts) {
 | 
			
		||||
		if(html) z.h = escapehtml(z.t);
 | 
			
		||||
	}
 | 
			
		||||
	/* 18.4.4 r CT_RElt (Rich Text Run) */
 | 
			
		||||
	else if((y = x.match(sirregex))) {
 | 
			
		||||
	else if((/*y = */x.match(sirregex))) {
 | 
			
		||||
		z.r = utf8read(x);
 | 
			
		||||
		z.t = unescapexml(utf8read((x.replace(sirphregex, '').match(sitregex)||[]).join("").replace(tagregex,"")));
 | 
			
		||||
		if(html) z.h = parse_rs(z.r);
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
/* [MS-XLSB] 2.4.219 BrtBeginSst */
 | 
			
		||||
function parse_BrtBeginSst(data, length) {
 | 
			
		||||
function parse_BrtBeginSst(data) {
 | 
			
		||||
	return [data.read_shift(4), data.read_shift(4)];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -39,7 +39,7 @@ function write_BrtBeginSst(sst, o) {
 | 
			
		||||
 | 
			
		||||
var write_BrtSSTItem = write_RichStr;
 | 
			
		||||
 | 
			
		||||
function write_sst_bin(sst, opts) {
 | 
			
		||||
function write_sst_bin(sst/*::, opts*/) {
 | 
			
		||||
	var ba = buf_array();
 | 
			
		||||
	write_record(ba, "BrtBeginSst", write_BrtBeginSst(sst));
 | 
			
		||||
	for(var i = 0; i < sst.length; ++i) write_record(ba, "BrtSSTItem", write_BrtSSTItem(sst[i]));
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@ function parse_CRYPTOVersion(blob, length/*:?number*/) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-OFFCRYPTO] 2.1.5 DataSpaceVersionInfo */
 | 
			
		||||
function parse_DataSpaceVersionInfo(blob, length) {
 | 
			
		||||
function parse_DataSpaceVersionInfo(blob) {
 | 
			
		||||
	var o = {};
 | 
			
		||||
	o.id = blob.read_shift(0, 'lpp4');
 | 
			
		||||
	o.R = parse_CRYPTOVersion(blob, 4);
 | 
			
		||||
@ -41,7 +41,7 @@ function parse_DataSpaceMapEntry(blob) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-OFFCRYPTO] 2.1.6 DataSpaceMap */
 | 
			
		||||
function parse_DataSpaceMap(blob, length) {
 | 
			
		||||
function parse_DataSpaceMap(blob) {
 | 
			
		||||
	var o = [];
 | 
			
		||||
	blob.l += 4; // must be 0x8
 | 
			
		||||
	var cnt = blob.read_shift(4);
 | 
			
		||||
@ -50,7 +50,7 @@ function parse_DataSpaceMap(blob, length) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-OFFCRYPTO] 2.1.7 DataSpaceDefinition */
 | 
			
		||||
function parse_DataSpaceDefinition(blob, length)/*:Array<string>*/ {
 | 
			
		||||
function parse_DataSpaceDefinition(blob)/*:Array<string>*/ {
 | 
			
		||||
	var o/*:Array<string>*/ = [];
 | 
			
		||||
	blob.l += 4; // must be 0x8
 | 
			
		||||
	var cnt = blob.read_shift(4);
 | 
			
		||||
@ -59,9 +59,9 @@ function parse_DataSpaceDefinition(blob, length)/*:Array<string>*/ {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-OFFCRYPTO] 2.1.8 DataSpaceDefinition */
 | 
			
		||||
function parse_TransformInfoHeader(blob, length) {
 | 
			
		||||
function parse_TransformInfoHeader(blob) {
 | 
			
		||||
	var o = {};
 | 
			
		||||
	var len = blob.read_shift(4);
 | 
			
		||||
	/*var len = */blob.read_shift(4);
 | 
			
		||||
	blob.l += 4; // must be 0x1
 | 
			
		||||
	o.id = blob.read_shift(0, 'lpp4');
 | 
			
		||||
	o.name = blob.read_shift(0, 'lpp4');
 | 
			
		||||
@ -71,7 +71,7 @@ function parse_TransformInfoHeader(blob, length) {
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function parse_Primary(blob, length) {
 | 
			
		||||
function parse_Primary(blob) {
 | 
			
		||||
	/* [MS-OFFCRYPTO] 2.2.6 IRMDSTransformInfo */
 | 
			
		||||
	var hdr = parse_TransformInfoHeader(blob);
 | 
			
		||||
	/* [MS-OFFCRYPTO] 2.1.9 EncryptionTransformInfo */
 | 
			
		||||
@ -112,13 +112,13 @@ function parse_EncryptionVerifier(blob, length/*:number*/) {
 | 
			
		||||
	blob.l += 4; // SaltSize must be 0x10
 | 
			
		||||
	o.Salt = blob.slice(blob.l, blob.l+16); blob.l += 16;
 | 
			
		||||
	o.Verifier = blob.slice(blob.l, blob.l+16); blob.l += 16;
 | 
			
		||||
	var sz = blob.read_shift(4);
 | 
			
		||||
	/*var sz = */blob.read_shift(4);
 | 
			
		||||
	o.VerifierHash = blob.slice(blob.l, tgt); blob.l = tgt;
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-OFFCRYPTO] 2.3.4.* EncryptionInfo Stream */
 | 
			
		||||
function parse_EncryptionInfo(blob, length/*:?number*/) {
 | 
			
		||||
function parse_EncryptionInfo(blob) {
 | 
			
		||||
	var vers = parse_CRYPTOVersion(blob);
 | 
			
		||||
	switch(vers.Minor) {
 | 
			
		||||
		case 0x02: return [vers.Minor, parse_EncInfoStd(blob, vers)];
 | 
			
		||||
@ -129,24 +129,24 @@ function parse_EncryptionInfo(blob, length/*:?number*/) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-OFFCRYPTO] 2.3.4.5  EncryptionInfo Stream (Standard Encryption) */
 | 
			
		||||
function parse_EncInfoStd(blob, vers) {
 | 
			
		||||
function parse_EncInfoStd(blob/*::, vers*/) {
 | 
			
		||||
	var flags = blob.read_shift(4);
 | 
			
		||||
	if((flags & 0x3F) != 0x24) throw new Error("EncryptionInfo mismatch");
 | 
			
		||||
	var sz = blob.read_shift(4);
 | 
			
		||||
	var tgt = blob.l + sz;
 | 
			
		||||
	//var tgt = blob.l + sz;
 | 
			
		||||
	var hdr = parse_EncryptionHeader(blob, sz);
 | 
			
		||||
	var verifier = parse_EncryptionVerifier(blob, blob.length - blob.l);
 | 
			
		||||
	return { t:"Std", h:hdr, v:verifier };
 | 
			
		||||
}
 | 
			
		||||
/* [MS-OFFCRYPTO] 2.3.4.6  EncryptionInfo Stream (Extensible Encryption) */
 | 
			
		||||
function parse_EncInfoExt(blob, vers) { throw new Error("File is password-protected: ECMA-376 Extensible"); }
 | 
			
		||||
function parse_EncInfoExt(/*::blob, vers*/) { throw new Error("File is password-protected: ECMA-376 Extensible"); }
 | 
			
		||||
/* [MS-OFFCRYPTO] 2.3.4.10 EncryptionInfo Stream (Agile Encryption) */
 | 
			
		||||
function parse_EncInfoAgl(blob, vers) {
 | 
			
		||||
function parse_EncInfoAgl(blob/*::, vers*/) {
 | 
			
		||||
	var KeyData = ["saltSize","blockSize","keyBits","hashSize","cipherAlgorithm","cipherChaining","hashAlgorithm","saltValue"];
 | 
			
		||||
	blob.l+=4;
 | 
			
		||||
	var xml = blob.read_shift(blob.length - blob.l, 'utf8');
 | 
			
		||||
	var o = {};
 | 
			
		||||
	xml.replace(tagregex, function xml_agile(x, idx) {
 | 
			
		||||
	xml.replace(tagregex, function xml_agile(x) {
 | 
			
		||||
		var y/*:any*/ = parsexmltag(x);
 | 
			
		||||
		switch(strip_ns(y[0])) {
 | 
			
		||||
			case '<?xml': break;
 | 
			
		||||
@ -178,9 +178,9 @@ function parse_RC4CryptoHeader(blob, length/*:number*/) {
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
/* [MS-OFFCRYPTO] 2.3.6.1 RC4 Encryption Header */
 | 
			
		||||
function parse_RC4Header(blob, length/*:number*/) {
 | 
			
		||||
function parse_RC4Header(blob/*::, length*/) {
 | 
			
		||||
	var o = {};
 | 
			
		||||
	var vers = o.EncryptionVersionInfo = parse_CRYPTOVersion(blob, 4); length -= 4;
 | 
			
		||||
	var vers = o.EncryptionVersionInfo = parse_CRYPTOVersion(blob, 4);
 | 
			
		||||
	if(vers.Major != 1 || vers.Minor != 1) throw 'unrecognized version code ' + vers.Major + ' : ' + vers.Minor;
 | 
			
		||||
	o.Salt = blob.read_shift(16);
 | 
			
		||||
	o.EncryptedVerifier = blob.read_shift(16);
 | 
			
		||||
 | 
			
		||||
@ -24,7 +24,7 @@ var RTF = (function() {
 | 
			
		||||
	function rtf_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ { return sheet_to_workbook(rtf_to_sheet(d, opts), opts); }
 | 
			
		||||
 | 
			
		||||
	/* TODO: this is a stub */
 | 
			
		||||
	function sheet_to_rtf(ws/*:Worksheet*/, opts)/*:string*/ {
 | 
			
		||||
	function sheet_to_rtf(ws/*:Worksheet*//*::, opts*/)/*:string*/ {
 | 
			
		||||
		var o = ["{\\rtf1\\ansi"];
 | 
			
		||||
		var r = safe_decode_range(ws['!ref']), cell/*:Cell*/;
 | 
			
		||||
		var dense = Array.isArray(ws);
 | 
			
		||||
 | 
			
		||||
@ -55,8 +55,8 @@ var DEF_MDW = 6, MAX_MDW = 15, MIN_MDW = 1, MDW = DEF_MDW;
 | 
			
		||||
function width2px(width) { return Math.floor(( width + (Math.round(128/MDW))/256 )* MDW ); }
 | 
			
		||||
function px2char(px) { return (Math.floor((px - 5)/MDW * 100 + 0.5))/100; }
 | 
			
		||||
function char2width(chr) { return (Math.round((chr * MDW + 5)/MDW*256))/256; }
 | 
			
		||||
function px2char_(px) { return (((px - 5)/MDW * 100 + 0.5))/100; }
 | 
			
		||||
function char2width_(chr) { return (((chr * MDW + 5)/MDW*256))/256; }
 | 
			
		||||
//function px2char_(px) { return (((px - 5)/MDW * 100 + 0.5))/100; }
 | 
			
		||||
//function char2width_(chr) { return (((chr * MDW + 5)/MDW*256))/256; }
 | 
			
		||||
function cycle_width(collw) { return char2width(px2char(width2px(collw))); }
 | 
			
		||||
/* XLSX/XLSB/XLS specify width in units of MDW */
 | 
			
		||||
function find_mdw_colw(collw) {
 | 
			
		||||
@ -65,7 +65,7 @@ function find_mdw_colw(collw) {
 | 
			
		||||
	MDW = _MDW;
 | 
			
		||||
}
 | 
			
		||||
/* XLML specifies width in terms of pixels */
 | 
			
		||||
function find_mdw_wpx(wpx) {
 | 
			
		||||
/*function find_mdw_wpx(wpx) {
 | 
			
		||||
	var delta = Infinity, guess = 0, _MDW = MIN_MDW;
 | 
			
		||||
	for(MDW=MIN_MDW; MDW<MAX_MDW; ++MDW) {
 | 
			
		||||
		guess = char2width_(px2char_(wpx))*256;
 | 
			
		||||
@ -74,7 +74,7 @@ function find_mdw_wpx(wpx) {
 | 
			
		||||
		if(Math.abs(guess) < delta) { delta = Math.abs(guess); _MDW = MDW; }
 | 
			
		||||
	}
 | 
			
		||||
	MDW = _MDW;
 | 
			
		||||
}
 | 
			
		||||
}*/
 | 
			
		||||
 | 
			
		||||
function process_col(coll/*:ColInfo*/) {
 | 
			
		||||
	if(coll.width) {
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
/* 18.8.5 borders CT_Borders */
 | 
			
		||||
function parse_borders(t, styles, themes, opts) {
 | 
			
		||||
	styles.Borders = [];
 | 
			
		||||
	var border = {}, sub_border = {};
 | 
			
		||||
	var border = {}/*, sub_border = {}*/;
 | 
			
		||||
	t[0].match(tagregex).forEach(function(x) {
 | 
			
		||||
		var y = parsexmltag(x);
 | 
			
		||||
		switch (y[0]) {
 | 
			
		||||
@ -261,7 +261,7 @@ function parse_numFmts(t, styles, opts) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_numFmts(NF/*:{[n:number|string]:string}*/, opts) {
 | 
			
		||||
function write_numFmts(NF/*:{[n:number|string]:string}*//*::, opts*/) {
 | 
			
		||||
	var o = ["<numFmts>"];
 | 
			
		||||
	[[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) {
 | 
			
		||||
		for(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) o[o.length] = (writextag('numFmt',null,{numFmtId:i,formatCode:escapexml(NF[i])}));
 | 
			
		||||
@ -290,7 +290,7 @@ function parse_cellXfs(t, styles, opts) {
 | 
			
		||||
				for(i = 0; i < cellXF_uint.length; ++i) if(xf[cellXF_uint[i]])
 | 
			
		||||
					xf[cellXF_uint[i]] = parseInt(xf[cellXF_uint[i]], 10);
 | 
			
		||||
				for(i = 0; i < cellXF_bool.length; ++i) if(xf[cellXF_bool[i]])
 | 
			
		||||
					xf[cellXF_bool[i]] = parsexmlbool(xf[cellXF_bool[i]], "");
 | 
			
		||||
					xf[cellXF_bool[i]] = parsexmlbool(xf[cellXF_bool[i]]);
 | 
			
		||||
				if(xf.numFmtId > 0x188) {
 | 
			
		||||
					for(i = 0x188; i > 0x3c; --i) if(styles.NumberFmt[xf.numFmtId] == styles.NumberFmt[i]) { xf.numFmtId = i; break; }
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
@ -276,7 +276,7 @@ function write_FMTS_bin(ba, NF/*:?SSFTable*/) {
 | 
			
		||||
	write_record(ba, "BrtEndFmts");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_FONTS_bin(ba, data) {
 | 
			
		||||
function write_FONTS_bin(ba/*::, data*/) {
 | 
			
		||||
	var cnt = 1;
 | 
			
		||||
 | 
			
		||||
	if(cnt == 0) return;
 | 
			
		||||
@ -292,7 +292,7 @@ function write_FONTS_bin(ba, data) {
 | 
			
		||||
	write_record(ba, "BrtEndFonts");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_FILLS_bin(ba, data) {
 | 
			
		||||
function write_FILLS_bin(ba/*::, data*/) {
 | 
			
		||||
	var cnt = 2;
 | 
			
		||||
 | 
			
		||||
	if(cnt == 0) return;
 | 
			
		||||
@ -303,7 +303,7 @@ function write_FILLS_bin(ba, data) {
 | 
			
		||||
	write_record(ba, "BrtEndFills");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_BORDERS_bin(ba, data) {
 | 
			
		||||
function write_BORDERS_bin(ba/*::, data*/) {
 | 
			
		||||
	var cnt = 1;
 | 
			
		||||
 | 
			
		||||
	if(cnt == 0) return;
 | 
			
		||||
@ -313,7 +313,7 @@ function write_BORDERS_bin(ba, data) {
 | 
			
		||||
	write_record(ba, "BrtEndBorders");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_CELLSTYLEXFS_bin(ba, data) {
 | 
			
		||||
function write_CELLSTYLEXFS_bin(ba/*::, data*/) {
 | 
			
		||||
	var cnt = 1;
 | 
			
		||||
	write_record(ba, "BrtBeginCellStyleXFs", write_UInt32LE(cnt));
 | 
			
		||||
	write_record(ba, "BrtXF", write_BrtXF({
 | 
			
		||||
@ -333,10 +333,10 @@ function write_CELLXFS_bin(ba, data) {
 | 
			
		||||
	write_record(ba, "BrtEndCellXFs");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_STYLES_bin(ba, data) {
 | 
			
		||||
function write_STYLES_bin(ba/*::, data*/) {
 | 
			
		||||
	var cnt = 1;
 | 
			
		||||
 | 
			
		||||
	write_record(ba, "BrtBeginStyles", write_UInt32LE(1));
 | 
			
		||||
	write_record(ba, "BrtBeginStyles", write_UInt32LE(cnt));
 | 
			
		||||
	write_record(ba, "BrtStyle", write_BrtStyle({
 | 
			
		||||
		xfId:0,
 | 
			
		||||
		builtinId:0,
 | 
			
		||||
@ -346,7 +346,7 @@ function write_STYLES_bin(ba, data) {
 | 
			
		||||
	write_record(ba, "BrtEndStyles");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_DXFS_bin(ba, data) {
 | 
			
		||||
function write_DXFS_bin(ba/*::, data*/) {
 | 
			
		||||
	var cnt = 0;
 | 
			
		||||
 | 
			
		||||
	write_record(ba, "BrtBeginDXFs", write_UInt32LE(cnt));
 | 
			
		||||
@ -354,7 +354,7 @@ function write_DXFS_bin(ba, data) {
 | 
			
		||||
	write_record(ba, "BrtEndDXFs");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_TABLESTYLES_bin(ba, data) {
 | 
			
		||||
function write_TABLESTYLES_bin(ba/*::, data*/) {
 | 
			
		||||
	var cnt = 0;
 | 
			
		||||
 | 
			
		||||
	write_record(ba, "BrtBeginTableStyles", write_BrtBeginTableStyles(cnt, "TableStyleMedium9", "PivotStyleMedium4"));
 | 
			
		||||
@ -362,7 +362,7 @@ function write_TABLESTYLES_bin(ba, data) {
 | 
			
		||||
	write_record(ba, "BrtEndTableStyles");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_COLORPALETTE_bin(ba, data) {
 | 
			
		||||
function write_COLORPALETTE_bin(/*::ba, data*/) {
 | 
			
		||||
	return;
 | 
			
		||||
	/* BrtBeginColorPalette [INDEXEDCOLORS] [MRUCOLORS] BrtEndColorPalette */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -56,10 +56,10 @@ function parse_clrScheme(t, themes, opts) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 20.1.4.1.18 fontScheme CT_FontScheme */
 | 
			
		||||
function parse_fontScheme(t, themes, opts) { }
 | 
			
		||||
function parse_fontScheme(/*::t, themes, opts*/) { }
 | 
			
		||||
 | 
			
		||||
/* 20.1.4.1.15 fmtScheme CT_StyleMatrix */
 | 
			
		||||
function parse_fmtScheme(t, themes, opts) { }
 | 
			
		||||
function parse_fmtScheme(/*::t, themes, opts*/) { }
 | 
			
		||||
 | 
			
		||||
var clrsregex = /<a:clrScheme([^>]*)>[\s\S]*<\/a:clrScheme>/;
 | 
			
		||||
var fntsregex = /<a:fontScheme([^>]*)>[\s\S]*<\/a:fontScheme>/;
 | 
			
		||||
 | 
			
		||||
@ -13,10 +13,10 @@ function parse_Theme(blob, length, opts) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.49 */
 | 
			
		||||
function parse_ColorTheme(blob, length) { return blob.read_shift(4); }
 | 
			
		||||
function parse_ColorTheme(blob/*::, length*/) { return blob.read_shift(4); }
 | 
			
		||||
 | 
			
		||||
/* 2.5.155 */
 | 
			
		||||
function parse_FullColorExt(blob, length) {
 | 
			
		||||
function parse_FullColorExt(blob/*::, length*/) {
 | 
			
		||||
	var o = {};
 | 
			
		||||
	o.xclrType = blob.read_shift(2);
 | 
			
		||||
	o.nTintShade = blob.read_shift(2);
 | 
			
		||||
@ -42,7 +42,7 @@ function parse_XFExtGradient(blob, length) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.108 */
 | 
			
		||||
function parse_ExtProp(blob, length)/*:Array<any>*/ {
 | 
			
		||||
function parse_ExtProp(blob/*::, length*/)/*:Array<any>*/ {
 | 
			
		||||
	var extType = blob.read_shift(2);
 | 
			
		||||
	var cb = blob.read_shift(2);
 | 
			
		||||
	var o = [extType];
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,8 @@
 | 
			
		||||
/* 18.6 Calculation Chain */
 | 
			
		||||
function parse_cc_xml(data, name, opts) {
 | 
			
		||||
function parse_cc_xml(data/*::, name, opts*/)/*:Array<any>*/ {
 | 
			
		||||
	var d = [];
 | 
			
		||||
	if(!data) return d;
 | 
			
		||||
	var l = 0, i = 1;
 | 
			
		||||
	var i = 1;
 | 
			
		||||
	(data.match(tagregex)||[]).forEach(function(x) {
 | 
			
		||||
		var y = parsexmltag(x);
 | 
			
		||||
		switch(y[0]) {
 | 
			
		||||
@ -16,10 +16,10 @@ function parse_cc_xml(data, name, opts) {
 | 
			
		||||
	return d;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_cc_xml(data, opts) { }
 | 
			
		||||
//function write_cc_xml(data, opts) { }
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.6.4.1 */
 | 
			
		||||
function parse_BrtCalcChainItem$(data, length) {
 | 
			
		||||
function parse_BrtCalcChainItem$(data) {
 | 
			
		||||
	var out = {};
 | 
			
		||||
	out.i = data.read_shift(4);
 | 
			
		||||
	var cell = {};
 | 
			
		||||
@ -50,4 +50,4 @@ function parse_cc_bin(data, name, opts) {
 | 
			
		||||
	return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_cc_bin(data, opts) { }
 | 
			
		||||
//function write_cc_bin(data, opts) { }
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
/* 18.14 Supplementary Workbook Data */
 | 
			
		||||
function parse_xlink_xml(data, name/*:string*/, _opts) {
 | 
			
		||||
	var opts = _opts || {};
 | 
			
		||||
function parse_xlink_xml(/*::data, name:string, _opts*/) {
 | 
			
		||||
	//var opts = _opts || {};
 | 
			
		||||
	//if(opts.WTF) throw "XLSX External Link";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@ function write_comments_vml(rId, comments) {
 | 
			
		||||
	];
 | 
			
		||||
	while(_shapeid < rId * 1000) _shapeid += 1000;
 | 
			
		||||
 | 
			
		||||
	comments.map(function(x) { return decode_cell(x[0]); }).forEach(function(c,i) { o = o.concat([
 | 
			
		||||
	comments.map(function(x) { return decode_cell(x[0]); }).forEach(function(c) { o = o.concat([
 | 
			
		||||
	'<v:shape' + wxt_helper({
 | 
			
		||||
		id:'_x0000_s' + (++_shapeid),
 | 
			
		||||
		type:"#_x0000_t202",
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@ function parse_comments_xml(data/*:string*/, opts)/*:Array<RawComment>*/ {
 | 
			
		||||
		if(a) authors.push(a[1]);
 | 
			
		||||
	});
 | 
			
		||||
	var cmnttag = data.match(/<(?:\w+:)?commentList>([\s\S]*)<\/(?:\w+:)?commentList>/);
 | 
			
		||||
	if(cmnttag && cmnttag[1]) cmnttag[1].split(/<\/\w*:?comment>/).forEach(function(x, index) {
 | 
			
		||||
	if(cmnttag && cmnttag[1]) cmnttag[1].split(/<\/\w*:?comment>/).forEach(function(x) {
 | 
			
		||||
		if(x === "" || x.trim() === "") return;
 | 
			
		||||
		var cm = x.match(/<(?:\w+:)?comment[^>]*>/);
 | 
			
		||||
		if(!cm) return;
 | 
			
		||||
@ -31,7 +31,7 @@ function parse_comments_xml(data/*:string*/, opts)/*:Array<RawComment>*/ {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var CMNT_XML_ROOT = writextag('comments', null, { 'xmlns': XMLNS.main[0] });
 | 
			
		||||
function write_comments_xml(data, opts) {
 | 
			
		||||
function write_comments_xml(data/*::, opts*/) {
 | 
			
		||||
	var o = [XML_HEADER, CMNT_XML_ROOT];
 | 
			
		||||
 | 
			
		||||
	var iauthor/*:Array<string>*/ = [];
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
/* [MS-XLSB] 2.4.28 BrtBeginComment */
 | 
			
		||||
function parse_BrtBeginComment(data, length/*:number*/) {
 | 
			
		||||
function parse_BrtBeginComment(data) {
 | 
			
		||||
	var out = {};
 | 
			
		||||
	out.iauthor = data.read_shift(4);
 | 
			
		||||
	var rfx = parse_UncheckedRfX(data, 16);
 | 
			
		||||
@ -63,7 +63,7 @@ function parse_comments_bin(data, opts)/*:Array<RawComment>*/ {
 | 
			
		||||
	return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_comments_bin(data, opts) {
 | 
			
		||||
function write_comments_bin(data/*::, opts*/) {
 | 
			
		||||
	var ba = buf_array();
 | 
			
		||||
	var iauthor/*:Array<string>*/ = [];
 | 
			
		||||
	write_record(ba, "BrtBeginComments");
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@ RELS.DS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/d
 | 
			
		||||
RELS.MS = "http://schemas.microsoft.com/office/2006/relationships/xlMacrosheet";
 | 
			
		||||
 | 
			
		||||
/* macro and dialog sheet stubs */
 | 
			
		||||
function parse_ds_bin(data/*:any*/, opts, idx/*:number*/, rels, wb, themes, styles)/*:Worksheet*/ { return {'!type':'dialog'}; }
 | 
			
		||||
function parse_ds_xml(data/*:any*/, opts, idx/*:number*/, rels, wb, themes, styles)/*:Worksheet*/ { return {'!type':'dialog'}; }
 | 
			
		||||
function parse_ms_bin(data/*:any*/, opts, idx/*:number*/, rels, wb, themes, styles)/*:Worksheet*/ { return {'!type':'macro'}; }
 | 
			
		||||
function parse_ms_xml(data/*:any*/, opts, idx/*:number*/, rels, wb, themes, styles)/*:Worksheet*/ { return {'!type':'macro'}; }
 | 
			
		||||
function parse_ds_bin(/*::data:any, opts, idx:number, rels, wb, themes, styles*/)/*:Worksheet*/ { return {'!type':'dialog'}; }
 | 
			
		||||
function parse_ds_xml(/*::data:any, opts, idx:number, rels, wb, themes, styles*/)/*:Worksheet*/ { return {'!type':'dialog'}; }
 | 
			
		||||
function parse_ms_bin(/*::data:any, opts, idx:number, rels, wb, themes, styles*/)/*:Worksheet*/ { return {'!type':'macro'}; }
 | 
			
		||||
function parse_ms_xml(/*::data:any, opts, idx:number, rels, wb, themes, styles*/)/*:Worksheet*/ { return {'!type':'macro'}; }
 | 
			
		||||
 | 
			
		||||
@ -19,7 +19,7 @@ var rc_to_a1 = (function(){
 | 
			
		||||
var crefregex = /(^|[^._A-Z0-9])([$]?)([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])([$]?)([1-9]\d{0,5}|10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6])(?![_.\(A-Za-z0-9])/g;
 | 
			
		||||
var a1_to_rc =(function(){
 | 
			
		||||
	return function a1_to_rc(fstr/*:string*/, base/*:CellAddress*/) {
 | 
			
		||||
		return fstr.replace(crefregex, function($0, $1, $2, $3, $4, $5, off, str) {
 | 
			
		||||
		return fstr.replace(crefregex, function($0, $1, $2, $3, $4, $5) {
 | 
			
		||||
			var c = decode_col($3) - ($2 ? 0 : base.c);
 | 
			
		||||
			var r = decode_row($5) - ($4 ? 0 : base.r);
 | 
			
		||||
			var R = (r == 0 ? "" : !$4 ? "[" + r + "]" : (r+1));
 | 
			
		||||
@ -31,7 +31,7 @@ var a1_to_rc =(function(){
 | 
			
		||||
 | 
			
		||||
/* no defined name can collide with a valid cell address A1:XFD1048576 ... except LOG10! */
 | 
			
		||||
function shift_formula_str(f/*:string*/, delta/*:Cell*/)/*:string*/ {
 | 
			
		||||
	return f.replace(crefregex, function($0, $1, $2, $3, $4, $5, off, str) {
 | 
			
		||||
	return f.replace(crefregex, function($0, $1, $2, $3, $4, $5) {
 | 
			
		||||
		return $1+($2=="$" ? $2+$3 : encode_col(decode_col($3)+delta.c))+($4=="$" ? $4+$5 : encode_row(decode_row($5) + delta.r));
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										143
									
								
								bits/62_fxls.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										143
									
								
								bits/62_fxls.js
									
									
									
									
									
								
							@ -1,6 +1,5 @@
 | 
			
		||||
/* --- formula references point to MS-XLS --- */
 | 
			
		||||
/* Small helpers */
 | 
			
		||||
function parseread(l) { return function(blob, length) { blob.l+=l; return; }; }
 | 
			
		||||
function parseread1(blob) { blob.l+=1; return; }
 | 
			
		||||
 | 
			
		||||
/* Rgce Helpers */
 | 
			
		||||
@ -47,14 +46,14 @@ function parse_RgceLoc(blob, length, opts) {
 | 
			
		||||
	var c = parse_ColRelU(blob, 2);
 | 
			
		||||
	return {r:r, c:c[0], cRel:c[1], rRel:c[2]};
 | 
			
		||||
}
 | 
			
		||||
function parse_RgceLoc_BIFF2(blob, length, opts) {
 | 
			
		||||
function parse_RgceLoc_BIFF2(blob/*::, length, opts*/) {
 | 
			
		||||
	var r = parse_ColRelU(blob, 2);
 | 
			
		||||
	var c = blob.read_shift(1);
 | 
			
		||||
	return {r:r[0], c:c, cRel:r[1], rRel:r[2]};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.107 , 2.5.47 */
 | 
			
		||||
function parse_RgceElfLoc(blob, length, opts) {
 | 
			
		||||
function parse_RgceElfLoc(blob/*::, length, opts*/) {
 | 
			
		||||
	var r = blob.read_shift(2);
 | 
			
		||||
	var c = blob.read_shift(2);
 | 
			
		||||
	return {r:r, c:c & 0xFF, fQuoted:!!(c & 0x4000), cRel:c>>15, rRel:c>>15 };
 | 
			
		||||
@ -73,7 +72,7 @@ function parse_RgceLocRel(blob, length, opts) {
 | 
			
		||||
	if(cRel == 1) while(cl > 0x1FFF) cl = cl - 0x4000;
 | 
			
		||||
	return {r:r,c:cl,cRel:cRel,rRel:rRel};
 | 
			
		||||
}
 | 
			
		||||
function parse_RgceLocRel_BIFF2(blob, length/*::, opts*/) {
 | 
			
		||||
function parse_RgceLocRel_BIFF2(blob/*::, length:number, opts*/) {
 | 
			
		||||
	var rl = blob.read_shift(2);
 | 
			
		||||
	var c = blob.read_shift(1);
 | 
			
		||||
	var rRel = (rl & 0x8000) >> 15, cRel = (rl & 0x4000) >> 14;
 | 
			
		||||
@ -141,7 +140,7 @@ function parse_PtgArray(blob, length, opts) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.33 */
 | 
			
		||||
function parse_PtgAttrBaxcel(blob, length) {
 | 
			
		||||
function parse_PtgAttrBaxcel(blob) {
 | 
			
		||||
	var bitSemi = blob[blob.l+1] & 0x01; /* 1 = volatile */
 | 
			
		||||
	var bitBaxcel = 1;
 | 
			
		||||
	blob.l += 4;
 | 
			
		||||
@ -173,7 +172,7 @@ function parse_PtgAttrIf(blob, length, opts) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.5.97.28 */
 | 
			
		||||
function parse_PtgAttrIfError(blob, length) {
 | 
			
		||||
function parse_PtgAttrIfError(blob) {
 | 
			
		||||
	var bitIf = (blob[blob.l+1] & 0xFF) ? 1 : 0;
 | 
			
		||||
	blob.l += 2;
 | 
			
		||||
	return [bitIf, blob.read_shift(2)];
 | 
			
		||||
@ -187,26 +186,26 @@ function parse_PtgAttrSemi(blob, length, opts) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.40 (used by PtgAttrSpace and PtgAttrSpaceSemi) */
 | 
			
		||||
function parse_PtgAttrSpaceType(blob, length) {
 | 
			
		||||
function parse_PtgAttrSpaceType(blob/*::, length*/) {
 | 
			
		||||
	var type = blob.read_shift(1), cch = blob.read_shift(1);
 | 
			
		||||
	return [type, cch];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.38 */
 | 
			
		||||
function parse_PtgAttrSpace(blob, length) {
 | 
			
		||||
function parse_PtgAttrSpace(blob) {
 | 
			
		||||
	blob.read_shift(2);
 | 
			
		||||
	return parse_PtgAttrSpaceType(blob, 2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.39 */
 | 
			
		||||
function parse_PtgAttrSpaceSemi(blob, length) {
 | 
			
		||||
function parse_PtgAttrSpaceSemi(blob) {
 | 
			
		||||
	blob.read_shift(2);
 | 
			
		||||
	return parse_PtgAttrSpaceType(blob, 2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.84 TODO */
 | 
			
		||||
function parse_PtgRef(blob, length, opts) {
 | 
			
		||||
	var ptg = blob[blob.l] & 0x1F;
 | 
			
		||||
	//var ptg = blob[blob.l] & 0x1F;
 | 
			
		||||
	var type = (blob[blob.l] & 0x60)>>5;
 | 
			
		||||
	blob.l += 1;
 | 
			
		||||
	var loc = parse_RgceLoc(blob, 0, opts);
 | 
			
		||||
@ -233,7 +232,7 @@ function parse_PtgRef3d(blob, length, opts) {
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.62 TODO */
 | 
			
		||||
function parse_PtgFunc(blob, length, opts) {
 | 
			
		||||
	var ptg = blob[blob.l] & 0x1F;
 | 
			
		||||
	//var ptg = blob[blob.l] & 0x1F;
 | 
			
		||||
	var type = (blob[blob.l] & 0x60)>>5;
 | 
			
		||||
	blob.l += 1;
 | 
			
		||||
	var iftab = blob.read_shift(opts && opts.biff <= 3 ? 1 : 2);
 | 
			
		||||
@ -246,7 +245,7 @@ function parse_PtgFuncVar(blob, length, opts) {
 | 
			
		||||
	return [cparams, (tab[0] === 0 ? Ftab : Cetab)[tab[1]]];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function parsetab(blob, length) {
 | 
			
		||||
function parsetab(blob) {
 | 
			
		||||
	return [blob[blob.l+1]>>7, blob.read_shift(2) & 0x7FFF];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -255,9 +254,6 @@ function parse_PtgAttrSum(blob, length, opts) {
 | 
			
		||||
	blob.l += opts && opts.biff == 2 ? 3 : 4; return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.43 */
 | 
			
		||||
var parse_PtgConcat = parseread1;
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.58 */
 | 
			
		||||
function parse_PtgExp(blob, length, opts) {
 | 
			
		||||
	blob.l++;
 | 
			
		||||
@ -268,16 +264,16 @@ function parse_PtgExp(blob, length, opts) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.57 */
 | 
			
		||||
function parse_PtgErr(blob, length) { blob.l++; return BErr[blob.read_shift(1)]; }
 | 
			
		||||
function parse_PtgErr(blob) { blob.l++; return BErr[blob.read_shift(1)]; }
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.66 */
 | 
			
		||||
function parse_PtgInt(blob, length) { blob.l++; return blob.read_shift(2); }
 | 
			
		||||
function parse_PtgInt(blob) { blob.l++; return blob.read_shift(2); }
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.42 */
 | 
			
		||||
function parse_PtgBool(blob, length) { blob.l++; return blob.read_shift(1)!==0;}
 | 
			
		||||
function parse_PtgBool(blob) { blob.l++; return blob.read_shift(1)!==0;}
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.79 */
 | 
			
		||||
function parse_PtgNum(blob, length) { blob.l++; return parse_Xnum(blob, 8); }
 | 
			
		||||
function parse_PtgNum(blob) { blob.l++; return parse_Xnum(blob, 8); }
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.89 */
 | 
			
		||||
function parse_PtgStr(blob, length, opts) { blob.l++; return parse_ShortXLUnicodeString(blob, length-1, opts); }
 | 
			
		||||
@ -316,7 +312,7 @@ function parse_SerAr(blob, biff/*:number*/) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.61 */
 | 
			
		||||
function parse_PtgExtraMem(blob, cce) {
 | 
			
		||||
function parse_PtgExtraMem(blob/*::, cce*/) {
 | 
			
		||||
	var count = blob.read_shift(2);
 | 
			
		||||
	var out/*:Array<Range>*/ = [];
 | 
			
		||||
	for(var i = 0; i != count; ++i) out.push(parse_Ref8U(blob, 8));
 | 
			
		||||
@ -361,7 +357,7 @@ function parse_PtgNameX(blob, length, opts) {
 | 
			
		||||
	var nameindex = blob.read_shift(4);
 | 
			
		||||
	return [type, ixti, nameindex];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgNameX_BIFF5(blob, length, opts) {
 | 
			
		||||
function parse_PtgNameX_BIFF5(blob/*::, length, opts*/) {
 | 
			
		||||
	var type = (blob.read_shift(1) >>> 5) & 0x03;
 | 
			
		||||
	var ixti = blob.read_shift(2, 'i'); // XtiIndex
 | 
			
		||||
	blob.l += 8;
 | 
			
		||||
@ -407,45 +403,6 @@ function parse_PtgRefErr3d(blob, length, opts) {
 | 
			
		||||
	return [type, ixti];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.26 */
 | 
			
		||||
var parse_PtgAdd = parseread1;
 | 
			
		||||
/* 2.5.198.45 */
 | 
			
		||||
var parse_PtgDiv = parseread1;
 | 
			
		||||
/* 2.5.198.56 */
 | 
			
		||||
var parse_PtgEq = parseread1;
 | 
			
		||||
/* 2.5.198.64 */
 | 
			
		||||
var parse_PtgGe = parseread1;
 | 
			
		||||
/* 2.5.198.65 */
 | 
			
		||||
var parse_PtgGt = parseread1;
 | 
			
		||||
/* 2.5.198.67 */
 | 
			
		||||
var parse_PtgIsect = parseread1;
 | 
			
		||||
/* 2.5.198.68 */
 | 
			
		||||
var parse_PtgLe = parseread1;
 | 
			
		||||
/* 2.5.198.69 */
 | 
			
		||||
var parse_PtgLt = parseread1;
 | 
			
		||||
/* 2.5.198.74 */
 | 
			
		||||
var parse_PtgMissArg = parseread1;
 | 
			
		||||
/* 2.5.198.75 */
 | 
			
		||||
var parse_PtgMul = parseread1;
 | 
			
		||||
/* 2.5.198.78 */
 | 
			
		||||
var parse_PtgNe = parseread1;
 | 
			
		||||
/* 2.5.198.80 */
 | 
			
		||||
var parse_PtgParen = parseread1;
 | 
			
		||||
/* 2.5.198.81 */
 | 
			
		||||
var parse_PtgPercent = parseread1;
 | 
			
		||||
/* 2.5.198.82 */
 | 
			
		||||
var parse_PtgPower = parseread1;
 | 
			
		||||
/* 2.5.198.83 */
 | 
			
		||||
var parse_PtgRange = parseread1;
 | 
			
		||||
/* 2.5.198.90 */
 | 
			
		||||
var parse_PtgSub = parseread1;
 | 
			
		||||
/* 2.5.198.93 */
 | 
			
		||||
var parse_PtgUminus = parseread1;
 | 
			
		||||
/* 2.5.198.94 */
 | 
			
		||||
var parse_PtgUnion = parseread1;
 | 
			
		||||
/* 2.5.198.95 */
 | 
			
		||||
var parse_PtgUplus = parseread1;
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.71 */
 | 
			
		||||
var parse_PtgMemErr = parsenoop;
 | 
			
		||||
/* 2.5.198.73 */
 | 
			
		||||
@ -457,7 +414,7 @@ function parse_PtgElfLoc(blob, length, opts) {
 | 
			
		||||
	blob.l += 2;
 | 
			
		||||
	return [parse_RgceElfLoc(blob, 4, opts)];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgElfNoop(blob, length, opts) {
 | 
			
		||||
function parse_PtgElfNoop(blob/*::, length, opts*/) {
 | 
			
		||||
	blob.l += 6;
 | 
			
		||||
	return [];
 | 
			
		||||
}
 | 
			
		||||
@ -470,7 +427,7 @@ var parse_PtgElfColSV = parse_PtgElfNoop;
 | 
			
		||||
/* 2.5.198.49 */
 | 
			
		||||
var parse_PtgElfColV = parse_PtgElfLoc;
 | 
			
		||||
/* 2.5.198.50 */
 | 
			
		||||
function parse_PtgElfLel(blob, length, opts) {
 | 
			
		||||
function parse_PtgElfLel(blob/*::, length, opts*/) {
 | 
			
		||||
	blob.l += 2;
 | 
			
		||||
	return [parseuint16(blob), blob.read_shift(2) & 0x01];
 | 
			
		||||
}
 | 
			
		||||
@ -486,14 +443,14 @@ var parse_PtgElfRw = parse_PtgElfLoc;
 | 
			
		||||
var parse_PtgElfRwV = parse_PtgElfLoc;
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.5.97.52 */
 | 
			
		||||
function parse_PtgList(blob, length, opts) {
 | 
			
		||||
function parse_PtgList(blob/*::, length, opts*/) {
 | 
			
		||||
	blob.l += 2;
 | 
			
		||||
	var ixti = blob.read_shift(2);
 | 
			
		||||
	blob.l += 10;
 | 
			
		||||
	return {};
 | 
			
		||||
	return {ixti: ixti};
 | 
			
		||||
}
 | 
			
		||||
/* 2.5.198.91 */
 | 
			
		||||
function parse_PtgSxName(blob, length, opts) {
 | 
			
		||||
function parse_PtgSxName(blob/*::, length, opts*/) {
 | 
			
		||||
	blob.l += 2;
 | 
			
		||||
	return [blob.read_shift(4)];
 | 
			
		||||
}
 | 
			
		||||
@ -502,26 +459,26 @@ function parse_PtgSxName(blob, length, opts) {
 | 
			
		||||
var PtgTypes = {
 | 
			
		||||
	/*::[*/0x01/*::]*/: { n:'PtgExp', f:parse_PtgExp },
 | 
			
		||||
	/*::[*/0x02/*::]*/: { n:'PtgTbl', f:parse_PtgTbl },
 | 
			
		||||
	/*::[*/0x03/*::]*/: { n:'PtgAdd', f:parse_PtgAdd },
 | 
			
		||||
	/*::[*/0x04/*::]*/: { n:'PtgSub', f:parse_PtgSub },
 | 
			
		||||
	/*::[*/0x05/*::]*/: { n:'PtgMul', f:parse_PtgMul },
 | 
			
		||||
	/*::[*/0x06/*::]*/: { n:'PtgDiv', f:parse_PtgDiv },
 | 
			
		||||
	/*::[*/0x07/*::]*/: { n:'PtgPower', f:parse_PtgPower },
 | 
			
		||||
	/*::[*/0x08/*::]*/: { n:'PtgConcat', f:parse_PtgConcat },
 | 
			
		||||
	/*::[*/0x09/*::]*/: { n:'PtgLt', f:parse_PtgLt },
 | 
			
		||||
	/*::[*/0x0A/*::]*/: { n:'PtgLe', f:parse_PtgLe },
 | 
			
		||||
	/*::[*/0x0B/*::]*/: { n:'PtgEq', f:parse_PtgEq },
 | 
			
		||||
	/*::[*/0x0C/*::]*/: { n:'PtgGe', f:parse_PtgGe },
 | 
			
		||||
	/*::[*/0x0D/*::]*/: { n:'PtgGt', f:parse_PtgGt },
 | 
			
		||||
	/*::[*/0x0E/*::]*/: { n:'PtgNe', f:parse_PtgNe },
 | 
			
		||||
	/*::[*/0x0F/*::]*/: { n:'PtgIsect', f:parse_PtgIsect },
 | 
			
		||||
	/*::[*/0x10/*::]*/: { n:'PtgUnion', f:parse_PtgUnion },
 | 
			
		||||
	/*::[*/0x11/*::]*/: { n:'PtgRange', f:parse_PtgRange },
 | 
			
		||||
	/*::[*/0x12/*::]*/: { n:'PtgUplus', f:parse_PtgUplus },
 | 
			
		||||
	/*::[*/0x13/*::]*/: { n:'PtgUminus', f:parse_PtgUminus },
 | 
			
		||||
	/*::[*/0x14/*::]*/: { n:'PtgPercent', f:parse_PtgPercent },
 | 
			
		||||
	/*::[*/0x15/*::]*/: { n:'PtgParen', f:parse_PtgParen },
 | 
			
		||||
	/*::[*/0x16/*::]*/: { n:'PtgMissArg', f:parse_PtgMissArg },
 | 
			
		||||
	/*::[*/0x03/*::]*/: { n:'PtgAdd', f:parseread1 },
 | 
			
		||||
	/*::[*/0x04/*::]*/: { n:'PtgSub', f:parseread1 },
 | 
			
		||||
	/*::[*/0x05/*::]*/: { n:'PtgMul', f:parseread1 },
 | 
			
		||||
	/*::[*/0x06/*::]*/: { n:'PtgDiv', f:parseread1 },
 | 
			
		||||
	/*::[*/0x07/*::]*/: { n:'PtgPower', f:parseread1 },
 | 
			
		||||
	/*::[*/0x08/*::]*/: { n:'PtgConcat', f:parseread1 },
 | 
			
		||||
	/*::[*/0x09/*::]*/: { n:'PtgLt', f:parseread1 },
 | 
			
		||||
	/*::[*/0x0A/*::]*/: { n:'PtgLe', f:parseread1 },
 | 
			
		||||
	/*::[*/0x0B/*::]*/: { n:'PtgEq', f:parseread1 },
 | 
			
		||||
	/*::[*/0x0C/*::]*/: { n:'PtgGe', f:parseread1 },
 | 
			
		||||
	/*::[*/0x0D/*::]*/: { n:'PtgGt', f:parseread1 },
 | 
			
		||||
	/*::[*/0x0E/*::]*/: { n:'PtgNe', f:parseread1 },
 | 
			
		||||
	/*::[*/0x0F/*::]*/: { n:'PtgIsect', f:parseread1 },
 | 
			
		||||
	/*::[*/0x10/*::]*/: { n:'PtgUnion', f:parseread1 },
 | 
			
		||||
	/*::[*/0x11/*::]*/: { n:'PtgRange', f:parseread1 },
 | 
			
		||||
	/*::[*/0x12/*::]*/: { n:'PtgUplus', f:parseread1 },
 | 
			
		||||
	/*::[*/0x13/*::]*/: { n:'PtgUminus', f:parseread1 },
 | 
			
		||||
	/*::[*/0x14/*::]*/: { n:'PtgPercent', f:parseread1 },
 | 
			
		||||
	/*::[*/0x15/*::]*/: { n:'PtgParen', f:parseread1 },
 | 
			
		||||
	/*::[*/0x16/*::]*/: { n:'PtgMissArg', f:parseread1 },
 | 
			
		||||
	/*::[*/0x17/*::]*/: { n:'PtgStr', f:parse_PtgStr },
 | 
			
		||||
	/*::[*/0x1C/*::]*/: { n:'PtgErr', f:parse_PtgErr },
 | 
			
		||||
	/*::[*/0x1D/*::]*/: { n:'PtgBool', f:parse_PtgBool },
 | 
			
		||||
@ -734,7 +691,7 @@ function get_ixti(supbooks, ixti/*:number*/, opts)/*:string*/ {
 | 
			
		||||
}
 | 
			
		||||
function stringify_formula(formula/*Array<any>*/, range, cell/*:any*/, supbooks, opts)/*:string*/ {
 | 
			
		||||
	var _range = /*range != null ? range :*/ {s:{c:0, r:0},e:{c:0, r:0}};
 | 
			
		||||
	var stack/*:Array<string>*/ = [], e1, e2, type, c/*:CellAddress*/, ixti=0, nameidx=0, r, sname="";
 | 
			
		||||
	var stack/*:Array<string>*/ = [], e1, e2, /*::type,*/ c/*:CellAddress*/, ixti=0, nameidx=0, r, sname="";
 | 
			
		||||
	if(!formula[0] || !formula[0][0]) return "";
 | 
			
		||||
	var last_sp = -1, sp = "";
 | 
			
		||||
	for(var ff = 0, fflen = formula[0].length; ff < fflen; ++ff) {
 | 
			
		||||
@ -803,17 +760,17 @@ function stringify_formula(formula/*Array<any>*/, range, cell/*:any*/, supbooks,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
			case 'PtgRef': /* 2.5.198.84 */
 | 
			
		||||
				type = f[1][0]; c = shift_cell_xls((f[1][1]/*:any*/), _range, opts);
 | 
			
		||||
				/*::type = f[1][0]; */c = shift_cell_xls((f[1][1]/*:any*/), _range, opts);
 | 
			
		||||
				stack.push(encode_cell_xls(c));
 | 
			
		||||
				break;
 | 
			
		||||
			case 'PtgRefN': /* 2.5.198.88 */
 | 
			
		||||
				type = f[1][0]; c = cell ? shift_cell_xls((f[1][1]/*:any*/), cell, opts) : (f[1][1]/*:any*/);
 | 
			
		||||
				/*::type = f[1][0]; */c = cell ? shift_cell_xls((f[1][1]/*:any*/), cell, opts) : (f[1][1]/*:any*/);
 | 
			
		||||
				stack.push(encode_cell_xls(c));
 | 
			
		||||
				break;
 | 
			
		||||
			case 'PtgRef3d': /* 2.5.198.85 */
 | 
			
		||||
				type = f[1][0]; ixti = /*::Number(*/f[1][1]/*::)*/; c = shift_cell_xls((f[1][2]/*:any*/), _range, opts);
 | 
			
		||||
				/*::type = f[1][0]; */ixti = /*::Number(*/f[1][1]/*::)*/; c = shift_cell_xls((f[1][2]/*:any*/), _range, opts);
 | 
			
		||||
				sname = get_ixti(supbooks, ixti, opts);
 | 
			
		||||
				var w = sname; /* IE9 fails on defined names */
 | 
			
		||||
				var w = sname; /* IE9 fails on defined names */ // eslint-disable-line no-unused-vars
 | 
			
		||||
				stack.push(sname + "!" + encode_cell_xls(c));
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
@ -840,15 +797,15 @@ function stringify_formula(formula/*Array<any>*/, range, cell/*:any*/, supbooks,
 | 
			
		||||
			case 'PtgErr': /* 2.5.198.57 */
 | 
			
		||||
				stack.push(/*::String(*/f[1]/*::)*/); break;
 | 
			
		||||
			case 'PtgAreaN': /* 2.5.198.31 TODO */
 | 
			
		||||
				type = f[1][0]; r = shift_range_xls(f[1][1], cell ? {s:cell} : _range, opts);
 | 
			
		||||
				/*::type = f[1][0]; */r = shift_range_xls(f[1][1], cell ? {s:cell} : _range, opts);
 | 
			
		||||
				stack.push(encode_range_xls((r/*:any*/), opts));
 | 
			
		||||
				break;
 | 
			
		||||
			case 'PtgArea': /* 2.5.198.27 TODO: fixed points */
 | 
			
		||||
				type = f[1][0]; r = shift_range_xls(f[1][1], _range, opts);
 | 
			
		||||
				/*::type = f[1][0]; */r = shift_range_xls(f[1][1], _range, opts);
 | 
			
		||||
				stack.push(encode_range_xls((r/*:any*/), opts));
 | 
			
		||||
				break;
 | 
			
		||||
			case 'PtgArea3d': /* 2.5.198.28 TODO */
 | 
			
		||||
				type = f[1][0]; ixti = /*::Number(*/f[1][1]/*::)*/; r = f[1][2];
 | 
			
		||||
				/*::type = f[1][0]; */ixti = /*::Number(*/f[1][1]/*::)*/; r = f[1][2];
 | 
			
		||||
				sname = get_ixti(supbooks, ixti, opts);
 | 
			
		||||
				stack.push(sname + "!" + encode_range_xls((r/*:any*/), opts));
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
@ -1,10 +1,11 @@
 | 
			
		||||
/* [MS-XLS] 2.5.198.1 TODO */
 | 
			
		||||
function parse_ArrayParsedFormula(blob, length, opts, ref) {
 | 
			
		||||
function parse_ArrayParsedFormula(blob, length, opts/*::, ref*/) {
 | 
			
		||||
	var target = blob.l + length, len = opts.biff == 2 ? 1 : 2;
 | 
			
		||||
	var rgcb, cce = blob.read_shift(len); // length of rgce
 | 
			
		||||
	if(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];
 | 
			
		||||
	var rgce = parse_Rgce(blob, cce, opts);
 | 
			
		||||
	if(length !== cce + len) rgcb = parse_RgbExtra(blob, length - cce - len, rgce, opts);
 | 
			
		||||
	blob.l = target;
 | 
			
		||||
	return [rgce, rgcb];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -15,6 +16,7 @@ function parse_XLSCellParsedFormula(blob, length, opts) {
 | 
			
		||||
	if(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];
 | 
			
		||||
	var rgce = parse_Rgce(blob, cce, opts);
 | 
			
		||||
	if(length !== cce + len) rgcb = parse_RgbExtra(blob, length - cce - len, rgce, opts);
 | 
			
		||||
	blob.l = target;
 | 
			
		||||
	return [rgce, rgcb];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -60,7 +62,7 @@ function parse_Formula(blob, length, opts) {
 | 
			
		||||
	if(opts.biff != 2) {
 | 
			
		||||
		blob.read_shift(1);
 | 
			
		||||
		if(opts.biff >= 5) {
 | 
			
		||||
			var chn = blob.read_shift(4);
 | 
			
		||||
			/*var chn = */blob.read_shift(4);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	var cbf = parse_XLSCellParsedFormula(blob, end - blob.l, opts);
 | 
			
		||||
@ -69,7 +71,7 @@ function parse_Formula(blob, length, opts) {
 | 
			
		||||
 | 
			
		||||
/* XLSB Parsed Formula records have the same shape */
 | 
			
		||||
function parse_XLSBParsedFormula(data, length, opts) {
 | 
			
		||||
	var end = data.l + length;
 | 
			
		||||
	//var end = data.l + length;
 | 
			
		||||
	var cce = data.read_shift(4);
 | 
			
		||||
	var rgce = parse_Rgce(data, cce, opts);
 | 
			
		||||
	var cb = data.read_shift(4);
 | 
			
		||||
 | 
			
		||||
@ -1,10 +1,3 @@
 | 
			
		||||
/* [MS-XLS] 2.5.198.44 */
 | 
			
		||||
var PtgDataType = {
 | 
			
		||||
	/*::[*/0x1/*::]*/: "REFERENCE", // reference to range
 | 
			
		||||
	/*::[*/0x2/*::]*/: "VALUE", // single value
 | 
			
		||||
	/*::[*/0x3/*::]*/: "ARRAY" // array of values
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* [MS-XLS] 2.5.198.4 */
 | 
			
		||||
var Cetab = {
 | 
			
		||||
	/*::[*/0x0000/*::]*/: 'BEEP',
 | 
			
		||||
@ -1196,6 +1189,7 @@ var XLSXFutureFunctions = {
 | 
			
		||||
	"_xlfn.HYPGEOM.DIST": "HYPGEOM.DIST",
 | 
			
		||||
	"_xlfn.IFERROR": "IFERROR",
 | 
			
		||||
	"_xlfn.IFNA": "IFNA",
 | 
			
		||||
	"_xlfn.IFS": "IFS",
 | 
			
		||||
	"_xlfn.IMCOSH": "IMCOSH",
 | 
			
		||||
	"_xlfn.IMCOT": "IMCOT",
 | 
			
		||||
	"_xlfn.IMCSC": "IMCSC",
 | 
			
		||||
@ -1244,6 +1238,7 @@ var XLSXFutureFunctions = {
 | 
			
		||||
	"_xlfn.STDEV.P": "STDEV.P",
 | 
			
		||||
	"_xlfn.STDEV.S": "STDEV.S",
 | 
			
		||||
	"_xlfn.SUMIFS": "SUMIFS",
 | 
			
		||||
	"_xlfn.SWITCH": "SWITCH",
 | 
			
		||||
	"_xlfn.T.DIST": "T.DIST",
 | 
			
		||||
	"_xlfn.T.DIST.2T": "T.DIST.2T",
 | 
			
		||||
	"_xlfn.T.DIST.RT": "T.DIST.RT",
 | 
			
		||||
 | 
			
		||||
@ -178,7 +178,7 @@ function parse_ws_xml_cols(columns, cols) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_ws_xml_cols(ws, cols)/*:string*/ {
 | 
			
		||||
	var o = ["<cols>"], col, width;
 | 
			
		||||
	var o = ["<cols>"], col;
 | 
			
		||||
	for(var i = 0; i != cols.length; ++i) {
 | 
			
		||||
		if(!(col = cols[i])) continue;
 | 
			
		||||
		o[o.length] = (writextag('col', null, col_obj_w(i, col)));
 | 
			
		||||
@ -215,7 +215,7 @@ function write_ws_xml_sheetviews(ws, opts, idx, wb)/*:string*/ {
 | 
			
		||||
	return writextag("sheetViews", writextag("sheetView", null, sview), {});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_ws_xml_cell(cell/*:Cell*/, ref, ws, opts, idx, wb)/*:string*/ {
 | 
			
		||||
function write_ws_xml_cell(cell/*:Cell*/, ref, ws, opts/*::, idx, wb*/)/*:string*/ {
 | 
			
		||||
	if(cell.v === undefined && cell.f === undefined || cell.t === 'z') return "";
 | 
			
		||||
	var vv = "";
 | 
			
		||||
	var oldt = cell.t, oldv = cell.v;
 | 
			
		||||
@ -415,7 +415,7 @@ return function parse_ws_xml_data(sdata/*:string*/, s, opts, guess/*:Range*/, th
 | 
			
		||||
	if(rows.length > 0) s['!rows'] = rows;
 | 
			
		||||
}; })();
 | 
			
		||||
 | 
			
		||||
function write_ws_xml_data(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbook*/, rels)/*:string*/ {
 | 
			
		||||
function write_ws_xml_data(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbook*//*::, rels*/)/*:string*/ {
 | 
			
		||||
	var o/*:Array<string>*/ = [], r/*:Array<string>*/ = [], range = safe_decode_range(ws['!ref']), cell="", ref, rr = "", cols/*:Array<string>*/ = [], R=0, C=0, rows = ws['!rows'];
 | 
			
		||||
	var dense = Array.isArray(ws);
 | 
			
		||||
	var params = ({r:rr}/*:any*/), row/*:RowInfo*/, height = -1;
 | 
			
		||||
@ -540,7 +540,7 @@ function write_ws_xml(idx/*:number*/, opts, wb/*:Workbook*/, rels)/*:string*/ {
 | 
			
		||||
	if (ws['!margins'] != null) o[o.length] =  write_ws_xml_margins(ws['!margins']);
 | 
			
		||||
	/* pageSetup */
 | 
			
		||||
 | 
			
		||||
	var hfidx = o.length;
 | 
			
		||||
	//var hfidx = o.length;
 | 
			
		||||
	o[o.length] = "";
 | 
			
		||||
 | 
			
		||||
	/* rowBreaks */
 | 
			
		||||
 | 
			
		||||
@ -72,7 +72,7 @@ var parse_BrtWsDim = parse_UncheckedRfX;
 | 
			
		||||
var write_BrtWsDim = write_UncheckedRfX;
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.4.813 BrtWsFmtInfo */
 | 
			
		||||
function parse_BrtWsFmtInfo(data, length) {
 | 
			
		||||
function parse_BrtWsFmtInfo(/*::data, length*/) {
 | 
			
		||||
}
 | 
			
		||||
//function write_BrtWsFmtInfo(ws, o) { }
 | 
			
		||||
 | 
			
		||||
@ -95,7 +95,7 @@ function write_BrtWsProp(str, o) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.4.303 BrtCellBlank */
 | 
			
		||||
function parse_BrtCellBlank(data, length) {
 | 
			
		||||
function parse_BrtCellBlank(data) {
 | 
			
		||||
	var cell = parse_XLSBCell(data);
 | 
			
		||||
	return [cell];
 | 
			
		||||
}
 | 
			
		||||
@ -106,7 +106,7 @@ function write_BrtCellBlank(cell, ncell, o) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.4.304 BrtCellBool */
 | 
			
		||||
function parse_BrtCellBool(data, length) {
 | 
			
		||||
function parse_BrtCellBool(data) {
 | 
			
		||||
	var cell = parse_XLSBCell(data);
 | 
			
		||||
	var fBool = data.read_shift(1);
 | 
			
		||||
	return [cell, fBool, 'b'];
 | 
			
		||||
@ -119,14 +119,14 @@ function write_BrtCellBool(cell, ncell, o) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.4.305 BrtCellError */
 | 
			
		||||
function parse_BrtCellError(data, length) {
 | 
			
		||||
function parse_BrtCellError(data) {
 | 
			
		||||
	var cell = parse_XLSBCell(data);
 | 
			
		||||
	var bError = data.read_shift(1);
 | 
			
		||||
	return [cell, bError, 'e'];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.4.308 BrtCellIsst */
 | 
			
		||||
function parse_BrtCellIsst(data, length) {
 | 
			
		||||
function parse_BrtCellIsst(data) {
 | 
			
		||||
	var cell = parse_XLSBCell(data);
 | 
			
		||||
	var isst = data.read_shift(4);
 | 
			
		||||
	return [cell, isst, 's'];
 | 
			
		||||
@ -139,7 +139,7 @@ function write_BrtCellIsst(cell, ncell, o) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.4.310 BrtCellReal */
 | 
			
		||||
function parse_BrtCellReal(data, length) {
 | 
			
		||||
function parse_BrtCellReal(data) {
 | 
			
		||||
	var cell = parse_XLSBCell(data);
 | 
			
		||||
	var value = parse_Xnum(data);
 | 
			
		||||
	return [cell, value, 'n'];
 | 
			
		||||
@ -152,7 +152,7 @@ function write_BrtCellReal(cell, ncell, o) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.4.311 BrtCellRk */
 | 
			
		||||
function parse_BrtCellRk(data, length) {
 | 
			
		||||
function parse_BrtCellRk(data) {
 | 
			
		||||
	var cell = parse_XLSBCell(data);
 | 
			
		||||
	var value = parse_RkNumber(data);
 | 
			
		||||
	return [cell, value, 'n'];
 | 
			
		||||
@ -166,7 +166,7 @@ function write_BrtCellRk(cell, ncell, o) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.4.314 BrtCellSt */
 | 
			
		||||
function parse_BrtCellSt(data, length) {
 | 
			
		||||
function parse_BrtCellSt(data) {
 | 
			
		||||
	var cell = parse_XLSBCell(data);
 | 
			
		||||
	var value = parse_XLWideString(data);
 | 
			
		||||
	return [cell, value, 'str'];
 | 
			
		||||
@ -253,7 +253,7 @@ function write_BrtBeginMergeCells(cnt, o) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.4.656 BrtHLink */
 | 
			
		||||
function parse_BrtHLink(data, length, opts) {
 | 
			
		||||
function parse_BrtHLink(data, length/*::, opts*/) {
 | 
			
		||||
	var end = data.l + length;
 | 
			
		||||
	var rfx = parse_UncheckedRfX(data, 16);
 | 
			
		||||
	var relId = parse_XLNullableWideString(data);
 | 
			
		||||
@ -322,7 +322,7 @@ function write_BrtColInfo(C/*:number*/, col, o) {
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.4.672 BrtMargins */
 | 
			
		||||
var BrtMarginKeys = ["left","right","top","bottom","header","footer"];
 | 
			
		||||
function parse_BrtMargins(data, length, opts)/*:Margins*/ {
 | 
			
		||||
function parse_BrtMargins(data/*::, length, opts*/)/*:Margins*/ {
 | 
			
		||||
	var margins = ({}/*:any*/);
 | 
			
		||||
	BrtMarginKeys.forEach(function(k) { margins[k] = parse_Xnum(data, 8); });
 | 
			
		||||
	return margins;
 | 
			
		||||
@ -335,7 +335,7 @@ function write_BrtMargins(margins/*:Margins*/, o) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.4.292 BrtBeginWsView */
 | 
			
		||||
function parse_BrtBeginWsView(data, length, opts) {
 | 
			
		||||
function parse_BrtBeginWsView(data/*::, length, opts*/) {
 | 
			
		||||
	var f = data.read_shift(2);
 | 
			
		||||
	data.l += 28;
 | 
			
		||||
	return { RTL: f & 0x20 };
 | 
			
		||||
@ -561,6 +561,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 0x01E5: /* 'BrtWsFmtInfo' */
 | 
			
		||||
				break;
 | 
			
		||||
			/* case 'BrtUid' */
 | 
			
		||||
			case 0x00AF: /* 'BrtAFilterDateGroupItem' */
 | 
			
		||||
			case 0x0284: /* 'BrtActiveX' */
 | 
			
		||||
@ -697,7 +698,7 @@ function write_ws_bin_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:num
 | 
			
		||||
	write_record(ba, "BrtCellBlank", write_BrtCellBlank(cell, o));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_CELLTABLE(ba, ws/*:Worksheet*/, idx/*:number*/, opts, wb/*:Workbook*/) {
 | 
			
		||||
function write_CELLTABLE(ba, ws/*:Worksheet*/, idx/*:number*/, opts/*::, wb:Workbook*/) {
 | 
			
		||||
	var range = safe_decode_range(ws['!ref'] || "A1"), ref, rr = "", cols/*:Array<string>*/ = [];
 | 
			
		||||
	write_record(ba, 'BrtBeginSheetData');
 | 
			
		||||
	var dense = Array.isArray(ws);
 | 
			
		||||
@ -728,7 +729,7 @@ function write_MERGECELLS(ba, ws/*:Worksheet*/) {
 | 
			
		||||
	write_record(ba, 'BrtEndMergeCells');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_COLINFOS(ba, ws/*:Worksheet*/, idx/*:number*/, opts, wb/*:Workbook*/) {
 | 
			
		||||
function write_COLINFOS(ba, ws/*:Worksheet*//*::, idx:number, opts, wb:Workbook*/) {
 | 
			
		||||
	if(!ws || !ws['!cols']) return;
 | 
			
		||||
	write_record(ba, 'BrtBeginColInfos');
 | 
			
		||||
	ws['!cols'].forEach(function(m, i) { if(m) write_record(ba, 'BrtColInfo', write_BrtColInfo(i, m)); });
 | 
			
		||||
@ -777,7 +778,7 @@ function write_WSVIEWS2(ba, ws, Workbook) {
 | 
			
		||||
	write_record(ba, "BrtEndWsViews");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_WSFMTINFO(ba, ws) {
 | 
			
		||||
function write_WSFMTINFO(/*::ba, ws*/) {
 | 
			
		||||
	/* [ACWSFMTINFO] */
 | 
			
		||||
	//write_record(ba, "BrtWsFmtInfo", write_BrtWsFmtInfo(ws));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,7 @@ var CS_XML_ROOT = writextag('chartsheet', null, {
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
/* 18.3 Worksheets also covers Chartsheets */
 | 
			
		||||
function parse_cs_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb, themes, styles)/*:Worksheet*/ {
 | 
			
		||||
function parse_cs_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*::, themes, styles*/)/*:Worksheet*/ {
 | 
			
		||||
	if(!data) return data;
 | 
			
		||||
	/* 18.3.1.12 chartsheet CT_ChartSheet */
 | 
			
		||||
	if(!rels) rels = {'!id':{}};
 | 
			
		||||
@ -39,7 +39,7 @@ function parse_BrtCsProp(data, length/*:number*/) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.1.7.7 Chart Sheet */
 | 
			
		||||
function parse_cs_bin(data, opts, idx/*:number*/, rels, wb, themes, styles)/*:Worksheet*/ {
 | 
			
		||||
function parse_cs_bin(data, opts, idx/*:number*/, rels, wb/*::, themes, styles*/)/*:Worksheet*/ {
 | 
			
		||||
	if(!data) return data;
 | 
			
		||||
	if(!rels) rels = {'!id':{}};
 | 
			
		||||
	var s = {'!type':"chart", '!chart':null, '!rel':""};
 | 
			
		||||
@ -85,7 +85,7 @@ function parse_cs_bin(data, opts, idx/*:number*/, rels, wb, themes, styles)/*:Wo
 | 
			
		||||
	if(rels['!id'][s['!rel']]) s['!chart'] = rels['!id'][s['!rel']];
 | 
			
		||||
	return s;
 | 
			
		||||
}
 | 
			
		||||
function write_cs_bin(idx/*:number*/, opts, wb/*:Workbook*/, rels) {
 | 
			
		||||
function write_cs_bin(/*::idx:number, opts, wb:Workbook, rels*/) {
 | 
			
		||||
	var ba = buf_array();
 | 
			
		||||
	write_record(ba, "BrtBeginSheet");
 | 
			
		||||
	/* [BrtCsProp] */
 | 
			
		||||
 | 
			
		||||
@ -54,7 +54,7 @@ var CalcPrDef = [
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
/* 18.2.3 (CT_CustomWorkbookView) Defaults */
 | 
			
		||||
var CustomWBViewDef = [
 | 
			
		||||
/*var CustomWBViewDef = [
 | 
			
		||||
	['autoUpdate', 'false'],
 | 
			
		||||
	['changesSavedWin', 'false'],
 | 
			
		||||
	['includeHiddenRowCol', 'true'],
 | 
			
		||||
@ -73,14 +73,14 @@ var CustomWBViewDef = [
 | 
			
		||||
	['tabRatio', '600'],
 | 
			
		||||
	['xWindow', '0'],
 | 
			
		||||
	['yWindow', '0']
 | 
			
		||||
];
 | 
			
		||||
];*/
 | 
			
		||||
 | 
			
		||||
function push_defaults_array(target, defaults) {
 | 
			
		||||
	for(var j = 0; j != target.length; ++j) { var w = target[j];
 | 
			
		||||
		for(var i=0; i != defaults.length; ++i) { var z = defaults[i];
 | 
			
		||||
			if(w[z[0]] == null) w[z[0]] = z[1];
 | 
			
		||||
			else switch(z[2]) {
 | 
			
		||||
			case "bool": if(typeof w[z[0]] == "string") w[z[0]] = parsexmlbool(w[z[0]], z[0]); break;
 | 
			
		||||
			case "bool": if(typeof w[z[0]] == "string") w[z[0]] = parsexmlbool(w[z[0]]); break;
 | 
			
		||||
			case "int": if(typeof w[z[0]] == "string") w[z[0]] = parseInt(w[z[0]], 10); break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@ -90,7 +90,7 @@ function push_defaults(target, defaults) {
 | 
			
		||||
	for(var i = 0; i != defaults.length; ++i) { var z = defaults[i];
 | 
			
		||||
		if(target[z[0]] == null) target[z[0]] = z[1];
 | 
			
		||||
		else switch(z[2]) {
 | 
			
		||||
			case "bool": if(typeof target[z[0]] == "string") target[z[0]] = parsexmlbool(target[z[0]], z[0]); break;
 | 
			
		||||
			case "bool": if(typeof target[z[0]] == "string") target[z[0]] = parsexmlbool(target[z[0]]); break;
 | 
			
		||||
			case "int": if(typeof target[z[0]] == "string") target[z[0]] = parseInt(target[z[0]], 10); break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@ -103,7 +103,7 @@ function parse_wb_defaults(wb) {
 | 
			
		||||
	push_defaults_array(wb.WBView, WBViewDef);
 | 
			
		||||
	push_defaults_array(wb.Sheets, SheetDef);
 | 
			
		||||
 | 
			
		||||
	_ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904, 'date1904');
 | 
			
		||||
	_ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function safe1904(wb/*:Workbook*/)/*:string*/ {
 | 
			
		||||
 | 
			
		||||
@ -30,7 +30,7 @@ function parse_wb_xml(data, opts)/*:WorkbookFile*/ {
 | 
			
		||||
				WBPropsDef.forEach(function(w) {
 | 
			
		||||
					if(y[w[0]] == null) return;
 | 
			
		||||
					switch(w[2]) {
 | 
			
		||||
						case "bool": wb.WBProps[w[0]] = parsexmlbool(y[w[0]], w[0]); break;
 | 
			
		||||
						case "bool": wb.WBProps[w[0]] = parsexmlbool(y[w[0]]); break;
 | 
			
		||||
						case "int": wb.WBProps[w[0]] = parseInt(y[w[0]], 10); break;
 | 
			
		||||
						default: wb.WBProps[w[0]] = y[w[0]];
 | 
			
		||||
					}
 | 
			
		||||
@ -161,7 +161,7 @@ var WB_XML_ROOT = writextag('workbook', null, {
 | 
			
		||||
	'xmlns:r': XMLNS.r
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
function write_wb_xml(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:string*/ {
 | 
			
		||||
function write_wb_xml(wb/*:Workbook*//*::, opts:?WriteOpts*/)/*:string*/ {
 | 
			
		||||
	var o = [XML_HEADER];
 | 
			
		||||
	o[o.length] = WB_XML_ROOT;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -64,8 +64,8 @@ function parse_BrtFRTArchID$(data, length) {
 | 
			
		||||
/* [MS-XLSB] 2.4.680 BrtName */
 | 
			
		||||
function parse_BrtName(data, length, opts) {
 | 
			
		||||
	var end = data.l + length;
 | 
			
		||||
	var flags = data.read_shift(4);
 | 
			
		||||
	var chKey = data.read_shift(1);
 | 
			
		||||
	data.l += 4; //var flags = data.read_shift(4);
 | 
			
		||||
	data.l += 1; //var chKey = data.read_shift(1);
 | 
			
		||||
	var itab = data.read_shift(4);
 | 
			
		||||
	var name = parse_XLNameWideString(data);
 | 
			
		||||
	var formula = parse_XLSBNameParsedFormula(data, 0, opts);
 | 
			
		||||
@ -86,7 +86,7 @@ function parse_BrtName(data, length, opts) {
 | 
			
		||||
/* [MS-XLSB] 2.1.7.60 Workbook */
 | 
			
		||||
function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
 | 
			
		||||
	var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: "" };
 | 
			
		||||
	var pass = false, z;
 | 
			
		||||
	var pass = false;
 | 
			
		||||
 | 
			
		||||
	if(!opts) opts = {};
 | 
			
		||||
	opts.biff = 12;
 | 
			
		||||
@ -186,7 +186,7 @@ function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.1.7.60 Workbook */
 | 
			
		||||
function write_BUNDLESHS(ba, wb, opts) {
 | 
			
		||||
function write_BUNDLESHS(ba, wb/*::, opts*/) {
 | 
			
		||||
	write_record(ba, "BrtBeginBundleShs");
 | 
			
		||||
	for(var idx = 0; idx != wb.SheetNames.length; ++idx) {
 | 
			
		||||
		var viz = wb.Workbook && wb.Workbook.Sheets && wb.Workbook.Sheets[idx] && wb.Workbook.Sheets[idx].Hidden || 0;
 | 
			
		||||
@ -224,7 +224,7 @@ function write_BrtBookView(idx, o) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.1.7.60 Workbook */
 | 
			
		||||
function write_BOOKVIEWS(ba, wb, opts) {
 | 
			
		||||
function write_BOOKVIEWS(ba, wb/*::, opts*/) {
 | 
			
		||||
	/* required if hidden tab appears before visible tab */
 | 
			
		||||
	if(!wb.Workbook || !wb.Workbook.Sheets) return;
 | 
			
		||||
	var sheets = wb.Workbook.Sheets;
 | 
			
		||||
@ -241,9 +241,9 @@ function write_BOOKVIEWS(ba, wb, opts) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.4.302 BrtCalcProp */
 | 
			
		||||
function write_BrtCalcProp(data, o) {
 | 
			
		||||
/*function write_BrtCalcProp(data, o) {
 | 
			
		||||
	if(!o) o = new_buf(26);
 | 
			
		||||
	o.write_shift(4,0); /* force recalc */
 | 
			
		||||
	o.write_shift(4,0); // force recalc
 | 
			
		||||
	o.write_shift(4,1);
 | 
			
		||||
	o.write_shift(4,0);
 | 
			
		||||
	write_Xnum(0, o);
 | 
			
		||||
@ -251,14 +251,14 @@ function write_BrtCalcProp(data, o) {
 | 
			
		||||
	o.write_shift(1, 0x33);
 | 
			
		||||
	o.write_shift(1, 0x00);
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
}*/
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.4.640 BrtFileRecover */
 | 
			
		||||
function write_BrtFileRecover(data, o) {
 | 
			
		||||
/*function write_BrtFileRecover(data, o) {
 | 
			
		||||
	if(!o) o = new_buf(1);
 | 
			
		||||
	o.write_shift(1,0);
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
}*/
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.1.7.60 Workbook */
 | 
			
		||||
function write_wb_bin(wb, opts) {
 | 
			
		||||
 | 
			
		||||
@ -60,6 +60,7 @@ function write_ws(data/*:number*/, name/*:string*/, opts, wb/*:Workbook*/, rels)
 | 
			
		||||
	return (name.slice(-4)===".bin" ? write_ws_bin : write_ws_xml)(data, opts, wb, rels);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// eslint-disable-next-line no-unused-vars
 | 
			
		||||
function write_cs(data/*:number*/, name/*:string*/, opts, wb/*:Workbook*/, rels) {
 | 
			
		||||
	return (name.slice(-4)===".bin" ? write_cs_bin : write_cs_xml)(data, opts, wb, rels);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -185,7 +185,7 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ {
 | 
			
		||||
	var state = [], tmp;
 | 
			
		||||
	if(DENSE != null && opts.dense == null) opts.dense = DENSE;
 | 
			
		||||
	var sheets = {}, sheetnames/*:Array<string>*/ = [], cursheet/*:Worksheet*/ = (opts.dense ? [] : {}), sheetname = "";
 | 
			
		||||
	var table = {}, cell = ({}/*:any*/), row = {};
 | 
			
		||||
	var table = {}, cell = ({}/*:any*/), row = {};// eslint-disable-line no-unused-vars
 | 
			
		||||
	var dtag = xlml_parsexmltag('<Data ss:Type="String">'), didx = 0;
 | 
			
		||||
	var c = 0, r = 0;
 | 
			
		||||
	var refguess/*:Range*/ = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };
 | 
			
		||||
@ -848,7 +848,7 @@ function write_props_xlml(wb/*:Workbook*/, opts)/*:string*/ {
 | 
			
		||||
	return o.join("");
 | 
			
		||||
}
 | 
			
		||||
/* TODO */
 | 
			
		||||
function write_wb_xlml(wb, opts)/*:string*/ {
 | 
			
		||||
function write_wb_xlml(/*::wb, opts*/)/*:string*/ {
 | 
			
		||||
	/* OfficeDocumentSettings */
 | 
			
		||||
	/* ExcelWorkbook */
 | 
			
		||||
	return "";
 | 
			
		||||
@ -865,7 +865,7 @@ function write_sty_xlml(wb, opts)/*:string*/ {
 | 
			
		||||
	return writextag("Styles", styles.join(""));
 | 
			
		||||
}
 | 
			
		||||
function write_name_xlml(n) { return writextag("NamedRange", null, {"ss:Name": n.Name, "ss:RefersTo":"=" + a1_to_rc(n.Ref, {r:0,c:0})}); }
 | 
			
		||||
function write_names_xlml(wb, opts)/*:string*/ {
 | 
			
		||||
function write_names_xlml(wb/*::, opts*/)/*:string*/ {
 | 
			
		||||
	if(!((wb||{}).Workbook||{}).Names) return "";
 | 
			
		||||
	/*:: if(!wb || !wb.Workbook || !wb.Workbook.Names) throw new Error("unreachable"); */
 | 
			
		||||
	var names/*:Array<any>*/ = wb.Workbook.Names;
 | 
			
		||||
 | 
			
		||||
@ -179,6 +179,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
	var merges/*:Array<Range>*/ = [];
 | 
			
		||||
	var objects = [];
 | 
			
		||||
	var colinfo/*:Array<ColInfo>*/ = [], rowinfo/*:Array<RowInfo>*/ = [];
 | 
			
		||||
	// eslint-disable-next-line no-unused-vars
 | 
			
		||||
	var defwidth = 0, defheight = 0; // twips / MDW respectively
 | 
			
		||||
	var seencol = false;
 | 
			
		||||
	var supbooks = ([]/*:any*/); // 1-indexed, will hold extern names
 | 
			
		||||
@ -201,7 +202,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
		var s = blob.l;
 | 
			
		||||
		var RecordType = blob.read_shift(2);
 | 
			
		||||
		if(RecordType === 0 && last_Rn === 'EOF') break;
 | 
			
		||||
		var length = (blob.l === blob.length ? 0 : blob.read_shift(2)), y;
 | 
			
		||||
		var length = (blob.l === blob.length ? 0 : blob.read_shift(2));
 | 
			
		||||
		var R = XLSRecordEnum[RecordType];
 | 
			
		||||
		//console.log(RecordType.toString(16), RecordType, R, blob.l, length, blob.length);
 | 
			
		||||
		//if(!R) console.log(blob.slice(blob.l, blob.l + length));
 | 
			
		||||
@ -817,10 +818,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
			}}}}
 | 
			
		||||
		} else blob.l += length;
 | 
			
		||||
	}
 | 
			
		||||
	var sheetnamesraw = Object.keys(Directory).sort(function(a,b) { return Number(a) - Number(b); }).map(function(x){return Directory[x].name;});
 | 
			
		||||
	var sheetnames = sheetnamesraw.slice();
 | 
			
		||||
	wb.Directory=sheetnamesraw;
 | 
			
		||||
	wb.SheetNames=sheetnamesraw;
 | 
			
		||||
	wb.SheetNames=keys(Directory).sort(function(a,b) { return Number(a) - Number(b); }).map(function(x){return Directory[x].name;});
 | 
			
		||||
	if(!options.bookSheets) wb.Sheets=Sheets;
 | 
			
		||||
	if(wb.Sheets) FilterDatabases.forEach(function(r,i) { wb.Sheets[wb.SheetNames[i]]['!autofilter'] = r; });
 | 
			
		||||
	wb.Preamble=Preamble;
 | 
			
		||||
@ -857,11 +855,10 @@ if(!options) options = {};
 | 
			
		||||
fix_read_opts(options);
 | 
			
		||||
reset_cp();
 | 
			
		||||
if(options.codepage) set_ansi(options.codepage);
 | 
			
		||||
var CompObj/*:?CFBEntry*/, Summary, WB/*:?any*/;
 | 
			
		||||
var CompObj/*:?CFBEntry*/, WB/*:?any*/;
 | 
			
		||||
if(cfb.FullPaths) {
 | 
			
		||||
	if(CFB.find(cfb, '/encryption')) throw new Error("File is password-protected");
 | 
			
		||||
	CompObj = CFB.find(cfb, '!CompObj');
 | 
			
		||||
	Summary = CFB.find(cfb, '!SummaryInformation');
 | 
			
		||||
	WB = CFB.find(cfb, '/Workbook') || CFB.find(cfb, '/Book');
 | 
			
		||||
} else {
 | 
			
		||||
	switch(options.type) {
 | 
			
		||||
@ -873,10 +870,10 @@ if(cfb.FullPaths) {
 | 
			
		||||
	prep_blob(cfb, 0);
 | 
			
		||||
	WB = ({content: cfb}/*:any*/);
 | 
			
		||||
}
 | 
			
		||||
var CompObjP, SummaryP, WorkbookP/*:: :Workbook = XLSX.utils.book_new(); */;
 | 
			
		||||
var /*::CompObjP, */WorkbookP/*:: :Workbook = XLSX.utils.book_new(); */;
 | 
			
		||||
 | 
			
		||||
var _data/*:?any*/;
 | 
			
		||||
if(CompObj) CompObjP = parse_compobj(CompObj);
 | 
			
		||||
if(CompObj) /*::CompObjP = */parse_compobj(CompObj);
 | 
			
		||||
if(options.bookProps && !options.bookSheets) WorkbookP = ({}/*:any*/);
 | 
			
		||||
else/*:: if(cfb instanceof CFBContainer) */ {
 | 
			
		||||
	var T = has_buf ? 'buffer' : 'array';
 | 
			
		||||
 | 
			
		||||
@ -34,7 +34,7 @@ function write_BIFF2LABEL(r/*:number*/, c/*:number*/, val) {
 | 
			
		||||
	return out.l < out.length ? out.slice(0, out.l) : out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_ws_biff2_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:number*/, opts) {
 | 
			
		||||
function write_ws_biff2_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:number*//*::, opts*/) {
 | 
			
		||||
	if(cell.v != null) switch(cell.t) {
 | 
			
		||||
		case 'd': case 'n':
 | 
			
		||||
			var v = cell.t == 'd' ? datenum(parseDate(cell.v)) : cell.v;
 | 
			
		||||
@ -52,7 +52,7 @@ function write_ws_biff2_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:n
 | 
			
		||||
	write_biff_rec(ba, 0x0001, write_BIFF2Cell(null, R, C));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function write_ws_biff2(ba/*:BufArray*/, ws/*:Worksheet*/, idx/*:number*/, opts, wb/*:Workbook*/) {
 | 
			
		||||
function write_ws_biff2(ba/*:BufArray*/, ws/*:Worksheet*/, idx/*:number*/, opts/*::, wb:Workbook*/) {
 | 
			
		||||
	var dense = Array.isArray(ws);
 | 
			
		||||
	var range = safe_decode_range(ws['!ref'] || "A1"), ref/*:string*/, rr = "", cols/*:Array<string>*/ = [];
 | 
			
		||||
	for(var R = range.s.r; R <= range.e.r; ++R) {
 | 
			
		||||
@ -118,7 +118,7 @@ function write_ws_biff8(idx/*:number*/, opts, wb/*:Workbook*/) {
 | 
			
		||||
	var dense = Array.isArray(ws);
 | 
			
		||||
	var ref/*:string*/, rr = "", cols/*:Array<string>*/ = [];
 | 
			
		||||
	var range = safe_decode_range(ws['!ref'] || "A1");
 | 
			
		||||
	var b8 = opts.biff == 8, b5 = opts.biff == 5;
 | 
			
		||||
	var b8 = opts.biff == 8;
 | 
			
		||||
	write_biff_rec(ba, 0x0809, write_BOF(wb, 0x10, opts));
 | 
			
		||||
	/* ... */
 | 
			
		||||
	write_biff_rec(ba, "CalcMode", writeuint16(1));
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@ var HTML_ = (function() {
 | 
			
		||||
		var rows = split_regex(str.slice(i, j), /(:?<tr[^>]*>)/i, "<tr>");
 | 
			
		||||
		var R = -1, C = 0, RS = 0, CS = 0;
 | 
			
		||||
		var range/*:Range*/ = {s:{r:10000000, c:10000000},e:{r:0,c:0}};
 | 
			
		||||
		var merges/*:Array<Range>*/ = [], midx = 0;
 | 
			
		||||
		var merges/*:Array<Range>*/ = [];
 | 
			
		||||
		for(i = 0; i < rows.length; ++i) {
 | 
			
		||||
			var row = rows[i].trim();
 | 
			
		||||
			var hd = row.slice(0,3).toLowerCase();
 | 
			
		||||
@ -84,13 +84,13 @@ var HTML_ = (function() {
 | 
			
		||||
		var preamble = "<tr>";
 | 
			
		||||
		return preamble + oo.join("") + "</tr>";
 | 
			
		||||
	}
 | 
			
		||||
	function make_html_preamble(ws/*:Worksheet*/, R/*:Range*/, o/*:Sheet2HTMLOpts*/)/*:string*/ {
 | 
			
		||||
	function make_html_preamble(/*::ws:Worksheet, R:Range, o:Sheet2HTMLOpts*/)/*:string*/ {
 | 
			
		||||
		var out/*:Array<string>*/ = [];
 | 
			
		||||
		return out.join("") + '<table>';
 | 
			
		||||
	}
 | 
			
		||||
	var _BEGIN = '<html><head><meta charset="utf-8"/><title>SheetJS Table Export</title></head><body>';
 | 
			
		||||
	var _END = '</body></html>';
 | 
			
		||||
	function sheet_to_html(ws/*:Worksheet*/, opts/*:?Sheet2HTMLOpts*/, wb/*:?Workbook*/)/*:string*/ {
 | 
			
		||||
	function sheet_to_html(ws/*:Worksheet*/, opts/*:?Sheet2HTMLOpts*//*, wb:?Workbook*/)/*:string*/ {
 | 
			
		||||
		var o = opts || {};
 | 
			
		||||
		var header = o.header != null ? o.header : _BEGIN;
 | 
			
		||||
		var footer = o.footer != null ? o.footer : _END;
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
var parse_content_xml = (function() {
 | 
			
		||||
 | 
			
		||||
	/* 6.1.2 White Space Characters */
 | 
			
		||||
	var parse_text_p = function(text/*:string*/, tag)/*:string*/ {
 | 
			
		||||
	var parse_text_p = function(text/*:string*//*::, tag*/)/*:string*/ {
 | 
			
		||||
		return unescapexml(text
 | 
			
		||||
			.replace(/[\t\r\n]/g, " ").trim().replace(/ +/g, " ")
 | 
			
		||||
			.replace(/<text:s\/>/g," ")
 | 
			
		||||
@ -117,10 +117,11 @@ var parse_content_xml = (function() {
 | 
			
		||||
				} else if(Rn[1]!=='/') {
 | 
			
		||||
					++C;
 | 
			
		||||
					colpeat = 1;
 | 
			
		||||
					var rptR = rowpeat ? R + rowpeat - 1 : R;
 | 
			
		||||
					if(C > range.e.c) range.e.c = C;
 | 
			
		||||
					if(R > range.e.r) range.e.r = R;
 | 
			
		||||
					if(C < range.s.c) range.s.c = C;
 | 
			
		||||
					if(R < range.s.r) range.s.r = R;
 | 
			
		||||
					if(rptR > range.e.r) range.e.r = rptR;
 | 
			
		||||
					ctag = parsexmltag(Rn[0], false);
 | 
			
		||||
					comments = []; comment = ({}/*:any*/);
 | 
			
		||||
					q = ({t:ctag['数据类型'] || ctag['value-type'], v:null/*:: , z:null, w:"",c:[]*/}/*:any*/);
 | 
			
		||||
@ -537,7 +538,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
function parse_ods(zip/*:ZIPFile*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
	opts = opts || ({}/*:any*/);
 | 
			
		||||
	var ods = !!safegetzipfile(zip, 'objectdata');
 | 
			
		||||
	if(ods) var manifest = parse_manifest(getzipdata(zip, 'META-INF/manifest.xml'), opts);
 | 
			
		||||
	if(ods) parse_manifest(getzipdata(zip, 'META-INF/manifest.xml'), opts);
 | 
			
		||||
	var content = getzipstr(zip, 'content.xml');
 | 
			
		||||
	if(!content) throw new Error("Missing content.xml in " + (ods ? "ODS" : "UOF")+ " file");
 | 
			
		||||
	var wb = parse_content_xml(ods ? content : utf8read(content), opts);
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@ var write_styles_ods/*:{(wb:any, opts:any):string}*/ = (function() {
 | 
			
		||||
		'xmlns:of':       "urn:oasis:names:tc:opendocument:xmlns:of:1.2",
 | 
			
		||||
		'office:version': "1.2"
 | 
			
		||||
	}) + '></office:document-styles>';
 | 
			
		||||
	return function wso(wb, opts) {
 | 
			
		||||
	return function wso(/*::wb, opts*/) {
 | 
			
		||||
		return XML_HEADER + payload;
 | 
			
		||||
	};
 | 
			
		||||
})();
 | 
			
		||||
@ -30,7 +30,7 @@ var write_content_ods/*:{(wb:any, opts:any):string}*/ = (function() {
 | 
			
		||||
 | 
			
		||||
	var null_cell_xml = '          <table:table-cell />\n';
 | 
			
		||||
	var covered_cell_xml = '          <table:covered-table-cell/>\n';
 | 
			
		||||
	var write_ws = function(ws, wb/*:Workbook*/, i/*:number*/, opts)/*:string*/ {
 | 
			
		||||
	var write_ws = function(ws, wb/*:Workbook*/, i/*:number*//*::, opts*/)/*:string*/ {
 | 
			
		||||
		/* Section 9 Tables */
 | 
			
		||||
		var o/*:Array<string>*/ = [];
 | 
			
		||||
		o.push('      <table:table table:name="' + escapexml(wb.SheetNames[i]) + '">\n');
 | 
			
		||||
@ -206,18 +206,18 @@ function write_ods(wb/*:any*/, opts/*:any*/) {
 | 
			
		||||
 | 
			
		||||
	/* TODO: this is hard-coded to satiate excel */
 | 
			
		||||
	f = "meta.xml";
 | 
			
		||||
	zip.file(f, write_meta_ods(wb, opts));
 | 
			
		||||
	zip.file(f, write_meta_ods(/*::wb, opts*/));
 | 
			
		||||
	manifest.push([f, "text/xml"]);
 | 
			
		||||
	rdf.push([f, "MetadataFile"]);
 | 
			
		||||
 | 
			
		||||
	/* Part 3 Section 6 Metadata Manifest File */
 | 
			
		||||
	f = "manifest.rdf";
 | 
			
		||||
	zip.file(f, write_rdf(rdf, opts));
 | 
			
		||||
	zip.file(f, write_rdf(rdf/*, opts*/));
 | 
			
		||||
	manifest.push([f, "application/rdf+xml"]);
 | 
			
		||||
 | 
			
		||||
	/* Part 3 Section 4 Manifest File */
 | 
			
		||||
	f = "META-INF/manifest.xml";
 | 
			
		||||
	zip.file(f, write_manifest(manifest, opts));
 | 
			
		||||
	zip.file(f, write_manifest(manifest/*, opts*/));
 | 
			
		||||
 | 
			
		||||
	return zip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -52,7 +52,7 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
	if(safegetzipfile(zip, 'Index/Document.iwa')) throw new Error('Unsupported NUMBERS file');
 | 
			
		||||
 | 
			
		||||
	var entries = keys(zip.files).filter(nodirs).sort();
 | 
			
		||||
	var dir = parse_ct((getzipstr(zip, '[Content_Types].xml')/*:?any*/), opts);
 | 
			
		||||
	var dir = parse_ct((getzipstr(zip, '[Content_Types].xml')/*:?any*/));
 | 
			
		||||
	var xlsb = false;
 | 
			
		||||
	var sheets, binname;
 | 
			
		||||
	if(dir.workbooks.length === 0) {
 | 
			
		||||
@ -78,7 +78,7 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
		if(dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var externbooks = dir.links.map(function(link) {
 | 
			
		||||
	/*var externbooks = */dir.links.map(function(link) {
 | 
			
		||||
		return parse_xlink(getzipdata(zip, strip_front_slash(link)), link, opts);
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
@ -179,7 +179,7 @@ function parse_xlsxcfb(cfb, _opts/*:?ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
	var opts = _opts || {};
 | 
			
		||||
	var f = '/!DataSpaces/Version';
 | 
			
		||||
	var data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
 | 
			
		||||
	var version = parse_DataSpaceVersionInfo(data.content);
 | 
			
		||||
	/*var version = */parse_DataSpaceVersionInfo(data.content);
 | 
			
		||||
 | 
			
		||||
	/* 2.3.4.1 */
 | 
			
		||||
	f = '/!DataSpaces/DataSpaceMap';
 | 
			
		||||
@ -198,7 +198,7 @@ function parse_xlsxcfb(cfb, _opts/*:?ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
	/* 2.3.4.3 */
 | 
			
		||||
	f = '/!DataSpaces/TransformInfo/StrongEncryptionTransform/!Primary';
 | 
			
		||||
	data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
 | 
			
		||||
	var hdr = parse_Primary(data.content);
 | 
			
		||||
	/*var hdr = */parse_Primary(data.content);
 | 
			
		||||
 | 
			
		||||
	f = '/EncryptionInfo';
 | 
			
		||||
	data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
 | 
			
		||||
@ -208,8 +208,10 @@ function parse_xlsxcfb(cfb, _opts/*:?ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
	f = '/EncryptedPackage';
 | 
			
		||||
	data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
 | 
			
		||||
 | 
			
		||||
/*global decrypt_agile */
 | 
			
		||||
/*:: declare var decrypt_agile:any; */
 | 
			
		||||
	if(einfo[0] == 0x04 && typeof decrypt_agile !== 'undefined') return decrypt_agile(einfo[1], data.content, opts.password || "", opts);
 | 
			
		||||
/*global decrypt_std76 */
 | 
			
		||||
/*:: declare var decrypt_std76:any; */
 | 
			
		||||
	if(einfo[0] == 0x02 && typeof decrypt_std76 !== 'undefined') return decrypt_std76(einfo[1], data.content, opts.password || "", opts);
 | 
			
		||||
	throw new Error("File is password-protected");
 | 
			
		||||
 | 
			
		||||
@ -79,7 +79,7 @@ function readSync(data/*:RawData*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
	if(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? "buffer" : "base64";
 | 
			
		||||
	if(o.type == "file") { o.type = "buffer"; d = _fs.readFileSync(data); }
 | 
			
		||||
	if(o.type == "string") { str = true; o.type = "binary"; d = bstrify(data); }
 | 
			
		||||
	if(o.type == 'array' && typeof Uint8Array !== 'undefined' && data instanceof Uint8Array) {
 | 
			
		||||
	if(o.type == 'array' && typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && typeof ArrayBuffer !== 'undefined') {
 | 
			
		||||
		// $FlowIgnore
 | 
			
		||||
		var ab=new ArrayBuffer(3), vu=new Uint8Array(ab); vu.foo="bar";
 | 
			
		||||
		// $FlowIgnore
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,6 @@ if(has_buf && typeof require != 'undefined') (function() {
 | 
			
		||||
 | 
			
		||||
	var write_csv_stream = function(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) {
 | 
			
		||||
		var stream = Readable();
 | 
			
		||||
		var out = "";
 | 
			
		||||
		var o = opts == null ? {} : opts;
 | 
			
		||||
		if(sheet == null || sheet["!ref"] == null) { stream.push(null); return stream; }
 | 
			
		||||
		var r = safe_decode_range(sheet["!ref"]);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										4
									
								
								demos/fusebox/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										4
									
								
								demos/fusebox/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,4 @@
 | 
			
		||||
.fusebox
 | 
			
		||||
tsconfig.json
 | 
			
		||||
client.js
 | 
			
		||||
server.js
 | 
			
		||||
							
								
								
									
										17
									
								
								demos/fusebox/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										17
									
								
								demos/fusebox/Makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
			
		||||
.PHONY: all
 | 
			
		||||
all server.js client.js: fuse.js
 | 
			
		||||
	node fuse.js
 | 
			
		||||
 | 
			
		||||
.PHONY: test ctest
 | 
			
		||||
test: server.js
 | 
			
		||||
	@node server.js
 | 
			
		||||
	xlsx --dev sheetjsfbox.xlsb
 | 
			
		||||
 | 
			
		||||
ctest: client.js
 | 
			
		||||
	python -mSimpleHTTPServer
 | 
			
		||||
 | 
			
		||||
.PHONY: init
 | 
			
		||||
init:
 | 
			
		||||
	mkdir -p node_modules
 | 
			
		||||
	cd node_modules; ln -s ../../../ xlsx; cd -
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										62
									
								
								demos/fusebox/README.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										62
									
								
								demos/fusebox/README.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,62 @@
 | 
			
		||||
# FuseBox
 | 
			
		||||
 | 
			
		||||
This library is built with some dynamic logic to determine if it is invoked in a
 | 
			
		||||
script tag or in nodejs.  FuseBox does not understand those feature tests, so by
 | 
			
		||||
default it will do some strange things.
 | 
			
		||||
 | 
			
		||||
## TypeScript Support
 | 
			
		||||
 | 
			
		||||
As with most TS modules in FuseBox, the glob import form should be used:
 | 
			
		||||
 | 
			
		||||
```typescript
 | 
			
		||||
import * as XLSX from 'xlsx';
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The included `sheetjs.ts` script will be transpiled and bundled to `server.js`
 | 
			
		||||
for the `"node"` target and `client.js` for the `"browser"` target.
 | 
			
		||||
 | 
			
		||||
## Proper Target Detection
 | 
			
		||||
 | 
			
		||||
Out of the box, FuseBox will automatically provide shims to browser globals like
 | 
			
		||||
`process` and `Browser`.  The proper way to detect `node` uses `process`:
 | 
			
		||||
 | 
			
		||||
```typescript
 | 
			
		||||
if(typeof process != 'undefined' && process.versions && process.versions.node) {
 | 
			
		||||
  /* Script is running in nodejs */
 | 
			
		||||
} else {
 | 
			
		||||
  /* Script is running in a browser environment */
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Server Target
 | 
			
		||||
 | 
			
		||||
The FuseBox documentation configuration can be used as-is:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
const fuse = FuseBox.init({
 | 
			
		||||
  homeDir: ".",
 | 
			
		||||
  target: "node",
 | 
			
		||||
  output: "$name.js"
 | 
			
		||||
});
 | 
			
		||||
fuse.bundle("server").instructions(">sheetjs.ts"); fuse.run();
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Browser Target
 | 
			
		||||
 | 
			
		||||
The native shims must be suppressed for browser usage:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
const fuse = FuseBox.init({
 | 
			
		||||
  homeDir: ".",
 | 
			
		||||
  target: "node",
 | 
			
		||||
  natives: {
 | 
			
		||||
    Buffer: false,
 | 
			
		||||
    stream: false,
 | 
			
		||||
    process: false
 | 
			
		||||
  },
 | 
			
		||||
  output: "$name.js"
 | 
			
		||||
});
 | 
			
		||||
fuse.bundle("client").instructions(">sheetjs.ts"); fuse.run();
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
[](https://github.com/SheetJS/js-xlsx)
 | 
			
		||||
							
								
								
									
										26
									
								
								demos/fusebox/fuse.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										26
									
								
								demos/fusebox/fuse.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,26 @@
 | 
			
		||||
const { FuseBox } = require("fuse-box");
 | 
			
		||||
const common_opts = {
 | 
			
		||||
  homeDir: ".",
 | 
			
		||||
  output: "$name.js"
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const browser_opts = {
 | 
			
		||||
  target: "browser",
 | 
			
		||||
  natives: {
 | 
			
		||||
    Buffer: false,
 | 
			
		||||
    stream: false,
 | 
			
		||||
    process: false
 | 
			
		||||
  },
 | 
			
		||||
  ...common_opts
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const node_opts = {
 | 
			
		||||
  target: "node",
 | 
			
		||||
  ...common_opts
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const fuse1 = FuseBox.init(browser_opts);
 | 
			
		||||
fuse1.bundle("client").instructions(">sheetjs.ts"); fuse1.run();
 | 
			
		||||
 | 
			
		||||
const fuse2 = FuseBox.init(node_opts);
 | 
			
		||||
fuse2.bundle("server").instructions(">sheetjs.ts"); fuse2.run();
 | 
			
		||||
							
								
								
									
										28
									
								
								demos/fusebox/sheetjs.ts
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										28
									
								
								demos/fusebox/sheetjs.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
			
		||||
import * as XLSX from 'xlsx';
 | 
			
		||||
 | 
			
		||||
console.log(XLSX.version);
 | 
			
		||||
 | 
			
		||||
const bookType: string = "xlsb";
 | 
			
		||||
const fn: string = "sheetjsfbox." + bookType
 | 
			
		||||
const sn: string = "SheetJSFBox";
 | 
			
		||||
const aoa: any[][] = [ ["Sheet", "JS"], ["Fuse", "Box"], [72, 62] ];
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
var wb: XLSX.WorkBook = XLSX.utils.book_new();
 | 
			
		||||
var ws: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(aoa);
 | 
			
		||||
XLSX.utils.book_append_sheet(wb, ws, sn);
 | 
			
		||||
 | 
			
		||||
var payload: string = "";
 | 
			
		||||
var w2: XLSX.WorkBook;
 | 
			
		||||
if(typeof process != 'undefined' && process.versions && process.versions.node) {
 | 
			
		||||
	/* server */
 | 
			
		||||
	XLSX.writeFile(wb, fn);
 | 
			
		||||
	w2 = XLSX.readFile(fn)
 | 
			
		||||
} else {
 | 
			
		||||
	/* client */
 | 
			
		||||
	payload = XLSX.write(wb, {bookType: "xlsb", type:"binary"});
 | 
			
		||||
	w2 = XLSX.read(payload, {type:"binary"});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var s2: XLSX.WorkSheet = w2.Sheets[sn];
 | 
			
		||||
console.log(XLSX.utils.sheet_to_csv(s2));
 | 
			
		||||
@ -21,7 +21,6 @@ suppress the node shims:
 | 
			
		||||
 | 
			
		||||
	/* suppress node shims */
 | 
			
		||||
	node: {
 | 
			
		||||
		fs: false,
 | 
			
		||||
		process: false,
 | 
			
		||||
		Buffer: false
 | 
			
		||||
	}
 | 
			
		||||
@ -35,7 +34,6 @@ browser but webpack disregards those.  The config should explicitly suppress:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
	node: {
 | 
			
		||||
		fs: false,
 | 
			
		||||
		process: false,
 | 
			
		||||
		Buffer: false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,6 @@
 | 
			
		||||
var commonops = {
 | 
			
		||||
	/* suppress node shims */
 | 
			
		||||
	node: {
 | 
			
		||||
		fs: false,
 | 
			
		||||
		process: false,
 | 
			
		||||
		Buffer: false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -20,7 +20,6 @@ module.exports = {
 | 
			
		||||
	*/
 | 
			
		||||
	/* suppress node shims */
 | 
			
		||||
	node: {
 | 
			
		||||
		fs: false,
 | 
			
		||||
		process: false,
 | 
			
		||||
		Buffer: false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										11
									
								
								dist/cpexcel.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										11
									
								
								dist/cpexcel.js
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -1,6 +1,6 @@
 | 
			
		||||
/* cpexcel.js (C) 2013-present SheetJS -- http://sheetjs.com */
 | 
			
		||||
/*jshint -W100 */
 | 
			
		||||
var cptable = {version:"1.11.0"};
 | 
			
		||||
var cptable = {version:"1.12.0"};
 | 
			
		||||
cptable[437] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
 | 
			
		||||
cptable[620] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàąçêëèïîćÄĄĘęłôöĆûùŚÖܢ٥śƒŹŻóÓńŃźż¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
 | 
			
		||||
cptable[737] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
 | 
			
		||||
@ -973,11 +973,14 @@ return {"enc": e, "dec": d }; })();
 | 
			
		||||
cptable[10029] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
 | 
			
		||||
cptable[10079] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüݰ¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ<C393>ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
 | 
			
		||||
cptable[10081] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ<C393>ÒÚÛÙ<C39B>ˆ˜¯˘˙˚¸˝˛ˇ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
 | 
			
		||||
// eslint-disable-next-line no-undef
 | 
			
		||||
if (typeof module !== 'undefined' && module.exports && typeof DO_NOT_EXPORT_CODEPAGE === 'undefined') module.exports = cptable;
 | 
			
		||||
/* cputils.js (C) 2013-present SheetJS -- http://sheetjs.com */
 | 
			
		||||
/* vim: set ft=javascript: */
 | 
			
		||||
/*jshint newcap: false */
 | 
			
		||||
(function(root, factory) {
 | 
			
		||||
  /*jshint ignore:start */
 | 
			
		||||
  /*eslint-disable */
 | 
			
		||||
  "use strict";
 | 
			
		||||
  if(typeof cptable === "undefined") {
 | 
			
		||||
    if(typeof require !== "undefined"){
 | 
			
		||||
@ -986,8 +989,11 @@ if (typeof module !== 'undefined' && module.exports && typeof DO_NOT_EXPORT_CODE
 | 
			
		||||
      else root.cptable = factory(cpt);
 | 
			
		||||
    } else throw new Error("cptable not found");
 | 
			
		||||
  } else cptable = factory(cptable);
 | 
			
		||||
  /*eslint-enable */
 | 
			
		||||
  /*jshint ignore:end */
 | 
			
		||||
}(this, function(cpt){
 | 
			
		||||
  "use strict";
 | 
			
		||||
  /*global module, Buffer */
 | 
			
		||||
  var magic = {
 | 
			
		||||
    "1200":"utf16le",
 | 
			
		||||
    "1201":"utf16be",
 | 
			
		||||
@ -1241,7 +1247,7 @@ if (typeof module !== 'undefined' && module.exports && typeof DO_NOT_EXPORT_CODE
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
  var null_enc = function(data, ofmt) { return ""; };
 | 
			
		||||
  var null_enc = function(data, ofmt) { void ofmt; return ""; };
 | 
			
		||||
  var cp_decache = function cp_decache(cp) { delete cpdcache[cp]; delete cpecache[cp]; };
 | 
			
		||||
  var decache = function decache() {
 | 
			
		||||
    if(has_buf) {
 | 
			
		||||
@ -1455,6 +1461,7 @@ if (typeof module !== 'undefined' && module.exports && typeof DO_NOT_EXPORT_CODE
 | 
			
		||||
          if(data[i] !== 0x2b) { j=1; out[k++] = String.fromCharCode(data[i]); continue; }
 | 
			
		||||
          j=1;
 | 
			
		||||
          if(data[i+1] === 0x2d) { j = 2; out[k++] = "+"; continue; }
 | 
			
		||||
          // eslint-disable-next-line no-useless-escape
 | 
			
		||||
          while(String.fromCharCode(data[i+j]).match(/[A-Za-z0-9+\/]/)) j++;
 | 
			
		||||
          var dash = 0;
 | 
			
		||||
          if(data[i+j] === 0x2d) { ++j; dash=1; }
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										30
									
								
								dist/xlsx.core.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										30
									
								
								dist/xlsx.core.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/xlsx.core.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/xlsx.core.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										32
									
								
								dist/xlsx.full.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										32
									
								
								dist/xlsx.full.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/xlsx.full.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/xlsx.full.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										859
									
								
								dist/xlsx.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										859
									
								
								dist/xlsx.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										24
									
								
								dist/xlsx.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										24
									
								
								dist/xlsx.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/xlsx.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/xlsx.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@ -56,6 +56,8 @@ Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" c
 | 
			
		||||
/* eslint-env browser */
 | 
			
		||||
/*global Uint8Array, console */
 | 
			
		||||
/*global XLSX */
 | 
			
		||||
/* exported b64it, setfmt */
 | 
			
		||||
/* eslint no-use-before-define:0 */
 | 
			
		||||
var X = XLSX;
 | 
			
		||||
var XW = {
 | 
			
		||||
	/* worker message */
 | 
			
		||||
@ -212,9 +214,6 @@ var do_file = (function() {
 | 
			
		||||
	function handleFile(e) { do_file(e.target.files); }
 | 
			
		||||
	xlf.addEventListener('change', handleFile, false);
 | 
			
		||||
})();
 | 
			
		||||
</script>
 | 
			
		||||
<script type="text/javascript">
 | 
			
		||||
/* eslint no-use-before-define:0 */
 | 
			
		||||
	var _gaq = _gaq || [];
 | 
			
		||||
	_gaq.push(['_setAccount', 'UA-36810333-1']);
 | 
			
		||||
	_gaq.push(['_trackPageview']);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										23
									
								
								package.json
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										23
									
								
								package.json
									
									
									
									
									
								
							@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
	"name": "xlsx",
 | 
			
		||||
	"version": "0.11.17",
 | 
			
		||||
	"version": "0.11.18",
 | 
			
		||||
	"author": "sheetjs",
 | 
			
		||||
	"description": "SheetJS Spreadsheet data parser and writer",
 | 
			
		||||
	"keywords": [
 | 
			
		||||
@ -23,29 +23,28 @@
 | 
			
		||||
	"main": "./xlsx",
 | 
			
		||||
	"types": "types",
 | 
			
		||||
	"browser": {
 | 
			
		||||
		"node": false,
 | 
			
		||||
		"buffer": false,
 | 
			
		||||
		"crypto": false,
 | 
			
		||||
		"stream": false,
 | 
			
		||||
		"process": false,
 | 
			
		||||
		"fs": false
 | 
			
		||||
	},
 | 
			
		||||
	"dependencies": {
 | 
			
		||||
		"adler-32": "~1.1.0",
 | 
			
		||||
		"cfb": "~1.0.1",
 | 
			
		||||
		"codepage": "~1.11.0",
 | 
			
		||||
		"commander": "~2.11.0",
 | 
			
		||||
		"crc-32": "~1.1.1",
 | 
			
		||||
		"adler-32": "~1.2.0",
 | 
			
		||||
		"cfb": "~1.0.2",
 | 
			
		||||
		"codepage": "~1.12.0",
 | 
			
		||||
		"commander": "~2.13.0",
 | 
			
		||||
		"crc-32": "~1.2.0",
 | 
			
		||||
		"exit-on-epipe": "~1.0.1",
 | 
			
		||||
		"ssf": "~0.10.1"
 | 
			
		||||
	},
 | 
			
		||||
	"devDependencies": {
 | 
			
		||||
		"mocha": "~2.5.3",
 | 
			
		||||
		"blanket": "~1.2.3",
 | 
			
		||||
		"@sheetjs/uglify-js": "~2.7.3",
 | 
			
		||||
		"@types/node": "^8.0.7",
 | 
			
		||||
		"@types/commander": "^2.9.0",
 | 
			
		||||
		"jsdom": "~11.1.0",
 | 
			
		||||
		"@types/node": "^8.5.9",
 | 
			
		||||
		"blanket": "~1.2.3",
 | 
			
		||||
		"dtslint": "^0.1.2",
 | 
			
		||||
		"jsdom": "~11.1.0",
 | 
			
		||||
		"mocha": "~2.5.3",
 | 
			
		||||
		"typescript": "2.2.0"
 | 
			
		||||
	},
 | 
			
		||||
	"repository": {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								test.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								test.js
									
									
									
									
									
								
							@ -17,6 +17,8 @@ describe('source',function(){it('should load',function(){X=require(modp);});});
 | 
			
		||||
var DIF_XL = true;
 | 
			
		||||
 | 
			
		||||
var browser = typeof document !== 'undefined';
 | 
			
		||||
// $FlowIgnore
 | 
			
		||||
if(!browser) try { require('./shim'); } catch(e) { }
 | 
			
		||||
 | 
			
		||||
var opts = ({cellNF: true}/*:any*/);
 | 
			
		||||
var TYPE = browser ? "binary" : "buffer";
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1
									
								
								tests/core.js
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								tests/core.js
									
									
									
										generated
									
									
									
								
							@ -17,6 +17,7 @@ describe('source',function(){it('should load',function(){X=require(modp);});});
 | 
			
		||||
var DIF_XL = true;
 | 
			
		||||
 | 
			
		||||
var browser = typeof document !== 'undefined';
 | 
			
		||||
if(!browser) try { require('./shim'); } catch(e) { }
 | 
			
		||||
 | 
			
		||||
var opts = ({cellNF: true}/*:any*/);
 | 
			
		||||
var TYPE = browser ? "binary" : "buffer";
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,8 @@
 | 
			
		||||
/* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */
 | 
			
		||||
/* eslint-env node */
 | 
			
		||||
const n = "xlsx";
 | 
			
		||||
/* vim: set ts=2 ft=javascript: */
 | 
			
		||||
/// <reference types="../node_modules/@types/node/" />
 | 
			
		||||
const n = "xlsx";
 | 
			
		||||
import X = require("xlsx");
 | 
			
		||||
import 'exit-on-epipe';
 | 
			
		||||
import * as fs from 'fs';
 | 
			
		||||
@ -24,7 +25,7 @@ program
 | 
			
		||||
	.option('-8, --xls',  'emit XLS  to <sheetname> or <file>.xls (BIFF8)')
 | 
			
		||||
	.option('-5, --biff5','emit XLS  to <sheetname> or <file>.xls (BIFF5)')
 | 
			
		||||
	.option('-2, --biff2','emit XLS  to <sheetname> or <file>.xls (BIFF2)')
 | 
			
		||||
	.option('-i, --xla', 'emit XLA to <sheetname> or <file>.xla')
 | 
			
		||||
	.option('-i, --xla',  'emit XLA to <sheetname> or <file>.xla')
 | 
			
		||||
	.option('-6, --xlml', 'emit SSML to <sheetname> or <file>.xls (2003 XML)')
 | 
			
		||||
	.option('-T, --fods', 'emit FODS to <sheetname> or <file>.fods (Flat ODS)')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										679
									
								
								xlsx.flow.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										679
									
								
								xlsx.flow.js
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user