forked from sheetjs/sheetjs
		
	
		
			
				
	
	
		
			332 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			332 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */
 | |
| /* 12.3 Part Summary <SpreadsheetML> */
 | |
| /* 14.2 Part Summary <DrawingML> */
 | |
| /* [MS-XLSX] 2.1 Part Enumerations ; [MS-XLSB] 2.1.7 Part Enumeration */
 | |
| var ct2type/*{[string]:string}*/ = ({
 | |
| 	/* Workbook */
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": "workbooks",
 | |
| 	"application/vnd.ms-excel.sheet.macroEnabled.main+xml": "workbooks",
 | |
| 	"application/vnd.ms-excel.sheet.binary.macroEnabled.main": "workbooks",
 | |
| 	"application/vnd.ms-excel.addin.macroEnabled.main+xml": "workbooks",
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": "workbooks",
 | |
| 
 | |
| 	/* Worksheet */
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": "sheets",
 | |
| 	"application/vnd.ms-excel.worksheet": "sheets",
 | |
| 	"application/vnd.ms-excel.binIndexWs": "TODO", /* Binary Index */
 | |
| 
 | |
| 	/* Chartsheet */
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": "charts",
 | |
| 	"application/vnd.ms-excel.chartsheet": "charts",
 | |
| 
 | |
| 	/* Macrosheet */
 | |
| 	"application/vnd.ms-excel.macrosheet+xml": "macros",
 | |
| 	"application/vnd.ms-excel.macrosheet": "macros",
 | |
| 	"application/vnd.ms-excel.intlmacrosheet": "TODO",
 | |
| 	"application/vnd.ms-excel.binIndexMs": "TODO", /* Binary Index */
 | |
| 
 | |
| 	/* Dialogsheet */
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": "dialogs",
 | |
| 	"application/vnd.ms-excel.dialogsheet": "dialogs",
 | |
| 
 | |
| 	/* Shared Strings */
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml": "strs",
 | |
| 	"application/vnd.ms-excel.sharedStrings": "strs",
 | |
| 
 | |
| 	/* Styles */
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": "styles",
 | |
| 	"application/vnd.ms-excel.styles": "styles",
 | |
| 
 | |
| 	/* File Properties */
 | |
| 	"application/vnd.openxmlformats-package.core-properties+xml": "coreprops",
 | |
| 	"application/vnd.openxmlformats-officedocument.custom-properties+xml": "custprops",
 | |
| 	"application/vnd.openxmlformats-officedocument.extended-properties+xml": "extprops",
 | |
| 
 | |
| 	/* Custom Data Properties */
 | |
| 	"application/vnd.openxmlformats-officedocument.customXmlProperties+xml": "TODO",
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.customProperty": "TODO",
 | |
| 
 | |
| 	/* Comments */
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": "comments",
 | |
| 	"application/vnd.ms-excel.comments": "comments",
 | |
| 	"application/vnd.ms-excel.threadedcomments+xml": "threadedcomments",
 | |
| 	"application/vnd.ms-excel.person+xml": "people",
 | |
| 
 | |
| 	/* Metadata (Stock/Geography and Dynamic Array) */
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml": "metadata",
 | |
| 	"application/vnd.ms-excel.sheetMetadata": "metadata",
 | |
| 
 | |
| 	/* PivotTable */
 | |
| 	"application/vnd.ms-excel.pivotTable": "TODO",
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml": "TODO",
 | |
| 
 | |
| 	/* Chart Objects */
 | |
| 	"application/vnd.openxmlformats-officedocument.drawingml.chart+xml": "TODO",
 | |
| 
 | |
| 	/* Chart Colors */
 | |
| 	"application/vnd.ms-office.chartcolorstyle+xml": "TODO",
 | |
| 
 | |
| 	/* Chart Style */
 | |
| 	"application/vnd.ms-office.chartstyle+xml": "TODO",
 | |
| 
 | |
| 	/* Chart Advanced */
 | |
| 	"application/vnd.ms-office.chartex+xml": "TODO",
 | |
| 
 | |
| 	/* Calculation Chain */
 | |
| 	"application/vnd.ms-excel.calcChain": "calcchains",
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml": "calcchains",
 | |
| 
 | |
| 	/* Printer Settings */
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings": "TODO",
 | |
| 
 | |
| 	/* ActiveX */
 | |
| 	"application/vnd.ms-office.activeX": "TODO",
 | |
| 	"application/vnd.ms-office.activeX+xml": "TODO",
 | |
| 
 | |
| 	/* Custom Toolbars */
 | |
| 	"application/vnd.ms-excel.attachedToolbars": "TODO",
 | |
| 
 | |
| 	/* External Data Connections */
 | |
| 	"application/vnd.ms-excel.connections": "TODO",
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": "TODO",
 | |
| 
 | |
| 	/* External Links */
 | |
| 	"application/vnd.ms-excel.externalLink": "links",
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml": "links",
 | |
| 
 | |
| 	/* PivotCache */
 | |
| 	"application/vnd.ms-excel.pivotCacheDefinition": "TODO",
 | |
| 	"application/vnd.ms-excel.pivotCacheRecords": "TODO",
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml": "TODO",
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml": "TODO",
 | |
| 
 | |
| 	/* Query Table */
 | |
| 	"application/vnd.ms-excel.queryTable": "TODO",
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml": "TODO",
 | |
| 
 | |
| 	/* Shared Workbook */
 | |
| 	"application/vnd.ms-excel.userNames": "TODO",
 | |
| 	"application/vnd.ms-excel.revisionHeaders": "TODO",
 | |
| 	"application/vnd.ms-excel.revisionLog": "TODO",
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml": "TODO",
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml": "TODO",
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml": "TODO",
 | |
| 
 | |
| 	/* Single Cell Table */
 | |
| 	"application/vnd.ms-excel.tableSingleCells": "TODO",
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml": "TODO",
 | |
| 
 | |
| 	/* Slicer */
 | |
| 	"application/vnd.ms-excel.slicer": "TODO",
 | |
| 	"application/vnd.ms-excel.slicerCache": "TODO",
 | |
| 	"application/vnd.ms-excel.slicer+xml": "TODO",
 | |
| 	"application/vnd.ms-excel.slicerCache+xml": "TODO",
 | |
| 
 | |
| 	/* Sort Map */
 | |
| 	"application/vnd.ms-excel.wsSortMap": "TODO",
 | |
| 
 | |
| 	/* Table */
 | |
| 	"application/vnd.ms-excel.table": "TODO",
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": "TODO",
 | |
| 
 | |
| 	/* Themes */
 | |
| 	"application/vnd.openxmlformats-officedocument.theme+xml": "themes",
 | |
| 
 | |
| 	/* Theme Override */
 | |
| 	"application/vnd.openxmlformats-officedocument.themeOverride+xml": "TODO",
 | |
| 
 | |
| 	/* Timeline */
 | |
| 	"application/vnd.ms-excel.Timeline+xml": "TODO", /* verify */
 | |
| 	"application/vnd.ms-excel.TimelineCache+xml": "TODO", /* verify */
 | |
| 
 | |
| 	/* VBA */
 | |
| 	"application/vnd.ms-office.vbaProject": "vba",
 | |
| 	"application/vnd.ms-office.vbaProjectSignature": "TODO",
 | |
| 
 | |
| 	/* Volatile Dependencies */
 | |
| 	"application/vnd.ms-office.volatileDependencies": "TODO",
 | |
| 	"application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml": "TODO",
 | |
| 
 | |
| 	/* Control Properties */
 | |
| 	"application/vnd.ms-excel.controlproperties+xml": "TODO",
 | |
| 
 | |
| 	/* Data Model */
 | |
| 	"application/vnd.openxmlformats-officedocument.model+data": "TODO",
 | |
| 
 | |
| 	/* Survey */
 | |
| 	"application/vnd.ms-excel.Survey+xml": "TODO",
 | |
| 
 | |
| 	/* Drawing */
 | |
| 	"application/vnd.openxmlformats-officedocument.drawing+xml": "drawings",
 | |
| 	"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": "TODO",
 | |
| 	"application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml": "TODO",
 | |
| 	"application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml": "TODO",
 | |
| 	"application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml": "TODO",
 | |
| 	"application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml": "TODO",
 | |
| 
 | |
| 	/* VML */
 | |
| 	"application/vnd.openxmlformats-officedocument.vmlDrawing": "TODO",
 | |
| 
 | |
| 	"application/vnd.openxmlformats-package.relationships+xml": "rels",
 | |
| 	"application/vnd.openxmlformats-officedocument.oleObject": "TODO",
 | |
| 
 | |
| 	/* Image */
 | |
| 	"image/png": "TODO",
 | |
| 
 | |
| 	"sheet": "js"
 | |
| }/*:any*/);
 | |
| 
 | |
| var CT_LIST = {
 | |
| 	workbooks: {
 | |
| 		xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
 | |
| 		xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
 | |
| 		xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main",
 | |
| 		xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml",
 | |
| 		xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"
 | |
| 	},
 | |
| 	strs: { /* Shared Strings */
 | |
| 		xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
 | |
| 		xlsb: "application/vnd.ms-excel.sharedStrings"
 | |
| 	},
 | |
| 	comments: { /* Comments */
 | |
| 		xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml",
 | |
| 		xlsb: "application/vnd.ms-excel.comments"
 | |
| 	},
 | |
| 	sheets: { /* Worksheet */
 | |
| 		xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
 | |
| 		xlsb: "application/vnd.ms-excel.worksheet"
 | |
| 	},
 | |
| 	charts: { /* Chartsheet */
 | |
| 		xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml",
 | |
| 		xlsb: "application/vnd.ms-excel.chartsheet"
 | |
| 	},
 | |
| 	dialogs: { /* Dialogsheet */
 | |
| 		xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml",
 | |
| 		xlsb: "application/vnd.ms-excel.dialogsheet"
 | |
| 	},
 | |
| 	macros: { /* Macrosheet (Excel 4.0 Macros) */
 | |
| 		xlsx: "application/vnd.ms-excel.macrosheet+xml",
 | |
| 		xlsb: "application/vnd.ms-excel.macrosheet"
 | |
| 	},
 | |
| 	metadata: { /* Metadata (Stock/Geography and Dynamic Array) */
 | |
| 		xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml",
 | |
| 		xlsb: "application/vnd.ms-excel.sheetMetadata"
 | |
| 	},
 | |
| 	styles: { /* Styles */
 | |
| 		xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml",
 | |
| 		xlsb: "application/vnd.ms-excel.styles"
 | |
| 	}
 | |
| };
 | |
| 
 | |
| function new_ct()/*:any*/ {
 | |
| 	return ({
 | |
| 		workbooks:[], sheets:[], charts:[], dialogs:[], macros:[],
 | |
| 		rels:[], strs:[], comments:[], threadedcomments:[], links:[],
 | |
| 		coreprops:[], extprops:[], custprops:[], themes:[], styles:[],
 | |
| 		calcchains:[], vba: [], drawings: [], metadata: [], people:[],
 | |
| 		TODO:[], xmlns: "" }/*:any*/);
 | |
| }
 | |
| 
 | |
| function parse_ct(data/*:?string*/) {
 | |
| 	var ct = new_ct();
 | |
| 	if(!data || !data.match) return ct;
 | |
| 	var ctext = {};
 | |
| 	(data.match(tagregex)||[]).forEach(function(x) {
 | |
| 		var y = parsexmltag(x);
 | |
| 		switch(y[0].replace(nsregex,"<")) {
 | |
| 			case '<?xml': break;
 | |
| 			case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break;
 | |
| 			case '<Default': ctext[y.Extension.toLowerCase()] = y.ContentType; break;
 | |
| 			case '<Override':
 | |
| 				if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName);
 | |
| 				break;
 | |
| 		}
 | |
| 	});
 | |
| 	if(ct.xmlns !== XMLNS.CT) throw new Error("Unknown Namespace: " + ct.xmlns);
 | |
| 	ct.calcchain = ct.calcchains.length > 0 ? ct.calcchains[0] : "";
 | |
| 	ct.sst = ct.strs.length > 0 ? ct.strs[0] : "";
 | |
| 	ct.style = ct.styles.length > 0 ? ct.styles[0] : "";
 | |
| 	ct.defaults = ctext;
 | |
| 	delete ct.calcchains;
 | |
| 	return ct;
 | |
| }
 | |
| 
 | |
| function write_ct(ct, opts, raw)/*:string*/ {
 | |
| 	var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type);
 | |
| 
 | |
| 	var o/*:Array<string>*/ = [], v;
 | |
| 
 | |
| 	if(!raw) {
 | |
| 		o[o.length] = (XML_HEADER);
 | |
| 		o[o.length] = writextag('Types', null, {
 | |
| 			'xmlns': XMLNS.CT,
 | |
| 			'xmlns:xsd': XMLNS.xsd,
 | |
| 			'xmlns:xsi': XMLNS.xsi
 | |
| 		});
 | |
| 		o = o.concat([
 | |
| 			['xml', 'application/xml'],
 | |
| 			['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],
 | |
| 			['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'],
 | |
| 			['data', 'application/vnd.openxmlformats-officedocument.model+data'],
 | |
| 			/* from test files */
 | |
| 			['bmp', 'image/bmp'],
 | |
| 			['png', 'image/png'],
 | |
| 			['gif', 'image/gif'],
 | |
| 			['emf', 'image/x-emf'],
 | |
| 			['wmf', 'image/x-wmf'],
 | |
| 			['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'],
 | |
| 			['tif', 'image/tiff'], ['tiff', 'image/tiff'],
 | |
| 			['pdf', 'application/pdf'],
 | |
| 			['rels', 'application/vnd.openxmlformats-package.relationships+xml']
 | |
| 		].map(function(x) {
 | |
| 			return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]});
 | |
| 		}));
 | |
| 	}
 | |
| 
 | |
| 	/* only write first instance */
 | |
| 	var f1 = function(w) {
 | |
| 		if(ct[w] && ct[w].length > 0) {
 | |
| 			v = ct[w][0];
 | |
| 			o[o.length] = (writextag('Override', null, {
 | |
| 				'PartName': (v[0] == '/' ? "":"/") + v,
 | |
| 				'ContentType': CT_LIST[w][opts.bookType] || CT_LIST[w]['xlsx']
 | |
| 			}));
 | |
| 		}
 | |
| 	};
 | |
| 
 | |
| 	/* book type-specific */
 | |
| 	var f2 = function(w) {
 | |
| 		(ct[w]||[]).forEach(function(v) {
 | |
| 			o[o.length] = (writextag('Override', null, {
 | |
| 				'PartName': (v[0] == '/' ? "":"/") + v,
 | |
| 				'ContentType': CT_LIST[w][opts.bookType] || CT_LIST[w]['xlsx']
 | |
| 			}));
 | |
| 		});
 | |
| 	};
 | |
| 
 | |
| 	/* standard type */
 | |
| 	var f3 = function(t) {
 | |
| 		(ct[t]||[]).forEach(function(v) {
 | |
| 			o[o.length] = (writextag('Override', null, {
 | |
| 				'PartName': (v[0] == '/' ? "":"/") + v,
 | |
| 				'ContentType': type2ct[t][0]
 | |
| 			}));
 | |
| 		});
 | |
| 	};
 | |
| 
 | |
| 	f1('workbooks');
 | |
| 	f2('sheets');
 | |
| 	f2('charts');
 | |
| 	f3('themes');
 | |
| 	['strs', 'styles'].forEach(f1);
 | |
| 	['coreprops', 'extprops', 'custprops'].forEach(f3);
 | |
| 	f3('vba');
 | |
| 	f3('comments');
 | |
| 	f3('threadedcomments');
 | |
| 	f3('drawings');
 | |
| 	f2('metadata');
 | |
| 	f3('people');
 | |
| 	if(!raw && o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); }
 | |
| 	return o.join("");
 | |
| }
 |