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;
}
|