ludc
2023-08-24 56c45e1f4be85d6bbfb3a03437021c6742b32ad9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/* 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[o.length] = (XML_HEADER);
    o[o.length] = (EXT_PROPS_XML_ROOT);
 
    EXT_PROPS.forEach(function(f) {
        if(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(v !== undefined) o[o.length] = (W(f[0], v));
    });
 
    /* TODO: HeadingPairs, TitlesOfParts */
    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"})));
    o[o.length] = (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[o.length] = ('</Properties>'); o[1]=o[1].replace("/>",">"); }
    return o.join("");
}