xiejun
2023-08-23 205056bc17023dd44e6d262cfe78b6e146ee2f20
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
77
/* [MS-XLS] 2.4.326 TODO: payload is a zip file */
function parse_Theme(blob, length) {
    var dwThemeVersion = blob.read_shift(4);
    if(dwThemeVersion === 124226) return;
    blob.l += length-4;
}
 
/* 2.5.49 */
function parse_ColorTheme(blob, length) { return blob.read_shift(4); }
 
/* 2.5.155 */
function parse_FullColorExt(blob, length) {
    var o = {};
    o.xclrType = blob.read_shift(2);
    o.nTintShade = blob.read_shift(2);
    switch(o.xclrType) {
        case 0: blob.l += 4; break;
        case 1: o.xclrValue = parse_IcvXF(blob, 4); break;
        case 2: o.xclrValue = parse_LongRGBA(blob, 4); break;
        case 3: o.xclrValue = parse_ColorTheme(blob, 4); break;
        case 4: blob.l += 4; break;
    }
    blob.l += 8;
    return o;
}
 
/* 2.5.164 TODO: read 7 bits*/
function parse_IcvXF(blob, length) {
    return parsenoop(blob, length);
}
 
/* 2.5.280 */
function parse_XFExtGradient(blob, length) {
    return parsenoop(blob, length);
}
 
/* 2.5.108 */
function parse_ExtProp(blob, length) {
    var extType = blob.read_shift(2);
    var cb = blob.read_shift(2);
    var o = [extType];
    switch(extType) {
        case 0x04: case 0x05: case 0x07: case 0x08:
        case 0x09: case 0x0A: case 0x0B: case 0x0D:
            o[1] = parse_FullColorExt(blob, cb); break;
        case 0x06: o[1] = parse_XFExtGradient(blob, cb); break;
        case 0x0E: case 0x0F: o[1] = blob.read_shift(cb === 5 ? 1 : 2); break;
        default: throw new Error("Unrecognized ExtProp type: " + extType + " " + cb);
    }
    return o;
}
 
/* 2.4.355 */
function parse_XFExt(blob, length) {
    var end = blob.l + length;
    blob.l += 2;
    var ixfe = blob.read_shift(2);
    blob.l += 2;
    var cexts = blob.read_shift(2);
    var ext = [];
    while(cexts-- > 0) ext.push(parse_ExtProp(blob, end-blob.l));
    return {ixfe:ixfe, ext:ext};
}
 
/* xf is an XF, see parse_XFExt for xfext */
function update_xfext(xf, xfext) {
    xfext.forEach(function(xfe) {
        switch(xfe[0]) { /* 2.5.108 extPropData */
            case 0x04: break; /* foreground color */
            case 0x05: break; /* background color */
            case 0x07: case 0x08: case 0x09: case 0x0a: break;
            case 0x0d: break; /* text color */
            case 0x0e: break; /* font scheme */
            default: throw "bafuq" + xfe[0].toString(16);
        }
    });
}