2014-05-16 00:33:34 +00:00
|
|
|
/* 15.2.12.2 Custom File Properties Part */
|
|
|
|
XMLNS.CUST_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties";
|
|
|
|
RELS.CUST_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties';
|
|
|
|
|
2014-06-29 18:29:45 +00:00
|
|
|
var custregex = /<[^>]+>[^<]*/g;
|
2017-02-10 19:23:01 +00:00
|
|
|
function parse_cust_props(data/*:string*/, opts) {
|
|
|
|
var p = {}, name = "";
|
2014-06-29 18:29:45 +00:00
|
|
|
var m = data.match(custregex);
|
|
|
|
if(m) for(var i = 0; i != m.length; ++i) {
|
|
|
|
var x = m[i], y = parsexmltag(x);
|
2014-05-16 00:33:34 +00:00
|
|
|
switch(y[0]) {
|
|
|
|
case '<?xml': break;
|
2017-02-19 20:36:32 +00:00
|
|
|
case '<Properties': break;
|
2019-11-27 09:47:16 +00:00
|
|
|
case '<property': name = unescapexml(y.name); break;
|
2014-05-16 00:33:34 +00:00
|
|
|
case '</property>': name = null; break;
|
|
|
|
default: if (x.indexOf('<vt:') === 0) {
|
|
|
|
var toks = x.split('>');
|
2018-01-11 08:01:25 +00:00
|
|
|
var type = toks[0].slice(4), text = toks[1];
|
2014-05-16 00:33:34 +00:00
|
|
|
/* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */
|
|
|
|
switch(type) {
|
2017-03-28 22:03:03 +00:00
|
|
|
case 'lpstr': case 'bstr': case 'lpwstr':
|
2014-05-16 00:33:34 +00:00
|
|
|
p[name] = unescapexml(text);
|
|
|
|
break;
|
|
|
|
case 'bool':
|
2018-01-23 09:07:51 +00:00
|
|
|
p[name] = parsexmlbool(text);
|
2014-05-16 00:33:34 +00:00
|
|
|
break;
|
|
|
|
case 'i1': case 'i2': case 'i4': case 'i8': case 'int': case 'uint':
|
|
|
|
p[name] = parseInt(text, 10);
|
|
|
|
break;
|
|
|
|
case 'r4': case 'r8': case 'decimal':
|
|
|
|
p[name] = parseFloat(text);
|
|
|
|
break;
|
|
|
|
case 'filetime': case 'date':
|
2017-03-23 01:18:40 +00:00
|
|
|
p[name] = parseDate(text);
|
2014-05-16 00:33:34 +00:00
|
|
|
break;
|
|
|
|
case 'cy': case 'error':
|
|
|
|
p[name] = unescapexml(text);
|
|
|
|
break;
|
|
|
|
default:
|
2017-07-26 08:35:28 +00:00
|
|
|
if(type.slice(-1) == '/') break;
|
2017-02-03 20:50:45 +00:00
|
|
|
if(opts.WTF && typeof console !== 'undefined') console.warn('Unexpected', x, type, toks);
|
2014-05-16 00:33:34 +00:00
|
|
|
}
|
2018-01-11 08:01:25 +00:00
|
|
|
} else if(x.slice(0,2) === "</") {/* empty */
|
2014-05-16 00:33:34 +00:00
|
|
|
} else if(opts.WTF) throw new Error(x);
|
|
|
|
}
|
2014-06-29 18:29:45 +00:00
|
|
|
}
|
2014-05-16 00:33:34 +00:00
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
|
|
|
var CUST_PROPS_XML_ROOT = writextag('Properties', null, {
|
|
|
|
'xmlns': XMLNS.CUST_PROPS,
|
|
|
|
'xmlns:vt': XMLNS.vt
|
|
|
|
});
|
|
|
|
|
2018-01-23 09:07:51 +00:00
|
|
|
function write_cust_props(cp/*::, opts*/)/*:string*/ {
|
2014-06-29 18:29:45 +00:00
|
|
|
var o = [XML_HEADER, CUST_PROPS_XML_ROOT];
|
2014-05-16 00:33:34 +00:00
|
|
|
if(!cp) return o.join("");
|
|
|
|
var pid = 1;
|
2014-06-29 18:29:45 +00:00
|
|
|
keys(cp).forEach(function custprop(k) { ++pid;
|
2020-05-16 19:45:54 +00:00
|
|
|
o[o.length] = (writextag('property', write_vt(cp[k], true), {
|
2014-05-16 00:33:34 +00:00
|
|
|
'fmtid': '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}',
|
|
|
|
'pid': pid,
|
2019-11-27 09:47:16 +00:00
|
|
|
'name': escapexml(k)
|
2014-05-16 00:33:34 +00:00
|
|
|
}));
|
|
|
|
});
|
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("");
|
|
|
|
}
|