forked from sheetjs/sheetjs
		
	archaic browser compatibility and testing
IE11 Compatibility View levels 5 and 7 (see #952) Firefox 5.0+ passes browser test (see #950)
This commit is contained in:
		
							parent
							
								
									1d74977718
								
							
						
					
					
						commit
						c654a2656b
					
				| @ -52,9 +52,9 @@ function utf16beread(data/*:string*/)/*:string*/ { | ||||
| 
 | ||||
| var debom = function(data/*:string*/)/*:string*/ { | ||||
| 	var c1 = data.charCodeAt(0), c2 = data.charCodeAt(1); | ||||
| 	if(c1 == 0xFF && c2 == 0xFE) return utf16leread(data.substr(2)); | ||||
| 	if(c1 == 0xFE && c2 == 0xFF) return utf16beread(data.substr(2)); | ||||
| 	if(c1 == 0xFEFF) return data.substr(1); | ||||
| 	if(c1 == 0xFF && c2 == 0xFE) return utf16leread(data.slice(2)); | ||||
| 	if(c1 == 0xFE && c2 == 0xFF) return utf16beread(data.slice(2)); | ||||
| 	if(c1 == 0xFEFF) return data.slice(1); | ||||
| 	return data; | ||||
| }; | ||||
| 
 | ||||
| @ -62,7 +62,7 @@ var _getchar = function _gc1(x/*:number*/)/*:string*/ { return String.fromCharCo | ||||
| if(typeof cptable !== 'undefined') { | ||||
| 	set_cp = function(cp/*:number*/) { current_codepage = cp; }; | ||||
| 	debom = function(data/*:string*/) { | ||||
| 		if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return cptable.utils.decode(1200, char_codes(data.substr(2))); } | ||||
| 		if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return cptable.utils.decode(1200, char_codes(data.slice(2))); } | ||||
| 		return data; | ||||
| 	}; | ||||
| 	_getchar = function _gc2(x/*:number*/)/*:string*/ { | ||||
|  | ||||
| @ -24,6 +24,15 @@ function arr2str(data/*:any*/)/*:string*/ { | ||||
| 	var o/*:Array<string>*/ = []; for(var i = 0; i < data.length; ++i) o[i] = _chr(data[i]); return o.join(""); | ||||
| } | ||||
| 
 | ||||
| function ab2a(data/*:ArrayBuffer|Uint8Array*/)/*:Array<number>*/ { | ||||
| 	if(typeof ArrayBuffer == 'undefined') throw new Error("Unsupported"); | ||||
| 	if(data instanceof ArrayBuffer) return ab2a(new Uint8Array(data)); | ||||
| 	/*:: if(data instanceof ArrayBuffer) throw new Error("unreachable"); */ | ||||
| 	var o = new Array(data.length); | ||||
| 	for(var i = 0; i < data.length; ++i) o[i] = data[i]; | ||||
| 	return o; | ||||
| } | ||||
| 
 | ||||
| var bconcat = function(bufs) { return [].concat.apply([], bufs); }; | ||||
| 
 | ||||
| var chr0 = /\u0000/g, chr1 = /[\u0001-\u0006]/g; | ||||
|  | ||||
| @ -49,9 +49,9 @@ function parse_isodur(s) { | ||||
| 		if(!m[i]) continue; | ||||
| 		mt = 1; | ||||
| 		if(i > 3) time = true; | ||||
| 		switch(m[i].substr(m[i].length-1)) { | ||||
| 		switch(m[i].slice(m[i].length-1)) { | ||||
| 			case 'Y': | ||||
| 				throw new Error("Unsupported ISO Duration Field: " + m[i].substr(m[i].length-1)); | ||||
| 				throw new Error("Unsupported ISO Duration Field: " + m[i].slice(m[i].length-1)); | ||||
| 			case 'D': mt *= 24; | ||||
| 				/* falls through */ | ||||
| 			case 'H': mt *= 60; | ||||
| @ -100,6 +100,7 @@ function cc2str(arr/*:Array<number>*/)/*:string*/ { | ||||
| function dup(o/*:any*/)/*:any*/ { | ||||
| 	if(typeof JSON != 'undefined' && !Array.isArray(o)) return JSON.parse(JSON.stringify(o)); | ||||
| 	if(typeof o != 'object' || o == null) return o; | ||||
| 	if(o instanceof Date) return new Date(o.getTime()); | ||||
| 	var out = {}; | ||||
| 	for(var k in o) if(o.hasOwnProperty(k)) out[k] = dup(o[k]); | ||||
| 	return out; | ||||
|  | ||||
| @ -7,24 +7,24 @@ function parsexmltag(tag/*:string*/, skip_root/*:?boolean*/)/*:any*/ { | ||||
| 	var z = ({}/*:any*/); | ||||
| 	var eq = 0, c = 0; | ||||
| 	for(; eq !== tag.length; ++eq) if((c = tag.charCodeAt(eq)) === 32 || c === 10 || c === 13) break; | ||||
| 	if(!skip_root) z[0] = tag.substr(0, eq); | ||||
| 	if(!skip_root) z[0] = tag.slice(0, eq); | ||||
| 	if(eq === tag.length) return z; | ||||
| 	var m = tag.match(attregexg), j=0, v="", i=0, q="", cc="", quot = 1; | ||||
| 	if(m) for(i = 0; i != m.length; ++i) { | ||||
| 		cc = m[i]; | ||||
| 		for(c=0; c != cc.length; ++c) if(cc.charCodeAt(c) === 61) break; | ||||
| 		q = cc.substr(0,c).trim(); | ||||
| 		q = cc.slice(0,c).trim(); | ||||
| 		while(cc.charCodeAt(c+1) == 32) ++c; | ||||
| 		quot = ((eq=cc.charCodeAt(c+1)) == 34 || eq == 39) ? 1 : 0; | ||||
| 		v = cc.substring(c+1+quot, cc.length-quot); | ||||
| 		v = cc.slice(c+1+quot, cc.length-quot); | ||||
| 		for(j=0;j!=q.length;++j) if(q.charCodeAt(j) === 58) break; | ||||
| 		if(j===q.length) { | ||||
| 			if(q.indexOf("_") > 0) q = q.substr(0, q.indexOf("_")); // from ods
 | ||||
| 			if(q.indexOf("_") > 0) q = q.slice(0, q.indexOf("_")); // from ods
 | ||||
| 			z[q] = v; | ||||
| 		} | ||||
| 		else { | ||||
| 			var k = (j===5 && q.substr(0,5)==="xmlns"?"xmlns":"")+q.substr(j+1); | ||||
| 			if(z[k] && q.substr(j-3,3) == "ext") continue; // from ods
 | ||||
| 			var k = (j===5 && q.slice(0,5)==="xmlns"?"xmlns":"")+q.slice(j+1); | ||||
| 			if(z[k] && q.slice(j-3,j) == "ext") continue; // from ods
 | ||||
| 			z[k] = v; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @ -227,9 +227,9 @@ function write_BrtColor(color, o) { | ||||
| 		o.write_shift(1, 0); | ||||
| 	} else { | ||||
| 		var rgb = (color.rgb || 'FFFFFF'); | ||||
| 		o.write_shift(1, parseInt(rgb.substr(0,2),16)); | ||||
| 		o.write_shift(1, parseInt(rgb.substr(2,2),16)); | ||||
| 		o.write_shift(1, parseInt(rgb.substr(4,2),16)); | ||||
| 		o.write_shift(1, parseInt(rgb.slice(0,2),16)); | ||||
| 		o.write_shift(1, parseInt(rgb.slice(2,4),16)); | ||||
| 		o.write_shift(1, parseInt(rgb.slice(4,6),16)); | ||||
| 		o.write_shift(1, 0xFF); | ||||
| 	} | ||||
| 	return o; | ||||
|  | ||||
| @ -10,7 +10,7 @@ var RELS = ({ | ||||
| /* 9.3.3 Representing Relationships */ | ||||
| function get_rels_path(file/*:string*/)/*:string*/ { | ||||
| 	var n = file.lastIndexOf("/"); | ||||
| 	return file.substr(0,n+1) + '_rels/' + file.substr(n+1) + ".rels"; | ||||
| 	return file.slice(0,n+1) + '_rels/' + file.slice(n+1) + ".rels"; | ||||
| } | ||||
| 
 | ||||
| function parse_rels(data/*:?string*/, currentFilePath/*:string*/) { | ||||
|  | ||||
| @ -25,7 +25,7 @@ var CORE_PROPS_REGEX/*:Array<RegExp>*/ = (function() { | ||||
| 	var r = new Array(CORE_PROPS.length); | ||||
| 	for(var i = 0; i < CORE_PROPS.length; ++i) { | ||||
| 		var f = CORE_PROPS[i]; | ||||
| 		var g = "(?:"+ f[0].substr(0,f[0].indexOf(":")) +":)"+ f[0].substr(f[0].indexOf(":")+1); | ||||
| 		var g = "(?:"+ f[0].slice(0,f[0].indexOf(":")) +":)"+ f[0].slice(f[0].indexOf(":")+1); | ||||
| 		r[i] = new RegExp("<" + g + "[^>]*>([\\s\\S]*?)<\/" + g + ">"); | ||||
| 	} | ||||
| 	return r; | ||||
|  | ||||
| @ -15,7 +15,7 @@ function parse_cust_props(data/*:string*/, opts) { | ||||
| 			case '</property>': name = null; break; | ||||
| 			default: if (x.indexOf('<vt:') === 0) { | ||||
| 				var toks = x.split('>'); | ||||
| 				var type = toks[0].substring(4), text = toks[1]; | ||||
| 				var type = toks[0].slice(4), text = toks[1]; | ||||
| 				/* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */ | ||||
| 				switch(type) { | ||||
| 					case 'lpstr': case 'bstr': case 'lpwstr': | ||||
| @ -40,7 +40,7 @@ function parse_cust_props(data/*:string*/, opts) { | ||||
| 						if(type.slice(-1) == '/') break; | ||||
| 						if(opts.WTF && typeof console !== 'undefined') console.warn('Unexpected', x, type, toks); | ||||
| 				} | ||||
| 			} else if(x.substr(0,2) === "</") {/* empty */ | ||||
| 			} else if(x.slice(0,2) === "</") {/* empty */ | ||||
| 			} else if(opts.WTF) throw new Error(x); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @ -312,6 +312,7 @@ function parse_ShortXLUnicodeString(blob, length, opts) { | ||||
| 	} else if(opts.biff == 12) { | ||||
| 		width = 2; encoding = 'wstr'; | ||||
| 	} | ||||
| 	if(opts.biff >= 2 && opts.biff <= 5) encoding = 'cpstr'; | ||||
| 	var o = cch ? blob.read_shift(cch, encoding) : ""; | ||||
| 	current_codepage = cp; | ||||
| 	return o; | ||||
| @ -342,7 +343,7 @@ function parse_XLUnicodeRichExtendedString(blob) { | ||||
| function parse_XLUnicodeStringNoCch(blob, cch, opts) { | ||||
| 	var retval; | ||||
| 	if(opts) { | ||||
| 		if(opts.biff >= 2 && opts.biff <= 5) return blob.read_shift(cch, 'sbcs-cont'); | ||||
| 		if(opts.biff >= 2 && opts.biff <= 5) return blob.read_shift(cch, 'cpstr'); | ||||
| 		if(opts.biff >= 12) return blob.read_shift(cch, 'dbcs-cont'); | ||||
| 	} | ||||
| 	var fHighByte = blob.read_shift(1); | ||||
| @ -362,7 +363,7 @@ function parse_XLUnicodeString2(blob, length, opts) { | ||||
| 	if(opts.biff > 5) return parse_XLUnicodeString(blob, length, opts); | ||||
| 	var cch = blob.read_shift(1); | ||||
| 	if(cch === 0) { blob.l++; return ""; } | ||||
| 	return blob.read_shift(cch, opts.biff == 4 ? 'cpstr' : 'sbcs-cont'); | ||||
| 	return blob.read_shift(cch, (opts.biff <= 4 || !blob.lens ) ? 'cpstr' : 'sbcs-cont'); | ||||
| } | ||||
| /* TODO: BIFF5 and lower, codepage awareness */ | ||||
| function write_XLUnicodeString(str, opts, o) { | ||||
|  | ||||
| @ -149,7 +149,7 @@ function dbf_to_aoa(buf, opts)/*:AOA*/ { | ||||
| 					out[R][C] = out[R][C].trim(); | ||||
| 					break; | ||||
| 				case 'D': | ||||
| 					if(s.length === 8) out[R][C] = new Date(+s.substr(0,4), +s.substr(4,2)-1, +s.substr(6,2)); | ||||
| 					if(s.length === 8) out[R][C] = new Date(+s.slice(0,4), +s.slice(4,6)-1, +s.slice(6,8)); | ||||
| 					else out[R][C] = s; | ||||
| 					break; | ||||
| 				case 'F': out[R][C] = parseFloat(s.trim()); break; | ||||
| @ -325,18 +325,18 @@ var SYLK = (function() { | ||||
| 			case 'O': break; /* options? */ | ||||
| 			case 'P': | ||||
| 				if(record[1].charAt(0) == 'P') | ||||
| 					formats.push(rstr.substr(3).replace(/;;/g, ";")); | ||||
| 					formats.push(rstr.slice(3).replace(/;;/g, ";")); | ||||
| 				break; | ||||
| 			case 'C': | ||||
| 			for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { | ||||
| 				case 'X': C = parseInt(record[rj].substr(1))-1; break; | ||||
| 				case 'X': C = parseInt(record[rj].slice(1))-1; break; | ||||
| 				case 'Y': | ||||
| 					R = parseInt(record[rj].substr(1))-1; C = 0; | ||||
| 					R = parseInt(record[rj].slice(1))-1; C = 0; | ||||
| 					for(j = arr.length; j <= R; ++j) arr[j] = []; | ||||
| 					break; | ||||
| 				case 'K': | ||||
| 					val = record[rj].substr(1); | ||||
| 					if(val.charAt(0) === '"') val = val.substr(1,val.length - 2); | ||||
| 					val = record[rj].slice(1); | ||||
| 					if(val.charAt(0) === '"') val = val.slice(1,val.length - 1); | ||||
| 					else if(val === 'TRUE') val = true; | ||||
| 					else if(val === 'FALSE') val = false; | ||||
| 					else if(!isNaN(fuzzynum(val))) { | ||||
| @ -349,7 +349,7 @@ var SYLK = (function() { | ||||
| 					next_cell_format = null; | ||||
| 					break; | ||||
| 				case 'E': | ||||
| 					var formula = rc_to_a1(record[rj].substr(1), {r:R,c:C}); | ||||
| 					var formula = rc_to_a1(record[rj].slice(1), {r:R,c:C}); | ||||
| 					arr[R][C] = [arr[R][C], formula]; | ||||
| 					break; | ||||
| 				default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr); | ||||
| @ -357,31 +357,31 @@ var SYLK = (function() { | ||||
| 			case 'F': | ||||
| 			var F_seen = 0; | ||||
| 			for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { | ||||
| 				case 'X': C = parseInt(record[rj].substr(1))-1; ++F_seen; break; | ||||
| 				case 'X': C = parseInt(record[rj].slice(1))-1; ++F_seen; break; | ||||
| 				case 'Y': | ||||
| 					R = parseInt(record[rj].substr(1))-1; /*C = 0;*/ | ||||
| 					R = parseInt(record[rj].slice(1))-1; /*C = 0;*/ | ||||
| 					for(j = arr.length; j <= R; ++j) arr[j] = []; | ||||
| 					break; | ||||
| 				case 'M': Mval = parseInt(record[rj].substr(1)) / 20; break; | ||||
| 				case 'M': Mval = parseInt(record[rj].slice(1)) / 20; break; | ||||
| 				case 'F': break; /* ??? */ | ||||
| 				case 'P': | ||||
| 					next_cell_format = formats[parseInt(record[rj].substr(1))]; | ||||
| 					next_cell_format = formats[parseInt(record[rj].slice(1))]; | ||||
| 					break; | ||||
| 				case 'S': break; /* cell style */ | ||||
| 				case 'D': break; /* column */ | ||||
| 				case 'N': break; /* font */ | ||||
| 				case 'W': | ||||
| 					cw = record[rj].substr(1).split(" "); | ||||
| 					cw = record[rj].slice(1).split(" "); | ||||
| 					for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) { | ||||
| 						Mval = parseInt(cw[2], 10); | ||||
| 						colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval}; process_col(colinfo[j-1]); | ||||
| 					} break; | ||||
| 				case 'C': /* default column format */ | ||||
| 					C = parseInt(record[rj].substr(1))-1; | ||||
| 					C = parseInt(record[rj].slice(1))-1; | ||||
| 					if(!colinfo[C]) colinfo[C] = {}; | ||||
| 					break; | ||||
| 				case 'R': /* row properties */ | ||||
| 					R = parseInt(record[rj].substr(1))-1; | ||||
| 					R = parseInt(record[rj].slice(1))-1; | ||||
| 					if(!rowinfo[R]) rowinfo[R] = {}; | ||||
| 					if(Mval > 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); } | ||||
| 					else if(Mval === 0) rowinfo[R].hidden = true; | ||||
| @ -506,7 +506,7 @@ var DIF = (function() { | ||||
| 					else arr[R][C] = value; | ||||
| 					++C; break; | ||||
| 				case 1: | ||||
| 					data = data.substr(1,data.length-2); | ||||
| 					data = data.slice(1,data.length-1); | ||||
| 					arr[R][C++] = data !== '' ? data : null; | ||||
| 					break; | ||||
| 			} | ||||
| @ -761,8 +761,8 @@ var PRN = (function() { | ||||
| 		var ws/*:Worksheet*/ = o.dense ? ([]/*:any*/) : ({}/*:any*/); | ||||
| 		var range/*:Range*/ = ({s: {c:0, r:0}, e: {c:0, r:0}}/*:any*/); | ||||
| 
 | ||||
| 		if(str.substr(0,4) == "sep=" && str.charCodeAt(5) == 10) { sep = str.charAt(4); str = str.substr(6); } | ||||
| 		else sep = guess_sep(str.substr(0,1024)); | ||||
| 		if(str.slice(0,4) == "sep=" && str.charCodeAt(5) == 10) { sep = str.charAt(4); str = str.slice(6); } | ||||
| 		else sep = guess_sep(str.slice(0,1024)); | ||||
| 		var R = 0, C = 0, v = 0; | ||||
| 		var start = 0, end = 0, sepcc = sep.charCodeAt(0), instr = false, cc=0; | ||||
| 		str = str.replace(/\r\n/mg, "\n"); | ||||
| @ -776,7 +776,7 @@ var PRN = (function() { | ||||
| 			else if(s.trim().length === 0) { cell.t = 's'; cell.v = s; } | ||||
| 			else if(s.charCodeAt(0) == 0x3D) { | ||||
| 				if(s.charCodeAt(1) == 0x22 && s.charCodeAt(s.length - 1) == 0x22) { cell.t = 's'; cell.v = s.slice(2,-1).replace(/""/g,'"'); } | ||||
| 				else if(fuzzyfmla(s)) { cell.t = 'n'; cell.f = s.substr(1); } | ||||
| 				else if(fuzzyfmla(s)) { cell.t = 'n'; cell.f = s.slice(1); } | ||||
| 				else { cell.t = 's'; cell.v = s; } } | ||||
| 			else if(s == "TRUE") { cell.t = 'b'; cell.v = true; } | ||||
| 			else if(s == "FALSE") { cell.t = 'b'; cell.v = false; } | ||||
| @ -846,7 +846,7 @@ var PRN = (function() { | ||||
| 				var coord = encode_cell({r:R,c:C}); | ||||
| 				cell = dense ? (ws[R]||[])[C] : ws[coord]; | ||||
| 				if(!cell || cell.v == null) { oo.push("          "); continue; } | ||||
| 				var w = (cell.w || (format_cell(cell), cell.w) || "").substr(0,10); | ||||
| 				var w = (cell.w || (format_cell(cell), cell.w) || "").slice(0,10); | ||||
| 				while(w.length < 10) w += " "; | ||||
| 				oo.push(w + (C === 0 ? " " : "")); | ||||
| 			} | ||||
|  | ||||
| @ -45,7 +45,7 @@ var WK_ = (function() { | ||||
| 					break; | ||||
| 				case 0x06: refguess = val; break; /* RANGE */ | ||||
| 				case 0x0F: /* LABEL */ | ||||
| 					if(!o.qpro) val[1].v = val[1].v.substr(1); | ||||
| 					if(!o.qpro) val[1].v = val[1].v.slice(1); | ||||
| 					/* falls through */ | ||||
| 				case 0x0D: /* INTEGER */ | ||||
| 				case 0x0E: /* NUMBER */ | ||||
| @ -63,7 +63,7 @@ var WK_ = (function() { | ||||
| 					break; | ||||
| 			} else switch(RT) { | ||||
| 				case 0x16: /* LABEL16 */ | ||||
| 					val[1].v = val[1].v.substr(1); | ||||
| 					val[1].v = val[1].v.slice(1); | ||||
| 					/* falls through */ | ||||
| 				case 0x17: /* NUMBER17 */ | ||||
| 				case 0x18: /* NUMBER18 */ | ||||
|  | ||||
| @ -82,7 +82,7 @@ var parse_rs = (function parse_rs_factory() { | ||||
| 
 | ||||
| 				/* 18.3.1.15 color CT_Color TODO: tint, theme, auto, indexed */ | ||||
| 				case '<color': | ||||
| 					if(y.rgb) font.color = y.rgb.substr(2,6); | ||||
| 					if(y.rgb) font.color = y.rgb.slice(2,8); | ||||
| 					break; | ||||
| 
 | ||||
| 				/* 18.8.18 family ST_FontFamily */ | ||||
|  | ||||
| @ -1,10 +1,10 @@ | ||||
| function hex2RGB(h) { | ||||
| 	var o = h.substr(h[0]==="#"?1:0,6); | ||||
| 	return [parseInt(o.substr(0,2),16),parseInt(o.substr(2,2),16),parseInt(o.substr(4,2),16)]; | ||||
| 	var o = h.slice(h[0]==="#"?1:0).slice(0,6); | ||||
| 	return [parseInt(o.slice(0,2),16),parseInt(o.slice(2,4),16),parseInt(o.slice(4,6),16)]; | ||||
| } | ||||
| function rgb2Hex(rgb) { | ||||
| 	for(var i=0,o=1; i!=3; ++i) o = o*256 + (rgb[i]>255?255:rgb[i]<0?0:rgb[i]); | ||||
| 	return o.toString(16).toUpperCase().substr(1); | ||||
| 	return o.toString(16).toUpperCase().slice(1); | ||||
| } | ||||
| 
 | ||||
| function rgb2HSL(rgb) { | ||||
|  | ||||
| @ -46,7 +46,7 @@ function parse_clrScheme(t, themes, opts) { | ||||
| 					themes.themeElements.clrScheme.push(color); | ||||
| 					color = {}; | ||||
| 				} else { | ||||
| 					color.name = y[0].substring(3, y[0].length - 1); | ||||
| 					color.name = y[0].slice(3, y[0].length - 1); | ||||
| 				} | ||||
| 				break; | ||||
| 
 | ||||
|  | ||||
| @ -690,8 +690,8 @@ var PtgBinOp = { | ||||
| 	PtgPower: "^", | ||||
| 	PtgSub: "-" | ||||
| }; | ||||
| function formula_quote_sheet_name(sname/*:string*/)/*:string*/ { | ||||
| 	if(!sname) throw new Error("empty sheet name"); | ||||
| function formula_quote_sheet_name(sname/*:string*/, opts)/*:string*/ { | ||||
| 	if(!sname && !(opts && opts.biff <= 5 && opts.biff >= 2)) throw new Error("empty sheet name"); | ||||
| 	if(sname.indexOf(" ") > -1) return "'" + sname + "'"; | ||||
| 	return sname; | ||||
| } | ||||
| @ -730,7 +730,7 @@ function get_ixti_raw(supbooks, ixti/*:number*/, opts)/*:string*/ { | ||||
| 	} | ||||
| } | ||||
| function get_ixti(supbooks, ixti/*:number*/, opts)/*:string*/ { | ||||
| 	return formula_quote_sheet_name(get_ixti_raw(supbooks, ixti, opts)); | ||||
| 	return formula_quote_sheet_name(get_ixti_raw(supbooks, ixti, opts), opts); | ||||
| } | ||||
| 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}}; | ||||
|  | ||||
| @ -1,10 +1,10 @@ | ||||
| /* Part 3 TODO: actually parse formulae */ | ||||
| function ods_to_csf_formula(f/*:string*/)/*:string*/ { | ||||
| 	if(f.substr(0,3) == "of:") f = f.substr(3); | ||||
| 	if(f.slice(0,3) == "of:") f = f.slice(3); | ||||
| 	/* 5.2 Basic Expressions */ | ||||
| 	if(f.charCodeAt(0) == 61) { | ||||
| 		f = f.substr(1); | ||||
| 		if(f.charCodeAt(0) == 61) f = f.substr(1); | ||||
| 		f = f.slice(1); | ||||
| 		if(f.charCodeAt(0) == 61) f = f.slice(1); | ||||
| 	} | ||||
| 	f = f.replace(/COM\.MICROSOFT\./g, ""); | ||||
| 	/* Part 3 Section 5.8 References */ | ||||
|  | ||||
| @ -23,8 +23,8 @@ function parse_ws_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*:WBWBPro | ||||
| 	var data1 = "", data2 = ""; | ||||
| 	var mtch/*:?any*/ = data.match(sheetdataregex); | ||||
| 	if(mtch) { | ||||
| 		data1 = data.substr(0, mtch.index); | ||||
| 		data2 = data.substr(mtch.index + mtch[0].length); | ||||
| 		data1 = data.slice(0, mtch.index); | ||||
| 		data2 = data.slice(mtch.index + mtch[0].length); | ||||
| 	} else data1 = data2 = data; | ||||
| 
 | ||||
| 	/* 18.3.1.82 sheetPr CT_SheetPr */ | ||||
| @ -35,7 +35,7 @@ function parse_ws_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*:WBWBPro | ||||
| 	// $FlowIgnore
 | ||||
| 	var ridx = (data1.match(/<(?:\w*:)?dimension/)||{index:-1}).index; | ||||
| 	if(ridx > 0) { | ||||
| 		var ref = data1.substr(ridx,50).match(dimregex); | ||||
| 		var ref = data1.slice(ridx,ridx+50).match(dimregex); | ||||
| 		if(ref) parse_ws_xml_dim(s, ref[1]); | ||||
| 	} | ||||
| 
 | ||||
| @ -62,7 +62,7 @@ function parse_ws_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*:WBWBPro | ||||
| 	var merges/*:Array<Range>*/ = []; | ||||
| 	var _merge = data2.match(mergecregex); | ||||
| 	if(_merge) for(ridx = 0; ridx != _merge.length; ++ridx) | ||||
| 		merges[ridx] = safe_decode_range(_merge[ridx].substr(_merge[ridx].indexOf("\"")+1)); | ||||
| 		merges[ridx] = safe_decode_range(_merge[ridx].slice(_merge[ridx].indexOf("\"")+1)); | ||||
| 
 | ||||
| 	/* 18.3.1.48 hyperlinks CT_Hyperlinks */ | ||||
| 	var hlink = data2.match(hlinkregex); | ||||
| @ -252,7 +252,7 @@ function write_ws_xml_cell(cell/*:Cell*/, ref, ws, opts, idx, wb)/*:string*/ { | ||||
| 	} | ||||
| 	if(cell.t != oldt) { cell.t = oldt; cell.v = oldv; } | ||||
| 	if(cell.f) { | ||||
| 		var ff = cell.F && cell.F.substr(0, ref.length) == ref ? {t:"array", ref:cell.F} : null; | ||||
| 		var ff = cell.F && cell.F.slice(0, ref.length) == ref ? {t:"array", ref:cell.F} : null; | ||||
| 		v = writextag('f', escapexml(cell.f), ff) + (cell.v != null ? v : ""); | ||||
| 	} | ||||
| 	if(cell.l) ws['!links'].push([ref, cell.l]); | ||||
| @ -283,7 +283,7 @@ return function parse_ws_xml_data(sdata/*:string*/, s, opts, guess/*:Range*/, th | ||||
| 
 | ||||
| 		/* 18.3.1.73 row CT_Row */ | ||||
| 		for(ri = 0; ri < xlen; ++ri) if(x.charCodeAt(ri) === 62) break; ++ri; | ||||
| 		tag = parsexmltag(x.substr(0,ri), true); | ||||
| 		tag = parsexmltag(x.slice(0,ri), true); | ||||
| 		tagr = tag.r != null ? parseInt(tag.r, 10) : tagr+1; tagc = -1; | ||||
| 		if(opts.sheetRows && opts.sheetRows < tagr) continue; | ||||
| 		if(guess.s.r > tagr - 1) guess.s.r = tagr - 1; | ||||
| @ -298,12 +298,12 @@ return function parse_ws_xml_data(sdata/*:string*/, s, opts, guess/*:Range*/, th | ||||
| 		} | ||||
| 
 | ||||
| 		/* 18.3.1.4 c CT_Cell */ | ||||
| 		cells = x.substr(ri).split(cellregex); | ||||
| 		cells = x.slice(ri).split(cellregex); | ||||
| 		for(ri = 0; ri != cells.length; ++ri) { | ||||
| 			x = cells[ri].trim(); | ||||
| 			if(x.length === 0) continue; | ||||
| 			cref = x.match(rregex); idx = ri; i=0; cc=0; | ||||
| 			x = "<c " + (x.substr(0,1)=="<"?">":"") + x; | ||||
| 			x = "<c " + (x.slice(0,1)=="<"?">":"") + x; | ||||
| 			if(cref != null && cref.length === 2) { | ||||
| 				idx = 0; d=cref[1]; | ||||
| 				for(i=0; i != d.length; ++i) { | ||||
| @ -314,9 +314,9 @@ return function parse_ws_xml_data(sdata/*:string*/, s, opts, guess/*:Range*/, th | ||||
| 				tagc = idx; | ||||
| 			} else ++tagc; | ||||
| 			for(i = 0; i != x.length; ++i) if(x.charCodeAt(i) === 62) break; ++i; | ||||
| 			tag = parsexmltag(x.substr(0,i), true); | ||||
| 			tag = parsexmltag(x.slice(0,i), true); | ||||
| 			if(!tag.r) tag.r = encode_cell({r:tagr-1, c:tagc}); | ||||
| 			d = x.substr(i); | ||||
| 			d = x.slice(i); | ||||
| 			p = ({t:""}/*:any*/); | ||||
| 
 | ||||
| 			if((cref=d.match(match_v))!= null && /*::cref != null && */cref[1] !== '') p.v=unescapexml(cref[1]); | ||||
| @ -528,7 +528,7 @@ function write_ws_xml(idx/*:number*/, opts, wb/*:Workbook*/, rels)/*:string*/ { | ||||
| 				rId = add_rels(rels, -1, escapexml(l[1].Target).replace(/#.*$/, ""), RELS.HLINK); | ||||
| 				rel["r:id"] = "rId"+rId; | ||||
| 			} | ||||
| 			if((relc = l[1].Target.indexOf("#")) > -1) rel.location = escapexml(l[1].Target.substr(relc+1)); | ||||
| 			if((relc = l[1].Target.indexOf("#")) > -1) rel.location = escapexml(l[1].Target.slice(relc+1)); | ||||
| 			if(l[1].Tooltip) rel.tooltip = escapexml(l[1].Tooltip); | ||||
| 			o[o.length] = writextag("hyperlink",null,rel); | ||||
| 		}); | ||||
|  | ||||
| @ -270,7 +270,7 @@ function write_BrtHLink(l, rId) { | ||||
| 	write_UncheckedRfX({s:decode_cell(l[0]), e:decode_cell(l[0])}, o); | ||||
| 	write_RelID("rId" + rId, o); | ||||
| 	var locidx = l[1].Target.indexOf("#"); | ||||
| 	var loc = locidx == -1 ? "" : l[1].Target.substr(locidx+1); | ||||
| 	var loc = locidx == -1 ? "" : l[1].Target.slice(locidx+1); | ||||
| 	write_XLWideString(loc || "", o); | ||||
| 	write_XLWideString(l[1].Tooltip || "", o); | ||||
| 	write_XLWideString("", o); | ||||
|  | ||||
| @ -189,7 +189,7 @@ function write_wb_xml(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:string*/ { | ||||
| 	o[o.length] = "<sheets>"; | ||||
| 	var sheets = wb.Workbook && wb.Workbook.Sheets || []; | ||||
| 	for(var i = 0; i != wb.SheetNames.length; ++i) { | ||||
| 		var sht = ({name:escapexml(wb.SheetNames[i].substr(0,31))}/*:any*/); | ||||
| 		var sht = ({name:escapexml(wb.SheetNames[i].slice(0,31))}/*:any*/); | ||||
| 		sht.sheetId = ""+(i+1); | ||||
| 		sht["r:id"] = "rId"+(i+1); | ||||
| 		if(sheets[i]) switch(sheets[i].Hidden) { | ||||
|  | ||||
| @ -12,7 +12,7 @@ function write_BrtBundleSh(data, o) { | ||||
| 	o.write_shift(4, data.Hidden); | ||||
| 	o.write_shift(4, data.iTabID); | ||||
| 	write_RelID(data.strRelID, o); | ||||
| 	write_XLWideString(data.name.substr(0,31), o); | ||||
| 	write_XLWideString(data.name.slice(0,31), o); | ||||
| 	return o.length > o.l ? o.slice(0, o.l) : o; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -9,11 +9,11 @@ function xlml_parsexmltag(tag/*:string*/, skip_root/*:?boolean*/) { | ||||
| 	if(m) for(i = 0; i != m.length; ++i) { | ||||
| 		y = m[i].match(attregex2); | ||||
| /*:: if(!y || !y[2]) continue; */ | ||||
| 		if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].substr(1,y[2].length-2); | ||||
| 		if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1); | ||||
| 		else { | ||||
| 			if(y[1].substr(0,6) === "xmlns:") w = "xmlns"+y[1].substr(6); | ||||
| 			else w = y[1].substr(j+1); | ||||
| 			z[w] = y[2].substr(1,y[2].length-2); | ||||
| 			if(y[1].slice(0,6) === "xmlns:") w = "xmlns"+y[1].slice(6); | ||||
| 			else w = y[1].slice(j+1); | ||||
| 			z[w] = y[2].slice(1,y[2].length-1); | ||||
| 		} | ||||
| 	} | ||||
| 	return z; | ||||
| @ -26,11 +26,11 @@ function xlml_parsexmltagobj(tag/*:string*/) { | ||||
| 	if(m) for(i = 0; i != m.length; ++i) { | ||||
| 		y = m[i].match(attregex2); | ||||
| /*:: if(!y || !y[2]) continue; */ | ||||
| 		if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].substr(1,y[2].length-2); | ||||
| 		if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1); | ||||
| 		else { | ||||
| 			if(y[1].substr(0,6) === "xmlns:") w = "xmlns"+y[1].substr(6); | ||||
| 			else w = y[1].substr(j+1); | ||||
| 			z[w] = y[2].substr(1,y[2].length-2); | ||||
| 			if(y[1].slice(0,6) === "xmlns:") w = "xmlns"+y[1].slice(6); | ||||
| 			else w = y[1].slice(j+1); | ||||
| 			z[w] = y[2].slice(1,y[2].length-1); | ||||
| 		} | ||||
| 	} | ||||
| 	return z; | ||||
| @ -130,7 +130,7 @@ function parse_xlml_data(xml, ss, data, cell/*:any*/, base, styles, csty, row, a | ||||
| 		if(cell.Formula) { | ||||
| 			var fstr = unescapexml(cell.Formula); | ||||
| 			/* strictly speaking, the leading = is required but some writers omit */ | ||||
| 			if(fstr.charCodeAt(0) == 61 /* = */) fstr = fstr.substr(1); | ||||
| 			if(fstr.charCodeAt(0) == 61 /* = */) fstr = fstr.slice(1); | ||||
| 			cell.f = rc_to_a1(fstr, base); | ||||
| 			delete cell.Formula; | ||||
| 			if(cell.ArrayRange == "RC") cell.F = rc_to_a1("RC:RC", base); | ||||
| @ -334,7 +334,7 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ { | ||||
| 			var _NamedRange = parsexmltag(Rn[0]); | ||||
| 			var _DefinedName/*:DefinedName*/ = ({ | ||||
| 				Name: _NamedRange.Name, | ||||
| 				Ref: rc_to_a1(_NamedRange.RefersTo.substr(1), {r:0, c:0}) | ||||
| 				Ref: rc_to_a1(_NamedRange.RefersTo.slice(1), {r:0, c:0}) | ||||
| 			}/*:any*/); | ||||
| 			if(Workbook.Sheets.length>0) _DefinedName.Sheet=Workbook.Sheets.length-1; | ||||
| 			/*:: if(Workbook.Names) */Workbook.Names.push(_DefinedName); | ||||
| @ -1017,8 +1017,8 @@ function write_ws_xlml_cell(cell, ref/*:string*/, ws, opts, idx/*:number*/, wb, | ||||
| 
 | ||||
| 	var attr = {}; | ||||
| 	if(cell.f) attr["ss:Formula"] = "=" + escapexml(a1_to_rc(cell.f, addr)); | ||||
| 	if(cell.F && cell.F.substr(0, ref.length) == ref) { | ||||
| 		var end = decode_cell(cell.F.substr(ref.length + 1)); | ||||
| 	if(cell.F && cell.F.slice(0, ref.length) == ref) { | ||||
| 		var end = decode_cell(cell.F.slice(ref.length + 1)); | ||||
| 		attr["ss:ArrayRange"] = "RC:R" + (end.r == addr.r ? "" : "[" + (end.r - addr.r) + "]") + "C" + (end.c == addr.c ? "" : "[" + (end.c - addr.c) + "]"); | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -14,13 +14,13 @@ var HTML_ = (function() { | ||||
| 		var merges/*:Array<Range>*/ = [], midx = 0; | ||||
| 		for(i = 0; i < rows.length; ++i) { | ||||
| 			var row = rows[i].trim(); | ||||
| 			var hd = row.substr(0,3).toLowerCase(); | ||||
| 			var hd = row.slice(0,3).toLowerCase(); | ||||
| 			if(hd == "<tr") { ++R; C = 0; continue; } | ||||
| 			if(hd != "<td") continue; | ||||
| 			var cells = row.split(/<\/td>/i); | ||||
| 			for(j = 0; j < cells.length; ++j) { | ||||
| 				var cell = cells[j].trim(); | ||||
| 				if(cell.substr(0,3).toLowerCase() != "<td") continue; | ||||
| 				if(cell.slice(0,3).toLowerCase() != "<td") continue; | ||||
| 				var m = cell, cc = 0; | ||||
| 				/* TODO: parse styles etc */ | ||||
| 				while(m.charAt(0) == "<" && (cc = m.indexOf(">")) > -1) m = m.slice(cc+1); | ||||
|  | ||||
| @ -58,7 +58,7 @@ var write_content_ods/*:{(wb:any, opts:any):string}*/ = (function() { | ||||
| 				if(cell && cell.f) { | ||||
| 					ct['table:formula'] = escapexml(csf_to_ods_formula(cell.f)); | ||||
| 					if(cell.F) { | ||||
| 						if(cell.F.substr(0, ref.length) == ref) { | ||||
| 						if(cell.F.slice(0, ref.length) == ref) { | ||||
| 							var _Fref = decode_range(cell.F); | ||||
| 							ct['table:number-matrix-columns-spanned'] = (_Fref.e.c - _Fref.s.c + 1); | ||||
| 							ct['table:number-matrix-rows-spanned'] =    (_Fref.e.r - _Fref.s.r + 1); | ||||
|  | ||||
| @ -2,7 +2,7 @@ function firstbyte(f/*:RawData*/,o/*:?TypeOpts*/)/*:Array<number>*/ { | ||||
| 	var x = ""; | ||||
| 	switch((o||{}).type || "base64") { | ||||
| 		case 'buffer': return [f[0], f[1], f[2], f[3]]; | ||||
| 		case 'base64': x = Base64.decode(f.substr(0,24)); break; | ||||
| 		case 'base64': x = Base64.decode(f.slice(0,24)); break; | ||||
| 		case 'binary': x = f; break; | ||||
| 		case 'array':  return [f[0], f[1], f[2], f[3]]; | ||||
| 		default: throw new Error("Unrecognized type " + (o && o.type || "undefined")); | ||||
| @ -79,6 +79,12 @@ 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) { | ||||
| 		// $FlowIgnore
 | ||||
| 		var ab=new ArrayBuffer(3), vu=new Uint8Array(ab); vu.foo="bar"; | ||||
| 		// $FlowIgnore
 | ||||
| 		if(!vu.foo) {o=dup(o); o.type='array'; return readSync(ab2a(d), o);} | ||||
| 	} | ||||
| 	switch((n = firstbyte(d, o))[0]) { | ||||
| 		case 0xD0: return read_cfb(CFB.read(d, o), o); | ||||
| 		case 0x09: return parse_xlscfb(d, o); | ||||
|  | ||||
							
								
								
									
										29
									
								
								test.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										29
									
								
								test.js
									
									
									
									
									
								
							| @ -269,7 +269,7 @@ function parsetest(x/*:string*/, wb/*:Workbook*/, full/*:boolean*/, ext/*:?strin | ||||
| 			}); | ||||
| 		}); | ||||
| 	}); | ||||
| 	describe(x + ext + ' should generate correct JSON output', function() { | ||||
| 	if(typeof JSON !== 'undefined') describe(x + ext + ' should generate correct JSON output', function() { | ||||
| 		wb.SheetNames.forEach(function(ws, i) { | ||||
| 			var rawjson = getfile(dir, x, i, ".rawjson"); | ||||
| 			if(fs.existsSync(rawjson)) it('#' + i + ' (' + ws + ')', function() { | ||||
| @ -601,15 +601,21 @@ describe('input formats', function() { | ||||
| 	it('should read base64 strings', function() { artifax.forEach(function(p) { | ||||
| 		X.read(fs.readFileSync(p, 'base64'), {type: 'base64'}); | ||||
| 	}); }); | ||||
| 	var k = browser ? 'array' : 'buffer'; | ||||
| 	(typeof Uint8Array !== 'undefined' ? it : it.skip)('should read ' + k + 's', function() { artifax.forEach(function(p) { | ||||
| 			X.read(fs.readFileSync(p, browser ? 'buffer' : null), {type: k}); | ||||
| 	}); }); | ||||
| 	(typeof Uint8Array !== 'undefined' ? it : it.skip)('should read array', function() { artifax.forEach(function(p) { | ||||
| 			X.read(fs.readFileSync(p, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 		X.read(fs.readFileSync(p, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 	}); }); | ||||
| 	((browser || typeof Buffer === 'undefined') ? it.skip : it)('should read Buffers', function() { artifax.forEach(function(p) { | ||||
| 		X.read(fs.readFileSync(p), {type: 'buffer'}); | ||||
| 	}); }); | ||||
| 	(typeof Uint8Array !== 'undefined' ? it : it.skip)('should read ArrayBuffer / Uint8Array', function() { artifax.forEach(function(p) { | ||||
| 		var payload = fs.readFileSync(p, browser ? 'buffer' : null); | ||||
| 		var ab = new ArrayBuffer(payload.length), vu = new Uint8Array(ab); | ||||
| 		for(var i = 0; i < payload.length; ++i) vu[i] = payload[i]; | ||||
| 		X.read(ab, {type: 'array'}); | ||||
| 		X.read(vu, {type: 'array'}); | ||||
| 	}); }); | ||||
| 	it('should throw if format is unknown', function() { artifax.forEach(function(p) { | ||||
| 			assert.throws(function() { X.read(fs.readFileSync(p), {type: 'dafuq'}); }); | ||||
| 		assert.throws(function() { X.read(fs.readFileSync(p), {type: 'dafuq'}); }); | ||||
| 	}); }); | ||||
| 
 | ||||
| 	var T = browser ? 'base64' : 'buffer'; | ||||
| @ -1011,8 +1017,8 @@ describe('parse features', function() { | ||||
| 		var wb1, wb2; | ||||
| 		var bef = (function() { | ||||
| 			X = require(modp); | ||||
| 			wb1 = HLPaths.map(function(p) { return X.read(fs.readFileSync(p), {type:TYPE}); }); | ||||
| 			wb2 = ILPaths.map(function(p) { return X.read(fs.readFileSync(p), {type:TYPE}); }); | ||||
| 			wb1 = HLPaths.map(function(p) { return X.read(fs.readFileSync(p), {type:TYPE, WTF:1}); }); | ||||
| 			wb2 = ILPaths.map(function(p) { return X.read(fs.readFileSync(p), {type:TYPE, WTF:1}); }); | ||||
| 		}); | ||||
| 		if(typeof before != 'undefined') before(bef); | ||||
| 		else it('before', bef); | ||||
| @ -1127,7 +1133,7 @@ describe('parse features', function() { | ||||
| 		var wbs=[]; | ||||
| 		var bef = (function() { | ||||
| 			if(!fs.existsSync(paths.pmxls)) return; | ||||
| 			wbs = PMPaths.map(function(p) { return X.read(fs.readFileSync(p), {type:TYPE}); }); | ||||
| 			wbs = PMPaths.map(function(p) { return X.read(fs.readFileSync(p), {type:TYPE, WTF:1}); }); | ||||
| 		}); | ||||
| 		if(typeof before != 'undefined') before(bef); | ||||
| 		else it('before', bef); | ||||
| @ -1550,6 +1556,7 @@ describe('invalid files', function() { | ||||
| 
 | ||||
| describe('json output', function() { | ||||
| 	function seeker(json, keys, val) { | ||||
| 		if(typeof keys == "string") keys = keys.split(""); | ||||
| 		for(var i = 0; i != json.length; ++i) { | ||||
| 			for(var j = 0; j != keys.length; ++j) { | ||||
| 				if(json[i][keys[j]] === val) throw new Error("found " + val + " in row " + i + " key " + keys[j]); | ||||
| @ -2031,7 +2038,7 @@ describe('corner cases', function() { | ||||
| 			assert.doesNotThrow(function(x) { return X.SSF.format(f, 12345.6789);}); | ||||
| 		}); | ||||
| 	}); | ||||
| 	it('SSF oddities', function() { | ||||
| 	if(typeof JSON !== 'undefined') it('SSF oddities', function() { | ||||
| 		// $FlowIgnore
 | ||||
| 		var ssfdata = require('./misc/ssf.json'); | ||||
| 		var cb = function(d, j) { return function() { return X.SSF.format(d[0], d[j][0]); }; }; | ||||
|  | ||||
							
								
								
									
										29
									
								
								tests/core.js
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										29
									
								
								tests/core.js
									
									
									
										generated
									
									
									
								
							| @ -269,7 +269,7 @@ function parsetest(x/*:string*/, wb/*:Workbook*/, full/*:boolean*/, ext/*:?strin | ||||
| 			}); | ||||
| 		}); | ||||
| 	}); | ||||
| 	describe(x + ext + ' should generate correct JSON output', function() { | ||||
| 	if(typeof JSON !== 'undefined') describe(x + ext + ' should generate correct JSON output', function() { | ||||
| 		wb.SheetNames.forEach(function(ws, i) { | ||||
| 			var rawjson = getfile(dir, x, i, ".rawjson"); | ||||
| 			if(fs.existsSync(rawjson)) it('#' + i + ' (' + ws + ')', function() { | ||||
| @ -601,15 +601,21 @@ describe('input formats', function() { | ||||
| 	it('should read base64 strings', function() { artifax.forEach(function(p) { | ||||
| 		X.read(fs.readFileSync(p, 'base64'), {type: 'base64'}); | ||||
| 	}); }); | ||||
| 	var k = browser ? 'array' : 'buffer'; | ||||
| 	(typeof Uint8Array !== 'undefined' ? it : it.skip)('should read ' + k + 's', function() { artifax.forEach(function(p) { | ||||
| 			X.read(fs.readFileSync(p, browser ? 'buffer' : null), {type: k}); | ||||
| 	}); }); | ||||
| 	(typeof Uint8Array !== 'undefined' ? it : it.skip)('should read array', function() { artifax.forEach(function(p) { | ||||
| 			X.read(fs.readFileSync(p, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 		X.read(fs.readFileSync(p, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 	}); }); | ||||
| 	((browser || typeof Buffer === 'undefined') ? it.skip : it)('should read Buffers', function() { artifax.forEach(function(p) { | ||||
| 		X.read(fs.readFileSync(p), {type: 'buffer'}); | ||||
| 	}); }); | ||||
| 	(typeof Uint8Array !== 'undefined' ? it : it.skip)('should read ArrayBuffer / Uint8Array', function() { artifax.forEach(function(p) { | ||||
| 		var payload = fs.readFileSync(p, browser ? 'buffer' : null); | ||||
| 		var ab = new ArrayBuffer(payload.length), vu = new Uint8Array(ab); | ||||
| 		for(var i = 0; i < payload.length; ++i) vu[i] = payload[i]; | ||||
| 		X.read(ab, {type: 'array'}); | ||||
| 		X.read(vu, {type: 'array'}); | ||||
| 	}); }); | ||||
| 	it('should throw if format is unknown', function() { artifax.forEach(function(p) { | ||||
| 			assert.throws(function() { X.read(fs.readFileSync(p), {type: 'dafuq'}); }); | ||||
| 		assert.throws(function() { X.read(fs.readFileSync(p), {type: 'dafuq'}); }); | ||||
| 	}); }); | ||||
| 
 | ||||
| 	var T = browser ? 'base64' : 'buffer'; | ||||
| @ -1011,8 +1017,8 @@ describe('parse features', function() { | ||||
| 		var wb1, wb2; | ||||
| 		var bef = (function() { | ||||
| 			X = require(modp); | ||||
| 			wb1 = HLPaths.map(function(p) { return X.read(fs.readFileSync(p), {type:TYPE}); }); | ||||
| 			wb2 = ILPaths.map(function(p) { return X.read(fs.readFileSync(p), {type:TYPE}); }); | ||||
| 			wb1 = HLPaths.map(function(p) { return X.read(fs.readFileSync(p), {type:TYPE, WTF:1}); }); | ||||
| 			wb2 = ILPaths.map(function(p) { return X.read(fs.readFileSync(p), {type:TYPE, WTF:1}); }); | ||||
| 		}); | ||||
| 		if(typeof before != 'undefined') before(bef); | ||||
| 		else it('before', bef); | ||||
| @ -1127,7 +1133,7 @@ describe('parse features', function() { | ||||
| 		var wbs=[]; | ||||
| 		var bef = (function() { | ||||
| 			if(!fs.existsSync(paths.pmxls)) return; | ||||
| 			wbs = PMPaths.map(function(p) { return X.read(fs.readFileSync(p), {type:TYPE}); }); | ||||
| 			wbs = PMPaths.map(function(p) { return X.read(fs.readFileSync(p), {type:TYPE, WTF:1}); }); | ||||
| 		}); | ||||
| 		if(typeof before != 'undefined') before(bef); | ||||
| 		else it('before', bef); | ||||
| @ -1550,6 +1556,7 @@ describe('invalid files', function() { | ||||
| 
 | ||||
| describe('json output', function() { | ||||
| 	function seeker(json, keys, val) { | ||||
| 		if(typeof keys == "string") keys = keys.split(""); | ||||
| 		for(var i = 0; i != json.length; ++i) { | ||||
| 			for(var j = 0; j != keys.length; ++j) { | ||||
| 				if(json[i][keys[j]] === val) throw new Error("found " + val + " in row " + i + " key " + keys[j]); | ||||
| @ -2031,7 +2038,7 @@ describe('corner cases', function() { | ||||
| 			assert.doesNotThrow(function(x) { return X.SSF.format(f, 12345.6789);}); | ||||
| 		}); | ||||
| 	}); | ||||
| 	it('SSF oddities', function() { | ||||
| 	if(typeof JSON !== 'undefined') it('SSF oddities', function() { | ||||
| 		// $FlowIgnore
 | ||||
| 		var ssfdata = require('./misc/ssf.json'); | ||||
| 		var cb = function(d, j) { return function() { return X.SSF.format(d[0], d[j][0]); }; }; | ||||
|  | ||||
							
								
								
									
										183
									
								
								xlsx.flow.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										183
									
								
								xlsx.flow.js
									
									
									
									
									
								
							| @ -59,9 +59,9 @@ function utf16beread(data/*:string*/)/*:string*/ { | ||||
| 
 | ||||
| var debom = function(data/*:string*/)/*:string*/ { | ||||
| 	var c1 = data.charCodeAt(0), c2 = data.charCodeAt(1); | ||||
| 	if(c1 == 0xFF && c2 == 0xFE) return utf16leread(data.substr(2)); | ||||
| 	if(c1 == 0xFE && c2 == 0xFF) return utf16beread(data.substr(2)); | ||||
| 	if(c1 == 0xFEFF) return data.substr(1); | ||||
| 	if(c1 == 0xFF && c2 == 0xFE) return utf16leread(data.slice(2)); | ||||
| 	if(c1 == 0xFE && c2 == 0xFF) return utf16beread(data.slice(2)); | ||||
| 	if(c1 == 0xFEFF) return data.slice(1); | ||||
| 	return data; | ||||
| }; | ||||
| 
 | ||||
| @ -69,7 +69,7 @@ var _getchar = function _gc1(x/*:number*/)/*:string*/ { return String.fromCharCo | ||||
| if(typeof cptable !== 'undefined') { | ||||
| 	set_cp = function(cp/*:number*/) { current_codepage = cp; }; | ||||
| 	debom = function(data/*:string*/) { | ||||
| 		if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return cptable.utils.decode(1200, char_codes(data.substr(2))); } | ||||
| 		if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return cptable.utils.decode(1200, char_codes(data.slice(2))); } | ||||
| 		return data; | ||||
| 	}; | ||||
| 	_getchar = function _gc2(x/*:number*/)/*:string*/ { | ||||
| @ -146,6 +146,15 @@ function arr2str(data/*:any*/)/*:string*/ { | ||||
| 	var o/*:Array<string>*/ = []; for(var i = 0; i < data.length; ++i) o[i] = _chr(data[i]); return o.join(""); | ||||
| } | ||||
| 
 | ||||
| function ab2a(data/*:ArrayBuffer|Uint8Array*/)/*:Array<number>*/ { | ||||
| 	if(typeof ArrayBuffer == 'undefined') throw new Error("Unsupported"); | ||||
| 	if(data instanceof ArrayBuffer) return ab2a(new Uint8Array(data)); | ||||
| 	/*:: if(data instanceof ArrayBuffer) throw new Error("unreachable"); */ | ||||
| 	var o = new Array(data.length); | ||||
| 	for(var i = 0; i < data.length; ++i) o[i] = data[i]; | ||||
| 	return o; | ||||
| } | ||||
| 
 | ||||
| var bconcat = function(bufs) { return [].concat.apply([], bufs); }; | ||||
| 
 | ||||
| var chr0 = /\u0000/g, chr1 = /[\u0001-\u0006]/g; | ||||
| @ -1892,9 +1901,9 @@ function parse_isodur(s) { | ||||
| 		if(!m[i]) continue; | ||||
| 		mt = 1; | ||||
| 		if(i > 3) time = true; | ||||
| 		switch(m[i].substr(m[i].length-1)) { | ||||
| 		switch(m[i].slice(m[i].length-1)) { | ||||
| 			case 'Y': | ||||
| 				throw new Error("Unsupported ISO Duration Field: " + m[i].substr(m[i].length-1)); | ||||
| 				throw new Error("Unsupported ISO Duration Field: " + m[i].slice(m[i].length-1)); | ||||
| 			case 'D': mt *= 24; | ||||
| 				/* falls through */ | ||||
| 			case 'H': mt *= 60; | ||||
| @ -1943,6 +1952,7 @@ function cc2str(arr/*:Array<number>*/)/*:string*/ { | ||||
| function dup(o/*:any*/)/*:any*/ { | ||||
| 	if(typeof JSON != 'undefined' && !Array.isArray(o)) return JSON.parse(JSON.stringify(o)); | ||||
| 	if(typeof o != 'object' || o == null) return o; | ||||
| 	if(o instanceof Date) return new Date(o.getTime()); | ||||
| 	var out = {}; | ||||
| 	for(var k in o) if(o.hasOwnProperty(k)) out[k] = dup(o[k]); | ||||
| 	return out; | ||||
| @ -2063,24 +2073,24 @@ function parsexmltag(tag/*:string*/, skip_root/*:?boolean*/)/*:any*/ { | ||||
| 	var z = ({}/*:any*/); | ||||
| 	var eq = 0, c = 0; | ||||
| 	for(; eq !== tag.length; ++eq) if((c = tag.charCodeAt(eq)) === 32 || c === 10 || c === 13) break; | ||||
| 	if(!skip_root) z[0] = tag.substr(0, eq); | ||||
| 	if(!skip_root) z[0] = tag.slice(0, eq); | ||||
| 	if(eq === tag.length) return z; | ||||
| 	var m = tag.match(attregexg), j=0, v="", i=0, q="", cc="", quot = 1; | ||||
| 	if(m) for(i = 0; i != m.length; ++i) { | ||||
| 		cc = m[i]; | ||||
| 		for(c=0; c != cc.length; ++c) if(cc.charCodeAt(c) === 61) break; | ||||
| 		q = cc.substr(0,c).trim(); | ||||
| 		q = cc.slice(0,c).trim(); | ||||
| 		while(cc.charCodeAt(c+1) == 32) ++c; | ||||
| 		quot = ((eq=cc.charCodeAt(c+1)) == 34 || eq == 39) ? 1 : 0; | ||||
| 		v = cc.substring(c+1+quot, cc.length-quot); | ||||
| 		v = cc.slice(c+1+quot, cc.length-quot); | ||||
| 		for(j=0;j!=q.length;++j) if(q.charCodeAt(j) === 58) break; | ||||
| 		if(j===q.length) { | ||||
| 			if(q.indexOf("_") > 0) q = q.substr(0, q.indexOf("_")); // from ods
 | ||||
| 			if(q.indexOf("_") > 0) q = q.slice(0, q.indexOf("_")); // from ods
 | ||||
| 			z[q] = v; | ||||
| 		} | ||||
| 		else { | ||||
| 			var k = (j===5 && q.substr(0,5)==="xmlns"?"xmlns":"")+q.substr(j+1); | ||||
| 			if(z[k] && q.substr(j-3,3) == "ext") continue; // from ods
 | ||||
| 			var k = (j===5 && q.slice(0,5)==="xmlns"?"xmlns":"")+q.slice(j+1); | ||||
| 			if(z[k] && q.slice(j-3,j) == "ext") continue; // from ods
 | ||||
| 			z[k] = v; | ||||
| 		} | ||||
| 	} | ||||
| @ -3061,9 +3071,9 @@ function write_BrtColor(color, o) { | ||||
| 		o.write_shift(1, 0); | ||||
| 	} else { | ||||
| 		var rgb = (color.rgb || 'FFFFFF'); | ||||
| 		o.write_shift(1, parseInt(rgb.substr(0,2),16)); | ||||
| 		o.write_shift(1, parseInt(rgb.substr(2,2),16)); | ||||
| 		o.write_shift(1, parseInt(rgb.substr(4,2),16)); | ||||
| 		o.write_shift(1, parseInt(rgb.slice(0,2),16)); | ||||
| 		o.write_shift(1, parseInt(rgb.slice(2,4),16)); | ||||
| 		o.write_shift(1, parseInt(rgb.slice(4,6),16)); | ||||
| 		o.write_shift(1, 0xFF); | ||||
| 	} | ||||
| 	return o; | ||||
| @ -3697,7 +3707,7 @@ var RELS = ({ | ||||
| /* 9.3.3 Representing Relationships */ | ||||
| function get_rels_path(file/*:string*/)/*:string*/ { | ||||
| 	var n = file.lastIndexOf("/"); | ||||
| 	return file.substr(0,n+1) + '_rels/' + file.substr(n+1) + ".rels"; | ||||
| 	return file.slice(0,n+1) + '_rels/' + file.slice(n+1) + ".rels"; | ||||
| } | ||||
| 
 | ||||
| function parse_rels(data/*:?string*/, currentFilePath/*:string*/) { | ||||
| @ -3844,7 +3854,7 @@ var CORE_PROPS_REGEX/*:Array<RegExp>*/ = (function() { | ||||
| 	var r = new Array(CORE_PROPS.length); | ||||
| 	for(var i = 0; i < CORE_PROPS.length; ++i) { | ||||
| 		var f = CORE_PROPS[i]; | ||||
| 		var g = "(?:"+ f[0].substr(0,f[0].indexOf(":")) +":)"+ f[0].substr(f[0].indexOf(":")+1); | ||||
| 		var g = "(?:"+ f[0].slice(0,f[0].indexOf(":")) +":)"+ f[0].slice(f[0].indexOf(":")+1); | ||||
| 		r[i] = new RegExp("<" + g + "[^>]*>([\\s\\S]*?)<\/" + g + ">"); | ||||
| 	} | ||||
| 	return r; | ||||
| @ -4024,7 +4034,7 @@ function parse_cust_props(data/*:string*/, opts) { | ||||
| 			case '</property>': name = null; break; | ||||
| 			default: if (x.indexOf('<vt:') === 0) { | ||||
| 				var toks = x.split('>'); | ||||
| 				var type = toks[0].substring(4), text = toks[1]; | ||||
| 				var type = toks[0].slice(4), text = toks[1]; | ||||
| 				/* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */ | ||||
| 				switch(type) { | ||||
| 					case 'lpstr': case 'bstr': case 'lpwstr': | ||||
| @ -4049,7 +4059,7 @@ function parse_cust_props(data/*:string*/, opts) { | ||||
| 						if(type.slice(-1) == '/') break; | ||||
| 						if(opts.WTF && typeof console !== 'undefined') console.warn('Unexpected', x, type, toks); | ||||
| 				} | ||||
| 			} else if(x.substr(0,2) === "</") {/* empty */ | ||||
| 			} else if(x.slice(0,2) === "</") {/* empty */ | ||||
| 			} else if(opts.WTF) throw new Error(x); | ||||
| 		} | ||||
| 	} | ||||
| @ -4481,6 +4491,7 @@ function parse_ShortXLUnicodeString(blob, length, opts) { | ||||
| 	} else if(opts.biff == 12) { | ||||
| 		width = 2; encoding = 'wstr'; | ||||
| 	} | ||||
| 	if(opts.biff >= 2 && opts.biff <= 5) encoding = 'cpstr'; | ||||
| 	var o = cch ? blob.read_shift(cch, encoding) : ""; | ||||
| 	current_codepage = cp; | ||||
| 	return o; | ||||
| @ -4511,7 +4522,7 @@ function parse_XLUnicodeRichExtendedString(blob) { | ||||
| function parse_XLUnicodeStringNoCch(blob, cch, opts) { | ||||
| 	var retval; | ||||
| 	if(opts) { | ||||
| 		if(opts.biff >= 2 && opts.biff <= 5) return blob.read_shift(cch, 'sbcs-cont'); | ||||
| 		if(opts.biff >= 2 && opts.biff <= 5) return blob.read_shift(cch, 'cpstr'); | ||||
| 		if(opts.biff >= 12) return blob.read_shift(cch, 'dbcs-cont'); | ||||
| 	} | ||||
| 	var fHighByte = blob.read_shift(1); | ||||
| @ -4531,7 +4542,7 @@ function parse_XLUnicodeString2(blob, length, opts) { | ||||
| 	if(opts.biff > 5) return parse_XLUnicodeString(blob, length, opts); | ||||
| 	var cch = blob.read_shift(1); | ||||
| 	if(cch === 0) { blob.l++; return ""; } | ||||
| 	return blob.read_shift(cch, opts.biff == 4 ? 'cpstr' : 'sbcs-cont'); | ||||
| 	return blob.read_shift(cch, (opts.biff <= 4 || !blob.lens ) ? 'cpstr' : 'sbcs-cont'); | ||||
| } | ||||
| /* TODO: BIFF5 and lower, codepage awareness */ | ||||
| function write_XLUnicodeString(str, opts, o) { | ||||
| @ -5828,7 +5839,7 @@ function dbf_to_aoa(buf, opts)/*:AOA*/ { | ||||
| 					out[R][C] = out[R][C].trim(); | ||||
| 					break; | ||||
| 				case 'D': | ||||
| 					if(s.length === 8) out[R][C] = new Date(+s.substr(0,4), +s.substr(4,2)-1, +s.substr(6,2)); | ||||
| 					if(s.length === 8) out[R][C] = new Date(+s.slice(0,4), +s.slice(4,6)-1, +s.slice(6,8)); | ||||
| 					else out[R][C] = s; | ||||
| 					break; | ||||
| 				case 'F': out[R][C] = parseFloat(s.trim()); break; | ||||
| @ -6004,18 +6015,18 @@ var SYLK = (function() { | ||||
| 			case 'O': break; /* options? */ | ||||
| 			case 'P': | ||||
| 				if(record[1].charAt(0) == 'P') | ||||
| 					formats.push(rstr.substr(3).replace(/;;/g, ";")); | ||||
| 					formats.push(rstr.slice(3).replace(/;;/g, ";")); | ||||
| 				break; | ||||
| 			case 'C': | ||||
| 			for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { | ||||
| 				case 'X': C = parseInt(record[rj].substr(1))-1; break; | ||||
| 				case 'X': C = parseInt(record[rj].slice(1))-1; break; | ||||
| 				case 'Y': | ||||
| 					R = parseInt(record[rj].substr(1))-1; C = 0; | ||||
| 					R = parseInt(record[rj].slice(1))-1; C = 0; | ||||
| 					for(j = arr.length; j <= R; ++j) arr[j] = []; | ||||
| 					break; | ||||
| 				case 'K': | ||||
| 					val = record[rj].substr(1); | ||||
| 					if(val.charAt(0) === '"') val = val.substr(1,val.length - 2); | ||||
| 					val = record[rj].slice(1); | ||||
| 					if(val.charAt(0) === '"') val = val.slice(1,val.length - 1); | ||||
| 					else if(val === 'TRUE') val = true; | ||||
| 					else if(val === 'FALSE') val = false; | ||||
| 					else if(!isNaN(fuzzynum(val))) { | ||||
| @ -6028,7 +6039,7 @@ var SYLK = (function() { | ||||
| 					next_cell_format = null; | ||||
| 					break; | ||||
| 				case 'E': | ||||
| 					var formula = rc_to_a1(record[rj].substr(1), {r:R,c:C}); | ||||
| 					var formula = rc_to_a1(record[rj].slice(1), {r:R,c:C}); | ||||
| 					arr[R][C] = [arr[R][C], formula]; | ||||
| 					break; | ||||
| 				default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr); | ||||
| @ -6036,31 +6047,31 @@ var SYLK = (function() { | ||||
| 			case 'F': | ||||
| 			var F_seen = 0; | ||||
| 			for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { | ||||
| 				case 'X': C = parseInt(record[rj].substr(1))-1; ++F_seen; break; | ||||
| 				case 'X': C = parseInt(record[rj].slice(1))-1; ++F_seen; break; | ||||
| 				case 'Y': | ||||
| 					R = parseInt(record[rj].substr(1))-1; /*C = 0;*/ | ||||
| 					R = parseInt(record[rj].slice(1))-1; /*C = 0;*/ | ||||
| 					for(j = arr.length; j <= R; ++j) arr[j] = []; | ||||
| 					break; | ||||
| 				case 'M': Mval = parseInt(record[rj].substr(1)) / 20; break; | ||||
| 				case 'M': Mval = parseInt(record[rj].slice(1)) / 20; break; | ||||
| 				case 'F': break; /* ??? */ | ||||
| 				case 'P': | ||||
| 					next_cell_format = formats[parseInt(record[rj].substr(1))]; | ||||
| 					next_cell_format = formats[parseInt(record[rj].slice(1))]; | ||||
| 					break; | ||||
| 				case 'S': break; /* cell style */ | ||||
| 				case 'D': break; /* column */ | ||||
| 				case 'N': break; /* font */ | ||||
| 				case 'W': | ||||
| 					cw = record[rj].substr(1).split(" "); | ||||
| 					cw = record[rj].slice(1).split(" "); | ||||
| 					for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) { | ||||
| 						Mval = parseInt(cw[2], 10); | ||||
| 						colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval}; process_col(colinfo[j-1]); | ||||
| 					} break; | ||||
| 				case 'C': /* default column format */ | ||||
| 					C = parseInt(record[rj].substr(1))-1; | ||||
| 					C = parseInt(record[rj].slice(1))-1; | ||||
| 					if(!colinfo[C]) colinfo[C] = {}; | ||||
| 					break; | ||||
| 				case 'R': /* row properties */ | ||||
| 					R = parseInt(record[rj].substr(1))-1; | ||||
| 					R = parseInt(record[rj].slice(1))-1; | ||||
| 					if(!rowinfo[R]) rowinfo[R] = {}; | ||||
| 					if(Mval > 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); } | ||||
| 					else if(Mval === 0) rowinfo[R].hidden = true; | ||||
| @ -6185,7 +6196,7 @@ var DIF = (function() { | ||||
| 					else arr[R][C] = value; | ||||
| 					++C; break; | ||||
| 				case 1: | ||||
| 					data = data.substr(1,data.length-2); | ||||
| 					data = data.slice(1,data.length-1); | ||||
| 					arr[R][C++] = data !== '' ? data : null; | ||||
| 					break; | ||||
| 			} | ||||
| @ -6440,8 +6451,8 @@ var PRN = (function() { | ||||
| 		var ws/*:Worksheet*/ = o.dense ? ([]/*:any*/) : ({}/*:any*/); | ||||
| 		var range/*:Range*/ = ({s: {c:0, r:0}, e: {c:0, r:0}}/*:any*/); | ||||
| 
 | ||||
| 		if(str.substr(0,4) == "sep=" && str.charCodeAt(5) == 10) { sep = str.charAt(4); str = str.substr(6); } | ||||
| 		else sep = guess_sep(str.substr(0,1024)); | ||||
| 		if(str.slice(0,4) == "sep=" && str.charCodeAt(5) == 10) { sep = str.charAt(4); str = str.slice(6); } | ||||
| 		else sep = guess_sep(str.slice(0,1024)); | ||||
| 		var R = 0, C = 0, v = 0; | ||||
| 		var start = 0, end = 0, sepcc = sep.charCodeAt(0), instr = false, cc=0; | ||||
| 		str = str.replace(/\r\n/mg, "\n"); | ||||
| @ -6455,7 +6466,7 @@ var PRN = (function() { | ||||
| 			else if(s.trim().length === 0) { cell.t = 's'; cell.v = s; } | ||||
| 			else if(s.charCodeAt(0) == 0x3D) { | ||||
| 				if(s.charCodeAt(1) == 0x22 && s.charCodeAt(s.length - 1) == 0x22) { cell.t = 's'; cell.v = s.slice(2,-1).replace(/""/g,'"'); } | ||||
| 				else if(fuzzyfmla(s)) { cell.t = 'n'; cell.f = s.substr(1); } | ||||
| 				else if(fuzzyfmla(s)) { cell.t = 'n'; cell.f = s.slice(1); } | ||||
| 				else { cell.t = 's'; cell.v = s; } } | ||||
| 			else if(s == "TRUE") { cell.t = 'b'; cell.v = true; } | ||||
| 			else if(s == "FALSE") { cell.t = 'b'; cell.v = false; } | ||||
| @ -6525,7 +6536,7 @@ var PRN = (function() { | ||||
| 				var coord = encode_cell({r:R,c:C}); | ||||
| 				cell = dense ? (ws[R]||[])[C] : ws[coord]; | ||||
| 				if(!cell || cell.v == null) { oo.push("          "); continue; } | ||||
| 				var w = (cell.w || (format_cell(cell), cell.w) || "").substr(0,10); | ||||
| 				var w = (cell.w || (format_cell(cell), cell.w) || "").slice(0,10); | ||||
| 				while(w.length < 10) w += " "; | ||||
| 				oo.push(w + (C === 0 ? " " : "")); | ||||
| 			} | ||||
| @ -6602,7 +6613,7 @@ var WK_ = (function() { | ||||
| 					break; | ||||
| 				case 0x06: refguess = val; break; /* RANGE */ | ||||
| 				case 0x0F: /* LABEL */ | ||||
| 					if(!o.qpro) val[1].v = val[1].v.substr(1); | ||||
| 					if(!o.qpro) val[1].v = val[1].v.slice(1); | ||||
| 					/* falls through */ | ||||
| 				case 0x0D: /* INTEGER */ | ||||
| 				case 0x0E: /* NUMBER */ | ||||
| @ -6620,7 +6631,7 @@ var WK_ = (function() { | ||||
| 					break; | ||||
| 			} else switch(RT) { | ||||
| 				case 0x16: /* LABEL16 */ | ||||
| 					val[1].v = val[1].v.substr(1); | ||||
| 					val[1].v = val[1].v.slice(1); | ||||
| 					/* falls through */ | ||||
| 				case 0x17: /* NUMBER17 */ | ||||
| 				case 0x18: /* NUMBER18 */ | ||||
| @ -6969,7 +6980,7 @@ var parse_rs = (function parse_rs_factory() { | ||||
| 
 | ||||
| 				/* 18.3.1.15 color CT_Color TODO: tint, theme, auto, indexed */ | ||||
| 				case '<color': | ||||
| 					if(y.rgb) font.color = y.rgb.substr(2,6); | ||||
| 					if(y.rgb) font.color = y.rgb.slice(2,8); | ||||
| 					break; | ||||
| 
 | ||||
| 				/* 18.8.18 family ST_FontFamily */ | ||||
| @ -7514,12 +7525,12 @@ var RTF = (function() { | ||||
| 	}; | ||||
| })(); | ||||
| function hex2RGB(h) { | ||||
| 	var o = h.substr(h[0]==="#"?1:0,6); | ||||
| 	return [parseInt(o.substr(0,2),16),parseInt(o.substr(2,2),16),parseInt(o.substr(4,2),16)]; | ||||
| 	var o = h.slice(h[0]==="#"?1:0).slice(0,6); | ||||
| 	return [parseInt(o.slice(0,2),16),parseInt(o.slice(2,4),16),parseInt(o.slice(4,6),16)]; | ||||
| } | ||||
| function rgb2Hex(rgb) { | ||||
| 	for(var i=0,o=1; i!=3; ++i) o = o*256 + (rgb[i]>255?255:rgb[i]<0?0:rgb[i]); | ||||
| 	return o.toString(16).toUpperCase().substr(1); | ||||
| 	return o.toString(16).toUpperCase().slice(1); | ||||
| } | ||||
| 
 | ||||
| function rgb2HSL(rgb) { | ||||
| @ -8462,7 +8473,7 @@ function parse_clrScheme(t, themes, opts) { | ||||
| 					themes.themeElements.clrScheme.push(color); | ||||
| 					color = {}; | ||||
| 				} else { | ||||
| 					color.name = y[0].substring(3, y[0].length - 1); | ||||
| 					color.name = y[0].slice(3, y[0].length - 1); | ||||
| 				} | ||||
| 				break; | ||||
| 
 | ||||
| @ -9924,8 +9935,8 @@ var PtgBinOp = { | ||||
| 	PtgPower: "^", | ||||
| 	PtgSub: "-" | ||||
| }; | ||||
| function formula_quote_sheet_name(sname/*:string*/)/*:string*/ { | ||||
| 	if(!sname) throw new Error("empty sheet name"); | ||||
| function formula_quote_sheet_name(sname/*:string*/, opts)/*:string*/ { | ||||
| 	if(!sname && !(opts && opts.biff <= 5 && opts.biff >= 2)) throw new Error("empty sheet name"); | ||||
| 	if(sname.indexOf(" ") > -1) return "'" + sname + "'"; | ||||
| 	return sname; | ||||
| } | ||||
| @ -9964,7 +9975,7 @@ function get_ixti_raw(supbooks, ixti/*:number*/, opts)/*:string*/ { | ||||
| 	} | ||||
| } | ||||
| function get_ixti(supbooks, ixti/*:number*/, opts)/*:string*/ { | ||||
| 	return formula_quote_sheet_name(get_ixti_raw(supbooks, ixti, opts)); | ||||
| 	return formula_quote_sheet_name(get_ixti_raw(supbooks, ixti, opts), opts); | ||||
| } | ||||
| 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}}; | ||||
| @ -11614,11 +11625,11 @@ var XLSXFutureFunctions = { | ||||
| 
 | ||||
| /* Part 3 TODO: actually parse formulae */ | ||||
| function ods_to_csf_formula(f/*:string*/)/*:string*/ { | ||||
| 	if(f.substr(0,3) == "of:") f = f.substr(3); | ||||
| 	if(f.slice(0,3) == "of:") f = f.slice(3); | ||||
| 	/* 5.2 Basic Expressions */ | ||||
| 	if(f.charCodeAt(0) == 61) { | ||||
| 		f = f.substr(1); | ||||
| 		if(f.charCodeAt(0) == 61) f = f.substr(1); | ||||
| 		f = f.slice(1); | ||||
| 		if(f.charCodeAt(0) == 61) f = f.slice(1); | ||||
| 	} | ||||
| 	f = f.replace(/COM\.MICROSOFT\./g, ""); | ||||
| 	/* Part 3 Section 5.8 References */ | ||||
| @ -11769,8 +11780,8 @@ function parse_ws_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*:WBWBPro | ||||
| 	var data1 = "", data2 = ""; | ||||
| 	var mtch/*:?any*/ = data.match(sheetdataregex); | ||||
| 	if(mtch) { | ||||
| 		data1 = data.substr(0, mtch.index); | ||||
| 		data2 = data.substr(mtch.index + mtch[0].length); | ||||
| 		data1 = data.slice(0, mtch.index); | ||||
| 		data2 = data.slice(mtch.index + mtch[0].length); | ||||
| 	} else data1 = data2 = data; | ||||
| 
 | ||||
| 	/* 18.3.1.82 sheetPr CT_SheetPr */ | ||||
| @ -11781,7 +11792,7 @@ function parse_ws_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*:WBWBPro | ||||
| 	// $FlowIgnore
 | ||||
| 	var ridx = (data1.match(/<(?:\w*:)?dimension/)||{index:-1}).index; | ||||
| 	if(ridx > 0) { | ||||
| 		var ref = data1.substr(ridx,50).match(dimregex); | ||||
| 		var ref = data1.slice(ridx,ridx+50).match(dimregex); | ||||
| 		if(ref) parse_ws_xml_dim(s, ref[1]); | ||||
| 	} | ||||
| 
 | ||||
| @ -11808,7 +11819,7 @@ function parse_ws_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*:WBWBPro | ||||
| 	var merges/*:Array<Range>*/ = []; | ||||
| 	var _merge = data2.match(mergecregex); | ||||
| 	if(_merge) for(ridx = 0; ridx != _merge.length; ++ridx) | ||||
| 		merges[ridx] = safe_decode_range(_merge[ridx].substr(_merge[ridx].indexOf("\"")+1)); | ||||
| 		merges[ridx] = safe_decode_range(_merge[ridx].slice(_merge[ridx].indexOf("\"")+1)); | ||||
| 
 | ||||
| 	/* 18.3.1.48 hyperlinks CT_Hyperlinks */ | ||||
| 	var hlink = data2.match(hlinkregex); | ||||
| @ -11998,7 +12009,7 @@ function write_ws_xml_cell(cell/*:Cell*/, ref, ws, opts, idx, wb)/*:string*/ { | ||||
| 	} | ||||
| 	if(cell.t != oldt) { cell.t = oldt; cell.v = oldv; } | ||||
| 	if(cell.f) { | ||||
| 		var ff = cell.F && cell.F.substr(0, ref.length) == ref ? {t:"array", ref:cell.F} : null; | ||||
| 		var ff = cell.F && cell.F.slice(0, ref.length) == ref ? {t:"array", ref:cell.F} : null; | ||||
| 		v = writextag('f', escapexml(cell.f), ff) + (cell.v != null ? v : ""); | ||||
| 	} | ||||
| 	if(cell.l) ws['!links'].push([ref, cell.l]); | ||||
| @ -12029,7 +12040,7 @@ return function parse_ws_xml_data(sdata/*:string*/, s, opts, guess/*:Range*/, th | ||||
| 
 | ||||
| 		/* 18.3.1.73 row CT_Row */ | ||||
| 		for(ri = 0; ri < xlen; ++ri) if(x.charCodeAt(ri) === 62) break; ++ri; | ||||
| 		tag = parsexmltag(x.substr(0,ri), true); | ||||
| 		tag = parsexmltag(x.slice(0,ri), true); | ||||
| 		tagr = tag.r != null ? parseInt(tag.r, 10) : tagr+1; tagc = -1; | ||||
| 		if(opts.sheetRows && opts.sheetRows < tagr) continue; | ||||
| 		if(guess.s.r > tagr - 1) guess.s.r = tagr - 1; | ||||
| @ -12044,12 +12055,12 @@ return function parse_ws_xml_data(sdata/*:string*/, s, opts, guess/*:Range*/, th | ||||
| 		} | ||||
| 
 | ||||
| 		/* 18.3.1.4 c CT_Cell */ | ||||
| 		cells = x.substr(ri).split(cellregex); | ||||
| 		cells = x.slice(ri).split(cellregex); | ||||
| 		for(ri = 0; ri != cells.length; ++ri) { | ||||
| 			x = cells[ri].trim(); | ||||
| 			if(x.length === 0) continue; | ||||
| 			cref = x.match(rregex); idx = ri; i=0; cc=0; | ||||
| 			x = "<c " + (x.substr(0,1)=="<"?">":"") + x; | ||||
| 			x = "<c " + (x.slice(0,1)=="<"?">":"") + x; | ||||
| 			if(cref != null && cref.length === 2) { | ||||
| 				idx = 0; d=cref[1]; | ||||
| 				for(i=0; i != d.length; ++i) { | ||||
| @ -12060,9 +12071,9 @@ return function parse_ws_xml_data(sdata/*:string*/, s, opts, guess/*:Range*/, th | ||||
| 				tagc = idx; | ||||
| 			} else ++tagc; | ||||
| 			for(i = 0; i != x.length; ++i) if(x.charCodeAt(i) === 62) break; ++i; | ||||
| 			tag = parsexmltag(x.substr(0,i), true); | ||||
| 			tag = parsexmltag(x.slice(0,i), true); | ||||
| 			if(!tag.r) tag.r = encode_cell({r:tagr-1, c:tagc}); | ||||
| 			d = x.substr(i); | ||||
| 			d = x.slice(i); | ||||
| 			p = ({t:""}/*:any*/); | ||||
| 
 | ||||
| 			if((cref=d.match(match_v))!= null && /*::cref != null && */cref[1] !== '') p.v=unescapexml(cref[1]); | ||||
| @ -12274,7 +12285,7 @@ function write_ws_xml(idx/*:number*/, opts, wb/*:Workbook*/, rels)/*:string*/ { | ||||
| 				rId = add_rels(rels, -1, escapexml(l[1].Target).replace(/#.*$/, ""), RELS.HLINK); | ||||
| 				rel["r:id"] = "rId"+rId; | ||||
| 			} | ||||
| 			if((relc = l[1].Target.indexOf("#")) > -1) rel.location = escapexml(l[1].Target.substr(relc+1)); | ||||
| 			if((relc = l[1].Target.indexOf("#")) > -1) rel.location = escapexml(l[1].Target.slice(relc+1)); | ||||
| 			if(l[1].Tooltip) rel.tooltip = escapexml(l[1].Tooltip); | ||||
| 			o[o.length] = writextag("hyperlink",null,rel); | ||||
| 		}); | ||||
| @ -12591,7 +12602,7 @@ function write_BrtHLink(l, rId) { | ||||
| 	write_UncheckedRfX({s:decode_cell(l[0]), e:decode_cell(l[0])}, o); | ||||
| 	write_RelID("rId" + rId, o); | ||||
| 	var locidx = l[1].Target.indexOf("#"); | ||||
| 	var loc = locidx == -1 ? "" : l[1].Target.substr(locidx+1); | ||||
| 	var loc = locidx == -1 ? "" : l[1].Target.slice(locidx+1); | ||||
| 	write_XLWideString(loc || "", o); | ||||
| 	write_XLWideString(l[1].Tooltip || "", o); | ||||
| 	write_XLWideString("", o); | ||||
| @ -13634,7 +13645,7 @@ function write_wb_xml(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:string*/ { | ||||
| 	o[o.length] = "<sheets>"; | ||||
| 	var sheets = wb.Workbook && wb.Workbook.Sheets || []; | ||||
| 	for(var i = 0; i != wb.SheetNames.length; ++i) { | ||||
| 		var sht = ({name:escapexml(wb.SheetNames[i].substr(0,31))}/*:any*/); | ||||
| 		var sht = ({name:escapexml(wb.SheetNames[i].slice(0,31))}/*:any*/); | ||||
| 		sht.sheetId = ""+(i+1); | ||||
| 		sht["r:id"] = "rId"+(i+1); | ||||
| 		if(sheets[i]) switch(sheets[i].Hidden) { | ||||
| @ -13688,7 +13699,7 @@ function write_BrtBundleSh(data, o) { | ||||
| 	o.write_shift(4, data.Hidden); | ||||
| 	o.write_shift(4, data.iTabID); | ||||
| 	write_RelID(data.strRelID, o); | ||||
| 	write_XLWideString(data.name.substr(0,31), o); | ||||
| 	write_XLWideString(data.name.slice(0,31), o); | ||||
| 	return o.length > o.l ? o.slice(0, o.l) : o; | ||||
| } | ||||
| 
 | ||||
| @ -14058,11 +14069,11 @@ function xlml_parsexmltag(tag/*:string*/, skip_root/*:?boolean*/) { | ||||
| 	if(m) for(i = 0; i != m.length; ++i) { | ||||
| 		y = m[i].match(attregex2); | ||||
| /*:: if(!y || !y[2]) continue; */ | ||||
| 		if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].substr(1,y[2].length-2); | ||||
| 		if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1); | ||||
| 		else { | ||||
| 			if(y[1].substr(0,6) === "xmlns:") w = "xmlns"+y[1].substr(6); | ||||
| 			else w = y[1].substr(j+1); | ||||
| 			z[w] = y[2].substr(1,y[2].length-2); | ||||
| 			if(y[1].slice(0,6) === "xmlns:") w = "xmlns"+y[1].slice(6); | ||||
| 			else w = y[1].slice(j+1); | ||||
| 			z[w] = y[2].slice(1,y[2].length-1); | ||||
| 		} | ||||
| 	} | ||||
| 	return z; | ||||
| @ -14075,11 +14086,11 @@ function xlml_parsexmltagobj(tag/*:string*/) { | ||||
| 	if(m) for(i = 0; i != m.length; ++i) { | ||||
| 		y = m[i].match(attregex2); | ||||
| /*:: if(!y || !y[2]) continue; */ | ||||
| 		if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].substr(1,y[2].length-2); | ||||
| 		if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1); | ||||
| 		else { | ||||
| 			if(y[1].substr(0,6) === "xmlns:") w = "xmlns"+y[1].substr(6); | ||||
| 			else w = y[1].substr(j+1); | ||||
| 			z[w] = y[2].substr(1,y[2].length-2); | ||||
| 			if(y[1].slice(0,6) === "xmlns:") w = "xmlns"+y[1].slice(6); | ||||
| 			else w = y[1].slice(j+1); | ||||
| 			z[w] = y[2].slice(1,y[2].length-1); | ||||
| 		} | ||||
| 	} | ||||
| 	return z; | ||||
| @ -14179,7 +14190,7 @@ function parse_xlml_data(xml, ss, data, cell/*:any*/, base, styles, csty, row, a | ||||
| 		if(cell.Formula) { | ||||
| 			var fstr = unescapexml(cell.Formula); | ||||
| 			/* strictly speaking, the leading = is required but some writers omit */ | ||||
| 			if(fstr.charCodeAt(0) == 61 /* = */) fstr = fstr.substr(1); | ||||
| 			if(fstr.charCodeAt(0) == 61 /* = */) fstr = fstr.slice(1); | ||||
| 			cell.f = rc_to_a1(fstr, base); | ||||
| 			delete cell.Formula; | ||||
| 			if(cell.ArrayRange == "RC") cell.F = rc_to_a1("RC:RC", base); | ||||
| @ -14383,7 +14394,7 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ { | ||||
| 			var _NamedRange = parsexmltag(Rn[0]); | ||||
| 			var _DefinedName/*:DefinedName*/ = ({ | ||||
| 				Name: _NamedRange.Name, | ||||
| 				Ref: rc_to_a1(_NamedRange.RefersTo.substr(1), {r:0, c:0}) | ||||
| 				Ref: rc_to_a1(_NamedRange.RefersTo.slice(1), {r:0, c:0}) | ||||
| 			}/*:any*/); | ||||
| 			if(Workbook.Sheets.length>0) _DefinedName.Sheet=Workbook.Sheets.length-1; | ||||
| 			/*:: if(Workbook.Names) */Workbook.Names.push(_DefinedName); | ||||
| @ -15066,8 +15077,8 @@ function write_ws_xlml_cell(cell, ref/*:string*/, ws, opts, idx/*:number*/, wb, | ||||
| 
 | ||||
| 	var attr = {}; | ||||
| 	if(cell.f) attr["ss:Formula"] = "=" + escapexml(a1_to_rc(cell.f, addr)); | ||||
| 	if(cell.F && cell.F.substr(0, ref.length) == ref) { | ||||
| 		var end = decode_cell(cell.F.substr(ref.length + 1)); | ||||
| 	if(cell.F && cell.F.slice(0, ref.length) == ref) { | ||||
| 		var end = decode_cell(cell.F.slice(ref.length + 1)); | ||||
| 		attr["ss:ArrayRange"] = "RC:R" + (end.r == addr.r ? "" : "[" + (end.r - addr.r) + "]") + "C" + (end.c == addr.c ? "" : "[" + (end.c - addr.c) + "]"); | ||||
| 	} | ||||
| 
 | ||||
| @ -17635,13 +17646,13 @@ var HTML_ = (function() { | ||||
| 		var merges/*:Array<Range>*/ = [], midx = 0; | ||||
| 		for(i = 0; i < rows.length; ++i) { | ||||
| 			var row = rows[i].trim(); | ||||
| 			var hd = row.substr(0,3).toLowerCase(); | ||||
| 			var hd = row.slice(0,3).toLowerCase(); | ||||
| 			if(hd == "<tr") { ++R; C = 0; continue; } | ||||
| 			if(hd != "<td") continue; | ||||
| 			var cells = row.split(/<\/td>/i); | ||||
| 			for(j = 0; j < cells.length; ++j) { | ||||
| 				var cell = cells[j].trim(); | ||||
| 				if(cell.substr(0,3).toLowerCase() != "<td") continue; | ||||
| 				if(cell.slice(0,3).toLowerCase() != "<td") continue; | ||||
| 				var m = cell, cc = 0; | ||||
| 				/* TODO: parse styles etc */ | ||||
| 				while(m.charAt(0) == "<" && (cc = m.indexOf(">")) > -1) m = m.slice(cc+1); | ||||
| @ -18393,7 +18404,7 @@ var write_content_ods/*:{(wb:any, opts:any):string}*/ = (function() { | ||||
| 				if(cell && cell.f) { | ||||
| 					ct['table:formula'] = escapexml(csf_to_ods_formula(cell.f)); | ||||
| 					if(cell.F) { | ||||
| 						if(cell.F.substr(0, ref.length) == ref) { | ||||
| 						if(cell.F.slice(0, ref.length) == ref) { | ||||
| 							var _Fref = decode_range(cell.F); | ||||
| 							ct['table:number-matrix-columns-spanned'] = (_Fref.e.c - _Fref.s.c + 1); | ||||
| 							ct['table:number-matrix-rows-spanned'] =    (_Fref.e.r - _Fref.s.r + 1); | ||||
| @ -18973,7 +18984,7 @@ function firstbyte(f/*:RawData*/,o/*:?TypeOpts*/)/*:Array<number>*/ { | ||||
| 	var x = ""; | ||||
| 	switch((o||{}).type || "base64") { | ||||
| 		case 'buffer': return [f[0], f[1], f[2], f[3]]; | ||||
| 		case 'base64': x = Base64.decode(f.substr(0,24)); break; | ||||
| 		case 'base64': x = Base64.decode(f.slice(0,24)); break; | ||||
| 		case 'binary': x = f; break; | ||||
| 		case 'array':  return [f[0], f[1], f[2], f[3]]; | ||||
| 		default: throw new Error("Unrecognized type " + (o && o.type || "undefined")); | ||||
| @ -19050,6 +19061,12 @@ 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) { | ||||
| 		// $FlowIgnore
 | ||||
| 		var ab=new ArrayBuffer(3), vu=new Uint8Array(ab); vu.foo="bar"; | ||||
| 		// $FlowIgnore
 | ||||
| 		if(!vu.foo) {o=dup(o); o.type='array'; return readSync(ab2a(d), o);} | ||||
| 	} | ||||
| 	switch((n = firstbyte(d, o))[0]) { | ||||
| 		case 0xD0: return read_cfb(CFB.read(d, o), o); | ||||
| 		case 0x09: return parse_xlscfb(d, o); | ||||
|  | ||||
							
								
								
									
										182
									
								
								xlsx.js
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										182
									
								
								xlsx.js
									
									
									
										generated
									
									
									
								
							| @ -58,9 +58,9 @@ function utf16beread(data) { | ||||
| 
 | ||||
| var debom = function(data) { | ||||
| 	var c1 = data.charCodeAt(0), c2 = data.charCodeAt(1); | ||||
| 	if(c1 == 0xFF && c2 == 0xFE) return utf16leread(data.substr(2)); | ||||
| 	if(c1 == 0xFE && c2 == 0xFF) return utf16beread(data.substr(2)); | ||||
| 	if(c1 == 0xFEFF) return data.substr(1); | ||||
| 	if(c1 == 0xFF && c2 == 0xFE) return utf16leread(data.slice(2)); | ||||
| 	if(c1 == 0xFE && c2 == 0xFF) return utf16beread(data.slice(2)); | ||||
| 	if(c1 == 0xFEFF) return data.slice(1); | ||||
| 	return data; | ||||
| }; | ||||
| 
 | ||||
| @ -68,7 +68,7 @@ var _getchar = function _gc1(x) { return String.fromCharCode(x); }; | ||||
| if(typeof cptable !== 'undefined') { | ||||
| 	set_cp = function(cp) { current_codepage = cp; }; | ||||
| 	debom = function(data) { | ||||
| 		if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return cptable.utils.decode(1200, char_codes(data.substr(2))); } | ||||
| 		if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return cptable.utils.decode(1200, char_codes(data.slice(2))); } | ||||
| 		return data; | ||||
| 	}; | ||||
| 	_getchar = function _gc2(x) { | ||||
| @ -145,6 +145,14 @@ function arr2str(data) { | ||||
| 	var o = []; for(var i = 0; i < data.length; ++i) o[i] = _chr(data[i]); return o.join(""); | ||||
| } | ||||
| 
 | ||||
| function ab2a(data) { | ||||
| 	if(typeof ArrayBuffer == 'undefined') throw new Error("Unsupported"); | ||||
| 	if(data instanceof ArrayBuffer) return ab2a(new Uint8Array(data)); | ||||
| var o = new Array(data.length); | ||||
| 	for(var i = 0; i < data.length; ++i) o[i] = data[i]; | ||||
| 	return o; | ||||
| } | ||||
| 
 | ||||
| var bconcat = function(bufs) { return [].concat.apply([], bufs); }; | ||||
| 
 | ||||
| var chr0 = /\u0000/g, chr1 = /[\u0001-\u0006]/g; | ||||
| @ -1822,9 +1830,9 @@ function parse_isodur(s) { | ||||
| 		if(!m[i]) continue; | ||||
| 		mt = 1; | ||||
| 		if(i > 3) time = true; | ||||
| 		switch(m[i].substr(m[i].length-1)) { | ||||
| 		switch(m[i].slice(m[i].length-1)) { | ||||
| 			case 'Y': | ||||
| 				throw new Error("Unsupported ISO Duration Field: " + m[i].substr(m[i].length-1)); | ||||
| 				throw new Error("Unsupported ISO Duration Field: " + m[i].slice(m[i].length-1)); | ||||
| 			case 'D': mt *= 24; | ||||
| 				/* falls through */ | ||||
| 			case 'H': mt *= 60; | ||||
| @ -1872,6 +1880,7 @@ function cc2str(arr) { | ||||
| function dup(o) { | ||||
| 	if(typeof JSON != 'undefined' && !Array.isArray(o)) return JSON.parse(JSON.stringify(o)); | ||||
| 	if(typeof o != 'object' || o == null) return o; | ||||
| 	if(o instanceof Date) return new Date(o.getTime()); | ||||
| 	var out = {}; | ||||
| 	for(var k in o) if(o.hasOwnProperty(k)) out[k] = dup(o[k]); | ||||
| 	return out; | ||||
| @ -1991,24 +2000,24 @@ function parsexmltag(tag, skip_root) { | ||||
| 	var z = ({}); | ||||
| 	var eq = 0, c = 0; | ||||
| 	for(; eq !== tag.length; ++eq) if((c = tag.charCodeAt(eq)) === 32 || c === 10 || c === 13) break; | ||||
| 	if(!skip_root) z[0] = tag.substr(0, eq); | ||||
| 	if(!skip_root) z[0] = tag.slice(0, eq); | ||||
| 	if(eq === tag.length) return z; | ||||
| 	var m = tag.match(attregexg), j=0, v="", i=0, q="", cc="", quot = 1; | ||||
| 	if(m) for(i = 0; i != m.length; ++i) { | ||||
| 		cc = m[i]; | ||||
| 		for(c=0; c != cc.length; ++c) if(cc.charCodeAt(c) === 61) break; | ||||
| 		q = cc.substr(0,c).trim(); | ||||
| 		q = cc.slice(0,c).trim(); | ||||
| 		while(cc.charCodeAt(c+1) == 32) ++c; | ||||
| 		quot = ((eq=cc.charCodeAt(c+1)) == 34 || eq == 39) ? 1 : 0; | ||||
| 		v = cc.substring(c+1+quot, cc.length-quot); | ||||
| 		v = cc.slice(c+1+quot, cc.length-quot); | ||||
| 		for(j=0;j!=q.length;++j) if(q.charCodeAt(j) === 58) break; | ||||
| 		if(j===q.length) { | ||||
| 			if(q.indexOf("_") > 0) q = q.substr(0, q.indexOf("_")); // from ods
 | ||||
| 			if(q.indexOf("_") > 0) q = q.slice(0, q.indexOf("_")); // from ods
 | ||||
| 			z[q] = v; | ||||
| 		} | ||||
| 		else { | ||||
| 			var k = (j===5 && q.substr(0,5)==="xmlns"?"xmlns":"")+q.substr(j+1); | ||||
| 			if(z[k] && q.substr(j-3,3) == "ext") continue; // from ods
 | ||||
| 			var k = (j===5 && q.slice(0,5)==="xmlns"?"xmlns":"")+q.slice(j+1); | ||||
| 			if(z[k] && q.slice(j-3,j) == "ext") continue; // from ods
 | ||||
| 			z[k] = v; | ||||
| 		} | ||||
| 	} | ||||
| @ -2978,9 +2987,9 @@ function write_BrtColor(color, o) { | ||||
| 		o.write_shift(1, 0); | ||||
| 	} else { | ||||
| 		var rgb = (color.rgb || 'FFFFFF'); | ||||
| 		o.write_shift(1, parseInt(rgb.substr(0,2),16)); | ||||
| 		o.write_shift(1, parseInt(rgb.substr(2,2),16)); | ||||
| 		o.write_shift(1, parseInt(rgb.substr(4,2),16)); | ||||
| 		o.write_shift(1, parseInt(rgb.slice(0,2),16)); | ||||
| 		o.write_shift(1, parseInt(rgb.slice(2,4),16)); | ||||
| 		o.write_shift(1, parseInt(rgb.slice(4,6),16)); | ||||
| 		o.write_shift(1, 0xFF); | ||||
| 	} | ||||
| 	return o; | ||||
| @ -3614,7 +3623,7 @@ var RELS = ({ | ||||
| /* 9.3.3 Representing Relationships */ | ||||
| function get_rels_path(file) { | ||||
| 	var n = file.lastIndexOf("/"); | ||||
| 	return file.substr(0,n+1) + '_rels/' + file.substr(n+1) + ".rels"; | ||||
| 	return file.slice(0,n+1) + '_rels/' + file.slice(n+1) + ".rels"; | ||||
| } | ||||
| 
 | ||||
| function parse_rels(data, currentFilePath) { | ||||
| @ -3761,7 +3770,7 @@ var CORE_PROPS_REGEX = (function() { | ||||
| 	var r = new Array(CORE_PROPS.length); | ||||
| 	for(var i = 0; i < CORE_PROPS.length; ++i) { | ||||
| 		var f = CORE_PROPS[i]; | ||||
| 		var g = "(?:"+ f[0].substr(0,f[0].indexOf(":")) +":)"+ f[0].substr(f[0].indexOf(":")+1); | ||||
| 		var g = "(?:"+ f[0].slice(0,f[0].indexOf(":")) +":)"+ f[0].slice(f[0].indexOf(":")+1); | ||||
| 		r[i] = new RegExp("<" + g + "[^>]*>([\\s\\S]*?)<\/" + g + ">"); | ||||
| 	} | ||||
| 	return r; | ||||
| @ -3941,7 +3950,7 @@ function parse_cust_props(data, opts) { | ||||
| 			case '</property>': name = null; break; | ||||
| 			default: if (x.indexOf('<vt:') === 0) { | ||||
| 				var toks = x.split('>'); | ||||
| 				var type = toks[0].substring(4), text = toks[1]; | ||||
| 				var type = toks[0].slice(4), text = toks[1]; | ||||
| 				/* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */ | ||||
| 				switch(type) { | ||||
| 					case 'lpstr': case 'bstr': case 'lpwstr': | ||||
| @ -3966,7 +3975,7 @@ function parse_cust_props(data, opts) { | ||||
| 						if(type.slice(-1) == '/') break; | ||||
| 						if(opts.WTF && typeof console !== 'undefined') console.warn('Unexpected', x, type, toks); | ||||
| 				} | ||||
| 			} else if(x.substr(0,2) === "</") {/* empty */ | ||||
| 			} else if(x.slice(0,2) === "</") {/* empty */ | ||||
| 			} else if(opts.WTF) throw new Error(x); | ||||
| 		} | ||||
| 	} | ||||
| @ -4396,6 +4405,7 @@ function parse_ShortXLUnicodeString(blob, length, opts) { | ||||
| 	} else if(opts.biff == 12) { | ||||
| 		width = 2; encoding = 'wstr'; | ||||
| 	} | ||||
| 	if(opts.biff >= 2 && opts.biff <= 5) encoding = 'cpstr'; | ||||
| 	var o = cch ? blob.read_shift(cch, encoding) : ""; | ||||
| 	current_codepage = cp; | ||||
| 	return o; | ||||
| @ -4426,7 +4436,7 @@ function parse_XLUnicodeRichExtendedString(blob) { | ||||
| function parse_XLUnicodeStringNoCch(blob, cch, opts) { | ||||
| 	var retval; | ||||
| 	if(opts) { | ||||
| 		if(opts.biff >= 2 && opts.biff <= 5) return blob.read_shift(cch, 'sbcs-cont'); | ||||
| 		if(opts.biff >= 2 && opts.biff <= 5) return blob.read_shift(cch, 'cpstr'); | ||||
| 		if(opts.biff >= 12) return blob.read_shift(cch, 'dbcs-cont'); | ||||
| 	} | ||||
| 	var fHighByte = blob.read_shift(1); | ||||
| @ -4446,7 +4456,7 @@ function parse_XLUnicodeString2(blob, length, opts) { | ||||
| 	if(opts.biff > 5) return parse_XLUnicodeString(blob, length, opts); | ||||
| 	var cch = blob.read_shift(1); | ||||
| 	if(cch === 0) { blob.l++; return ""; } | ||||
| 	return blob.read_shift(cch, opts.biff == 4 ? 'cpstr' : 'sbcs-cont'); | ||||
| 	return blob.read_shift(cch, (opts.biff <= 4 || !blob.lens ) ? 'cpstr' : 'sbcs-cont'); | ||||
| } | ||||
| /* TODO: BIFF5 and lower, codepage awareness */ | ||||
| function write_XLUnicodeString(str, opts, o) { | ||||
| @ -5742,7 +5752,7 @@ var fields = [], field = ({}); | ||||
| 					out[R][C] = out[R][C].trim(); | ||||
| 					break; | ||||
| 				case 'D': | ||||
| 					if(s.length === 8) out[R][C] = new Date(+s.substr(0,4), +s.substr(4,2)-1, +s.substr(6,2)); | ||||
| 					if(s.length === 8) out[R][C] = new Date(+s.slice(0,4), +s.slice(4,6)-1, +s.slice(6,8)); | ||||
| 					else out[R][C] = s; | ||||
| 					break; | ||||
| 				case 'F': out[R][C] = parseFloat(s.trim()); break; | ||||
| @ -5918,18 +5928,18 @@ var SYLK = (function() { | ||||
| 			case 'O': break; /* options? */ | ||||
| 			case 'P': | ||||
| 				if(record[1].charAt(0) == 'P') | ||||
| 					formats.push(rstr.substr(3).replace(/;;/g, ";")); | ||||
| 					formats.push(rstr.slice(3).replace(/;;/g, ";")); | ||||
| 				break; | ||||
| 			case 'C': | ||||
| 			for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { | ||||
| 				case 'X': C = parseInt(record[rj].substr(1))-1; break; | ||||
| 				case 'X': C = parseInt(record[rj].slice(1))-1; break; | ||||
| 				case 'Y': | ||||
| 					R = parseInt(record[rj].substr(1))-1; C = 0; | ||||
| 					R = parseInt(record[rj].slice(1))-1; C = 0; | ||||
| 					for(j = arr.length; j <= R; ++j) arr[j] = []; | ||||
| 					break; | ||||
| 				case 'K': | ||||
| 					val = record[rj].substr(1); | ||||
| 					if(val.charAt(0) === '"') val = val.substr(1,val.length - 2); | ||||
| 					val = record[rj].slice(1); | ||||
| 					if(val.charAt(0) === '"') val = val.slice(1,val.length - 1); | ||||
| 					else if(val === 'TRUE') val = true; | ||||
| 					else if(val === 'FALSE') val = false; | ||||
| 					else if(!isNaN(fuzzynum(val))) { | ||||
| @ -5942,7 +5952,7 @@ var SYLK = (function() { | ||||
| 					next_cell_format = null; | ||||
| 					break; | ||||
| 				case 'E': | ||||
| 					var formula = rc_to_a1(record[rj].substr(1), {r:R,c:C}); | ||||
| 					var formula = rc_to_a1(record[rj].slice(1), {r:R,c:C}); | ||||
| 					arr[R][C] = [arr[R][C], formula]; | ||||
| 					break; | ||||
| 				default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr); | ||||
| @ -5950,31 +5960,31 @@ var SYLK = (function() { | ||||
| 			case 'F': | ||||
| 			var F_seen = 0; | ||||
| 			for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { | ||||
| 				case 'X': C = parseInt(record[rj].substr(1))-1; ++F_seen; break; | ||||
| 				case 'X': C = parseInt(record[rj].slice(1))-1; ++F_seen; break; | ||||
| 				case 'Y': | ||||
| 					R = parseInt(record[rj].substr(1))-1; /*C = 0;*/ | ||||
| 					R = parseInt(record[rj].slice(1))-1; /*C = 0;*/ | ||||
| 					for(j = arr.length; j <= R; ++j) arr[j] = []; | ||||
| 					break; | ||||
| 				case 'M': Mval = parseInt(record[rj].substr(1)) / 20; break; | ||||
| 				case 'M': Mval = parseInt(record[rj].slice(1)) / 20; break; | ||||
| 				case 'F': break; /* ??? */ | ||||
| 				case 'P': | ||||
| 					next_cell_format = formats[parseInt(record[rj].substr(1))]; | ||||
| 					next_cell_format = formats[parseInt(record[rj].slice(1))]; | ||||
| 					break; | ||||
| 				case 'S': break; /* cell style */ | ||||
| 				case 'D': break; /* column */ | ||||
| 				case 'N': break; /* font */ | ||||
| 				case 'W': | ||||
| 					cw = record[rj].substr(1).split(" "); | ||||
| 					cw = record[rj].slice(1).split(" "); | ||||
| 					for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) { | ||||
| 						Mval = parseInt(cw[2], 10); | ||||
| 						colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval}; process_col(colinfo[j-1]); | ||||
| 					} break; | ||||
| 				case 'C': /* default column format */ | ||||
| 					C = parseInt(record[rj].substr(1))-1; | ||||
| 					C = parseInt(record[rj].slice(1))-1; | ||||
| 					if(!colinfo[C]) colinfo[C] = {}; | ||||
| 					break; | ||||
| 				case 'R': /* row properties */ | ||||
| 					R = parseInt(record[rj].substr(1))-1; | ||||
| 					R = parseInt(record[rj].slice(1))-1; | ||||
| 					if(!rowinfo[R]) rowinfo[R] = {}; | ||||
| 					if(Mval > 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); } | ||||
| 					else if(Mval === 0) rowinfo[R].hidden = true; | ||||
| @ -6099,7 +6109,7 @@ var DIF = (function() { | ||||
| 					else arr[R][C] = value; | ||||
| 					++C; break; | ||||
| 				case 1: | ||||
| 					data = data.substr(1,data.length-2); | ||||
| 					data = data.slice(1,data.length-1); | ||||
| 					arr[R][C++] = data !== '' ? data : null; | ||||
| 					break; | ||||
| 			} | ||||
| @ -6354,8 +6364,8 @@ var PRN = (function() { | ||||
| 		var ws = o.dense ? ([]) : ({}); | ||||
| 		var range = ({s: {c:0, r:0}, e: {c:0, r:0}}); | ||||
| 
 | ||||
| 		if(str.substr(0,4) == "sep=" && str.charCodeAt(5) == 10) { sep = str.charAt(4); str = str.substr(6); } | ||||
| 		else sep = guess_sep(str.substr(0,1024)); | ||||
| 		if(str.slice(0,4) == "sep=" && str.charCodeAt(5) == 10) { sep = str.charAt(4); str = str.slice(6); } | ||||
| 		else sep = guess_sep(str.slice(0,1024)); | ||||
| 		var R = 0, C = 0, v = 0; | ||||
| 		var start = 0, end = 0, sepcc = sep.charCodeAt(0), instr = false, cc=0; | ||||
| 		str = str.replace(/\r\n/mg, "\n"); | ||||
| @ -6369,7 +6379,7 @@ var PRN = (function() { | ||||
| 			else if(s.trim().length === 0) { cell.t = 's'; cell.v = s; } | ||||
| 			else if(s.charCodeAt(0) == 0x3D) { | ||||
| 				if(s.charCodeAt(1) == 0x22 && s.charCodeAt(s.length - 1) == 0x22) { cell.t = 's'; cell.v = s.slice(2,-1).replace(/""/g,'"'); } | ||||
| 				else if(fuzzyfmla(s)) { cell.t = 'n'; cell.f = s.substr(1); } | ||||
| 				else if(fuzzyfmla(s)) { cell.t = 'n'; cell.f = s.slice(1); } | ||||
| 				else { cell.t = 's'; cell.v = s; } } | ||||
| 			else if(s == "TRUE") { cell.t = 'b'; cell.v = true; } | ||||
| 			else if(s == "FALSE") { cell.t = 'b'; cell.v = false; } | ||||
| @ -6439,7 +6449,7 @@ var PRN = (function() { | ||||
| 				var coord = encode_cell({r:R,c:C}); | ||||
| 				cell = dense ? (ws[R]||[])[C] : ws[coord]; | ||||
| 				if(!cell || cell.v == null) { oo.push("          "); continue; } | ||||
| 				var w = (cell.w || (format_cell(cell), cell.w) || "").substr(0,10); | ||||
| 				var w = (cell.w || (format_cell(cell), cell.w) || "").slice(0,10); | ||||
| 				while(w.length < 10) w += " "; | ||||
| 				oo.push(w + (C === 0 ? " " : "")); | ||||
| 			} | ||||
| @ -6516,7 +6526,7 @@ var WK_ = (function() { | ||||
| 					break; | ||||
| 				case 0x06: refguess = val; break; /* RANGE */ | ||||
| 				case 0x0F: /* LABEL */ | ||||
| 					if(!o.qpro) val[1].v = val[1].v.substr(1); | ||||
| 					if(!o.qpro) val[1].v = val[1].v.slice(1); | ||||
| 					/* falls through */ | ||||
| 				case 0x0D: /* INTEGER */ | ||||
| 				case 0x0E: /* NUMBER */ | ||||
| @ -6534,7 +6544,7 @@ var WK_ = (function() { | ||||
| 					break; | ||||
| 			} else switch(RT) { | ||||
| 				case 0x16: /* LABEL16 */ | ||||
| 					val[1].v = val[1].v.substr(1); | ||||
| 					val[1].v = val[1].v.slice(1); | ||||
| 					/* falls through */ | ||||
| 				case 0x17: /* NUMBER17 */ | ||||
| 				case 0x18: /* NUMBER18 */ | ||||
| @ -6883,7 +6893,7 @@ var parse_rs = (function parse_rs_factory() { | ||||
| 
 | ||||
| 				/* 18.3.1.15 color CT_Color TODO: tint, theme, auto, indexed */ | ||||
| 				case '<color': | ||||
| 					if(y.rgb) font.color = y.rgb.substr(2,6); | ||||
| 					if(y.rgb) font.color = y.rgb.slice(2,8); | ||||
| 					break; | ||||
| 
 | ||||
| 				/* 18.8.18 family ST_FontFamily */ | ||||
| @ -7427,12 +7437,12 @@ var RTF = (function() { | ||||
| 	}; | ||||
| })(); | ||||
| function hex2RGB(h) { | ||||
| 	var o = h.substr(h[0]==="#"?1:0,6); | ||||
| 	return [parseInt(o.substr(0,2),16),parseInt(o.substr(2,2),16),parseInt(o.substr(4,2),16)]; | ||||
| 	var o = h.slice(h[0]==="#"?1:0).slice(0,6); | ||||
| 	return [parseInt(o.slice(0,2),16),parseInt(o.slice(2,4),16),parseInt(o.slice(4,6),16)]; | ||||
| } | ||||
| function rgb2Hex(rgb) { | ||||
| 	for(var i=0,o=1; i!=3; ++i) o = o*256 + (rgb[i]>255?255:rgb[i]<0?0:rgb[i]); | ||||
| 	return o.toString(16).toUpperCase().substr(1); | ||||
| 	return o.toString(16).toUpperCase().slice(1); | ||||
| } | ||||
| 
 | ||||
| function rgb2HSL(rgb) { | ||||
| @ -8373,7 +8383,7 @@ function parse_clrScheme(t, themes, opts) { | ||||
| 					themes.themeElements.clrScheme.push(color); | ||||
| 					color = {}; | ||||
| 				} else { | ||||
| 					color.name = y[0].substring(3, y[0].length - 1); | ||||
| 					color.name = y[0].slice(3, y[0].length - 1); | ||||
| 				} | ||||
| 				break; | ||||
| 
 | ||||
| @ -9834,8 +9844,8 @@ var PtgBinOp = { | ||||
| 	PtgPower: "^", | ||||
| 	PtgSub: "-" | ||||
| }; | ||||
| function formula_quote_sheet_name(sname) { | ||||
| 	if(!sname) throw new Error("empty sheet name"); | ||||
| function formula_quote_sheet_name(sname, opts) { | ||||
| 	if(!sname && !(opts && opts.biff <= 5 && opts.biff >= 2)) throw new Error("empty sheet name"); | ||||
| 	if(sname.indexOf(" ") > -1) return "'" + sname + "'"; | ||||
| 	return sname; | ||||
| } | ||||
| @ -9874,7 +9884,7 @@ function get_ixti_raw(supbooks, ixti, opts) { | ||||
| 	} | ||||
| } | ||||
| function get_ixti(supbooks, ixti, opts) { | ||||
| 	return formula_quote_sheet_name(get_ixti_raw(supbooks, ixti, opts)); | ||||
| 	return formula_quote_sheet_name(get_ixti_raw(supbooks, ixti, opts), opts); | ||||
| } | ||||
| function stringify_formula(formula/*Array<any>*/, range, cell, supbooks, opts) { | ||||
| 	var _range = /*range != null ? range :*/ {s:{c:0, r:0},e:{c:0, r:0}}; | ||||
| @ -11524,11 +11534,11 @@ var XLSXFutureFunctions = { | ||||
| 
 | ||||
| /* Part 3 TODO: actually parse formulae */ | ||||
| function ods_to_csf_formula(f) { | ||||
| 	if(f.substr(0,3) == "of:") f = f.substr(3); | ||||
| 	if(f.slice(0,3) == "of:") f = f.slice(3); | ||||
| 	/* 5.2 Basic Expressions */ | ||||
| 	if(f.charCodeAt(0) == 61) { | ||||
| 		f = f.substr(1); | ||||
| 		if(f.charCodeAt(0) == 61) f = f.substr(1); | ||||
| 		f = f.slice(1); | ||||
| 		if(f.charCodeAt(0) == 61) f = f.slice(1); | ||||
| 	} | ||||
| 	f = f.replace(/COM\.MICROSOFT\./g, ""); | ||||
| 	/* Part 3 Section 5.8 References */ | ||||
| @ -11679,8 +11689,8 @@ function parse_ws_xml(data, opts, idx, rels, wb, themes, styles) { | ||||
| 	var data1 = "", data2 = ""; | ||||
| 	var mtch = data.match(sheetdataregex); | ||||
| 	if(mtch) { | ||||
| 		data1 = data.substr(0, mtch.index); | ||||
| 		data2 = data.substr(mtch.index + mtch[0].length); | ||||
| 		data1 = data.slice(0, mtch.index); | ||||
| 		data2 = data.slice(mtch.index + mtch[0].length); | ||||
| 	} else data1 = data2 = data; | ||||
| 
 | ||||
| 	/* 18.3.1.82 sheetPr CT_SheetPr */ | ||||
| @ -11691,7 +11701,7 @@ function parse_ws_xml(data, opts, idx, rels, wb, themes, styles) { | ||||
| 	// $FlowIgnore
 | ||||
| 	var ridx = (data1.match(/<(?:\w*:)?dimension/)||{index:-1}).index; | ||||
| 	if(ridx > 0) { | ||||
| 		var ref = data1.substr(ridx,50).match(dimregex); | ||||
| 		var ref = data1.slice(ridx,ridx+50).match(dimregex); | ||||
| 		if(ref) parse_ws_xml_dim(s, ref[1]); | ||||
| 	} | ||||
| 
 | ||||
| @ -11718,7 +11728,7 @@ function parse_ws_xml(data, opts, idx, rels, wb, themes, styles) { | ||||
| 	var merges = []; | ||||
| 	var _merge = data2.match(mergecregex); | ||||
| 	if(_merge) for(ridx = 0; ridx != _merge.length; ++ridx) | ||||
| 		merges[ridx] = safe_decode_range(_merge[ridx].substr(_merge[ridx].indexOf("\"")+1)); | ||||
| 		merges[ridx] = safe_decode_range(_merge[ridx].slice(_merge[ridx].indexOf("\"")+1)); | ||||
| 
 | ||||
| 	/* 18.3.1.48 hyperlinks CT_Hyperlinks */ | ||||
| 	var hlink = data2.match(hlinkregex); | ||||
| @ -11908,7 +11918,7 @@ function write_ws_xml_cell(cell, ref, ws, opts, idx, wb) { | ||||
| 	} | ||||
| 	if(cell.t != oldt) { cell.t = oldt; cell.v = oldv; } | ||||
| 	if(cell.f) { | ||||
| 		var ff = cell.F && cell.F.substr(0, ref.length) == ref ? {t:"array", ref:cell.F} : null; | ||||
| 		var ff = cell.F && cell.F.slice(0, ref.length) == ref ? {t:"array", ref:cell.F} : null; | ||||
| 		v = writextag('f', escapexml(cell.f), ff) + (cell.v != null ? v : ""); | ||||
| 	} | ||||
| 	if(cell.l) ws['!links'].push([ref, cell.l]); | ||||
| @ -11939,7 +11949,7 @@ return function parse_ws_xml_data(sdata, s, opts, guess, themes, styles) { | ||||
| 
 | ||||
| 		/* 18.3.1.73 row CT_Row */ | ||||
| 		for(ri = 0; ri < xlen; ++ri) if(x.charCodeAt(ri) === 62) break; ++ri; | ||||
| 		tag = parsexmltag(x.substr(0,ri), true); | ||||
| 		tag = parsexmltag(x.slice(0,ri), true); | ||||
| 		tagr = tag.r != null ? parseInt(tag.r, 10) : tagr+1; tagc = -1; | ||||
| 		if(opts.sheetRows && opts.sheetRows < tagr) continue; | ||||
| 		if(guess.s.r > tagr - 1) guess.s.r = tagr - 1; | ||||
| @ -11954,12 +11964,12 @@ return function parse_ws_xml_data(sdata, s, opts, guess, themes, styles) { | ||||
| 		} | ||||
| 
 | ||||
| 		/* 18.3.1.4 c CT_Cell */ | ||||
| 		cells = x.substr(ri).split(cellregex); | ||||
| 		cells = x.slice(ri).split(cellregex); | ||||
| 		for(ri = 0; ri != cells.length; ++ri) { | ||||
| 			x = cells[ri].trim(); | ||||
| 			if(x.length === 0) continue; | ||||
| 			cref = x.match(rregex); idx = ri; i=0; cc=0; | ||||
| 			x = "<c " + (x.substr(0,1)=="<"?">":"") + x; | ||||
| 			x = "<c " + (x.slice(0,1)=="<"?">":"") + x; | ||||
| 			if(cref != null && cref.length === 2) { | ||||
| 				idx = 0; d=cref[1]; | ||||
| 				for(i=0; i != d.length; ++i) { | ||||
| @ -11970,9 +11980,9 @@ return function parse_ws_xml_data(sdata, s, opts, guess, themes, styles) { | ||||
| 				tagc = idx; | ||||
| 			} else ++tagc; | ||||
| 			for(i = 0; i != x.length; ++i) if(x.charCodeAt(i) === 62) break; ++i; | ||||
| 			tag = parsexmltag(x.substr(0,i), true); | ||||
| 			tag = parsexmltag(x.slice(0,i), true); | ||||
| 			if(!tag.r) tag.r = encode_cell({r:tagr-1, c:tagc}); | ||||
| 			d = x.substr(i); | ||||
| 			d = x.slice(i); | ||||
| 			p = ({t:""}); | ||||
| 
 | ||||
| 			if((cref=d.match(match_v))!= null && cref[1] !== '') p.v=unescapexml(cref[1]); | ||||
| @ -12184,7 +12194,7 @@ function write_ws_xml(idx, opts, wb, rels) { | ||||
| 				rId = add_rels(rels, -1, escapexml(l[1].Target).replace(/#.*$/, ""), RELS.HLINK); | ||||
| 				rel["r:id"] = "rId"+rId; | ||||
| 			} | ||||
| 			if((relc = l[1].Target.indexOf("#")) > -1) rel.location = escapexml(l[1].Target.substr(relc+1)); | ||||
| 			if((relc = l[1].Target.indexOf("#")) > -1) rel.location = escapexml(l[1].Target.slice(relc+1)); | ||||
| 			if(l[1].Tooltip) rel.tooltip = escapexml(l[1].Tooltip); | ||||
| 			o[o.length] = writextag("hyperlink",null,rel); | ||||
| 		}); | ||||
| @ -12501,7 +12511,7 @@ function write_BrtHLink(l, rId) { | ||||
| 	write_UncheckedRfX({s:decode_cell(l[0]), e:decode_cell(l[0])}, o); | ||||
| 	write_RelID("rId" + rId, o); | ||||
| 	var locidx = l[1].Target.indexOf("#"); | ||||
| 	var loc = locidx == -1 ? "" : l[1].Target.substr(locidx+1); | ||||
| 	var loc = locidx == -1 ? "" : l[1].Target.slice(locidx+1); | ||||
| 	write_XLWideString(loc || "", o); | ||||
| 	write_XLWideString(l[1].Tooltip || "", o); | ||||
| 	write_XLWideString("", o); | ||||
| @ -13541,7 +13551,7 @@ if(wb.Workbook.WBProps.CodeName) { workbookPr.codeName = wb.Workbook.WBProps.Cod | ||||
| 	o[o.length] = "<sheets>"; | ||||
| 	var sheets = wb.Workbook && wb.Workbook.Sheets || []; | ||||
| 	for(var i = 0; i != wb.SheetNames.length; ++i) { | ||||
| 		var sht = ({name:escapexml(wb.SheetNames[i].substr(0,31))}); | ||||
| 		var sht = ({name:escapexml(wb.SheetNames[i].slice(0,31))}); | ||||
| 		sht.sheetId = ""+(i+1); | ||||
| 		sht["r:id"] = "rId"+(i+1); | ||||
| 		if(sheets[i]) switch(sheets[i].Hidden) { | ||||
| @ -13595,7 +13605,7 @@ function write_BrtBundleSh(data, o) { | ||||
| 	o.write_shift(4, data.Hidden); | ||||
| 	o.write_shift(4, data.iTabID); | ||||
| 	write_RelID(data.strRelID, o); | ||||
| 	write_XLWideString(data.name.substr(0,31), o); | ||||
| 	write_XLWideString(data.name.slice(0,31), o); | ||||
| 	return o.length > o.l ? o.slice(0, o.l) : o; | ||||
| } | ||||
| 
 | ||||
| @ -13964,11 +13974,11 @@ function xlml_parsexmltag(tag, skip_root) { | ||||
| 	var m = tag.match(attregexg2), y, j, w, i; | ||||
| 	if(m) for(i = 0; i != m.length; ++i) { | ||||
| 		y = m[i].match(attregex2); | ||||
| if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].substr(1,y[2].length-2); | ||||
| if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1); | ||||
| 		else { | ||||
| 			if(y[1].substr(0,6) === "xmlns:") w = "xmlns"+y[1].substr(6); | ||||
| 			else w = y[1].substr(j+1); | ||||
| 			z[w] = y[2].substr(1,y[2].length-2); | ||||
| 			if(y[1].slice(0,6) === "xmlns:") w = "xmlns"+y[1].slice(6); | ||||
| 			else w = y[1].slice(j+1); | ||||
| 			z[w] = y[2].slice(1,y[2].length-1); | ||||
| 		} | ||||
| 	} | ||||
| 	return z; | ||||
| @ -13980,11 +13990,11 @@ function xlml_parsexmltagobj(tag) { | ||||
| 	var m = tag.match(attregexg2), y, j, w, i; | ||||
| 	if(m) for(i = 0; i != m.length; ++i) { | ||||
| 		y = m[i].match(attregex2); | ||||
| if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].substr(1,y[2].length-2); | ||||
| if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1); | ||||
| 		else { | ||||
| 			if(y[1].substr(0,6) === "xmlns:") w = "xmlns"+y[1].substr(6); | ||||
| 			else w = y[1].substr(j+1); | ||||
| 			z[w] = y[2].substr(1,y[2].length-2); | ||||
| 			if(y[1].slice(0,6) === "xmlns:") w = "xmlns"+y[1].slice(6); | ||||
| 			else w = y[1].slice(j+1); | ||||
| 			z[w] = y[2].slice(1,y[2].length-1); | ||||
| 		} | ||||
| 	} | ||||
| 	return z; | ||||
| @ -14084,7 +14094,7 @@ function parse_xlml_data(xml, ss, data, cell, base, styles, csty, row, arrayf, o | ||||
| 		if(cell.Formula) { | ||||
| 			var fstr = unescapexml(cell.Formula); | ||||
| 			/* strictly speaking, the leading = is required but some writers omit */ | ||||
| 			if(fstr.charCodeAt(0) == 61 /* = */) fstr = fstr.substr(1); | ||||
| 			if(fstr.charCodeAt(0) == 61 /* = */) fstr = fstr.slice(1); | ||||
| 			cell.f = rc_to_a1(fstr, base); | ||||
| 			delete cell.Formula; | ||||
| 			if(cell.ArrayRange == "RC") cell.F = rc_to_a1("RC:RC", base); | ||||
| @ -14287,7 +14297,7 @@ for(var cma = c; cma <= cc; ++cma) { | ||||
| 			var _NamedRange = parsexmltag(Rn[0]); | ||||
| 			var _DefinedName = ({ | ||||
| 				Name: _NamedRange.Name, | ||||
| 				Ref: rc_to_a1(_NamedRange.RefersTo.substr(1), {r:0, c:0}) | ||||
| 				Ref: rc_to_a1(_NamedRange.RefersTo.slice(1), {r:0, c:0}) | ||||
| 			}); | ||||
| 			if(Workbook.Sheets.length>0) _DefinedName.Sheet=Workbook.Sheets.length-1; | ||||
| Workbook.Names.push(_DefinedName); | ||||
| @ -14966,8 +14976,8 @@ function write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr){ | ||||
| 
 | ||||
| 	var attr = {}; | ||||
| 	if(cell.f) attr["ss:Formula"] = "=" + escapexml(a1_to_rc(cell.f, addr)); | ||||
| 	if(cell.F && cell.F.substr(0, ref.length) == ref) { | ||||
| 		var end = decode_cell(cell.F.substr(ref.length + 1)); | ||||
| 	if(cell.F && cell.F.slice(0, ref.length) == ref) { | ||||
| 		var end = decode_cell(cell.F.slice(ref.length + 1)); | ||||
| 		attr["ss:ArrayRange"] = "RC:R" + (end.r == addr.r ? "" : "[" + (end.r - addr.r) + "]") + "C" + (end.c == addr.c ? "" : "[" + (end.c - addr.c) + "]"); | ||||
| 	} | ||||
| 
 | ||||
| @ -17531,13 +17541,13 @@ var HTML_ = (function() { | ||||
| 		var merges = [], midx = 0; | ||||
| 		for(i = 0; i < rows.length; ++i) { | ||||
| 			var row = rows[i].trim(); | ||||
| 			var hd = row.substr(0,3).toLowerCase(); | ||||
| 			var hd = row.slice(0,3).toLowerCase(); | ||||
| 			if(hd == "<tr") { ++R; C = 0; continue; } | ||||
| 			if(hd != "<td") continue; | ||||
| 			var cells = row.split(/<\/td>/i); | ||||
| 			for(j = 0; j < cells.length; ++j) { | ||||
| 				var cell = cells[j].trim(); | ||||
| 				if(cell.substr(0,3).toLowerCase() != "<td") continue; | ||||
| 				if(cell.slice(0,3).toLowerCase() != "<td") continue; | ||||
| 				var m = cell, cc = 0; | ||||
| 				/* TODO: parse styles etc */ | ||||
| 				while(m.charAt(0) == "<" && (cc = m.indexOf(">")) > -1) m = m.slice(cc+1); | ||||
| @ -18289,7 +18299,7 @@ var write_content_ods = (function() { | ||||
| 				if(cell && cell.f) { | ||||
| 					ct['table:formula'] = escapexml(csf_to_ods_formula(cell.f)); | ||||
| 					if(cell.F) { | ||||
| 						if(cell.F.substr(0, ref.length) == ref) { | ||||
| 						if(cell.F.slice(0, ref.length) == ref) { | ||||
| 							var _Fref = decode_range(cell.F); | ||||
| 							ct['table:number-matrix-columns-spanned'] = (_Fref.e.c - _Fref.s.c + 1); | ||||
| 							ct['table:number-matrix-rows-spanned'] =    (_Fref.e.r - _Fref.s.r + 1); | ||||
| @ -18864,7 +18874,7 @@ function firstbyte(f,o) { | ||||
| 	var x = ""; | ||||
| 	switch((o||{}).type || "base64") { | ||||
| 		case 'buffer': return [f[0], f[1], f[2], f[3]]; | ||||
| 		case 'base64': x = Base64.decode(f.substr(0,24)); break; | ||||
| 		case 'base64': x = Base64.decode(f.slice(0,24)); break; | ||||
| 		case 'binary': x = f; break; | ||||
| 		case 'array':  return [f[0], f[1], f[2], f[3]]; | ||||
| 		default: throw new Error("Unrecognized type " + (o && o.type || "undefined")); | ||||
| @ -18940,6 +18950,12 @@ function readSync(data, opts) { | ||||
| 	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) { | ||||
| 		// $FlowIgnore
 | ||||
| 		var ab=new ArrayBuffer(3), vu=new Uint8Array(ab); vu.foo="bar"; | ||||
| 		// $FlowIgnore
 | ||||
| 		if(!vu.foo) {o=dup(o); o.type='array'; return readSync(ab2a(d), o);} | ||||
| 	} | ||||
| 	switch((n = firstbyte(d, o))[0]) { | ||||
| 		case 0xD0: return read_cfb(CFB.read(d, o), o); | ||||
| 		case 0x09: return parse_xlscfb(d, o); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user