diff options
| author | Michael Williamson <mike@zwobble.org> | 2013-04-01 15:50:24 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2013-04-01 15:50:24 +0100 |
| commit | 7aecbe20f174100cdc6f72238f43ef3d96e7fb50 (patch) | |
| tree | 11f826c8fef2bae26397d8374f51c94d7d336791 | |
| parent | 6fdee5a4b57832682e1c43156b2e075a5552f595 (diff) | |
Have docx-reader emit warnings when finding unrecognised elements
| -rw-r--r-- | lib/docx-reader.js | 71 | ||||
| -rw-r--r-- | lib/index.js | 4 | ||||
| -rw-r--r-- | tests/docx-reader.tests.js | 46 |
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" + }] + ); }); }); |
