forked from sheetjs/sheetjs
		
	- read BOM, handle UTF16LE-encoded XML - handle namespaces in [Content_Types].xml - parse workbook rels to determine sheet files - numbers OSX boolean support (apparently requires "0" or "1") - XLSX force "General" style to be serialized, omit implied cell type and style - updated SSF to 0.7.0 (h/t @sysarchitect) - updated jszip to 2.2.2 - removed old tests/files path, replaced with test_files - themes written - ignore potential existence of thumbnail when calculating relationship ids
		
			
				
	
	
		
			77 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* 15.2.12.3 Extended File Properties Part */
 | |
| /* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */
 | |
| var EXT_PROPS = [
 | |
| 	["Application", "Application", "string"],
 | |
| 	["AppVersion", "AppVersion", "string"],
 | |
| 	["Company", "Company", "string"],
 | |
| 	["DocSecurity", "DocSecurity", "string"],
 | |
| 	["Manager", "Manager", "string"],
 | |
| 	["HyperlinksChanged", "HyperlinksChanged", "bool"],
 | |
| 	["SharedDoc", "SharedDoc", "bool"],
 | |
| 	["LinksUpToDate", "LinksUpToDate", "bool"],
 | |
| 	["ScaleCrop", "ScaleCrop", "bool"],
 | |
| 	["HeadingPairs", "HeadingPairs", "raw"],
 | |
| 	["TitlesOfParts", "TitlesOfParts", "raw"],
 | |
| ];
 | |
| 
 | |
| XMLNS.EXT_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties";
 | |
| RELS.EXT_PROPS  = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties';
 | |
| 
 | |
| function parse_ext_props(data, p) {
 | |
| 	var q = {}; if(!p) p = {};
 | |
| 
 | |
| 	EXT_PROPS.forEach(function(f) {
 | |
| 		switch(f[2]) {
 | |
| 			case "string": p[f[1]] = (data.match(matchtag(f[0]))||[])[1]; break;
 | |
| 			case "bool": p[f[1]] = (data.match(matchtag(f[0]))||[])[1] === "true"; break;
 | |
| 			case "raw":
 | |
| 				var cur = data.match(new RegExp("<" + f[0] + "[^>]*>(.*)<\/" + f[0] + ">"));
 | |
| 				if(cur && cur.length > 0) q[f[1]] = cur[1];
 | |
| 				break;
 | |
| 		}
 | |
| 	});
 | |
| 
 | |
| 	if(q.HeadingPairs && q.TitlesOfParts) {
 | |
| 		var v = parseVector(q.HeadingPairs);
 | |
| 		var j = 0, widx = 0;
 | |
| 		for(var i = 0; i !== v.length; ++i) {
 | |
| 			switch(v[i].v) {
 | |
| 				case "Worksheets": widx = j; p.Worksheets = +(v[++i].v); break;
 | |
| 				case "Named Ranges": ++i; break; // TODO: Handle Named Ranges
 | |
| 			}
 | |
| 		}
 | |
| 		var parts = parseVector(q.TitlesOfParts).map(function(x) { return utf8read(x.v); });
 | |
| 		p.SheetNames = parts.slice(widx, widx + p.Worksheets);
 | |
| 	}
 | |
| 	return p;
 | |
| }
 | |
| 
 | |
| var EXT_PROPS_XML_ROOT = writextag('Properties', null, {
 | |
| 	'xmlns': XMLNS.EXT_PROPS,
 | |
| 	'xmlns:vt': XMLNS.vt
 | |
| });
 | |
| 
 | |
| function write_ext_props(cp, opts) {
 | |
| 	var o = [], p = {}, W = writextag;
 | |
| 	if(!cp) cp = {};
 | |
| 	cp.Application = "SheetJS";
 | |
| 	o.push(XML_HEADER);
 | |
| 	o.push(EXT_PROPS_XML_ROOT);
 | |
| 
 | |
| 	EXT_PROPS.forEach(function(f) {
 | |
| 		if(typeof cp[f[1]] === 'undefined') return;
 | |
| 		var v;
 | |
| 		switch(f[2]) {
 | |
| 			case 'string': v = cp[f[1]]; break;
 | |
| 			case 'bool': v = cp[f[1]] ? 'true' : 'false'; break;
 | |
| 		}
 | |
| 		if(typeof v !== 'undefined') o.push(W(f[0], v));
 | |
| 	});
 | |
| 
 | |
| 	/* TODO: HeadingPairs, TitlesOfParts */
 | |
| 	o.push(W('HeadingPairs', W('vt:vector', W('vt:variant', '<vt:lpstr>Worksheets</vt:lpstr>')+W('vt:variant', W('vt:i4', String(cp.Worksheets))), {size:2, baseType:"variant"})));
 | |
| 	o.push(W('TitlesOfParts', W('vt:vector', cp.SheetNames.map(function(s) { return "<vt:lpstr>" + s + "</vt:lpstr>"; }).join(""), {size: cp.Worksheets, baseType:"lpstr"})));
 | |
| 	if(o.length>2){ o.push('</Properties>'); o[1]=o[1].replace("/>",">"); }
 | |
| 	return o.join("");
 | |
| }
 |