summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2013-05-03 17:47:50 +0100
committerMichael Williamson <mike@zwobble.org>2013-05-03 17:47:50 +0100
commit49f72cd7bf6034f646a0f0e51ffbd204d86bea54 (patch)
tree9fe827f055c5b1c663b2b549ed705e0627d601d6
parentc770ff5fc300cdff7c961c4a222639fddb556431 (diff)
Read numFmt from numbering.xml
-rw-r--r--lib/numbering-xml.js44
-rw-r--r--package.json3
-rw-r--r--tests/numbering-xml.tests.js25
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
+ }));
});
});