diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-08-04 21:48:04 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-08-04 21:50:41 +0100 |
| commit | 91933a7a595e05ef7b860fa0223d2fac16c81c80 (patch) | |
| tree | 7b7db4fc48970d3dfc5dd5964c92a7c8da506cbb | |
| parent | 2fcfbd4b3832ec6a6495bc08a2b97fa077c2f380 (diff) | |
Handle numbering properties without w:ilvl or w:numId
| -rw-r--r-- | NEWS | 4 | ||||
| -rw-r--r-- | lib/docx/body-reader.js | 21 | ||||
| -rw-r--r-- | lib/xmlreader.js | 14 | ||||
| -rw-r--r-- | tests/docx/body-reader.tests.js | 43 |
4 files changed, 74 insertions, 8 deletions
@@ -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); |
