diff options
| author | Michael Williamson <mike@zwobble.org> | 2013-04-27 16:54:42 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2013-04-27 16:54:42 +0100 |
| commit | 54c5c0ee38eb915275be4b0713fcaafb56033ac3 (patch) | |
| tree | b4f08f49fb83dabbd4abbe89ace4f9e4a1dfc912 | |
| parent | da8ef999085c7f229da25673a2b4fbf908c7a3f0 (diff) | |
Handle w:drawing elements with no children
| -rw-r--r-- | lib/document-xml-reader.js | 8 | ||||
| -rw-r--r-- | lib/xmlreader.js | 6 | ||||
| -rw-r--r-- | tests/document-xml-reader.tests.js | 26 |
3 files changed, 32 insertions, 8 deletions
diff --git a/lib/document-xml-reader.js b/lib/document-xml-reader.js index 04eec21..a391a21 100644 --- a/lib/document-xml-reader.js +++ b/lib/document-xml-reader.js @@ -23,7 +23,7 @@ function DocumentXmlReader(relationships, docxFile) { function readXmlElements(elements) { var results = elements.map(readXmlElement); - var values = _.pluck(results, "value").filter(notNull); + var values = _.flatten(_.pluck(results, "value")); var messages = _.flatten(_.pluck(results, "messages"), true); return new Result(values, messages); } @@ -35,12 +35,12 @@ function DocumentXmlReader(relationships, docxFile) { return handler(element); } else if (!Object.prototype.hasOwnProperty.call(ignoreElements, element.name)) { return new Result( - null, + [], [warning("An unrecognised element was ignored: " + element.name)] ); } } - return new Result(null); + return new Result([]); } var xmlElementReaders = { @@ -105,7 +105,7 @@ function DocumentXmlReader(relationships, docxFile) { }, "w:drawing": function(element) { - return readXmlElement(element.first("wp:inline")); + return readXmlElements(element.children); }, "wp:inline": function(element) { var relationshipId = element diff --git a/lib/xmlreader.js b/lib/xmlreader.js index 3fde762..08347c4 100644 --- a/lib/xmlreader.js +++ b/lib/xmlreader.js @@ -97,3 +97,9 @@ Element.prototype.first = function(name) { return child.name == name; }); } + +Element.prototype.getElementsByTagName = function(name) { + return _.filter(this.children, function(child) { + return child.name == name; + }); +}; diff --git a/tests/document-xml-reader.tests.js b/tests/document-xml-reader.tests.js index 422a186..51512eb 100644 --- a/tests/document-xml-reader.tests.js +++ b/tests/document-xml-reader.tests.js @@ -96,7 +96,7 @@ describe("readXmlElement: ", function() { var ignoredElement = new XmlElement("w:bookmarkStart"); var result = readXmlElement(ignoredElement); assert.deepEqual(result.messages, []); - assert.equal(null, result.value); + assert.deepEqual([], result.value); }); test("can read inline pictures", function() { @@ -126,13 +126,23 @@ describe("readXmlElement: ", function() { ); var result = reader.readXmlElement(drawing); assert.deepEqual(result.messages, []); - assert.equal("image", result.value.type); - assert.equal(result.value.altText, "It's a hat"); - return result.value.read() + var element = single(result.value); + assert.equal("image", element.type); + assert.equal(element.altText, "It's a hat"); + return element.read() .then(function(readValue) { assert.equal(readValue, imageBuffer) }); }); + + test("no elements created if image cannot be found in w:drawing", function() { + var drawing = new XmlElement("w:drawing", {}, []); + + var reader = new DocumentXmlReader(); + var result = reader.readXmlElement(drawing); + assert.deepEqual(result.messages, []); + assert.deepEqual(result.value, []); + }); }); function runWithProperties(children) { @@ -142,3 +152,11 @@ function runWithProperties(children) { function createRunPropertiesXml(children) { return new XmlElement("w:rPr", {}, children); } + +function single(array) { + if (array.length === 1) { + return array[0]; + } else { + throw new Error("Array has " + array.length + " elements"); + } +} |
