aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2013-04-27 16:54:42 +0100
committerMichael Williamson <mike@zwobble.org>2013-04-27 16:54:42 +0100
commit54c5c0ee38eb915275be4b0713fcaafb56033ac3 (patch)
treeb4f08f49fb83dabbd4abbe89ace4f9e4a1dfc912
parentda8ef999085c7f229da25673a2b4fbf908c7a3f0 (diff)
Handle w:drawing elements with no children
-rw-r--r--lib/document-xml-reader.js8
-rw-r--r--lib/xmlreader.js6
-rw-r--r--tests/document-xml-reader.tests.js26
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");
+ }
+}