aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-08-04 21:48:04 +0100
committerMichael Williamson <mike@zwobble.org>2015-08-04 21:50:41 +0100
commit91933a7a595e05ef7b860fa0223d2fac16c81c80 (patch)
tree7b7db4fc48970d3dfc5dd5964c92a7c8da506cbb
parent2fcfbd4b3832ec6a6495bc08a2b97fa077c2f380 (diff)
Handle numbering properties without w:ilvl or w:numId
-rw-r--r--NEWS4
-rw-r--r--lib/docx/body-reader.js21
-rw-r--r--lib/xmlreader.js14
-rw-r--r--tests/docx/body-reader.tests.js43
4 files changed, 74 insertions, 8 deletions
diff --git a/NEWS b/NEWS
index bc83a00..d8f5d75 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+# 0.3.24
+
+* Ignore w:numPr elements without w:numId or w:ilvl children.
+
# 0.3.23
* Support links and images in footnotes and endnotes.
diff --git a/lib/docx/body-reader.js b/lib/docx/body-reader.js
index 44ae038..25a263a 100644
--- a/lib/docx/body-reader.js
+++ b/lib/docx/body-reader.js
@@ -108,13 +108,7 @@ function BodyReader(options) {
if (alignElement) {
properties.alignment = alignElement.attributes["w:val"];
}
- var numberingPropertiesElement = element.first("w:numPr");
- if (numberingPropertiesElement) {
- var levelElement = numberingPropertiesElement.first("w:ilvl");
- var level = levelElement.attributes["w:val"];
- var numId = numberingPropertiesElement.first("w:numId").attributes["w:val"];
- properties.numbering = numbering.findLevel(numId, level);
- }
+ properties.numbering = readNumberingProperties(element.firstOrEmpty("w:numPr"));
return elementResult(properties);
},
@@ -196,9 +190,20 @@ function BodyReader(options) {
};
return {
readXmlElement: readXmlElement,
- readXmlElements: readXmlElements
+ readXmlElements: readXmlElements,
+ _readNumberingProperties: readNumberingProperties
};
+ function readNumberingProperties(element) {
+ var level = element.firstOrEmpty("w:ilvl").attributes["w:val"];
+ var numId = element.firstOrEmpty("w:numId").attributes["w:val"];
+ if (level === undefined || numId === undefined) {
+ return null;
+ } else {
+ return numbering.findLevel(numId, level);
+ }
+ }
+
function readDrawingElement(element) {
var blips = element
.getElementsByTagName("a:graphic")
diff --git a/lib/xmlreader.js b/lib/xmlreader.js
index f219d2b..551366f 100644
--- a/lib/xmlreader.js
+++ b/lib/xmlreader.js
@@ -85,6 +85,16 @@ function mapObject(input, valueFunc, keyFunc) {
}, {});
}
+var emptyElement = {
+ first: function() {
+ return null;
+ },
+ firstOrEmpty: function() {
+ return emptyElement;
+ },
+ attributes: {}
+};
+
function Element(name, attributes, children) {
this.type = "element";
this.name = name;
@@ -98,6 +108,10 @@ Element.prototype.first = function(name) {
});
};
+Element.prototype.firstOrEmpty = function(name) {
+ return this.first(name) || emptyElement;
+};
+
Element.prototype.getElementsByTagName = function(name) {
var elements = _.filter(this.children, function(child) {
return child.name == name;
diff --git a/tests/docx/body-reader.tests.js b/tests/docx/body-reader.tests.js
index acc8ca3..172da76 100644
--- a/tests/docx/body-reader.tests.js
+++ b/tests/docx/body-reader.tests.js
@@ -92,6 +92,49 @@ describe("readXmlElement: ", function() {
assert.deepEqual(paragraph.numbering, {level: "1", isOrdered: true});
});
+ test("numbering properties are converted to numbering at specified level", function() {
+ var numberingPropertiesXml = new XmlElement("w:numPr", {}, [
+ new XmlElement("w:ilvl", {"w:val": "1"}),
+ new XmlElement("w:numId", {"w:val": "42"})
+ ]);
+
+ var numbering = new Numbering({"42": {"1": {isOrdered: true, level: "1"}}});
+
+ var reader = new BodyReader({
+ numbering: numbering
+ });
+ var numberingLevel = reader._readNumberingProperties(numberingPropertiesXml);
+ assert.deepEqual(numberingLevel, {level: "1", isOrdered: true});
+ });
+
+ test("numbering properties are ignored if w:ilvl is missing", function() {
+ var numberingPropertiesXml = new XmlElement("w:numPr", {}, [
+ new XmlElement("w:numId", {"w:val": "42"})
+ ]);
+
+ var numbering = new Numbering({"42": {"1": {isOrdered: true, level: "1"}}});
+
+ var reader = new BodyReader({
+ numbering: numbering
+ });
+ var numberingLevel = reader._readNumberingProperties(numberingPropertiesXml);
+ assert.equal(numberingLevel, null);
+ });
+
+ test("numbering properties are ignored if w:numId is missing", function() {
+ var numberingPropertiesXml = new XmlElement("w:numPr", {}, [
+ new XmlElement("w:ilvl", {"w:val": "1"})
+ ]);
+
+ var numbering = new Numbering({"42": {"1": {isOrdered: true, level: "1"}}});
+
+ var reader = new BodyReader({
+ numbering: numbering
+ });
+ var numberingLevel = reader._readNumberingProperties(numberingPropertiesXml);
+ assert.equal(numberingLevel, null);
+ });
+
test("run has no style if it has no properties", function() {
var runXml = runWithProperties([]);
var run = readXmlElementValue(runXml);