2014-05-16 00:33:34 +00:00
|
|
|
|
/* 15.2.12.3 Extended File Properties Part */
|
|
|
|
|
/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */
|
2017-02-10 19:23:01 +00:00
|
|
|
|
var EXT_PROPS/*:Array<Array<string> >*/ = [
|
2014-05-16 00:33:34 +00:00
|
|
|
|
["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"],
|
2014-06-03 18:39:46 +00:00
|
|
|
|
["TitlesOfParts", "TitlesOfParts", "raw"]
|
2014-05-16 00:33:34 +00:00
|
|
|
|
];
|
|
|
|
|
|
2018-05-05 06:34:37 +00:00
|
|
|
|
var PseudoPropsPairs = [
|
|
|
|
|
"Worksheets", "SheetNames",
|
|
|
|
|
"NamedRanges", "DefinedNames",
|
|
|
|
|
"Chartsheets", "ChartNames"
|
|
|
|
|
];
|
|
|
|
|
function load_props_pairs(HP/*:string|Array<Array<any>>*/, TOP, props, opts) {
|
|
|
|
|
var v = [];
|
|
|
|
|
if(typeof HP == "string") v = parseVector(HP, opts);
|
|
|
|
|
else for(var j = 0; j < HP.length; ++j) v = v.concat(HP[j].map(function(hp) { return {v:hp}; }));
|
|
|
|
|
var parts = (typeof TOP == "string") ? parseVector(TOP, opts).map(function (x) { return x.v; }) : TOP;
|
|
|
|
|
var idx = 0, len = 0;
|
|
|
|
|
if(parts.length > 0) for(var i = 0; i !== v.length; i += 2) {
|
|
|
|
|
len = +(v[i+1].v);
|
|
|
|
|
switch(v[i].v) {
|
|
|
|
|
case "Worksheets":
|
|
|
|
|
case "工作表":
|
|
|
|
|
case "Листы":
|
|
|
|
|
case "أوراق العمل":
|
|
|
|
|
case "ワークシート":
|
|
|
|
|
case "גליונות עבודה":
|
|
|
|
|
case "Arbeitsblätter":
|
|
|
|
|
case "Çalışma Sayfaları":
|
|
|
|
|
case "Feuilles de calcul":
|
|
|
|
|
case "Fogli di lavoro":
|
|
|
|
|
case "Folhas de cálculo":
|
|
|
|
|
case "Planilhas":
|
|
|
|
|
case "Regneark":
|
2019-11-01 03:09:14 +00:00
|
|
|
|
case "Hojas de cálculo":
|
2018-05-05 06:34:37 +00:00
|
|
|
|
case "Werkbladen":
|
|
|
|
|
props.Worksheets = len;
|
|
|
|
|
props.SheetNames = parts.slice(idx, idx + len);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case "Named Ranges":
|
2019-11-01 03:09:14 +00:00
|
|
|
|
case "Rangos con nombre":
|
2018-05-05 06:34:37 +00:00
|
|
|
|
case "名前付き一覧":
|
|
|
|
|
case "Benannte Bereiche":
|
|
|
|
|
case "Navngivne områder":
|
|
|
|
|
props.NamedRanges = len;
|
|
|
|
|
props.DefinedNames = parts.slice(idx, idx + len);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case "Charts":
|
|
|
|
|
case "Diagramme":
|
|
|
|
|
props.Chartsheets = len;
|
|
|
|
|
props.ChartNames = parts.slice(idx, idx + len);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
idx += len;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-03 15:51:16 +00:00
|
|
|
|
function parse_ext_props(data, p, opts) {
|
2014-05-16 00:33:34 +00:00
|
|
|
|
var q = {}; if(!p) p = {};
|
2017-09-30 06:18:11 +00:00
|
|
|
|
data = utf8read(data);
|
2014-05-16 00:33:34 +00:00
|
|
|
|
|
|
|
|
|
EXT_PROPS.forEach(function(f) {
|
2024-02-02 06:52:14 +00:00
|
|
|
|
var xml = (str_match_xml_ns(data, f[0])||[])[1];
|
2014-05-16 00:33:34 +00:00
|
|
|
|
switch(f[2]) {
|
2020-04-20 17:17:29 +00:00
|
|
|
|
case "string": if(xml) p[f[1]] = unescapexml(xml); break;
|
2019-11-27 09:47:16 +00:00
|
|
|
|
case "bool": p[f[1]] = xml === "true"; break;
|
2014-05-16 00:33:34 +00:00
|
|
|
|
case "raw":
|
2024-02-02 06:52:14 +00:00
|
|
|
|
var cur = str_match_xml(data, f[0]);
|
2014-05-16 00:33:34 +00:00
|
|
|
|
if(cur && cur.length > 0) q[f[1]] = cur[1];
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2018-05-05 06:34:37 +00:00
|
|
|
|
if(q.HeadingPairs && q.TitlesOfParts) load_props_pairs(q.HeadingPairs, q.TitlesOfParts, p, opts);
|
2017-03-31 18:46:42 +00:00
|
|
|
|
|
2014-05-16 00:33:34 +00:00
|
|
|
|
return p;
|
|
|
|
|
}
|
|
|
|
|
|
2018-01-23 09:07:51 +00:00
|
|
|
|
function write_ext_props(cp/*::, opts*/)/*:string*/ {
|
|
|
|
|
var o/*:Array<string>*/ = [], W = writextag;
|
2014-05-22 12:16:51 +00:00
|
|
|
|
if(!cp) cp = {};
|
|
|
|
|
cp.Application = "SheetJS";
|
2014-06-29 18:29:45 +00:00
|
|
|
|
o[o.length] = (XML_HEADER);
|
2022-03-14 06:51:33 +00:00
|
|
|
|
o[o.length] = (writextag('Properties', null, {
|
|
|
|
|
'xmlns': XMLNS.EXT_PROPS,
|
|
|
|
|
'xmlns:vt': XMLNS.vt
|
|
|
|
|
}));
|
2014-05-16 00:33:34 +00:00
|
|
|
|
|
|
|
|
|
EXT_PROPS.forEach(function(f) {
|
2014-07-28 13:22:32 +00:00
|
|
|
|
if(cp[f[1]] === undefined) return;
|
2014-05-16 00:33:34 +00:00
|
|
|
|
var v;
|
|
|
|
|
switch(f[2]) {
|
2019-11-27 09:47:16 +00:00
|
|
|
|
case 'string': v = escapexml(String(cp[f[1]])); break;
|
2014-05-16 00:33:34 +00:00
|
|
|
|
case 'bool': v = cp[f[1]] ? 'true' : 'false'; break;
|
|
|
|
|
}
|
2014-07-28 13:22:32 +00:00
|
|
|
|
if(v !== undefined) o[o.length] = (W(f[0], v));
|
2014-05-16 00:33:34 +00:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
/* TODO: HeadingPairs, TitlesOfParts */
|
2014-06-29 18:29:45 +00:00
|
|
|
|
o[o.length] = (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"})));
|
2017-03-13 06:46:37 +00:00
|
|
|
|
o[o.length] = (W('TitlesOfParts', W('vt:vector', cp.SheetNames.map(function(s) { return "<vt:lpstr>" + escapexml(s) + "</vt:lpstr>"; }).join(""), {size: cp.Worksheets, baseType:"lpstr"})));
|
2014-06-29 18:29:45 +00:00
|
|
|
|
if(o.length>2){ o[o.length] = ('</Properties>'); o[1]=o[1].replace("/>",">"); }
|
2014-05-16 00:33:34 +00:00
|
|
|
|
return o.join("");
|
|
|
|
|
}
|