diff options
| author | Michael Williamson <mike@zwobble.org> | 2014-03-18 14:15:33 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2014-03-18 14:15:33 +0000 |
| commit | 45f302766a3a5ca99338fd8e5fef07dec42c0e56 (patch) | |
| tree | e5081b43310e6c3698c08ab021e0d61d0a84d09c /lib/docx/numbering-xml.js | |
| parent | dca50ccd84f91a7db2a41a59e15b3ed95b2c3f46 (diff) | |
Move modules for docx reading into separate directory
Diffstat (limited to 'lib/docx/numbering-xml.js')
| -rw-r--r-- | lib/docx/numbering-xml.js | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/lib/docx/numbering-xml.js b/lib/docx/numbering-xml.js new file mode 100644 index 0000000..7e64dc2 --- /dev/null +++ b/lib/docx/numbering-xml.js @@ -0,0 +1,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; +} |
