forked from sheetjs/sheetjs
		
	numbers parser prefer subarray
This commit is contained in:
		
							parent
							
								
									ef6d3086ac
								
							
						
					
					
						commit
						dbc30ef188
					
				
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @ -193,7 +193,7 @@ ctest: ## Build browser test fixtures | ||||
| 
 | ||||
| .PHONY: ctestserv | ||||
| ctestserv: ## Start a test server on port 8000
 | ||||
| 	@cd tests && python -mSimpleHTTPServer | ||||
| 	@cd tests && python -mSimpleHTTPServer || python3 -mhttp.server || npx -y http-server -p 8000 . | ||||
| 
 | ||||
| ## Code Checking
 | ||||
| 
 | ||||
|  | ||||
| @ -1,4 +1,7 @@ | ||||
| /*! sheetjs (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| var subarray = typeof Uint8Array !== "undefined" && typeof Uint8Array.prototype.subarray != "undefined" ? "subarray" : "slice"; | ||||
| if (typeof Buffer !== "undefined" && typeof Buffer.prototype.subarray == "undefined") | ||||
|   subarray = "slice"; | ||||
| function u8_to_dataview(array) { | ||||
|   return new DataView(array.buffer, array.byteOffset, array.byteLength); | ||||
| } | ||||
| @ -117,7 +120,7 @@ function write_varint49(v) { | ||||
|       usz[L] = v / 16777216 >>> 21 & 127; | ||||
|       ++L; | ||||
|     } | ||||
|   return usz.slice(0, L); | ||||
|   return usz[subarray](0, L); | ||||
| } | ||||
| function varint_to_i32(buf) { | ||||
|   var l = 0, i32 = buf[l] & 127; | ||||
| @ -153,22 +156,22 @@ function parse_shallow(buf) { | ||||
|           var l = ptr[0]; | ||||
|           while (buf[ptr[0]++] >= 128) | ||||
|             ; | ||||
|           res = buf.slice(l, ptr[0]); | ||||
|           res = buf[subarray](l, ptr[0]); | ||||
|         } | ||||
|         break; | ||||
|       case 5: | ||||
|         len = 4; | ||||
|         res = buf.slice(ptr[0], ptr[0] + len); | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 1: | ||||
|         len = 8; | ||||
|         res = buf.slice(ptr[0], ptr[0] + len); | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 2: | ||||
|         len = parse_varint49(buf, ptr); | ||||
|         res = buf.slice(ptr[0], ptr[0] + len); | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 3: | ||||
| @ -210,7 +213,7 @@ function parse_iwa_file(buf) { | ||||
|   var out = [], ptr = [0]; | ||||
|   while (ptr[0] < buf.length) { | ||||
|     var len = parse_varint49(buf, ptr); | ||||
|     var ai = parse_shallow(buf.slice(ptr[0], ptr[0] + len)); | ||||
|     var ai = parse_shallow(buf[subarray](ptr[0], ptr[0] + len)); | ||||
|     ptr[0] += len; | ||||
|     var res = { | ||||
|       id: varint_to_i32(ai[1][0].data), | ||||
| @ -221,7 +224,7 @@ function parse_iwa_file(buf) { | ||||
|       var fl = varint_to_i32(mi[3][0].data); | ||||
|       res.messages.push({ | ||||
|         meta: mi, | ||||
|         data: buf.slice(ptr[0], ptr[0] + fl) | ||||
|         data: buf[subarray](ptr[0], ptr[0] + fl) | ||||
|       }); | ||||
|       ptr[0] += fl; | ||||
|     }); | ||||
| @ -281,7 +284,7 @@ function parse_snappy_chunk(type, buf) { | ||||
|         len++; | ||||
|         ptr[0] += c; | ||||
|       } | ||||
|       chunks.push(buf.slice(ptr[0], ptr[0] + len)); | ||||
|       chunks.push(buf[subarray](ptr[0], ptr[0] + len)); | ||||
|       ptr[0] += len; | ||||
|       continue; | ||||
|     } else { | ||||
| @ -300,35 +303,57 @@ function parse_snappy_chunk(type, buf) { | ||||
|           ptr[0] += 4; | ||||
|         } | ||||
|       } | ||||
|       chunks = [u8concat(chunks)]; | ||||
|       if (offset == 0) | ||||
|         throw new Error("Invalid offset 0"); | ||||
|       if (offset > chunks[0].length) | ||||
|         throw new Error("Invalid offset beyond length"); | ||||
|       if (length >= offset) { | ||||
|         chunks.push(chunks[0].slice(-offset)); | ||||
|         length -= offset; | ||||
|         while (length >= chunks[chunks.length - 1].length) { | ||||
|           chunks.push(chunks[chunks.length - 1]); | ||||
|           length -= chunks[chunks.length - 1].length; | ||||
|         } | ||||
|       var j = chunks.length - 1, off = offset; | ||||
|       while (j >= 0 && off >= chunks[j].length) { | ||||
|         off -= chunks[j].length; | ||||
|         --j; | ||||
|       } | ||||
|       chunks.push(chunks[0].slice(-offset, -offset + length)); | ||||
|       if (j < 0) { | ||||
|         if (off == 0) | ||||
|           off = chunks[j = 0].length; | ||||
|         else | ||||
|           throw new Error("Invalid offset beyond length"); | ||||
|       } | ||||
|       if (length < off) | ||||
|         chunks.push(chunks[j][subarray](-off, -off + length)); | ||||
|       else { | ||||
|         if (off > 0) { | ||||
|           chunks.push(chunks[j][subarray](-off)); | ||||
|           length -= off; | ||||
|         } | ||||
|         ++j; | ||||
|         while (length >= chunks[j].length) { | ||||
|           chunks.push(chunks[j]); | ||||
|           length -= chunks[j].length; | ||||
|           ++j; | ||||
|         } | ||||
|         if (length) | ||||
|           chunks.push(chunks[j][subarray](0, length)); | ||||
|       } | ||||
|       if (chunks.length > 100) | ||||
|         chunks = [u8concat(chunks)]; | ||||
|     } | ||||
|   } | ||||
|   var o = u8concat(chunks); | ||||
|   if (o.length != usz) | ||||
|     throw new Error("Unexpected length: ".concat(o.length, " != ").concat(usz)); | ||||
|   return o; | ||||
|   if (chunks.reduce(function(acc, u8) { | ||||
|     return acc + u8.length; | ||||
|   }, 0) != usz) | ||||
|     throw new Error("Unexpected length: ".concat(chunks.reduce(function(acc, u8) { | ||||
|       return acc + u8.length; | ||||
|     }, 0), " != ").concat(usz)); | ||||
|   return chunks; | ||||
| } | ||||
| function decompress_iwa_file(buf) { | ||||
|   if (Array.isArray(buf)) | ||||
|     buf = new Uint8Array(buf); | ||||
|   var out = []; | ||||
|   var l = 0; | ||||
|   while (l < buf.length) { | ||||
|     var t = buf[l++]; | ||||
|     var len = buf[l] | buf[l + 1] << 8 | buf[l + 2] << 16; | ||||
|     l += 3; | ||||
|     out.push(parse_snappy_chunk(t, buf.slice(l, l + len))); | ||||
|     out.push.apply(out, parse_snappy_chunk(t, buf[subarray](l, l + len))); | ||||
|     l += len; | ||||
|   } | ||||
|   if (l !== buf.length) | ||||
| @ -361,7 +386,7 @@ function compress_iwa_file(buf) { | ||||
|       L += 5; | ||||
|       out.push(new Uint8Array([252, c - 1 & 255, c - 1 >> 8 & 255, c - 1 >> 16 & 255, c - 1 >>> 24 & 255])); | ||||
|     } | ||||
|     out.push(buf.slice(l, l + c)); | ||||
|     out.push(buf[subarray](l, l + c)); | ||||
|     L += c; | ||||
|     frame[0] = 0; | ||||
|     frame[1] = L & 255; | ||||
| @ -420,11 +445,11 @@ function parse_old_storage(buf, sst, rsst, v) { | ||||
|         if (ridx > -1) | ||||
|           ret = { t: "s", v: rsst[ridx] }; | ||||
|         else | ||||
|           throw new Error("Unsupported cell type ".concat(buf.slice(0, 4))); | ||||
|           throw new Error("Unsupported cell type ".concat(buf[subarray](0, 4))); | ||||
|       } | ||||
|       break; | ||||
|     default: | ||||
|       throw new Error("Unsupported cell type ".concat(buf.slice(0, 4))); | ||||
|       throw new Error("Unsupported cell type ".concat(buf[subarray](0, 4))); | ||||
|   } | ||||
|   return ret; | ||||
| } | ||||
| @ -480,14 +505,14 @@ function parse_new_storage(buf, sst, rsst) { | ||||
|         if (ridx > -1) | ||||
|           ret = { t: "s", v: rsst[ridx] }; | ||||
|         else | ||||
|           throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf.slice(0, 4))); | ||||
|           throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf[subarray](0, 4))); | ||||
|       } | ||||
|       break; | ||||
|     case 10: | ||||
|       ret = { t: "n", v: d128 }; | ||||
|       break; | ||||
|     default: | ||||
|       throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf.slice(0, 4))); | ||||
|       throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf[subarray](0, 4))); | ||||
|   } | ||||
|   return ret; | ||||
| } | ||||
| @ -519,7 +544,7 @@ function write_new_storage(cell, sst) { | ||||
|       throw "unsupported cell type " + cell.t; | ||||
|   } | ||||
|   dv.setUint32(8, flags, true); | ||||
|   return out.slice(0, l); | ||||
|   return out[subarray](0, l); | ||||
| } | ||||
| function write_old_storage(cell, sst) { | ||||
|   var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, flags = 0; | ||||
| @ -549,7 +574,7 @@ function write_old_storage(cell, sst) { | ||||
|       throw "unsupported cell type " + cell.t; | ||||
|   } | ||||
|   dv.setUint32(4, flags, true); | ||||
|   return out.slice(0, l); | ||||
|   return out[subarray](0, l); | ||||
| } | ||||
| function parse_cell_storage(buf, sst, rsst) { | ||||
|   switch (buf[0]) { | ||||
| @ -631,9 +656,9 @@ function parse_TST_TileRowInfo(u8, type) { | ||||
|     throw "Expected ".concat(cnt, " cells, found ").concat(offsets.length); | ||||
|   var cells = []; | ||||
|   for (C = 0; C < offsets.length - 1; ++C) | ||||
|     cells[offsets[C][0]] = used_storage.subarray(offsets[C][1] * width, offsets[C + 1][1] * width); | ||||
|     cells[offsets[C][0]] = used_storage[subarray](offsets[C][1] * width, offsets[C + 1][1] * width); | ||||
|   if (offsets.length >= 1) | ||||
|     cells[offsets[offsets.length - 1][0]] = used_storage.subarray(offsets[offsets.length - 1][1] * width); | ||||
|     cells[offsets[offsets.length - 1][0]] = used_storage[subarray](offsets[offsets.length - 1][1] * width); | ||||
|   return { R: R, cells: cells }; | ||||
| } | ||||
| function parse_TST_Tile(M, root) { | ||||
| @ -674,6 +699,7 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|   if (range.e.c < 0) | ||||
|     throw new Error("Invalid col varint ".concat(pb[7][0].data)); | ||||
|   ws["!ref"] = encode_range(range); | ||||
|   var dense = Array.isArray(ws); | ||||
|   var store = parse_shallow(pb[4][0].data); | ||||
|   var sst = parse_TST_TableDataList(M, M[parse_TSP_Reference(store[4][0].data)][0]); | ||||
|   var rsst = ((_a = store[17]) == null ? void 0 : _a[0]) ? parse_TST_TableDataList(M, M[parse_TSP_Reference(store[17][0].data)][0]) : []; | ||||
| @ -688,10 +714,17 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|     var _tile = parse_TST_Tile(M, ref2); | ||||
|     _tile.data.forEach(function(row, R) { | ||||
|       row.forEach(function(buf, C) { | ||||
|         var addr = encode_cell({ r: _R + R, c: C }); | ||||
|         var res = parse_cell_storage(buf, sst, rsst); | ||||
|         if (res) | ||||
|           ws[addr] = res; | ||||
|         if (res) { | ||||
|           if (dense) { | ||||
|             if (!ws[_R + R]) | ||||
|               ws[_R + R] = []; | ||||
|             ws[_R + R][C] = res; | ||||
|           } else { | ||||
|             var addr = encode_cell({ r: _R + R, c: C }); | ||||
|             ws[addr] = res; | ||||
|           } | ||||
|         } | ||||
|       }); | ||||
|     }); | ||||
|     _R += _tile.nrows; | ||||
| @ -714,9 +747,14 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| function parse_TST_TableInfoArchive(M, root) { | ||||
| function parse_TST_TableInfoArchive(M, root, opts) { | ||||
|   var pb = parse_shallow(root.data); | ||||
|   var out = { "!ref": "A1" }; | ||||
|   var out; | ||||
|   if (!(opts == null ? void 0 : opts.dense)) | ||||
|     out = { "!ref": "A1" }; | ||||
|   else | ||||
|     out = []; | ||||
|   out["!ref"] = "A1"; | ||||
|   var tableref = M[parse_TSP_Reference(pb[2][0].data)]; | ||||
|   var mtype = varint_to_i32(tableref[0].meta[1][0].data); | ||||
|   if (mtype != 6001) | ||||
| @ -724,7 +762,7 @@ function parse_TST_TableInfoArchive(M, root) { | ||||
|   parse_TST_TableModelArchive(M, tableref[0], out); | ||||
|   return out; | ||||
| } | ||||
| function parse_TN_SheetArchive(M, root) { | ||||
| function parse_TN_SheetArchive(M, root, opts) { | ||||
|   var _a; | ||||
|   var pb = parse_shallow(root.data); | ||||
|   var out = { | ||||
| @ -736,12 +774,12 @@ function parse_TN_SheetArchive(M, root) { | ||||
|     M[off].forEach(function(m) { | ||||
|       var mtype = varint_to_i32(m.meta[1][0].data); | ||||
|       if (mtype == 6e3) | ||||
|         out.sheets.push(parse_TST_TableInfoArchive(M, m)); | ||||
|         out.sheets.push(parse_TST_TableInfoArchive(M, m, opts)); | ||||
|     }); | ||||
|   }); | ||||
|   return out; | ||||
| } | ||||
| function parse_TN_DocumentArchive(M, root) { | ||||
| function parse_TN_DocumentArchive(M, root, opts) { | ||||
|   var _a; | ||||
|   var out = book_new(); | ||||
|   var pb = parse_shallow(root.data); | ||||
| @ -752,7 +790,7 @@ function parse_TN_DocumentArchive(M, root) { | ||||
|     M[off].forEach(function(m) { | ||||
|       var mtype = varint_to_i32(m.meta[1][0].data); | ||||
|       if (mtype == 2) { | ||||
|         var root2 = parse_TN_SheetArchive(M, m); | ||||
|         var root2 = parse_TN_SheetArchive(M, m, opts); | ||||
|         root2.sheets.forEach(function(sheet, idx) { | ||||
|           book_append_sheet(out, sheet, idx == 0 ? root2.name : root2.name + "_" + idx, true); | ||||
|         }); | ||||
| @ -764,7 +802,7 @@ function parse_TN_DocumentArchive(M, root) { | ||||
|   out.bookType = "numbers"; | ||||
|   return out; | ||||
| } | ||||
| function parse_numbers_iwa(cfb) { | ||||
| function parse_numbers_iwa(cfb, opts) { | ||||
|   var _a, _b, _c, _d, _e, _f, _g, _h; | ||||
|   var M = {}, indices = []; | ||||
|   cfb.FullPaths.forEach(function(p) { | ||||
| @ -810,7 +848,7 @@ function parse_numbers_iwa(cfb) { | ||||
|     }); | ||||
|   if (!docroot) | ||||
|     throw new Error("Cannot find Document root"); | ||||
|   return parse_TN_DocumentArchive(M, docroot); | ||||
|   return parse_TN_DocumentArchive(M, docroot, opts); | ||||
| } | ||||
| function write_tile_row(tri, data, SST, wide) { | ||||
|   var _a, _b; | ||||
|  | ||||
| @ -69,10 +69,10 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ { | ||||
| 	if(safegetzipfile(zip, 'Index/Document.iwa')) { | ||||
| 		if(typeof Uint8Array == "undefined") throw new Error('NUMBERS file parsing requires Uint8Array support'); | ||||
| 		if(typeof parse_numbers_iwa != "undefined") { | ||||
| 			if(zip.FileIndex) return parse_numbers_iwa(zip); | ||||
| 			if(zip.FileIndex) return parse_numbers_iwa(zip, opts); | ||||
| 			var _zip = CFB.utils.cfb_new(); | ||||
| 			zipentries(zip).forEach(function(e) { zip_add_file(_zip, e, getzipbin(zip, e)); }); | ||||
| 			return parse_numbers_iwa(_zip); | ||||
| 			return parse_numbers_iwa(_zip, opts); | ||||
| 		} | ||||
| 		throw new Error('Unsupported NUMBERS file'); | ||||
| 	} | ||||
|  | ||||
| @ -1,4 +1,7 @@ | ||||
| /*! sheetjs (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| var subarray = typeof Uint8Array !== "undefined" && typeof Uint8Array.prototype.subarray != "undefined" ? "subarray" : "slice"; | ||||
| if (typeof Buffer !== "undefined" && typeof Buffer.prototype.subarray == "undefined") | ||||
|   subarray = "slice"; | ||||
| function u8_to_dataview(array) { | ||||
|   return new DataView(array.buffer, array.byteOffset, array.byteLength); | ||||
| } | ||||
| @ -117,7 +120,7 @@ function write_varint49(v) { | ||||
|       usz[L] = v / 16777216 >>> 21 & 127; | ||||
|       ++L; | ||||
|     } | ||||
|   return usz.slice(0, L); | ||||
|   return usz[subarray](0, L); | ||||
| } | ||||
| function varint_to_i32(buf) { | ||||
|   var l = 0, i32 = buf[l] & 127; | ||||
| @ -153,22 +156,22 @@ function parse_shallow(buf) { | ||||
|           var l = ptr[0]; | ||||
|           while (buf[ptr[0]++] >= 128) | ||||
|             ; | ||||
|           res = buf.slice(l, ptr[0]); | ||||
|           res = buf[subarray](l, ptr[0]); | ||||
|         } | ||||
|         break; | ||||
|       case 5: | ||||
|         len = 4; | ||||
|         res = buf.slice(ptr[0], ptr[0] + len); | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 1: | ||||
|         len = 8; | ||||
|         res = buf.slice(ptr[0], ptr[0] + len); | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 2: | ||||
|         len = parse_varint49(buf, ptr); | ||||
|         res = buf.slice(ptr[0], ptr[0] + len); | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 3: | ||||
| @ -210,7 +213,7 @@ function parse_iwa_file(buf) { | ||||
|   var out = [], ptr = [0]; | ||||
|   while (ptr[0] < buf.length) { | ||||
|     var len = parse_varint49(buf, ptr); | ||||
|     var ai = parse_shallow(buf.slice(ptr[0], ptr[0] + len)); | ||||
|     var ai = parse_shallow(buf[subarray](ptr[0], ptr[0] + len)); | ||||
|     ptr[0] += len; | ||||
|     var res = { | ||||
|       id: varint_to_i32(ai[1][0].data), | ||||
| @ -221,7 +224,7 @@ function parse_iwa_file(buf) { | ||||
|       var fl = varint_to_i32(mi[3][0].data); | ||||
|       res.messages.push({ | ||||
|         meta: mi, | ||||
|         data: buf.slice(ptr[0], ptr[0] + fl) | ||||
|         data: buf[subarray](ptr[0], ptr[0] + fl) | ||||
|       }); | ||||
|       ptr[0] += fl; | ||||
|     }); | ||||
| @ -281,7 +284,7 @@ function parse_snappy_chunk(type, buf) { | ||||
|         len++; | ||||
|         ptr[0] += c; | ||||
|       } | ||||
|       chunks.push(buf.slice(ptr[0], ptr[0] + len)); | ||||
|       chunks.push(buf[subarray](ptr[0], ptr[0] + len)); | ||||
|       ptr[0] += len; | ||||
|       continue; | ||||
|     } else { | ||||
| @ -300,35 +303,57 @@ function parse_snappy_chunk(type, buf) { | ||||
|           ptr[0] += 4; | ||||
|         } | ||||
|       } | ||||
|       chunks = [u8concat(chunks)]; | ||||
|       if (offset == 0) | ||||
|         throw new Error("Invalid offset 0"); | ||||
|       if (offset > chunks[0].length) | ||||
|         throw new Error("Invalid offset beyond length"); | ||||
|       if (length >= offset) { | ||||
|         chunks.push(chunks[0].slice(-offset)); | ||||
|         length -= offset; | ||||
|         while (length >= chunks[chunks.length - 1].length) { | ||||
|           chunks.push(chunks[chunks.length - 1]); | ||||
|           length -= chunks[chunks.length - 1].length; | ||||
|         } | ||||
|       var j = chunks.length - 1, off = offset; | ||||
|       while (j >= 0 && off >= chunks[j].length) { | ||||
|         off -= chunks[j].length; | ||||
|         --j; | ||||
|       } | ||||
|       chunks.push(chunks[0].slice(-offset, -offset + length)); | ||||
|       if (j < 0) { | ||||
|         if (off == 0) | ||||
|           off = chunks[j = 0].length; | ||||
|         else | ||||
|           throw new Error("Invalid offset beyond length"); | ||||
|       } | ||||
|       if (length < off) | ||||
|         chunks.push(chunks[j][subarray](-off, -off + length)); | ||||
|       else { | ||||
|         if (off > 0) { | ||||
|           chunks.push(chunks[j][subarray](-off)); | ||||
|           length -= off; | ||||
|         } | ||||
|         ++j; | ||||
|         while (length >= chunks[j].length) { | ||||
|           chunks.push(chunks[j]); | ||||
|           length -= chunks[j].length; | ||||
|           ++j; | ||||
|         } | ||||
|         if (length) | ||||
|           chunks.push(chunks[j][subarray](0, length)); | ||||
|       } | ||||
|       if (chunks.length > 100) | ||||
|         chunks = [u8concat(chunks)]; | ||||
|     } | ||||
|   } | ||||
|   var o = u8concat(chunks); | ||||
|   if (o.length != usz) | ||||
|     throw new Error("Unexpected length: ".concat(o.length, " != ").concat(usz)); | ||||
|   return o; | ||||
|   if (chunks.reduce(function(acc, u8) { | ||||
|     return acc + u8.length; | ||||
|   }, 0) != usz) | ||||
|     throw new Error("Unexpected length: ".concat(chunks.reduce(function(acc, u8) { | ||||
|       return acc + u8.length; | ||||
|     }, 0), " != ").concat(usz)); | ||||
|   return chunks; | ||||
| } | ||||
| function decompress_iwa_file(buf) { | ||||
|   if (Array.isArray(buf)) | ||||
|     buf = new Uint8Array(buf); | ||||
|   var out = []; | ||||
|   var l = 0; | ||||
|   while (l < buf.length) { | ||||
|     var t = buf[l++]; | ||||
|     var len = buf[l] | buf[l + 1] << 8 | buf[l + 2] << 16; | ||||
|     l += 3; | ||||
|     out.push(parse_snappy_chunk(t, buf.slice(l, l + len))); | ||||
|     out.push.apply(out, parse_snappy_chunk(t, buf[subarray](l, l + len))); | ||||
|     l += len; | ||||
|   } | ||||
|   if (l !== buf.length) | ||||
| @ -361,7 +386,7 @@ function compress_iwa_file(buf) { | ||||
|       L += 5; | ||||
|       out.push(new Uint8Array([252, c - 1 & 255, c - 1 >> 8 & 255, c - 1 >> 16 & 255, c - 1 >>> 24 & 255])); | ||||
|     } | ||||
|     out.push(buf.slice(l, l + c)); | ||||
|     out.push(buf[subarray](l, l + c)); | ||||
|     L += c; | ||||
|     frame[0] = 0; | ||||
|     frame[1] = L & 255; | ||||
| @ -420,11 +445,11 @@ function parse_old_storage(buf, sst, rsst, v) { | ||||
|         if (ridx > -1) | ||||
|           ret = { t: "s", v: rsst[ridx] }; | ||||
|         else | ||||
|           throw new Error("Unsupported cell type ".concat(buf.slice(0, 4))); | ||||
|           throw new Error("Unsupported cell type ".concat(buf[subarray](0, 4))); | ||||
|       } | ||||
|       break; | ||||
|     default: | ||||
|       throw new Error("Unsupported cell type ".concat(buf.slice(0, 4))); | ||||
|       throw new Error("Unsupported cell type ".concat(buf[subarray](0, 4))); | ||||
|   } | ||||
|   return ret; | ||||
| } | ||||
| @ -480,14 +505,14 @@ function parse_new_storage(buf, sst, rsst) { | ||||
|         if (ridx > -1) | ||||
|           ret = { t: "s", v: rsst[ridx] }; | ||||
|         else | ||||
|           throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf.slice(0, 4))); | ||||
|           throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf[subarray](0, 4))); | ||||
|       } | ||||
|       break; | ||||
|     case 10: | ||||
|       ret = { t: "n", v: d128 }; | ||||
|       break; | ||||
|     default: | ||||
|       throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf.slice(0, 4))); | ||||
|       throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf[subarray](0, 4))); | ||||
|   } | ||||
|   return ret; | ||||
| } | ||||
| @ -519,7 +544,7 @@ function write_new_storage(cell, sst) { | ||||
|       throw "unsupported cell type " + cell.t; | ||||
|   } | ||||
|   dv.setUint32(8, flags, true); | ||||
|   return out.slice(0, l); | ||||
|   return out[subarray](0, l); | ||||
| } | ||||
| function write_old_storage(cell, sst) { | ||||
|   var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, flags = 0; | ||||
| @ -549,7 +574,7 @@ function write_old_storage(cell, sst) { | ||||
|       throw "unsupported cell type " + cell.t; | ||||
|   } | ||||
|   dv.setUint32(4, flags, true); | ||||
|   return out.slice(0, l); | ||||
|   return out[subarray](0, l); | ||||
| } | ||||
| function parse_cell_storage(buf, sst, rsst) { | ||||
|   switch (buf[0]) { | ||||
| @ -631,9 +656,9 @@ function parse_TST_TileRowInfo(u8, type) { | ||||
|     throw "Expected ".concat(cnt, " cells, found ").concat(offsets.length); | ||||
|   var cells = []; | ||||
|   for (C = 0; C < offsets.length - 1; ++C) | ||||
|     cells[offsets[C][0]] = used_storage.subarray(offsets[C][1] * width, offsets[C + 1][1] * width); | ||||
|     cells[offsets[C][0]] = used_storage[subarray](offsets[C][1] * width, offsets[C + 1][1] * width); | ||||
|   if (offsets.length >= 1) | ||||
|     cells[offsets[offsets.length - 1][0]] = used_storage.subarray(offsets[offsets.length - 1][1] * width); | ||||
|     cells[offsets[offsets.length - 1][0]] = used_storage[subarray](offsets[offsets.length - 1][1] * width); | ||||
|   return { R: R, cells: cells }; | ||||
| } | ||||
| function parse_TST_Tile(M, root) { | ||||
| @ -674,6 +699,7 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|   if (range.e.c < 0) | ||||
|     throw new Error("Invalid col varint ".concat(pb[7][0].data)); | ||||
|   ws["!ref"] = encode_range(range); | ||||
|   var dense = Array.isArray(ws); | ||||
|   var store = parse_shallow(pb[4][0].data); | ||||
|   var sst = parse_TST_TableDataList(M, M[parse_TSP_Reference(store[4][0].data)][0]); | ||||
|   var rsst = ((_a = store[17]) == null ? void 0 : _a[0]) ? parse_TST_TableDataList(M, M[parse_TSP_Reference(store[17][0].data)][0]) : []; | ||||
| @ -688,10 +714,17 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|     var _tile = parse_TST_Tile(M, ref2); | ||||
|     _tile.data.forEach(function(row, R) { | ||||
|       row.forEach(function(buf, C) { | ||||
|         var addr = encode_cell({ r: _R + R, c: C }); | ||||
|         var res = parse_cell_storage(buf, sst, rsst); | ||||
|         if (res) | ||||
|           ws[addr] = res; | ||||
|         if (res) { | ||||
|           if (dense) { | ||||
|             if (!ws[_R + R]) | ||||
|               ws[_R + R] = []; | ||||
|             ws[_R + R][C] = res; | ||||
|           } else { | ||||
|             var addr = encode_cell({ r: _R + R, c: C }); | ||||
|             ws[addr] = res; | ||||
|           } | ||||
|         } | ||||
|       }); | ||||
|     }); | ||||
|     _R += _tile.nrows; | ||||
| @ -714,9 +747,14 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| function parse_TST_TableInfoArchive(M, root) { | ||||
| function parse_TST_TableInfoArchive(M, root, opts) { | ||||
|   var pb = parse_shallow(root.data); | ||||
|   var out = { "!ref": "A1" }; | ||||
|   var out; | ||||
|   if (!(opts == null ? void 0 : opts.dense)) | ||||
|     out = { "!ref": "A1" }; | ||||
|   else | ||||
|     out = []; | ||||
|   out["!ref"] = "A1"; | ||||
|   var tableref = M[parse_TSP_Reference(pb[2][0].data)]; | ||||
|   var mtype = varint_to_i32(tableref[0].meta[1][0].data); | ||||
|   if (mtype != 6001) | ||||
| @ -724,7 +762,7 @@ function parse_TST_TableInfoArchive(M, root) { | ||||
|   parse_TST_TableModelArchive(M, tableref[0], out); | ||||
|   return out; | ||||
| } | ||||
| function parse_TN_SheetArchive(M, root) { | ||||
| function parse_TN_SheetArchive(M, root, opts) { | ||||
|   var _a; | ||||
|   var pb = parse_shallow(root.data); | ||||
|   var out = { | ||||
| @ -736,12 +774,12 @@ function parse_TN_SheetArchive(M, root) { | ||||
|     M[off].forEach(function(m) { | ||||
|       var mtype = varint_to_i32(m.meta[1][0].data); | ||||
|       if (mtype == 6e3) | ||||
|         out.sheets.push(parse_TST_TableInfoArchive(M, m)); | ||||
|         out.sheets.push(parse_TST_TableInfoArchive(M, m, opts)); | ||||
|     }); | ||||
|   }); | ||||
|   return out; | ||||
| } | ||||
| function parse_TN_DocumentArchive(M, root) { | ||||
| function parse_TN_DocumentArchive(M, root, opts) { | ||||
|   var _a; | ||||
|   var out = book_new(); | ||||
|   var pb = parse_shallow(root.data); | ||||
| @ -752,7 +790,7 @@ function parse_TN_DocumentArchive(M, root) { | ||||
|     M[off].forEach(function(m) { | ||||
|       var mtype = varint_to_i32(m.meta[1][0].data); | ||||
|       if (mtype == 2) { | ||||
|         var root2 = parse_TN_SheetArchive(M, m); | ||||
|         var root2 = parse_TN_SheetArchive(M, m, opts); | ||||
|         root2.sheets.forEach(function(sheet, idx) { | ||||
|           book_append_sheet(out, sheet, idx == 0 ? root2.name : root2.name + "_" + idx, true); | ||||
|         }); | ||||
| @ -764,7 +802,7 @@ function parse_TN_DocumentArchive(M, root) { | ||||
|   out.bookType = "numbers"; | ||||
|   return out; | ||||
| } | ||||
| function parse_numbers_iwa(cfb) { | ||||
| function parse_numbers_iwa(cfb, opts) { | ||||
|   var _a, _b, _c, _d, _e, _f, _g, _h; | ||||
|   var M = {}, indices = []; | ||||
|   cfb.FullPaths.forEach(function(p) { | ||||
| @ -810,7 +848,7 @@ function parse_numbers_iwa(cfb) { | ||||
|     }); | ||||
|   if (!docroot) | ||||
|     throw new Error("Cannot find Document root"); | ||||
|   return parse_TN_DocumentArchive(M, docroot); | ||||
|   return parse_TN_DocumentArchive(M, docroot, opts); | ||||
| } | ||||
| function write_tile_row(tri, data, SST, wide) { | ||||
|   var _a, _b; | ||||
|  | ||||
| @ -3,7 +3,7 @@ | ||||
| 
 | ||||
| /* these are type imports and do not show up in the generated JS */ | ||||
| import { CFB$Container, CFB$Entry } from 'cfb'; | ||||
| import { WorkBook, WorkSheet, Range, CellObject } from '../'; | ||||
| import { WorkBook, WorkSheet, Range, CellObject, ParsingOptions, WritingOptions } from '../'; | ||||
| import type { utils } from "../"; | ||||
| 
 | ||||
| declare var encode_cell: typeof utils.encode_cell; | ||||
| @ -17,6 +17,9 @@ declare var CFB: typeof _CFB; | ||||
| //<<import { utils } from "../../";
 | ||||
| //<<const { encode_cell, encode_range, book_new, book_append_sheet } = utils;
 | ||||
| 
 | ||||
| var subarray = typeof Uint8Array !== "undefined" && typeof Uint8Array.prototype.subarray != "undefined" ? "subarray" : "slice"; | ||||
| if(typeof Buffer !== "undefined" && typeof Buffer.prototype.subarray == "undefined") subarray = "slice"; | ||||
| 
 | ||||
| function u8_to_dataview(array: Uint8Array): DataView { return new DataView(array.buffer, array.byteOffset, array.byteLength); } | ||||
| //<<export { u8_to_dataview };
 | ||||
| 
 | ||||
| @ -104,7 +107,7 @@ function write_varint49(v: number): Uint8Array { | ||||
| 		if(v <= 0x3FFFFFFFFFF) break sz; | ||||
| 		usz[L-1] |= 0x80; usz[L] = ((v/0x1000000) >>> 21) & 0x7F; ++L; | ||||
| 	} | ||||
| 	return usz.slice(0, L); | ||||
| 	return usz[subarray](0, L); | ||||
| } | ||||
| //<<export { parse_varint49, write_varint49 };
 | ||||
| 
 | ||||
| @ -141,11 +144,11 @@ function parse_shallow(buf: Uint8Array): ProtoMessage { | ||||
| 			case 0: { | ||||
| 				var l = ptr[0]; | ||||
| 				while(buf[ptr[0]++] >= 0x80); | ||||
| 				res = buf.slice(l, ptr[0]); | ||||
| 				res = buf[subarray](l, ptr[0]); | ||||
| 			} break; | ||||
| 			case 5: len = 4; res = buf.slice(ptr[0], ptr[0] + len); ptr[0] += len; break; | ||||
| 			case 1: len = 8; res = buf.slice(ptr[0], ptr[0] + len); ptr[0] += len; break; | ||||
| 			case 2: len = parse_varint49(buf, ptr); res = buf.slice(ptr[0], ptr[0] + len); ptr[0] += len; break; | ||||
| 			case 5: len = 4; res = buf[subarray](ptr[0], ptr[0] + len); ptr[0] += len; break; | ||||
| 			case 1: len = 8; res = buf[subarray](ptr[0], ptr[0] + len); ptr[0] += len; break; | ||||
| 			case 2: len = parse_varint49(buf, ptr); res = buf[subarray](ptr[0], ptr[0] + len); ptr[0] += len; break; | ||||
| 			case 3: // Start group
 | ||||
| 			case 4: // End group
 | ||||
| 			default: throw new Error(`PB Type ${type} for Field ${num} at offset ${off}`); | ||||
| @ -194,7 +197,7 @@ function parse_iwa_file(buf: Uint8Array): IWAArchiveInfo[] { | ||||
| 	while(ptr[0] < buf.length) { | ||||
| 		/* .TSP.ArchiveInfo */ | ||||
| 		var len = parse_varint49(buf, ptr); | ||||
| 		var ai = parse_shallow(buf.slice(ptr[0], ptr[0] + len)); | ||||
| 		var ai = parse_shallow(buf[subarray](ptr[0], ptr[0] + len)); | ||||
| 		ptr[0] += len; | ||||
| 
 | ||||
| 		var res: IWAArchiveInfo = { | ||||
| @ -207,7 +210,7 @@ function parse_iwa_file(buf: Uint8Array): IWAArchiveInfo[] { | ||||
| 			var fl = varint_to_i32(mi[3][0].data); | ||||
| 			res.messages.push({ | ||||
| 				meta: mi, | ||||
| 				data: buf.slice(ptr[0], ptr[0] + fl) | ||||
| 				data: buf[subarray](ptr[0], ptr[0] + fl) | ||||
| 			}); | ||||
| 			ptr[0] += fl; | ||||
| 		}); | ||||
| @ -243,7 +246,7 @@ function write_iwa_file(ias: IWAArchiveInfo[]): Uint8Array { | ||||
| //<<export { IWAMessage, IWAArchiveInfo, parse_iwa_file, write_iwa_file };
 | ||||
| 
 | ||||
| /** Decompress a snappy chunk */ | ||||
| function parse_snappy_chunk(type: number, buf: Uint8Array): Uint8Array { | ||||
| function parse_snappy_chunk(type: number, buf: Uint8Array): Uint8Array[] { | ||||
| 	if(type != 0) throw new Error(`Unexpected Snappy chunk type ${type}`); | ||||
| 	var ptr: Ptr = [0]; | ||||
| 
 | ||||
| @ -263,7 +266,7 @@ function parse_snappy_chunk(type: number, buf: Uint8Array): Uint8Array { | ||||
| 				len >>>=0; len++; | ||||
| 				ptr[0] += c; | ||||
| 			} | ||||
| 			chunks.push(buf.slice(ptr[0], ptr[0] + len)); ptr[0] += len; continue; | ||||
| 			chunks.push(buf[subarray](ptr[0], ptr[0] + len)); ptr[0] += len; continue; | ||||
| 		} else { | ||||
| 			var offset = 0, length = 0; | ||||
| 			if(tag == 1) { | ||||
| @ -275,32 +278,38 @@ function parse_snappy_chunk(type: number, buf: Uint8Array): Uint8Array { | ||||
| 				if(tag == 2) { offset = buf[ptr[0]] | (buf[ptr[0]+1]<<8); ptr[0] += 2; } | ||||
| 				else { offset = (buf[ptr[0]] | (buf[ptr[0]+1]<<8) | (buf[ptr[0]+2]<<16) | (buf[ptr[0]+3]<<24))>>>0; ptr[0] += 4; } | ||||
| 			} | ||||
| 			chunks = [u8concat(chunks)]; | ||||
| 			if(offset == 0) throw new Error("Invalid offset 0"); | ||||
| 			if(offset > chunks[0].length) throw new Error("Invalid offset beyond length"); | ||||
| 			if(length >= offset) { | ||||
| 				chunks.push(chunks[0].slice(-offset)); length -= offset; | ||||
| 				while(length >= chunks[chunks.length-1].length) { | ||||
| 					chunks.push(chunks[chunks.length - 1]); | ||||
| 					length -= chunks[chunks.length - 1].length; | ||||
| 				} | ||||
| 			var j = chunks.length - 1, off = offset; | ||||
| 			while(j >=0 && off >= chunks[j].length) { off -= chunks[j].length; --j; } | ||||
| 			if(j < 0) { | ||||
| 				if(off == 0) off = chunks[(j = 0)].length; | ||||
| 				else throw new Error("Invalid offset beyond length"); | ||||
| 			} | ||||
| 			chunks.push(chunks[0].slice(-offset, -offset + length)); | ||||
| 			if(length < off) chunks.push(chunks[j][subarray](-off, -off + length)); | ||||
| 			else { | ||||
| 				if(off > 0) { chunks.push(chunks[j][subarray](-off)); length -= off; } ++j; | ||||
| 				while(length >= chunks[j].length) { chunks.push(chunks[j]); length -= chunks[j].length; ++j; } | ||||
| 				if(length) chunks.push(chunks[j][subarray](0, length)); | ||||
| 			} | ||||
| 			if(chunks.length > 100) chunks = [u8concat(chunks)]; | ||||
| 		} | ||||
| 	} | ||||
| 	var o = u8concat(chunks); | ||||
| 	if(o.length != usz) throw new Error(`Unexpected length: ${o.length} != ${usz}`); | ||||
| 	return o; | ||||
| 	if(chunks.reduce((acc, u8) => acc + u8.length, 0) != usz) throw new Error(`Unexpected length: ${chunks.reduce((acc, u8) => acc + u8.length, 0)} != ${usz}`); | ||||
| 	return chunks; | ||||
| 	//var o = u8concat(chunks);
 | ||||
| 	//if(o.length != usz) throw new Error(`Unexpected length: ${o.length} != ${usz}`);
 | ||||
| 	//return o;
 | ||||
| } | ||||
| 
 | ||||
| /** Decompress IWA file */ | ||||
| function decompress_iwa_file(buf: Uint8Array): Uint8Array { | ||||
| 	if(Array.isArray(buf)) buf = new Uint8Array(buf); | ||||
| 	var out: Uint8Array[] = []; | ||||
| 	var l = 0; | ||||
| 	while(l < buf.length) { | ||||
| 		var t = buf[l++]; | ||||
| 		var len = buf[l] | (buf[l+1]<<8) | (buf[l+2] << 16); l += 3; | ||||
| 		out.push(parse_snappy_chunk(t, buf.slice(l, l + len))); | ||||
| 		out.push.apply(out, parse_snappy_chunk(t, buf[subarray](l, l + len))); | ||||
| 		l += len; | ||||
| 	} | ||||
| 	if(l !== buf.length) throw new Error("data is not a valid framed stream!"); | ||||
| @ -325,7 +334,7 @@ function compress_iwa_file(buf: Uint8Array): Uint8Array { | ||||
| 		else if(c <= 0x1000000)   { L += 4; out.push(new Uint8Array([0xF8, (c-1) & 0xFF, ((c-1) >> 8) & 0xFF, ((c-1) >> 16) & 0xFF])); } | ||||
| 		else if(c <= 0x100000000) { L += 5; out.push(new Uint8Array([0xFC, (c-1) & 0xFF, ((c-1) >> 8) & 0xFF, ((c-1) >> 16) & 0xFF, ((c-1) >>> 24) & 0xFF])); } | ||||
| 
 | ||||
| 		out.push(buf.slice(l, l + c)); L += c; | ||||
| 		out.push(buf[subarray](l, l + c)); L += c; | ||||
| 
 | ||||
| 		frame[0] = 0; | ||||
| 		frame[1] = L & 0xFF; frame[2] = (L >>  8) & 0xFF; frame[3] = (L >> 16) & 0xFF; | ||||
| @ -361,9 +370,9 @@ function parse_old_storage(buf: Uint8Array, sst: string[], rsst: string[], v: 0| | ||||
| 		case 8: ret = { t: "e", v: 0}; break; // "formula error" TODO: enumerate and map errors to csf equivalents
 | ||||
| 		case 9: { // "rich text"
 | ||||
| 			if(ridx > -1) ret = { t: "s", v: rsst[ridx] }; | ||||
| 			else throw new Error(`Unsupported cell type ${buf.slice(0,4)}`); | ||||
| 			else throw new Error(`Unsupported cell type ${buf[subarray](0,4)}`); | ||||
| 		} break; | ||||
| 		default: throw new Error(`Unsupported cell type ${buf.slice(0,4)}`); | ||||
| 		default: throw new Error(`Unsupported cell type ${buf[subarray](0,4)}`); | ||||
| 	} | ||||
| 	/* TODO: Some fields appear after the cell data */ | ||||
| 
 | ||||
| @ -397,10 +406,10 @@ function parse_new_storage(buf: Uint8Array, sst: string[], rsst: string[]): Cell | ||||
| 		case 8: ret = { t: "e", v: 0}; break; // "formula error" TODO: enumerate and map errors to csf equivalents
 | ||||
| 		case 9: { // "rich text"
 | ||||
| 			if(ridx > -1) ret = { t: "s", v: rsst[ridx] }; | ||||
| 			else throw new Error(`Unsupported cell type ${buf[1]} : ${flags & 0x1F} : ${buf.slice(0,4)}`); | ||||
| 			else throw new Error(`Unsupported cell type ${buf[1]} : ${flags & 0x1F} : ${buf[subarray](0,4)}`); | ||||
| 		} break; | ||||
| 		case 10: ret = { t: "n", v: d128 }; break; // currency
 | ||||
| 		default: throw new Error(`Unsupported cell type ${buf[1]} : ${flags & 0x1F} : ${buf.slice(0,4)}`); | ||||
| 		default: throw new Error(`Unsupported cell type ${buf[1]} : ${flags & 0x1F} : ${buf[subarray](0,4)}`); | ||||
| 	} | ||||
| 	/* TODO: All styling fields appear after the cell data */ | ||||
| 
 | ||||
| @ -420,7 +429,7 @@ function write_new_storage(cell: CellObject, sst: string[]): Uint8Array { | ||||
| 		default: throw "unsupported cell type " + cell.t; | ||||
| 	} | ||||
| 	dv.setUint32(8, flags, true); | ||||
| 	return out.slice(0, l); | ||||
| 	return out[subarray](0, l); | ||||
| } | ||||
| /** Write a cell "old storage" (version 3) */ | ||||
| function write_old_storage(cell: CellObject, sst: string[]): Uint8Array { | ||||
| @ -435,7 +444,7 @@ function write_old_storage(cell: CellObject, sst: string[]): Uint8Array { | ||||
| 		default: throw "unsupported cell type " + cell.t; | ||||
| 	} | ||||
| 	dv.setUint32(4, flags, true); | ||||
| 	return out.slice(0, l); | ||||
| 	return out[subarray](0, l); | ||||
| } | ||||
| //<<export { write_new_storage, write_old_storage };
 | ||||
| function parse_cell_storage(buf: Uint8Array, sst: string[], rsst: string[]): CellObject | void { | ||||
| @ -532,8 +541,8 @@ function parse_TST_TileRowInfo(u8: Uint8Array, type: TileStorageType): TileRowIn | ||||
| 	if(offsets.length != cnt) throw `Expected ${cnt} cells, found ${offsets.length}`; | ||||
| 
 | ||||
| 	var cells: Uint8Array[] = []; | ||||
| 	for(C = 0; C < offsets.length - 1; ++C) cells[offsets[C][0]] = used_storage.subarray(offsets[C][1] * width, offsets[C+1][1] * width); | ||||
| 	if(offsets.length >= 1) cells[offsets[offsets.length - 1][0]] = used_storage.subarray(offsets[offsets.length - 1][1] * width); | ||||
| 	for(C = 0; C < offsets.length - 1; ++C) cells[offsets[C][0]] = used_storage[subarray](offsets[C][1] * width, offsets[C+1][1] * width); | ||||
| 	if(offsets.length >= 1) cells[offsets[offsets.length - 1][0]] = used_storage[subarray](offsets[offsets.length - 1][1] * width); | ||||
| 	return { R, cells }; | ||||
| } | ||||
| 
 | ||||
| @ -571,7 +580,7 @@ function parse_TST_TableModelArchive(M: MessageSpace, root: IWAMessage, ws: Work | ||||
| 	range.e.c = (varint_to_i32(pb[7][0].data) >>> 0) - 1; | ||||
| 	if(range.e.c < 0) throw new Error(`Invalid col varint ${pb[7][0].data}`); | ||||
| 	ws["!ref"] = encode_range(range); | ||||
| 
 | ||||
| 	var dense = Array.isArray(ws); | ||||
| 	// .TST.DataStore
 | ||||
| 	var store = parse_shallow(pb[4][0].data); | ||||
| 	var sst = parse_TST_TableDataList(M, M[parse_TSP_Reference(store[4][0].data)][0]); | ||||
| @ -590,9 +599,16 @@ function parse_TST_TableModelArchive(M: MessageSpace, root: IWAMessage, ws: Work | ||||
| 		var _tile = parse_TST_Tile(M, ref); | ||||
| 		_tile.data.forEach((row, R) => { | ||||
| 			row.forEach((buf, C) => { | ||||
| 				var addr = encode_cell({r:_R + R,c:C}); | ||||
| 				var res = parse_cell_storage(buf, sst, rsst); | ||||
| 				if(res) ws[addr] = res; | ||||
| 				if(res) { | ||||
| 					if(dense) { | ||||
| 						if(!ws[_R + R]) ws[_R + R] = []; | ||||
| 						ws[_R + R][C] = res; | ||||
| 					} else { | ||||
| 						var addr = encode_cell({r:_R + R,c:C}); | ||||
| 						ws[addr] = res; | ||||
| 					} | ||||
| 				} | ||||
| 			}); | ||||
| 		}); | ||||
| 		_R += _tile.nrows; | ||||
| @ -617,9 +633,13 @@ function parse_TST_TableModelArchive(M: MessageSpace, root: IWAMessage, ws: Work | ||||
| } | ||||
| 
 | ||||
| /** Parse .TST.TableInfoArchive (6000) */ | ||||
| function parse_TST_TableInfoArchive(M: MessageSpace, root: IWAMessage): WorkSheet { | ||||
| function parse_TST_TableInfoArchive(M: MessageSpace, root: IWAMessage, opts?: ParsingOptions): WorkSheet { | ||||
| 	var pb = parse_shallow(root.data); | ||||
| 	var out: WorkSheet = { "!ref": "A1" }; | ||||
| 	// ESBuild #2375
 | ||||
| 	var out: WorkSheet; | ||||
| 	if(!opts?.dense) out =  ({ "!ref": "A1" }); | ||||
| 	else out = ([] as any); | ||||
| 	out["!ref"] = "A1"; | ||||
| 	var tableref = M[parse_TSP_Reference(pb[2][0].data)]; | ||||
| 	var mtype = varint_to_i32(tableref[0].meta[1][0].data); | ||||
| 	if(mtype != 6001) throw new Error(`6000 unexpected reference to ${mtype}`); | ||||
| @ -632,7 +652,7 @@ interface NSheet { | ||||
| 	sheets: WorkSheet[]; | ||||
| } | ||||
| /** Parse .TN.SheetArchive (2) */ | ||||
| function parse_TN_SheetArchive(M: MessageSpace, root: IWAMessage): NSheet { | ||||
| function parse_TN_SheetArchive(M: MessageSpace, root: IWAMessage, opts?: ParsingOptions): NSheet { | ||||
| 	var pb = parse_shallow(root.data); | ||||
| 	var out: NSheet = { | ||||
| 		name: (pb[1]?.[0] ? u8str(pb[1][0].data) : ""), | ||||
| @ -642,14 +662,14 @@ function parse_TN_SheetArchive(M: MessageSpace, root: IWAMessage): NSheet { | ||||
| 	shapeoffs.forEach((off) => { | ||||
| 		M[off].forEach((m: IWAMessage) => { | ||||
| 			var mtype = varint_to_i32(m.meta[1][0].data); | ||||
| 			if(mtype == 6000) out.sheets.push(parse_TST_TableInfoArchive(M, m)); | ||||
| 			if(mtype == 6000) out.sheets.push(parse_TST_TableInfoArchive(M, m, opts)); | ||||
| 		}); | ||||
| 	}); | ||||
| 	return out; | ||||
| } | ||||
| 
 | ||||
| /** Parse .TN.DocumentArchive */ | ||||
| function parse_TN_DocumentArchive(M: MessageSpace, root: IWAMessage): WorkBook { | ||||
| function parse_TN_DocumentArchive(M: MessageSpace, root: IWAMessage, opts?: ParsingOptions): WorkBook { | ||||
| 	var out = book_new(); | ||||
| 	var pb = parse_shallow(root.data); | ||||
| 	if(pb[2]?.[0]) throw new Error("Keynote presentations are not supported"); | ||||
| @ -667,7 +687,7 @@ function parse_TN_DocumentArchive(M: MessageSpace, root: IWAMessage): WorkBook { | ||||
| 		M[off].forEach((m: IWAMessage) => { | ||||
| 			var mtype = varint_to_i32(m.meta[1][0].data); | ||||
| 			if(mtype == 2) { | ||||
| 				var root = parse_TN_SheetArchive(M, m); | ||||
| 				var root = parse_TN_SheetArchive(M, m, opts); | ||||
| 				root.sheets.forEach((sheet, idx) => { book_append_sheet(out, sheet, idx == 0 ? root.name : root.name + "_" + idx, true); }); | ||||
| 			} | ||||
| 		}); | ||||
| @ -678,7 +698,7 @@ function parse_TN_DocumentArchive(M: MessageSpace, root: IWAMessage): WorkBook { | ||||
| } | ||||
| 
 | ||||
| /** Parse NUMBERS file */ | ||||
| function parse_numbers_iwa(cfb: CFB$Container): WorkBook { | ||||
| function parse_numbers_iwa(cfb: CFB$Container, opts?: ParsingOptions ): WorkBook { | ||||
| 	var M: MessageSpace = {}, indices: number[] = []; | ||||
| 	cfb.FullPaths.forEach(p => { if(p.match(/\.iwpv2/)) throw new Error(`Unsupported password protection`); }); | ||||
| 
 | ||||
| @ -706,7 +726,7 @@ function parse_numbers_iwa(cfb: CFB$Container): WorkBook { | ||||
| 		}); | ||||
| 	}); | ||||
| 	if(!docroot) throw new Error("Cannot find Document root"); | ||||
| 	return parse_TN_DocumentArchive(M, docroot); | ||||
| 	return parse_TN_DocumentArchive(M, docroot, opts); | ||||
| } | ||||
| 
 | ||||
| //<<export { parse_numbers_iwa };
 | ||||
| @ -784,7 +804,7 @@ function write_iwam(type: number, payload: Uint8Array): IWAMessage { | ||||
| 
 | ||||
| var USE_WIDE_ROWS = true; | ||||
| /** Write NUMBERS workbook */ | ||||
| function write_numbers_iwa(wb: WorkBook, opts: any): CFB$Container { | ||||
| function write_numbers_iwa(wb: WorkBook, opts?: WritingOptions): CFB$Container { | ||||
| 	if(!opts || !opts.numbers) throw new Error("Must pass a `numbers` option -- check the README"); | ||||
| 
 | ||||
| 	/* TODO: support multiple worksheets, larger ranges, more data types, etc */ | ||||
|  | ||||
							
								
								
									
										137
									
								
								xlsx.flow.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										137
									
								
								xlsx.flow.js
									
									
									
									
									
								
							| @ -4156,8 +4156,11 @@ function buf_array()/*:BufArray*/ { | ||||
| 
 | ||||
| 	var endbuf = function ba_endbuf() { | ||||
| 		if(!curbuf) return; | ||||
| 		if(curbuf.length > curbuf.l) { curbuf = curbuf.slice(0, curbuf.l); curbuf.l = curbuf.length; } | ||||
| 		if(curbuf.length > 0) bufs.push(curbuf); | ||||
| 		// workaround for new Buffer(3).slice(0,0) bug in bun 0.1.3
 | ||||
| 		if(curbuf.l) { | ||||
| 			if(curbuf.length > curbuf.l) { curbuf = curbuf.slice(0, curbuf.l); curbuf.l = curbuf.length; } | ||||
| 			if(curbuf.length > 0) bufs.push(curbuf); | ||||
| 		} | ||||
| 		curbuf = null; | ||||
| 	}; | ||||
| 
 | ||||
| @ -23063,6 +23066,9 @@ function write_ods(wb/*:any*/, opts/*:any*/) { | ||||
| } | ||||
| 
 | ||||
| /*! sheetjs (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| var subarray = typeof Uint8Array !== "undefined" && typeof Uint8Array.prototype.subarray != "undefined" ? "subarray" : "slice"; | ||||
| if (typeof Buffer !== "undefined" && typeof Buffer.prototype.subarray == "undefined") | ||||
|   subarray = "slice"; | ||||
| function u8_to_dataview(array) { | ||||
|   return new DataView(array.buffer, array.byteOffset, array.byteLength); | ||||
| } | ||||
| @ -23181,7 +23187,7 @@ function write_varint49(v) { | ||||
|       usz[L] = v / 16777216 >>> 21 & 127; | ||||
|       ++L; | ||||
|     } | ||||
|   return usz.slice(0, L); | ||||
|   return usz[subarray](0, L); | ||||
| } | ||||
| function varint_to_i32(buf) { | ||||
|   var l = 0, i32 = buf[l] & 127; | ||||
| @ -23217,22 +23223,22 @@ function parse_shallow(buf) { | ||||
|           var l = ptr[0]; | ||||
|           while (buf[ptr[0]++] >= 128) | ||||
|             ; | ||||
|           res = buf.slice(l, ptr[0]); | ||||
|           res = buf[subarray](l, ptr[0]); | ||||
|         } | ||||
|         break; | ||||
|       case 5: | ||||
|         len = 4; | ||||
|         res = buf.slice(ptr[0], ptr[0] + len); | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 1: | ||||
|         len = 8; | ||||
|         res = buf.slice(ptr[0], ptr[0] + len); | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 2: | ||||
|         len = parse_varint49(buf, ptr); | ||||
|         res = buf.slice(ptr[0], ptr[0] + len); | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 3: | ||||
| @ -23274,7 +23280,7 @@ function parse_iwa_file(buf) { | ||||
|   var out = [], ptr = [0]; | ||||
|   while (ptr[0] < buf.length) { | ||||
|     var len = parse_varint49(buf, ptr); | ||||
|     var ai = parse_shallow(buf.slice(ptr[0], ptr[0] + len)); | ||||
|     var ai = parse_shallow(buf[subarray](ptr[0], ptr[0] + len)); | ||||
|     ptr[0] += len; | ||||
|     var res = { | ||||
|       id: varint_to_i32(ai[1][0].data), | ||||
| @ -23285,7 +23291,7 @@ function parse_iwa_file(buf) { | ||||
|       var fl = varint_to_i32(mi[3][0].data); | ||||
|       res.messages.push({ | ||||
|         meta: mi, | ||||
|         data: buf.slice(ptr[0], ptr[0] + fl) | ||||
|         data: buf[subarray](ptr[0], ptr[0] + fl) | ||||
|       }); | ||||
|       ptr[0] += fl; | ||||
|     }); | ||||
| @ -23345,7 +23351,7 @@ function parse_snappy_chunk(type, buf) { | ||||
|         len++; | ||||
|         ptr[0] += c; | ||||
|       } | ||||
|       chunks.push(buf.slice(ptr[0], ptr[0] + len)); | ||||
|       chunks.push(buf[subarray](ptr[0], ptr[0] + len)); | ||||
|       ptr[0] += len; | ||||
|       continue; | ||||
|     } else { | ||||
| @ -23364,35 +23370,57 @@ function parse_snappy_chunk(type, buf) { | ||||
|           ptr[0] += 4; | ||||
|         } | ||||
|       } | ||||
|       chunks = [u8concat(chunks)]; | ||||
|       if (offset == 0) | ||||
|         throw new Error("Invalid offset 0"); | ||||
|       if (offset > chunks[0].length) | ||||
|         throw new Error("Invalid offset beyond length"); | ||||
|       if (length >= offset) { | ||||
|         chunks.push(chunks[0].slice(-offset)); | ||||
|         length -= offset; | ||||
|         while (length >= chunks[chunks.length - 1].length) { | ||||
|           chunks.push(chunks[chunks.length - 1]); | ||||
|           length -= chunks[chunks.length - 1].length; | ||||
|         } | ||||
|       var j = chunks.length - 1, off = offset; | ||||
|       while (j >= 0 && off >= chunks[j].length) { | ||||
|         off -= chunks[j].length; | ||||
|         --j; | ||||
|       } | ||||
|       chunks.push(chunks[0].slice(-offset, -offset + length)); | ||||
|       if (j < 0) { | ||||
|         if (off == 0) | ||||
|           off = chunks[j = 0].length; | ||||
|         else | ||||
|           throw new Error("Invalid offset beyond length"); | ||||
|       } | ||||
|       if (length < off) | ||||
|         chunks.push(chunks[j][subarray](-off, -off + length)); | ||||
|       else { | ||||
|         if (off > 0) { | ||||
|           chunks.push(chunks[j][subarray](-off)); | ||||
|           length -= off; | ||||
|         } | ||||
|         ++j; | ||||
|         while (length >= chunks[j].length) { | ||||
|           chunks.push(chunks[j]); | ||||
|           length -= chunks[j].length; | ||||
|           ++j; | ||||
|         } | ||||
|         if (length) | ||||
|           chunks.push(chunks[j][subarray](0, length)); | ||||
|       } | ||||
|       if (chunks.length > 100) | ||||
|         chunks = [u8concat(chunks)]; | ||||
|     } | ||||
|   } | ||||
|   var o = u8concat(chunks); | ||||
|   if (o.length != usz) | ||||
|     throw new Error("Unexpected length: ".concat(o.length, " != ").concat(usz)); | ||||
|   return o; | ||||
|   if (chunks.reduce(function(acc, u8) { | ||||
|     return acc + u8.length; | ||||
|   }, 0) != usz) | ||||
|     throw new Error("Unexpected length: ".concat(chunks.reduce(function(acc, u8) { | ||||
|       return acc + u8.length; | ||||
|     }, 0), " != ").concat(usz)); | ||||
|   return chunks; | ||||
| } | ||||
| function decompress_iwa_file(buf) { | ||||
|   if (Array.isArray(buf)) | ||||
|     buf = new Uint8Array(buf); | ||||
|   var out = []; | ||||
|   var l = 0; | ||||
|   while (l < buf.length) { | ||||
|     var t = buf[l++]; | ||||
|     var len = buf[l] | buf[l + 1] << 8 | buf[l + 2] << 16; | ||||
|     l += 3; | ||||
|     out.push(parse_snappy_chunk(t, buf.slice(l, l + len))); | ||||
|     out.push.apply(out, parse_snappy_chunk(t, buf[subarray](l, l + len))); | ||||
|     l += len; | ||||
|   } | ||||
|   if (l !== buf.length) | ||||
| @ -23425,7 +23453,7 @@ function compress_iwa_file(buf) { | ||||
|       L += 5; | ||||
|       out.push(new Uint8Array([252, c - 1 & 255, c - 1 >> 8 & 255, c - 1 >> 16 & 255, c - 1 >>> 24 & 255])); | ||||
|     } | ||||
|     out.push(buf.slice(l, l + c)); | ||||
|     out.push(buf[subarray](l, l + c)); | ||||
|     L += c; | ||||
|     frame[0] = 0; | ||||
|     frame[1] = L & 255; | ||||
| @ -23484,11 +23512,11 @@ function parse_old_storage(buf, sst, rsst, v) { | ||||
|         if (ridx > -1) | ||||
|           ret = { t: "s", v: rsst[ridx] }; | ||||
|         else | ||||
|           throw new Error("Unsupported cell type ".concat(buf.slice(0, 4))); | ||||
|           throw new Error("Unsupported cell type ".concat(buf[subarray](0, 4))); | ||||
|       } | ||||
|       break; | ||||
|     default: | ||||
|       throw new Error("Unsupported cell type ".concat(buf.slice(0, 4))); | ||||
|       throw new Error("Unsupported cell type ".concat(buf[subarray](0, 4))); | ||||
|   } | ||||
|   return ret; | ||||
| } | ||||
| @ -23544,14 +23572,14 @@ function parse_new_storage(buf, sst, rsst) { | ||||
|         if (ridx > -1) | ||||
|           ret = { t: "s", v: rsst[ridx] }; | ||||
|         else | ||||
|           throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf.slice(0, 4))); | ||||
|           throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf[subarray](0, 4))); | ||||
|       } | ||||
|       break; | ||||
|     case 10: | ||||
|       ret = { t: "n", v: d128 }; | ||||
|       break; | ||||
|     default: | ||||
|       throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf.slice(0, 4))); | ||||
|       throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf[subarray](0, 4))); | ||||
|   } | ||||
|   return ret; | ||||
| } | ||||
| @ -23583,7 +23611,7 @@ function write_new_storage(cell, sst) { | ||||
|       throw "unsupported cell type " + cell.t; | ||||
|   } | ||||
|   dv.setUint32(8, flags, true); | ||||
|   return out.slice(0, l); | ||||
|   return out[subarray](0, l); | ||||
| } | ||||
| function write_old_storage(cell, sst) { | ||||
|   var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, flags = 0; | ||||
| @ -23613,7 +23641,7 @@ function write_old_storage(cell, sst) { | ||||
|       throw "unsupported cell type " + cell.t; | ||||
|   } | ||||
|   dv.setUint32(4, flags, true); | ||||
|   return out.slice(0, l); | ||||
|   return out[subarray](0, l); | ||||
| } | ||||
| function parse_cell_storage(buf, sst, rsst) { | ||||
|   switch (buf[0]) { | ||||
| @ -23695,9 +23723,9 @@ function parse_TST_TileRowInfo(u8, type) { | ||||
|     throw "Expected ".concat(cnt, " cells, found ").concat(offsets.length); | ||||
|   var cells = []; | ||||
|   for (C = 0; C < offsets.length - 1; ++C) | ||||
|     cells[offsets[C][0]] = used_storage.subarray(offsets[C][1] * width, offsets[C + 1][1] * width); | ||||
|     cells[offsets[C][0]] = used_storage[subarray](offsets[C][1] * width, offsets[C + 1][1] * width); | ||||
|   if (offsets.length >= 1) | ||||
|     cells[offsets[offsets.length - 1][0]] = used_storage.subarray(offsets[offsets.length - 1][1] * width); | ||||
|     cells[offsets[offsets.length - 1][0]] = used_storage[subarray](offsets[offsets.length - 1][1] * width); | ||||
|   return { R: R, cells: cells }; | ||||
| } | ||||
| function parse_TST_Tile(M, root) { | ||||
| @ -23738,6 +23766,7 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|   if (range.e.c < 0) | ||||
|     throw new Error("Invalid col varint ".concat(pb[7][0].data)); | ||||
|   ws["!ref"] = encode_range(range); | ||||
|   var dense = Array.isArray(ws); | ||||
|   var store = parse_shallow(pb[4][0].data); | ||||
|   var sst = parse_TST_TableDataList(M, M[parse_TSP_Reference(store[4][0].data)][0]); | ||||
|   var rsst = ((_a = store[17]) == null ? void 0 : _a[0]) ? parse_TST_TableDataList(M, M[parse_TSP_Reference(store[17][0].data)][0]) : []; | ||||
| @ -23752,10 +23781,17 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|     var _tile = parse_TST_Tile(M, ref2); | ||||
|     _tile.data.forEach(function(row, R) { | ||||
|       row.forEach(function(buf, C) { | ||||
|         var addr = encode_cell({ r: _R + R, c: C }); | ||||
|         var res = parse_cell_storage(buf, sst, rsst); | ||||
|         if (res) | ||||
|           ws[addr] = res; | ||||
|         if (res) { | ||||
|           if (dense) { | ||||
|             if (!ws[_R + R]) | ||||
|               ws[_R + R] = []; | ||||
|             ws[_R + R][C] = res; | ||||
|           } else { | ||||
|             var addr = encode_cell({ r: _R + R, c: C }); | ||||
|             ws[addr] = res; | ||||
|           } | ||||
|         } | ||||
|       }); | ||||
|     }); | ||||
|     _R += _tile.nrows; | ||||
| @ -23778,9 +23814,14 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| function parse_TST_TableInfoArchive(M, root) { | ||||
| function parse_TST_TableInfoArchive(M, root, opts) { | ||||
|   var pb = parse_shallow(root.data); | ||||
|   var out = { "!ref": "A1" }; | ||||
|   var out; | ||||
|   if (!(opts == null ? void 0 : opts.dense)) | ||||
|     out = { "!ref": "A1" }; | ||||
|   else | ||||
|     out = []; | ||||
|   out["!ref"] = "A1"; | ||||
|   var tableref = M[parse_TSP_Reference(pb[2][0].data)]; | ||||
|   var mtype = varint_to_i32(tableref[0].meta[1][0].data); | ||||
|   if (mtype != 6001) | ||||
| @ -23788,7 +23829,7 @@ function parse_TST_TableInfoArchive(M, root) { | ||||
|   parse_TST_TableModelArchive(M, tableref[0], out); | ||||
|   return out; | ||||
| } | ||||
| function parse_TN_SheetArchive(M, root) { | ||||
| function parse_TN_SheetArchive(M, root, opts) { | ||||
|   var _a; | ||||
|   var pb = parse_shallow(root.data); | ||||
|   var out = { | ||||
| @ -23800,12 +23841,12 @@ function parse_TN_SheetArchive(M, root) { | ||||
|     M[off].forEach(function(m) { | ||||
|       var mtype = varint_to_i32(m.meta[1][0].data); | ||||
|       if (mtype == 6e3) | ||||
|         out.sheets.push(parse_TST_TableInfoArchive(M, m)); | ||||
|         out.sheets.push(parse_TST_TableInfoArchive(M, m, opts)); | ||||
|     }); | ||||
|   }); | ||||
|   return out; | ||||
| } | ||||
| function parse_TN_DocumentArchive(M, root) { | ||||
| function parse_TN_DocumentArchive(M, root, opts) { | ||||
|   var _a; | ||||
|   var out = book_new(); | ||||
|   var pb = parse_shallow(root.data); | ||||
| @ -23816,7 +23857,7 @@ function parse_TN_DocumentArchive(M, root) { | ||||
|     M[off].forEach(function(m) { | ||||
|       var mtype = varint_to_i32(m.meta[1][0].data); | ||||
|       if (mtype == 2) { | ||||
|         var root2 = parse_TN_SheetArchive(M, m); | ||||
|         var root2 = parse_TN_SheetArchive(M, m, opts); | ||||
|         root2.sheets.forEach(function(sheet, idx) { | ||||
|           book_append_sheet(out, sheet, idx == 0 ? root2.name : root2.name + "_" + idx, true); | ||||
|         }); | ||||
| @ -23828,7 +23869,7 @@ function parse_TN_DocumentArchive(M, root) { | ||||
|   out.bookType = "numbers"; | ||||
|   return out; | ||||
| } | ||||
| function parse_numbers_iwa(cfb) { | ||||
| function parse_numbers_iwa(cfb, opts) { | ||||
|   var _a, _b, _c, _d, _e, _f, _g, _h; | ||||
|   var M = {}, indices = []; | ||||
|   cfb.FullPaths.forEach(function(p) { | ||||
| @ -23874,7 +23915,7 @@ function parse_numbers_iwa(cfb) { | ||||
|     }); | ||||
|   if (!docroot) | ||||
|     throw new Error("Cannot find Document root"); | ||||
|   return parse_TN_DocumentArchive(M, docroot); | ||||
|   return parse_TN_DocumentArchive(M, docroot, opts); | ||||
| } | ||||
| function write_tile_row(tri, data, SST, wide) { | ||||
|   var _a, _b; | ||||
| @ -24388,10 +24429,10 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ { | ||||
| 	if(safegetzipfile(zip, 'Index/Document.iwa')) { | ||||
| 		if(typeof Uint8Array == "undefined") throw new Error('NUMBERS file parsing requires Uint8Array support'); | ||||
| 		if(typeof parse_numbers_iwa != "undefined") { | ||||
| 			if(zip.FileIndex) return parse_numbers_iwa(zip); | ||||
| 			if(zip.FileIndex) return parse_numbers_iwa(zip, opts); | ||||
| 			var _zip = CFB.utils.cfb_new(); | ||||
| 			zipentries(zip).forEach(function(e) { zip_add_file(_zip, e, getzipbin(zip, e)); }); | ||||
| 			return parse_numbers_iwa(_zip); | ||||
| 			return parse_numbers_iwa(_zip, opts); | ||||
| 		} | ||||
| 		throw new Error('Unsupported NUMBERS file'); | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										137
									
								
								xlsx.js
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										137
									
								
								xlsx.js
									
									
									
										generated
									
									
									
								
							| @ -4076,8 +4076,11 @@ function buf_array() { | ||||
| 
 | ||||
| 	var endbuf = function ba_endbuf() { | ||||
| 		if(!curbuf) return; | ||||
| 		if(curbuf.length > curbuf.l) { curbuf = curbuf.slice(0, curbuf.l); curbuf.l = curbuf.length; } | ||||
| 		if(curbuf.length > 0) bufs.push(curbuf); | ||||
| 		// workaround for new Buffer(3).slice(0,0) bug in bun 0.1.3
 | ||||
| 		if(curbuf.l) { | ||||
| 			if(curbuf.length > curbuf.l) { curbuf = curbuf.slice(0, curbuf.l); curbuf.l = curbuf.length; } | ||||
| 			if(curbuf.length > 0) bufs.push(curbuf); | ||||
| 		} | ||||
| 		curbuf = null; | ||||
| 	}; | ||||
| 
 | ||||
| @ -22953,6 +22956,9 @@ function write_ods(wb, opts) { | ||||
| } | ||||
| 
 | ||||
| /*! sheetjs (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| var subarray = typeof Uint8Array !== "undefined" && typeof Uint8Array.prototype.subarray != "undefined" ? "subarray" : "slice"; | ||||
| if (typeof Buffer !== "undefined" && typeof Buffer.prototype.subarray == "undefined") | ||||
|   subarray = "slice"; | ||||
| function u8_to_dataview(array) { | ||||
|   return new DataView(array.buffer, array.byteOffset, array.byteLength); | ||||
| } | ||||
| @ -23071,7 +23077,7 @@ function write_varint49(v) { | ||||
|       usz[L] = v / 16777216 >>> 21 & 127; | ||||
|       ++L; | ||||
|     } | ||||
|   return usz.slice(0, L); | ||||
|   return usz[subarray](0, L); | ||||
| } | ||||
| function varint_to_i32(buf) { | ||||
|   var l = 0, i32 = buf[l] & 127; | ||||
| @ -23107,22 +23113,22 @@ function parse_shallow(buf) { | ||||
|           var l = ptr[0]; | ||||
|           while (buf[ptr[0]++] >= 128) | ||||
|             ; | ||||
|           res = buf.slice(l, ptr[0]); | ||||
|           res = buf[subarray](l, ptr[0]); | ||||
|         } | ||||
|         break; | ||||
|       case 5: | ||||
|         len = 4; | ||||
|         res = buf.slice(ptr[0], ptr[0] + len); | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 1: | ||||
|         len = 8; | ||||
|         res = buf.slice(ptr[0], ptr[0] + len); | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 2: | ||||
|         len = parse_varint49(buf, ptr); | ||||
|         res = buf.slice(ptr[0], ptr[0] + len); | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 3: | ||||
| @ -23164,7 +23170,7 @@ function parse_iwa_file(buf) { | ||||
|   var out = [], ptr = [0]; | ||||
|   while (ptr[0] < buf.length) { | ||||
|     var len = parse_varint49(buf, ptr); | ||||
|     var ai = parse_shallow(buf.slice(ptr[0], ptr[0] + len)); | ||||
|     var ai = parse_shallow(buf[subarray](ptr[0], ptr[0] + len)); | ||||
|     ptr[0] += len; | ||||
|     var res = { | ||||
|       id: varint_to_i32(ai[1][0].data), | ||||
| @ -23175,7 +23181,7 @@ function parse_iwa_file(buf) { | ||||
|       var fl = varint_to_i32(mi[3][0].data); | ||||
|       res.messages.push({ | ||||
|         meta: mi, | ||||
|         data: buf.slice(ptr[0], ptr[0] + fl) | ||||
|         data: buf[subarray](ptr[0], ptr[0] + fl) | ||||
|       }); | ||||
|       ptr[0] += fl; | ||||
|     }); | ||||
| @ -23235,7 +23241,7 @@ function parse_snappy_chunk(type, buf) { | ||||
|         len++; | ||||
|         ptr[0] += c; | ||||
|       } | ||||
|       chunks.push(buf.slice(ptr[0], ptr[0] + len)); | ||||
|       chunks.push(buf[subarray](ptr[0], ptr[0] + len)); | ||||
|       ptr[0] += len; | ||||
|       continue; | ||||
|     } else { | ||||
| @ -23254,35 +23260,57 @@ function parse_snappy_chunk(type, buf) { | ||||
|           ptr[0] += 4; | ||||
|         } | ||||
|       } | ||||
|       chunks = [u8concat(chunks)]; | ||||
|       if (offset == 0) | ||||
|         throw new Error("Invalid offset 0"); | ||||
|       if (offset > chunks[0].length) | ||||
|         throw new Error("Invalid offset beyond length"); | ||||
|       if (length >= offset) { | ||||
|         chunks.push(chunks[0].slice(-offset)); | ||||
|         length -= offset; | ||||
|         while (length >= chunks[chunks.length - 1].length) { | ||||
|           chunks.push(chunks[chunks.length - 1]); | ||||
|           length -= chunks[chunks.length - 1].length; | ||||
|         } | ||||
|       var j = chunks.length - 1, off = offset; | ||||
|       while (j >= 0 && off >= chunks[j].length) { | ||||
|         off -= chunks[j].length; | ||||
|         --j; | ||||
|       } | ||||
|       chunks.push(chunks[0].slice(-offset, -offset + length)); | ||||
|       if (j < 0) { | ||||
|         if (off == 0) | ||||
|           off = chunks[j = 0].length; | ||||
|         else | ||||
|           throw new Error("Invalid offset beyond length"); | ||||
|       } | ||||
|       if (length < off) | ||||
|         chunks.push(chunks[j][subarray](-off, -off + length)); | ||||
|       else { | ||||
|         if (off > 0) { | ||||
|           chunks.push(chunks[j][subarray](-off)); | ||||
|           length -= off; | ||||
|         } | ||||
|         ++j; | ||||
|         while (length >= chunks[j].length) { | ||||
|           chunks.push(chunks[j]); | ||||
|           length -= chunks[j].length; | ||||
|           ++j; | ||||
|         } | ||||
|         if (length) | ||||
|           chunks.push(chunks[j][subarray](0, length)); | ||||
|       } | ||||
|       if (chunks.length > 100) | ||||
|         chunks = [u8concat(chunks)]; | ||||
|     } | ||||
|   } | ||||
|   var o = u8concat(chunks); | ||||
|   if (o.length != usz) | ||||
|     throw new Error("Unexpected length: ".concat(o.length, " != ").concat(usz)); | ||||
|   return o; | ||||
|   if (chunks.reduce(function(acc, u8) { | ||||
|     return acc + u8.length; | ||||
|   }, 0) != usz) | ||||
|     throw new Error("Unexpected length: ".concat(chunks.reduce(function(acc, u8) { | ||||
|       return acc + u8.length; | ||||
|     }, 0), " != ").concat(usz)); | ||||
|   return chunks; | ||||
| } | ||||
| function decompress_iwa_file(buf) { | ||||
|   if (Array.isArray(buf)) | ||||
|     buf = new Uint8Array(buf); | ||||
|   var out = []; | ||||
|   var l = 0; | ||||
|   while (l < buf.length) { | ||||
|     var t = buf[l++]; | ||||
|     var len = buf[l] | buf[l + 1] << 8 | buf[l + 2] << 16; | ||||
|     l += 3; | ||||
|     out.push(parse_snappy_chunk(t, buf.slice(l, l + len))); | ||||
|     out.push.apply(out, parse_snappy_chunk(t, buf[subarray](l, l + len))); | ||||
|     l += len; | ||||
|   } | ||||
|   if (l !== buf.length) | ||||
| @ -23315,7 +23343,7 @@ function compress_iwa_file(buf) { | ||||
|       L += 5; | ||||
|       out.push(new Uint8Array([252, c - 1 & 255, c - 1 >> 8 & 255, c - 1 >> 16 & 255, c - 1 >>> 24 & 255])); | ||||
|     } | ||||
|     out.push(buf.slice(l, l + c)); | ||||
|     out.push(buf[subarray](l, l + c)); | ||||
|     L += c; | ||||
|     frame[0] = 0; | ||||
|     frame[1] = L & 255; | ||||
| @ -23374,11 +23402,11 @@ function parse_old_storage(buf, sst, rsst, v) { | ||||
|         if (ridx > -1) | ||||
|           ret = { t: "s", v: rsst[ridx] }; | ||||
|         else | ||||
|           throw new Error("Unsupported cell type ".concat(buf.slice(0, 4))); | ||||
|           throw new Error("Unsupported cell type ".concat(buf[subarray](0, 4))); | ||||
|       } | ||||
|       break; | ||||
|     default: | ||||
|       throw new Error("Unsupported cell type ".concat(buf.slice(0, 4))); | ||||
|       throw new Error("Unsupported cell type ".concat(buf[subarray](0, 4))); | ||||
|   } | ||||
|   return ret; | ||||
| } | ||||
| @ -23434,14 +23462,14 @@ function parse_new_storage(buf, sst, rsst) { | ||||
|         if (ridx > -1) | ||||
|           ret = { t: "s", v: rsst[ridx] }; | ||||
|         else | ||||
|           throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf.slice(0, 4))); | ||||
|           throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf[subarray](0, 4))); | ||||
|       } | ||||
|       break; | ||||
|     case 10: | ||||
|       ret = { t: "n", v: d128 }; | ||||
|       break; | ||||
|     default: | ||||
|       throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf.slice(0, 4))); | ||||
|       throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf[subarray](0, 4))); | ||||
|   } | ||||
|   return ret; | ||||
| } | ||||
| @ -23473,7 +23501,7 @@ function write_new_storage(cell, sst) { | ||||
|       throw "unsupported cell type " + cell.t; | ||||
|   } | ||||
|   dv.setUint32(8, flags, true); | ||||
|   return out.slice(0, l); | ||||
|   return out[subarray](0, l); | ||||
| } | ||||
| function write_old_storage(cell, sst) { | ||||
|   var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, flags = 0; | ||||
| @ -23503,7 +23531,7 @@ function write_old_storage(cell, sst) { | ||||
|       throw "unsupported cell type " + cell.t; | ||||
|   } | ||||
|   dv.setUint32(4, flags, true); | ||||
|   return out.slice(0, l); | ||||
|   return out[subarray](0, l); | ||||
| } | ||||
| function parse_cell_storage(buf, sst, rsst) { | ||||
|   switch (buf[0]) { | ||||
| @ -23585,9 +23613,9 @@ function parse_TST_TileRowInfo(u8, type) { | ||||
|     throw "Expected ".concat(cnt, " cells, found ").concat(offsets.length); | ||||
|   var cells = []; | ||||
|   for (C = 0; C < offsets.length - 1; ++C) | ||||
|     cells[offsets[C][0]] = used_storage.subarray(offsets[C][1] * width, offsets[C + 1][1] * width); | ||||
|     cells[offsets[C][0]] = used_storage[subarray](offsets[C][1] * width, offsets[C + 1][1] * width); | ||||
|   if (offsets.length >= 1) | ||||
|     cells[offsets[offsets.length - 1][0]] = used_storage.subarray(offsets[offsets.length - 1][1] * width); | ||||
|     cells[offsets[offsets.length - 1][0]] = used_storage[subarray](offsets[offsets.length - 1][1] * width); | ||||
|   return { R: R, cells: cells }; | ||||
| } | ||||
| function parse_TST_Tile(M, root) { | ||||
| @ -23628,6 +23656,7 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|   if (range.e.c < 0) | ||||
|     throw new Error("Invalid col varint ".concat(pb[7][0].data)); | ||||
|   ws["!ref"] = encode_range(range); | ||||
|   var dense = Array.isArray(ws); | ||||
|   var store = parse_shallow(pb[4][0].data); | ||||
|   var sst = parse_TST_TableDataList(M, M[parse_TSP_Reference(store[4][0].data)][0]); | ||||
|   var rsst = ((_a = store[17]) == null ? void 0 : _a[0]) ? parse_TST_TableDataList(M, M[parse_TSP_Reference(store[17][0].data)][0]) : []; | ||||
| @ -23642,10 +23671,17 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|     var _tile = parse_TST_Tile(M, ref2); | ||||
|     _tile.data.forEach(function(row, R) { | ||||
|       row.forEach(function(buf, C) { | ||||
|         var addr = encode_cell({ r: _R + R, c: C }); | ||||
|         var res = parse_cell_storage(buf, sst, rsst); | ||||
|         if (res) | ||||
|           ws[addr] = res; | ||||
|         if (res) { | ||||
|           if (dense) { | ||||
|             if (!ws[_R + R]) | ||||
|               ws[_R + R] = []; | ||||
|             ws[_R + R][C] = res; | ||||
|           } else { | ||||
|             var addr = encode_cell({ r: _R + R, c: C }); | ||||
|             ws[addr] = res; | ||||
|           } | ||||
|         } | ||||
|       }); | ||||
|     }); | ||||
|     _R += _tile.nrows; | ||||
| @ -23668,9 +23704,14 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| function parse_TST_TableInfoArchive(M, root) { | ||||
| function parse_TST_TableInfoArchive(M, root, opts) { | ||||
|   var pb = parse_shallow(root.data); | ||||
|   var out = { "!ref": "A1" }; | ||||
|   var out; | ||||
|   if (!(opts == null ? void 0 : opts.dense)) | ||||
|     out = { "!ref": "A1" }; | ||||
|   else | ||||
|     out = []; | ||||
|   out["!ref"] = "A1"; | ||||
|   var tableref = M[parse_TSP_Reference(pb[2][0].data)]; | ||||
|   var mtype = varint_to_i32(tableref[0].meta[1][0].data); | ||||
|   if (mtype != 6001) | ||||
| @ -23678,7 +23719,7 @@ function parse_TST_TableInfoArchive(M, root) { | ||||
|   parse_TST_TableModelArchive(M, tableref[0], out); | ||||
|   return out; | ||||
| } | ||||
| function parse_TN_SheetArchive(M, root) { | ||||
| function parse_TN_SheetArchive(M, root, opts) { | ||||
|   var _a; | ||||
|   var pb = parse_shallow(root.data); | ||||
|   var out = { | ||||
| @ -23690,12 +23731,12 @@ function parse_TN_SheetArchive(M, root) { | ||||
|     M[off].forEach(function(m) { | ||||
|       var mtype = varint_to_i32(m.meta[1][0].data); | ||||
|       if (mtype == 6e3) | ||||
|         out.sheets.push(parse_TST_TableInfoArchive(M, m)); | ||||
|         out.sheets.push(parse_TST_TableInfoArchive(M, m, opts)); | ||||
|     }); | ||||
|   }); | ||||
|   return out; | ||||
| } | ||||
| function parse_TN_DocumentArchive(M, root) { | ||||
| function parse_TN_DocumentArchive(M, root, opts) { | ||||
|   var _a; | ||||
|   var out = book_new(); | ||||
|   var pb = parse_shallow(root.data); | ||||
| @ -23706,7 +23747,7 @@ function parse_TN_DocumentArchive(M, root) { | ||||
|     M[off].forEach(function(m) { | ||||
|       var mtype = varint_to_i32(m.meta[1][0].data); | ||||
|       if (mtype == 2) { | ||||
|         var root2 = parse_TN_SheetArchive(M, m); | ||||
|         var root2 = parse_TN_SheetArchive(M, m, opts); | ||||
|         root2.sheets.forEach(function(sheet, idx) { | ||||
|           book_append_sheet(out, sheet, idx == 0 ? root2.name : root2.name + "_" + idx, true); | ||||
|         }); | ||||
| @ -23718,7 +23759,7 @@ function parse_TN_DocumentArchive(M, root) { | ||||
|   out.bookType = "numbers"; | ||||
|   return out; | ||||
| } | ||||
| function parse_numbers_iwa(cfb) { | ||||
| function parse_numbers_iwa(cfb, opts) { | ||||
|   var _a, _b, _c, _d, _e, _f, _g, _h; | ||||
|   var M = {}, indices = []; | ||||
|   cfb.FullPaths.forEach(function(p) { | ||||
| @ -23764,7 +23805,7 @@ function parse_numbers_iwa(cfb) { | ||||
|     }); | ||||
|   if (!docroot) | ||||
|     throw new Error("Cannot find Document root"); | ||||
|   return parse_TN_DocumentArchive(M, docroot); | ||||
|   return parse_TN_DocumentArchive(M, docroot, opts); | ||||
| } | ||||
| function write_tile_row(tri, data, SST, wide) { | ||||
|   var _a, _b; | ||||
| @ -24278,10 +24319,10 @@ function parse_zip(zip, opts) { | ||||
| 	if(safegetzipfile(zip, 'Index/Document.iwa')) { | ||||
| 		if(typeof Uint8Array == "undefined") throw new Error('NUMBERS file parsing requires Uint8Array support'); | ||||
| 		if(typeof parse_numbers_iwa != "undefined") { | ||||
| 			if(zip.FileIndex) return parse_numbers_iwa(zip); | ||||
| 			if(zip.FileIndex) return parse_numbers_iwa(zip, opts); | ||||
| 			var _zip = CFB.utils.cfb_new(); | ||||
| 			zipentries(zip).forEach(function(e) { zip_add_file(_zip, e, getzipbin(zip, e)); }); | ||||
| 			return parse_numbers_iwa(_zip); | ||||
| 			return parse_numbers_iwa(_zip, opts); | ||||
| 		} | ||||
| 		throw new Error('Unsupported NUMBERS file'); | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										130
									
								
								xlsx.mjs
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										130
									
								
								xlsx.mjs
									
									
									
										generated
									
									
									
								
							| @ -23061,6 +23061,9 @@ function write_ods(wb/*:any*/, opts/*:any*/) { | ||||
| } | ||||
| 
 | ||||
| /*! sheetjs (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| var subarray = typeof Uint8Array !== "undefined" && typeof Uint8Array.prototype.subarray != "undefined" ? "subarray" : "slice"; | ||||
| if (typeof Buffer !== "undefined" && typeof Buffer.prototype.subarray == "undefined") | ||||
|   subarray = "slice"; | ||||
| function u8_to_dataview(array) { | ||||
|   return new DataView(array.buffer, array.byteOffset, array.byteLength); | ||||
| } | ||||
| @ -23179,7 +23182,7 @@ function write_varint49(v) { | ||||
|       usz[L] = v / 16777216 >>> 21 & 127; | ||||
|       ++L; | ||||
|     } | ||||
|   return usz.slice(0, L); | ||||
|   return usz[subarray](0, L); | ||||
| } | ||||
| function varint_to_i32(buf) { | ||||
|   var l = 0, i32 = buf[l] & 127; | ||||
| @ -23215,22 +23218,22 @@ function parse_shallow(buf) { | ||||
|           var l = ptr[0]; | ||||
|           while (buf[ptr[0]++] >= 128) | ||||
|             ; | ||||
|           res = buf.slice(l, ptr[0]); | ||||
|           res = buf[subarray](l, ptr[0]); | ||||
|         } | ||||
|         break; | ||||
|       case 5: | ||||
|         len = 4; | ||||
|         res = buf.slice(ptr[0], ptr[0] + len); | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 1: | ||||
|         len = 8; | ||||
|         res = buf.slice(ptr[0], ptr[0] + len); | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 2: | ||||
|         len = parse_varint49(buf, ptr); | ||||
|         res = buf.slice(ptr[0], ptr[0] + len); | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 3: | ||||
| @ -23272,7 +23275,7 @@ function parse_iwa_file(buf) { | ||||
|   var out = [], ptr = [0]; | ||||
|   while (ptr[0] < buf.length) { | ||||
|     var len = parse_varint49(buf, ptr); | ||||
|     var ai = parse_shallow(buf.slice(ptr[0], ptr[0] + len)); | ||||
|     var ai = parse_shallow(buf[subarray](ptr[0], ptr[0] + len)); | ||||
|     ptr[0] += len; | ||||
|     var res = { | ||||
|       id: varint_to_i32(ai[1][0].data), | ||||
| @ -23283,7 +23286,7 @@ function parse_iwa_file(buf) { | ||||
|       var fl = varint_to_i32(mi[3][0].data); | ||||
|       res.messages.push({ | ||||
|         meta: mi, | ||||
|         data: buf.slice(ptr[0], ptr[0] + fl) | ||||
|         data: buf[subarray](ptr[0], ptr[0] + fl) | ||||
|       }); | ||||
|       ptr[0] += fl; | ||||
|     }); | ||||
| @ -23343,7 +23346,7 @@ function parse_snappy_chunk(type, buf) { | ||||
|         len++; | ||||
|         ptr[0] += c; | ||||
|       } | ||||
|       chunks.push(buf.slice(ptr[0], ptr[0] + len)); | ||||
|       chunks.push(buf[subarray](ptr[0], ptr[0] + len)); | ||||
|       ptr[0] += len; | ||||
|       continue; | ||||
|     } else { | ||||
| @ -23362,35 +23365,57 @@ function parse_snappy_chunk(type, buf) { | ||||
|           ptr[0] += 4; | ||||
|         } | ||||
|       } | ||||
|       chunks = [u8concat(chunks)]; | ||||
|       if (offset == 0) | ||||
|         throw new Error("Invalid offset 0"); | ||||
|       if (offset > chunks[0].length) | ||||
|         throw new Error("Invalid offset beyond length"); | ||||
|       if (length >= offset) { | ||||
|         chunks.push(chunks[0].slice(-offset)); | ||||
|         length -= offset; | ||||
|         while (length >= chunks[chunks.length - 1].length) { | ||||
|           chunks.push(chunks[chunks.length - 1]); | ||||
|           length -= chunks[chunks.length - 1].length; | ||||
|         } | ||||
|       var j = chunks.length - 1, off = offset; | ||||
|       while (j >= 0 && off >= chunks[j].length) { | ||||
|         off -= chunks[j].length; | ||||
|         --j; | ||||
|       } | ||||
|       chunks.push(chunks[0].slice(-offset, -offset + length)); | ||||
|       if (j < 0) { | ||||
|         if (off == 0) | ||||
|           off = chunks[j = 0].length; | ||||
|         else | ||||
|           throw new Error("Invalid offset beyond length"); | ||||
|       } | ||||
|       if (length < off) | ||||
|         chunks.push(chunks[j][subarray](-off, -off + length)); | ||||
|       else { | ||||
|         if (off > 0) { | ||||
|           chunks.push(chunks[j][subarray](-off)); | ||||
|           length -= off; | ||||
|         } | ||||
|         ++j; | ||||
|         while (length >= chunks[j].length) { | ||||
|           chunks.push(chunks[j]); | ||||
|           length -= chunks[j].length; | ||||
|           ++j; | ||||
|         } | ||||
|         if (length) | ||||
|           chunks.push(chunks[j][subarray](0, length)); | ||||
|       } | ||||
|       if (chunks.length > 100) | ||||
|         chunks = [u8concat(chunks)]; | ||||
|     } | ||||
|   } | ||||
|   var o = u8concat(chunks); | ||||
|   if (o.length != usz) | ||||
|     throw new Error("Unexpected length: ".concat(o.length, " != ").concat(usz)); | ||||
|   return o; | ||||
|   if (chunks.reduce(function(acc, u8) { | ||||
|     return acc + u8.length; | ||||
|   }, 0) != usz) | ||||
|     throw new Error("Unexpected length: ".concat(chunks.reduce(function(acc, u8) { | ||||
|       return acc + u8.length; | ||||
|     }, 0), " != ").concat(usz)); | ||||
|   return chunks; | ||||
| } | ||||
| function decompress_iwa_file(buf) { | ||||
|   if (Array.isArray(buf)) | ||||
|     buf = new Uint8Array(buf); | ||||
|   var out = []; | ||||
|   var l = 0; | ||||
|   while (l < buf.length) { | ||||
|     var t = buf[l++]; | ||||
|     var len = buf[l] | buf[l + 1] << 8 | buf[l + 2] << 16; | ||||
|     l += 3; | ||||
|     out.push(parse_snappy_chunk(t, buf.slice(l, l + len))); | ||||
|     out.push.apply(out, parse_snappy_chunk(t, buf[subarray](l, l + len))); | ||||
|     l += len; | ||||
|   } | ||||
|   if (l !== buf.length) | ||||
| @ -23423,7 +23448,7 @@ function compress_iwa_file(buf) { | ||||
|       L += 5; | ||||
|       out.push(new Uint8Array([252, c - 1 & 255, c - 1 >> 8 & 255, c - 1 >> 16 & 255, c - 1 >>> 24 & 255])); | ||||
|     } | ||||
|     out.push(buf.slice(l, l + c)); | ||||
|     out.push(buf[subarray](l, l + c)); | ||||
|     L += c; | ||||
|     frame[0] = 0; | ||||
|     frame[1] = L & 255; | ||||
| @ -23482,11 +23507,11 @@ function parse_old_storage(buf, sst, rsst, v) { | ||||
|         if (ridx > -1) | ||||
|           ret = { t: "s", v: rsst[ridx] }; | ||||
|         else | ||||
|           throw new Error("Unsupported cell type ".concat(buf.slice(0, 4))); | ||||
|           throw new Error("Unsupported cell type ".concat(buf[subarray](0, 4))); | ||||
|       } | ||||
|       break; | ||||
|     default: | ||||
|       throw new Error("Unsupported cell type ".concat(buf.slice(0, 4))); | ||||
|       throw new Error("Unsupported cell type ".concat(buf[subarray](0, 4))); | ||||
|   } | ||||
|   return ret; | ||||
| } | ||||
| @ -23542,14 +23567,14 @@ function parse_new_storage(buf, sst, rsst) { | ||||
|         if (ridx > -1) | ||||
|           ret = { t: "s", v: rsst[ridx] }; | ||||
|         else | ||||
|           throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf.slice(0, 4))); | ||||
|           throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf[subarray](0, 4))); | ||||
|       } | ||||
|       break; | ||||
|     case 10: | ||||
|       ret = { t: "n", v: d128 }; | ||||
|       break; | ||||
|     default: | ||||
|       throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf.slice(0, 4))); | ||||
|       throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf[subarray](0, 4))); | ||||
|   } | ||||
|   return ret; | ||||
| } | ||||
| @ -23581,7 +23606,7 @@ function write_new_storage(cell, sst) { | ||||
|       throw "unsupported cell type " + cell.t; | ||||
|   } | ||||
|   dv.setUint32(8, flags, true); | ||||
|   return out.slice(0, l); | ||||
|   return out[subarray](0, l); | ||||
| } | ||||
| function write_old_storage(cell, sst) { | ||||
|   var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, flags = 0; | ||||
| @ -23611,7 +23636,7 @@ function write_old_storage(cell, sst) { | ||||
|       throw "unsupported cell type " + cell.t; | ||||
|   } | ||||
|   dv.setUint32(4, flags, true); | ||||
|   return out.slice(0, l); | ||||
|   return out[subarray](0, l); | ||||
| } | ||||
| function parse_cell_storage(buf, sst, rsst) { | ||||
|   switch (buf[0]) { | ||||
| @ -23693,9 +23718,9 @@ function parse_TST_TileRowInfo(u8, type) { | ||||
|     throw "Expected ".concat(cnt, " cells, found ").concat(offsets.length); | ||||
|   var cells = []; | ||||
|   for (C = 0; C < offsets.length - 1; ++C) | ||||
|     cells[offsets[C][0]] = used_storage.subarray(offsets[C][1] * width, offsets[C + 1][1] * width); | ||||
|     cells[offsets[C][0]] = used_storage[subarray](offsets[C][1] * width, offsets[C + 1][1] * width); | ||||
|   if (offsets.length >= 1) | ||||
|     cells[offsets[offsets.length - 1][0]] = used_storage.subarray(offsets[offsets.length - 1][1] * width); | ||||
|     cells[offsets[offsets.length - 1][0]] = used_storage[subarray](offsets[offsets.length - 1][1] * width); | ||||
|   return { R: R, cells: cells }; | ||||
| } | ||||
| function parse_TST_Tile(M, root) { | ||||
| @ -23736,6 +23761,7 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|   if (range.e.c < 0) | ||||
|     throw new Error("Invalid col varint ".concat(pb[7][0].data)); | ||||
|   ws["!ref"] = encode_range(range); | ||||
|   var dense = Array.isArray(ws); | ||||
|   var store = parse_shallow(pb[4][0].data); | ||||
|   var sst = parse_TST_TableDataList(M, M[parse_TSP_Reference(store[4][0].data)][0]); | ||||
|   var rsst = ((_a = store[17]) == null ? void 0 : _a[0]) ? parse_TST_TableDataList(M, M[parse_TSP_Reference(store[17][0].data)][0]) : []; | ||||
| @ -23750,10 +23776,17 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|     var _tile = parse_TST_Tile(M, ref2); | ||||
|     _tile.data.forEach(function(row, R) { | ||||
|       row.forEach(function(buf, C) { | ||||
|         var addr = encode_cell({ r: _R + R, c: C }); | ||||
|         var res = parse_cell_storage(buf, sst, rsst); | ||||
|         if (res) | ||||
|           ws[addr] = res; | ||||
|         if (res) { | ||||
|           if (dense) { | ||||
|             if (!ws[_R + R]) | ||||
|               ws[_R + R] = []; | ||||
|             ws[_R + R][C] = res; | ||||
|           } else { | ||||
|             var addr = encode_cell({ r: _R + R, c: C }); | ||||
|             ws[addr] = res; | ||||
|           } | ||||
|         } | ||||
|       }); | ||||
|     }); | ||||
|     _R += _tile.nrows; | ||||
| @ -23776,9 +23809,14 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| function parse_TST_TableInfoArchive(M, root) { | ||||
| function parse_TST_TableInfoArchive(M, root, opts) { | ||||
|   var pb = parse_shallow(root.data); | ||||
|   var out = { "!ref": "A1" }; | ||||
|   var out; | ||||
|   if (!(opts == null ? void 0 : opts.dense)) | ||||
|     out = { "!ref": "A1" }; | ||||
|   else | ||||
|     out = []; | ||||
|   out["!ref"] = "A1"; | ||||
|   var tableref = M[parse_TSP_Reference(pb[2][0].data)]; | ||||
|   var mtype = varint_to_i32(tableref[0].meta[1][0].data); | ||||
|   if (mtype != 6001) | ||||
| @ -23786,7 +23824,7 @@ function parse_TST_TableInfoArchive(M, root) { | ||||
|   parse_TST_TableModelArchive(M, tableref[0], out); | ||||
|   return out; | ||||
| } | ||||
| function parse_TN_SheetArchive(M, root) { | ||||
| function parse_TN_SheetArchive(M, root, opts) { | ||||
|   var _a; | ||||
|   var pb = parse_shallow(root.data); | ||||
|   var out = { | ||||
| @ -23798,12 +23836,12 @@ function parse_TN_SheetArchive(M, root) { | ||||
|     M[off].forEach(function(m) { | ||||
|       var mtype = varint_to_i32(m.meta[1][0].data); | ||||
|       if (mtype == 6e3) | ||||
|         out.sheets.push(parse_TST_TableInfoArchive(M, m)); | ||||
|         out.sheets.push(parse_TST_TableInfoArchive(M, m, opts)); | ||||
|     }); | ||||
|   }); | ||||
|   return out; | ||||
| } | ||||
| function parse_TN_DocumentArchive(M, root) { | ||||
| function parse_TN_DocumentArchive(M, root, opts) { | ||||
|   var _a; | ||||
|   var out = book_new(); | ||||
|   var pb = parse_shallow(root.data); | ||||
| @ -23814,7 +23852,7 @@ function parse_TN_DocumentArchive(M, root) { | ||||
|     M[off].forEach(function(m) { | ||||
|       var mtype = varint_to_i32(m.meta[1][0].data); | ||||
|       if (mtype == 2) { | ||||
|         var root2 = parse_TN_SheetArchive(M, m); | ||||
|         var root2 = parse_TN_SheetArchive(M, m, opts); | ||||
|         root2.sheets.forEach(function(sheet, idx) { | ||||
|           book_append_sheet(out, sheet, idx == 0 ? root2.name : root2.name + "_" + idx, true); | ||||
|         }); | ||||
| @ -23826,7 +23864,7 @@ function parse_TN_DocumentArchive(M, root) { | ||||
|   out.bookType = "numbers"; | ||||
|   return out; | ||||
| } | ||||
| function parse_numbers_iwa(cfb) { | ||||
| function parse_numbers_iwa(cfb, opts) { | ||||
|   var _a, _b, _c, _d, _e, _f, _g, _h; | ||||
|   var M = {}, indices = []; | ||||
|   cfb.FullPaths.forEach(function(p) { | ||||
| @ -23872,7 +23910,7 @@ function parse_numbers_iwa(cfb) { | ||||
|     }); | ||||
|   if (!docroot) | ||||
|     throw new Error("Cannot find Document root"); | ||||
|   return parse_TN_DocumentArchive(M, docroot); | ||||
|   return parse_TN_DocumentArchive(M, docroot, opts); | ||||
| } | ||||
| function write_tile_row(tri, data, SST, wide) { | ||||
|   var _a, _b; | ||||
| @ -24386,10 +24424,10 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ { | ||||
| 	if(safegetzipfile(zip, 'Index/Document.iwa')) { | ||||
| 		if(typeof Uint8Array == "undefined") throw new Error('NUMBERS file parsing requires Uint8Array support'); | ||||
| 		if(typeof parse_numbers_iwa != "undefined") { | ||||
| 			if(zip.FileIndex) return parse_numbers_iwa(zip); | ||||
| 			if(zip.FileIndex) return parse_numbers_iwa(zip, opts); | ||||
| 			var _zip = CFB.utils.cfb_new(); | ||||
| 			zipentries(zip).forEach(function(e) { zip_add_file(_zip, e, getzipbin(zip, e)); }); | ||||
| 			return parse_numbers_iwa(_zip); | ||||
| 			return parse_numbers_iwa(_zip, opts); | ||||
| 		} | ||||
| 		throw new Error('Unsupported NUMBERS file'); | ||||
| 	} | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user