aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2013-04-01 15:50:24 +0100
committerMichael Williamson <mike@zwobble.org>2013-04-01 15:50:24 +0100
commit7aecbe20f174100cdc6f72238f43ef3d96e7fb50 (patch)
tree11f826c8fef2bae26397d8374f51c94d7d336791
parent6fdee5a4b57832682e1c43156b2e075a5552f595 (diff)
Have docx-reader emit warnings when finding unrecognised elements
-rw-r--r--lib/docx-reader.js71
-rw-r--r--lib/index.js4
-rw-r--r--tests/docx-reader.tests.js46
3 files changed, 81 insertions, 40 deletions
diff --git a/lib/docx-reader.js b/lib/docx-reader.js
index 44b3393..94e5f99 100644
--- a/lib/docx-reader.js
+++ b/lib/docx-reader.js
@@ -30,12 +30,17 @@ function read(docxFile) {
function convertXmlToDocument(documentXml) {
var body = documentXml.root.first("w:body");
- var children = readXmlElements(body.children);
- return new documents.Document(children);
+ return readXmlElements(body.children)
+ .map(function(children) {
+ return new documents.Document(children);
+ });
}
function readXmlElements(elements) {
- return elements.map(readXmlElement).filter(notNull);
+ var results = elements.map(readXmlElement);
+ var values = _.pluck(results, "value").filter(notNull);
+ var messages = _.pluck(results, "messages");
+ return new Result(values, messages);
}
function readXmlElement(element) {
@@ -44,22 +49,27 @@ function readXmlElement(element) {
if (handler) {
return handler(element);
} else {
- return null;
+ return new Result(
+ null,
+ [warning("An unrecognised element was ignored: " + element.name)]
+ );
}
} else {
- return null;
+ return new Result(null);
}
}
var xmlElementReaders = {
"w:p": function(element) {
- var children = readXmlElements(element.children);
- var properties = _.find(children, isParagraphProperties);
-
- return new documents.Paragraph(
- children.filter(negate(isParagraphProperties)),
- properties
- );
+ return readXmlElements(element.children)
+ .map(function(children) {
+ var properties = _.find(children, isParagraphProperties);
+
+ return new documents.Paragraph(
+ children.filter(negate(isParagraphProperties)),
+ properties
+ );
+ });
},
"w:pPr": function(element) {
var properties = {
@@ -71,15 +81,18 @@ var xmlElementReaders = {
properties.styleName = styleElement.attributes["w:val"];
}
- return properties;
+ return new Result(properties);
},
"w:r": function(element) {
- var children = readXmlElements(element.children);
- var properties = _.find(children, isRunProperties);
- return new documents.Run(
- children.filter(negate(isRunProperties)),
- properties
- );
+ return readXmlElements(element.children)
+ .map(function(children) {
+ var properties = _.find(children, isRunProperties);
+
+ return new documents.Run(
+ children.filter(negate(isRunProperties)),
+ properties
+ );
+ });
},
"w:rPr": function(element) {
var properties = {
@@ -93,10 +106,10 @@ var xmlElementReaders = {
properties.isBold = !!element.first("w:b");
properties.isItalic = !!element.first("w:i");
- return properties;
+ return new Result(properties);
},
"w:t": function(element) {
- return new documents.Text(element.children[0].value);
+ return new Result(new documents.Text(element.children[0].value));
}
};
@@ -121,3 +134,19 @@ function negate(predicate) {
return !predicate(value);
};
}
+
+function Result(value, messages) {
+ this.value = value;
+ this.messages = messages || [];
+}
+
+Result.prototype.map = function(func) {
+ return new Result(func(this.value), this.messages);
+};
+
+function warning(message) {
+ return {
+ type: "warning",
+ message: message
+ };
+}
diff --git a/lib/index.js b/lib/index.js
index 146b507..2a5283f 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -19,7 +19,7 @@ function Converter(options) {
Converter.prototype.convertToHtml = function(docxFile) {
var documentConverter = this._documentConverter;
return docxReader.read(docxFile)
- .then(function(document) {
- return documentConverter.convertToHtml(document);
+ .then(function(result) {
+ return documentConverter.convertToHtml(result.value);
});
}
diff --git a/tests/docx-reader.tests.js b/tests/docx-reader.tests.js
index 005f808..3eee8f1 100644
--- a/tests/docx-reader.tests.js
+++ b/tests/docx-reader.tests.js
@@ -23,7 +23,7 @@ describe("docx-reader", function() {
"word/document.xml": testData("simple/word/document.xml")
});
return docxReader.read(docxFile).then(function(result) {
- assert.deepEqual(expectedDocument, result);
+ assert.deepEqual(expectedDocument, result.value);
});
});
@@ -32,7 +32,7 @@ describe("docx-reader", function() {
"word/document.xml": testData("paragraphStyles/word/document.xml")
});
return docxReader.read(docxFile).then(function(result) {
- var paragraph = result.children[0];
+ var paragraph = result.value.children[0];
assert.deepEqual("Heading1", paragraph.properties.styleName);
});
});
@@ -42,7 +42,7 @@ describe("docx-reader", function() {
"word/document.xml": testData("paragraphStyles/word/document.xml")
});
return docxReader.read(docxFile).then(function(result) {
- var paragraph = result.children[0];
+ var paragraph = result.value.children[0];
assert.equal(1, paragraph.children.length);
});
});
@@ -52,50 +52,62 @@ describe("readElement", function() {
test("reads styles from run properties", function() {
var runStyleXml = new XmlElement("w:rStyle", {"w:val": "Emphasis"});
var runPropertiesXml = createRunPropertiesXml([runStyleXml]);
- var element = docxReader.readXmlElement(runPropertiesXml);
- assert.equal(element.styleName, "Emphasis");
+ var result = docxReader.readXmlElement(runPropertiesXml);
+ assert.equal(result.value.styleName, "Emphasis");
});
test("isBold is false if bold element is not present", function() {
var runPropertiesXml = createRunPropertiesXml([]);
- var element = docxReader.readXmlElement(runPropertiesXml);
- assert.equal(element.isBold, false);
+ var result = docxReader.readXmlElement(runPropertiesXml);
+ assert.equal(result.value.isBold, false);
});
test("isBold is true if bold element is present", function() {
var boldXml = new XmlElement("w:b");
var runPropertiesXml = createRunPropertiesXml([boldXml]);
- var element = docxReader.readXmlElement(runPropertiesXml);
- assert.equal(element.isBold, true);
+ var result = docxReader.readXmlElement(runPropertiesXml);
+ assert.equal(result.value.isBold, true);
});
test("isItalic is false if bold element is not present", function() {
var runPropertiesXml = createRunPropertiesXml([]);
- var element = docxReader.readXmlElement(runPropertiesXml);
- assert.equal(element.isItalic, false);
+ var result = docxReader.readXmlElement(runPropertiesXml);
+ assert.equal(result.value.isItalic, false);
});
test("isItalic is true if bold element is present", function() {
var italicXml = new XmlElement("w:i");
var runPropertiesXml = createRunPropertiesXml([italicXml]);
- var element = docxReader.readXmlElement(runPropertiesXml);
- assert.equal(element.isItalic, true);
+ var result = docxReader.readXmlElement(runPropertiesXml);
+ assert.equal(result.value.isItalic, true);
});
test("run properties are attached to run", function() {
var runStyleXml = new XmlElement("w:rStyle", {"w:val": "Emphasis"});
var runPropertiesXml = new XmlElement("w:rPr", {}, [runStyleXml]);
var runXml = new XmlElement("w:r", {}, [runPropertiesXml]);
- var element = docxReader.readXmlElement(runXml);
- assert.equal(element.properties.styleName, "Emphasis");
+ var result = docxReader.readXmlElement(runXml);
+ assert.equal(result.value.properties.styleName, "Emphasis");
});
test("run properties not included as child of run", function() {
var runStyleXml = new XmlElement("w:rStyle", {"w:val": "Emphasis"});
var runPropertiesXml = new XmlElement("w:rPr", {}, [runStyleXml]);
var runXml = new XmlElement("w:r", {}, [runPropertiesXml]);
- var element = docxReader.readXmlElement(runXml);
- assert.deepEqual(element.children, []);
+ var result = docxReader.readXmlElement(runXml);
+ assert.deepEqual(result.value.children, []);
+ });
+
+ test("emits warning on unrecognised element", function() {
+ var unrecognisedElement = new XmlElement("w:not-an-element");
+ var result = docxReader.readXmlElement(unrecognisedElement);
+ assert.deepEqual(
+ result.messages,
+ [{
+ type: "warning",
+ message: "An unrecognised element was ignored: w:not-an-element"
+ }]
+ );
});
});