forked from sheetjs/sheetjs
		
	- XLSX / XLSB dynamic array formulae - use Uint8Array when available in write (fixes #2539 h/t @RScherzer) - mini build cleanup to satiate webpack (fixes #2526 #2530)
		
			
				
	
	
		
			121 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /// <reference path="src/types.ts"/>
 | |
| 
 | |
| /* [MS-XLSB] 2.4.698 BrtMdtinfo */
 | |
| interface BrtMdtinfo {
 | |
| 	flags: number;
 | |
| 	version: number;
 | |
| 	name: string;
 | |
| }
 | |
| function parse_BrtMdtinfo(data: ReadableData, length: number): BrtMdtinfo {
 | |
| 	return {
 | |
| 		flags: data.read_shift(4),
 | |
| 		version: data.read_shift(4),
 | |
| 		name: parse_XLWideString(data, length - 8)
 | |
| 	};
 | |
| }
 | |
| function write_BrtMdtinfo(data: BrtMdtinfo): RawData {
 | |
| 	var o = new_buf(12 + 2 * data.name.length);
 | |
| 	o.write_shift(4, data.flags);
 | |
| 	o.write_shift(4, data.version);
 | |
| 	write_XLWideString(data.name, o);
 | |
| 	return o.slice(0, o.l);
 | |
| }
 | |
| 
 | |
| /* [MS-XLSB] 2.4.697 BrtMdb */
 | |
| type Mdir = [number, number]; // "t", "v" in XLSX parlance
 | |
| type BrtMdb = Mdir[];
 | |
| function write_BrtMdb(mdb: BrtMdb): RawData {
 | |
| 	var o = new_buf(4 + 8 * mdb.length);
 | |
| 	o.write_shift(4, mdb.length);
 | |
| 	for(var i = 0; i < mdb.length; ++i) {
 | |
| 		o.write_shift(4, mdb[i][0]);
 | |
| 		o.write_shift(4, mdb[i][1]);
 | |
| 	}
 | |
| 	return o;
 | |
| }
 | |
| 
 | |
| /* [MS-XLSB] 2.4.72 BrtBeginEsfmd */
 | |
| function write_BrtBeginEsfmd(cnt: number, name: string): RawData {
 | |
| 	var o = new_buf(8 + 2 * name.length);
 | |
| 	o.write_shift(4, cnt);
 | |
| 	write_XLWideString(name, o);
 | |
| 	return o.slice(0, o.l);
 | |
| }
 | |
| 
 | |
| /* [MS-XLSB] 2.4.73 BrtBeginEsmdb */
 | |
| function write_BrtBeginEsmdb(cnt: number, cm: boolean): RawData {
 | |
| 	var o = new_buf(8);
 | |
| 	o.write_shift(4, cnt);
 | |
| 	o.write_shift(4, cm ? 1 : 0);
 | |
| 	return o;
 | |
| }
 | |
| 
 | |
| /* [MS-XLSB] 2.1.7.34 Metadata */
 | |
| function parse_xlmeta_bin(data, name: string, _opts?: ParseXLMetaOptions): XLMeta {
 | |
| 	var out: XLMeta = { Types: [] };
 | |
| 	var opts = _opts || {};
 | |
| 	var state: string[] = [];
 | |
| 	var pass = false;
 | |
| 
 | |
| 	recordhopper(data, (val, R_n, RT) => {
 | |
| 		switch(RT) {
 | |
| 			// case 0x014C: /* 'BrtBeginMetadata' */
 | |
| 			// case 0x014D: /* 'BrtEndMetadata' */
 | |
| 			// case 0x014E: /* 'BrtBeginEsmdtinfo' */
 | |
| 			// case 0x0150: /* 'BrtEndEsmdtinfo' */
 | |
| 			// case 0x0151: /* 'BrtBeginEsmdb' */
 | |
| 			// case 0x0152: /* 'BrtEndEsmdb' */
 | |
| 			// case 0x0153: /* 'BrtBeginEsfmd' */
 | |
| 			// case 0x0154: /* 'BrtEndEsfmd' */
 | |
| 			// case 0x0034: /* 'BrtBeginFmd' */
 | |
| 			// case 0x0035: /* 'BrtEndFmd' */
 | |
| 			// case 0x1000: /* 'BrtBeginDynamicArrayPr' */
 | |
| 			// case 0x1001: /* 'BrtEndDynamicArrayPr' */
 | |
| 			// case 0x138A: /* 'BrtBeginRichValueBlock' */
 | |
| 			// case 0x138B: /* 'BrtEndRichValueBlock' */
 | |
| 
 | |
| 			case 0x014F: /* 'BrtMdtinfo' */
 | |
| 				out.Types.push({name: (val as BrtMdtinfo).name});
 | |
| 				break;
 | |
| 			case 0x0033: /* 'BrtMdb' */
 | |
| 				break;
 | |
| 
 | |
| 			case 0x0023: /* 'BrtFRTBegin' */
 | |
| 				state.push(R_n); pass = true; break;
 | |
| 			case 0x0024: /* 'BrtFRTEnd' */
 | |
| 				state.pop(); pass = false; break;
 | |
| 			default:
 | |
| 				if((R_n||"").indexOf("Begin") > 0){/* empty */}
 | |
| 				else if((R_n||"").indexOf("End") > 0){/* empty */}
 | |
| 				else if(!pass || (opts.WTF && state[state.length-1] != "BrtFRTBegin")) throw new Error("Unexpected record " + RT + " " + R_n);
 | |
| 		}
 | |
| 	});
 | |
| 	return out;
 | |
| }
 | |
| function write_xlmeta_bin() {
 | |
| 	var ba = buf_array();
 | |
| 	write_record(ba, "BrtBeginMetadata");
 | |
| 	write_record(ba, "BrtBeginEsmdtinfo", write_UInt32LE(1));
 | |
| 	write_record(ba, "BrtMdtinfo", write_BrtMdtinfo({
 | |
| 		name: "XLDAPR",
 | |
| 		version: 120000,
 | |
| 		flags: 0xD06AC0B0
 | |
| 	}));
 | |
| 	write_record(ba, "BrtEndEsmdtinfo");
 | |
| 	/* [ESSTR] [ESMDX] */
 | |
| 	write_record(ba, "BrtBeginEsfmd", write_BrtBeginEsfmd(1, "XLDAPR"));
 | |
| 	write_record(ba, "BrtBeginFmd");
 | |
| 	write_record(ba, "BrtFRTBegin", write_UInt32LE(0x0202));
 | |
| 	write_record(ba, "BrtBeginDynamicArrayPr", write_UInt32LE(0));
 | |
| 	write_record(ba, "BrtEndDynamicArrayPr", writeuint16(1));
 | |
| 	write_record(ba, "BrtFRTEnd");
 | |
| 	write_record(ba, "BrtEndFmd");
 | |
| 	write_record(ba, "BrtEndEsfmd");
 | |
| 	write_record(ba, "BrtBeginEsmdb", write_BrtBeginEsmdb(1, true));
 | |
| 	write_record(ba, "BrtMdb", write_BrtMdb([[1, 0]]));
 | |
| 	write_record(ba, "BrtEndEsmdb");
 | |
| 	/* *FRT */
 | |
| 	write_record(ba, "BrtEndMetadata");
 | |
| 	return ba.end();
 | |
| }
 |