summaryrefslogtreecommitdiff
path: root/lib/numbering-xml.js
blob: 7e64dc226308699416a0db0cdfde1fd8540893b9 (plain)
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
var readXmlFromZipFile = require("./office-xml-reader").readXmlFromZipFile;

exports.readNumberingXml = readNumberingXml;
exports.readNumberingFromZipFile = readNumberingFromZipFile;
exports.Numbering = Numbering;

function readNumberingFromZipFile(file) {
    return readXmlFromZipFile(file, "word/numbering.xml")
        .then(function(xml) {
            return xml ? readNumberingXml(xml) : new Numbering({});
        });
}

function Numbering(nums) {
    return {
        findLevel: function(numId, level) {
            var num = nums[numId];
            if (num) {
                return num[level];
            } else {
                return null;
            }
        }
    };
}

function readNumberingXml(xml) {
    var abstractNums = readAbstractNums(xml);
    var nums = readNums(xml, abstractNums);
    return new Numbering(nums);
}

function readAbstractNums(xml) {
    var abstractNums = {};
    xml.root.getElementsByTagName("w:abstractNum").forEach(function(element) {
        var id = element.attributes["w:abstractNumId"];
        abstractNums[id] = readAbstractNum(element);
    });
    return abstractNums;
}

function readAbstractNum(element) {
    var levels = {};
    element.getElementsByTagName("w:lvl").forEach(function(levelElement) {
        var levelIndex = levelElement.attributes["w:ilvl"];
        var numFmt = levelElement.first("w:numFmt").attributes["w:val"];
        levels[levelIndex] = {
            isOrdered: numFmt !== "bullet",
            level: levelIndex
        };
    });
    return levels;
}

function readNums(xml, abstractNums) {
    var nums = {};
    xml.root.getElementsByTagName("w:num").forEach(function(element) {
        var id = element.attributes["w:numId"];
        var abstractNumId = element.first("w:abstractNumId").attributes["w:val"];
        nums[id] = abstractNums[abstractNumId];
    });
    return nums;
}