diff options
| author | Michael Williamson <mike@zwobble.org> | 2013-05-03 17:47:50 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2013-05-03 17:47:50 +0100 |
| commit | 49f72cd7bf6034f646a0f0e51ffbd204d86bea54 (patch) | |
| tree | 9fe827f055c5b1c663b2b549ed705e0627d601d6 | |
| parent | c770ff5fc300cdff7c961c4a222639fddb556431 (diff) | |
Read numFmt from numbering.xml
| -rw-r--r-- | lib/numbering-xml.js | 44 | ||||
| -rw-r--r-- | package.json | 3 | ||||
| -rw-r--r-- | tests/numbering-xml.tests.js | 25 |
3 files changed, 67 insertions, 5 deletions
diff --git a/lib/numbering-xml.js b/lib/numbering-xml.js index bc1c4d7..f983448 100644 --- a/lib/numbering-xml.js +++ b/lib/numbering-xml.js @@ -1,5 +1,47 @@ exports.readNumberingXml = readNumberingXml; function readNumberingXml(xml) { - return []; + var abstractNums = readAbstractNums(xml); + var nums = readNums(xml, abstractNums); + return { + findLevel: function(numId, level) { + var num = nums[numId]; + if (num) { + return num[level]; + } else { + return null; + } + } + }; +} + +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" + }; + }); + 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; } diff --git a/package.json b/package.json index c7f093f..310381b 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "devDependencies": { "mocha": "~1.8", "browserify": "~2.12.0", - "license-sniffer": "~0.1.0" + "license-sniffer": "~0.1.0", + "duck": "~0.1.11" } } diff --git a/tests/numbering-xml.tests.js b/tests/numbering-xml.tests.js index ab2ef15..3312dfe 100644 --- a/tests/numbering-xml.tests.js +++ b/tests/numbering-xml.tests.js @@ -1,15 +1,34 @@ var assert = require("assert"); +var duck = require("duck"); + var readNumberingXml = require("../lib/numbering-xml").readNumberingXml; var XmlElement = require("../lib/xmlreader").Element; var test = require("./testing").test; describe('readNumberingXml', function() { - test('reads no numbering elements from empty XML', function() { + test('w:num element inherits levels from w:abstractNum', function() { var numbering = readNumberingXml({ - root: new XmlElement("w:numbering") + root: new XmlElement("w:numbering", {}, [ + new XmlElement("w:abstractNum", {"w:abstractNumId": "42"}, [ + new XmlElement("w:lvl", {"w:ilvl": "0"}, [ + new XmlElement("w:numFmt", {"w:val": "bullet"}) + ]), + new XmlElement("w:lvl", {"w:ilvl": "1"}, [ + new XmlElement("w:numFmt", {"w:val": "decimal"}) + ]) + ]), + new XmlElement("w:num", {"w:numId": "47"}, [ + new XmlElement("w:abstractNumId", {"w:val": "42"}) + ]) + ]) }); - assert.deepEqual(numbering, []); + duck.assertThat(numbering.findLevel("47", "0"), duck.hasProperties({ + isOrdered: false + })); + duck.assertThat(numbering.findLevel("47", "1"), duck.hasProperties({ + isOrdered: true + })); }); }); |
