From 45f302766a3a5ca99338fd8e5fef07dec42c0e56 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 18 Mar 2014 14:15:33 +0000 Subject: Move modules for docx reading into separate directory --- tests/content-types-reader.tests.js | 27 --- tests/document-xml-reader.tests.js | 291 ------------------------------- tests/docx-reader.tests.js | 43 ----- tests/docx/content-types-reader.tests.js | 27 +++ tests/docx/document-xml-reader.tests.js | 291 +++++++++++++++++++++++++++++++ tests/docx/docx-reader.tests.js | 43 +++++ tests/docx/numbering-xml.tests.js | 34 ++++ tests/numbering-xml.tests.js | 34 ---- 8 files changed, 395 insertions(+), 395 deletions(-) delete mode 100644 tests/content-types-reader.tests.js delete mode 100644 tests/document-xml-reader.tests.js delete mode 100644 tests/docx-reader.tests.js create mode 100644 tests/docx/content-types-reader.tests.js create mode 100644 tests/docx/document-xml-reader.tests.js create mode 100644 tests/docx/docx-reader.tests.js create mode 100644 tests/docx/numbering-xml.tests.js delete mode 100644 tests/numbering-xml.tests.js (limited to 'tests') diff --git a/tests/content-types-reader.tests.js b/tests/content-types-reader.tests.js deleted file mode 100644 index df7ed47..0000000 --- a/tests/content-types-reader.tests.js +++ /dev/null @@ -1,27 +0,0 @@ -var assert = require("assert"); - -var readContentTypesFromXml = require("../lib/content-types-reader").readContentTypesFromXml; -var XmlElement = require("../lib/xmlreader").Element; -var test = require("./testing").test; - - -describe('readContentTypesFromXml', function() { - test('reads default-per-extension from XML', function() { - var contentTypes = readContentTypesFromXml({ - root: new XmlElement("content-types:Types", {}, [ - new XmlElement("content-types:Default", {Extension: "png", ContentType: "image/png"}) - ]) - }); - assert.equal(contentTypes.findContentType("word/media/hat.png"), "image/png"); - }); - - test('reads overrides in preference to defaults', function() { - var contentTypes = readContentTypesFromXml({ - root: new XmlElement("content-types:Types", {}, [ - new XmlElement("content-types:Default", {Extension: "png", ContentType: "image/png"}), - new XmlElement("content-types:Override", {PartName: "/word/media/hat.png", ContentType: "image/hat"}) - ]) - }); - assert.equal(contentTypes.findContentType("word/media/hat.png"), "image/hat"); - }); -}); diff --git a/tests/document-xml-reader.tests.js b/tests/document-xml-reader.tests.js deleted file mode 100644 index 14a9cbe..0000000 --- a/tests/document-xml-reader.tests.js +++ /dev/null @@ -1,291 +0,0 @@ -var assert = require("assert"); - -var DocumentXmlReader = require("../lib/document-xml-reader").DocumentXmlReader; -var documents = require("../lib/documents"); -var XmlElement = require("../lib/xmlreader").Element; -var Numbering = require("../lib/numbering-xml").Numbering; - -var testing = require("./testing"); -var test = testing.test; -var createFakeDocxFile = testing.createFakeDocxFile; - -function readXmlElement(element, options) { - options = options || {} - return new DocumentXmlReader(options.relationships || {}).readXmlElement(element); -} - -function readXmlElementValue(element) { - var result = readXmlElement(element); - assert.deepEqual(result.messages, []); - return result.value; -} - -var fakeContentTypes = { - findContentType: function(path) { - return ""; - } -}; - -describe("readXmlElement: ", function() { - test("paragraph has no style if it has no properties", function() { - var paragraphXml = new XmlElement("w:p", {}, []); - var paragraph = readXmlElementValue(paragraphXml); - assert.deepEqual(paragraph.styleName, null); - }); - - test("paragraph has style name read from paragraph properties if present", function() { - var styleXml = new XmlElement("w:pStyle", {"w:val": "Heading1"}, []); - var propertiesXml = new XmlElement("w:pPr", {}, [styleXml]); - var paragraphXml = new XmlElement("w:p", {}, [propertiesXml]); - var paragraph = readXmlElementValue(paragraphXml); - assert.deepEqual(paragraph.styleName, "Heading1"); - }); - - test("paragraph has justification read from paragraph properties if present", function() { - var justificationXml = new XmlElement("w:jc", {"w:val": "center"}, []); - var propertiesXml = new XmlElement("w:pPr", {}, [justificationXml]); - var paragraphXml = new XmlElement("w:p", {}, [propertiesXml]); - var paragraph = readXmlElementValue(paragraphXml); - assert.deepEqual(paragraph.alignment, "center"); - }); - - test("paragraph has numbering properties from paragraph properties if present", function() { - var numberingPropertiesXml = new XmlElement("w:numPr", {}, [ - new XmlElement("w:ilvl", {"w:val": "1"}), - new XmlElement("w:numId", {"w:val": "42"}) - ]); - var propertiesXml = new XmlElement("w:pPr", {}, [numberingPropertiesXml]); - var paragraphXml = new XmlElement("w:p", {}, [propertiesXml]); - - var numbering = new Numbering({"42": {"1": {isOrdered: true, level: "1"}}}); - - var reader = new DocumentXmlReader( - {}, - null, - null, - numbering - ); - var paragraph = reader.readXmlElement(paragraphXml).value; - assert.deepEqual(paragraph.numbering, {level: "1", isOrdered: true}); - }); - - test("run has no style if it has no properties", function() { - var runXml = runWithProperties([]); - var run = readXmlElementValue(runXml); - assert.deepEqual(run.styleName, null); - }); - - test("run has style name read from run properties if present", function() { - var runStyleXml = new XmlElement("w:rStyle", {"w:val": "Emphasis"}); - var runXml = runWithProperties([runStyleXml]); - var run = readXmlElementValue(runXml); - assert.deepEqual(run.styleName, "Emphasis"); - }); - - test("isBold is false if bold element is not present", function() { - var runXml = runWithProperties([]); - var run = readXmlElementValue(runXml); - assert.deepEqual(run.isBold, false); - }); - - test("isBold is true if bold element is present", function() { - var boldXml = new XmlElement("w:b"); - var runXml = runWithProperties([boldXml]); - var run = readXmlElementValue(runXml); - assert.equal(run.isBold, true); - }); - - test("isItalic is false if bold element is not present", function() { - var runXml = runWithProperties([]); - var run = readXmlElementValue(runXml); - assert.deepEqual(run.isItalic, false); - }); - - test("isItalic is true if bold element is present", function() { - var italicXml = new XmlElement("w:i"); - var runXml = runWithProperties([italicXml]); - var run = readXmlElementValue(runXml); - assert.equal(run.isItalic, true); - }); - - 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 result = readXmlElement(runXml); - assert.deepEqual(result.value.children, []); - }); - - test("w:tab is read as document tab element", function() { - var tabXml = new XmlElement("w:tab"); - var result = readXmlElement(tabXml); - assert.deepEqual(result.value, new documents.Tab()); - }); - - test("emits warning on unrecognised element", function() { - var unrecognisedElement = new XmlElement("w:not-an-element"); - var result = readXmlElement(unrecognisedElement); - assert.deepEqual( - result.messages, - [{ - type: "warning", - message: "An unrecognised element was ignored: w:not-an-element" - }] - ); - }); - - test("w:bookmarkStart is ignored without warning", function() { - var ignoredElement = new XmlElement("w:bookmarkStart"); - var result = readXmlElement(ignoredElement); - assert.deepEqual(result.messages, []); - assert.deepEqual([], result.value); - }); - - test("can read inline pictures", function() { - var drawing = createInlineImage({ - relationshipId: "rId5", - description: "It's a hat" - }); - - var imageBuffer = new Buffer("Not an image at all!"); - var reader = new DocumentXmlReader( - { - "rId5": {target: "media/hat.png"} - }, - fakeContentTypes, - createFakeDocxFile({ - "word/media/hat.png": imageBuffer - }) - ); - var result = reader.readXmlElement(drawing); - assert.deepEqual(result.messages, []); - var element = single(result.value); - assert.equal("image", element.type); - assert.equal(element.altText, "It's a hat"); - assert.equal(element.contentType, ""); - return element.read() - .then(function(readValue) { - assert.equal(readValue, imageBuffer); - }); - }); - - test("can read anchored pictures", function() { - var drawing = new XmlElement("w:drawing", {}, [ - new XmlElement("wp:anchor", {}, [ - new XmlElement("wp:docPr", {descr: "It's a hat"}), - new XmlElement("a:graphic", {}, [ - new XmlElement("a:graphicData", {}, [ - new XmlElement("pic:pic", {}, [ - new XmlElement("pic:blipFill", {}, [ - new XmlElement("a:blip", {"r:embed": "rId5"}) - ]) - ]) - ]) - ]) - ]) - ]); - - var imageBuffer = new Buffer("Not an image at all!"); - var reader = new DocumentXmlReader( - { - "rId5": {target: "media/hat.png"} - }, - fakeContentTypes, - createFakeDocxFile({ - "word/media/hat.png": imageBuffer - }) - ); - var result = reader.readXmlElement(drawing); - assert.deepEqual(result.messages, []); - 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, []); - }); - - test("no elements created if image cannot be found in wp:inline", function() { - var drawing = new XmlElement("wp:inline", {}, []); - - var reader = new DocumentXmlReader(); - var result = reader.readXmlElement(drawing); - assert.deepEqual(result.messages, []); - assert.deepEqual(result.value, []); - }); - - test("children of w:ins are converted normally", function() { - var runXml = new XmlElement("w:r", {}, []); - var insXml = new XmlElement("w:ins", {}, [runXml]); - var result = readXmlElement(insXml); - assert.deepEqual(result.value[0].type, "run"); - }); - - test("children of w:smartTag are converted normally", function() { - var runXml = new XmlElement("w:r", {}, []); - var smartTagXml = new XmlElement("w:smartTag", {}, [runXml]); - var result = readXmlElement(smartTagXml); - assert.deepEqual(result.value[0].type, "run"); - }); - - test("w:hyperlink is read as document hyperlink if it has a relationship ID", function() { - var runXml = new XmlElement("w:r", {}, []); - var hyperlinkXml = new XmlElement("w:hyperlink", {"r:id": "r42"}, [runXml]); - var relationships = { - "r42": {target: "http://example.com"} - }; - var result = readXmlElement(hyperlinkXml, {relationships: relationships}); - assert.deepEqual(result.value.href, "http://example.com"); - assert.deepEqual(result.value.children[0].type, "run"); - }); - - test("w:hyperlink is ignored if it does not have a relationship ID", function() { - var runXml = new XmlElement("w:r", {}, []); - var hyperlinkXml = new XmlElement("w:hyperlink", {}, [runXml]); - var result = readXmlElement(hyperlinkXml); - assert.deepEqual(result.value[0].type, "run"); - }); -}); - -function runWithProperties(children) { - return new XmlElement("w:r", {}, [createRunPropertiesXml(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"); - } -} - -function createInlineImage(options) { - return new XmlElement("w:drawing", {}, [ - new XmlElement("wp:inline", {}, [ - new XmlElement("wp:docPr", {descr: options.description}), - new XmlElement("a:graphic", {}, [ - new XmlElement("a:graphicData", {}, [ - new XmlElement("pic:pic", {}, [ - new XmlElement("pic:blipFill", {}, [ - new XmlElement("a:blip", {"r:embed": options.relationshipId}) - ]) - ]) - ]) - ]) - ]) - ]); -} diff --git a/tests/docx-reader.tests.js b/tests/docx-reader.tests.js deleted file mode 100644 index 4fc487f..0000000 --- a/tests/docx-reader.tests.js +++ /dev/null @@ -1,43 +0,0 @@ -var assert = require("assert"); - -var docxReader = require("../lib/docx-reader"); -var documents = require("../lib/documents"); -var XmlElement = require("../lib/xmlreader").Element; - -var testing = require("./testing"); -var test = testing.test; -var testData = testing.testData; -var createFakeDocxFile = testing.createFakeDocxFile; - - -describe("docx-reader", function() { - test("can read document with single paragraph with single run of text", function() { - var expectedDocument = documents.Document([ - documents.Paragraph([ - documents.Run([ - documents.Text("Hello.") - ]) - ]) - ]); - var docxFile = createFakeDocxFile({ - "word/document.xml": testData("simple/word/document.xml") - }); - return docxReader.read({file: docxFile}).then(function(result) { - assert.deepEqual(expectedDocument, result.document); - }); - }); - - test("hyperlink hrefs are read from relationships file", function() { - var docxFile = createFakeDocxFile({ - "word/document.xml": testData("hyperlinks/word/document.xml"), - "word/_rels/document.xml.rels": testData("hyperlinks/word/_rels/document.xml.rels") - }); - return docxReader.read({file: docxFile}).then(function(result) { - var paragraph = result.document.children[0]; - assert.equal(1, paragraph.children.length); - var hyperlink = paragraph.children[0]; - assert.equal(hyperlink.href, "http://www.example.com"); - assert.equal(hyperlink.children.length, 1); - }); - }); -}); diff --git a/tests/docx/content-types-reader.tests.js b/tests/docx/content-types-reader.tests.js new file mode 100644 index 0000000..b0f135e --- /dev/null +++ b/tests/docx/content-types-reader.tests.js @@ -0,0 +1,27 @@ +var assert = require("assert"); + +var readContentTypesFromXml = require("../../lib/docx/content-types-reader").readContentTypesFromXml; +var XmlElement = require("../../lib/xmlreader").Element; +var test = require("../testing").test; + + +describe('readContentTypesFromXml', function() { + test('reads default-per-extension from XML', function() { + var contentTypes = readContentTypesFromXml({ + root: new XmlElement("content-types:Types", {}, [ + new XmlElement("content-types:Default", {Extension: "png", ContentType: "image/png"}) + ]) + }); + assert.equal(contentTypes.findContentType("word/media/hat.png"), "image/png"); + }); + + test('reads overrides in preference to defaults', function() { + var contentTypes = readContentTypesFromXml({ + root: new XmlElement("content-types:Types", {}, [ + new XmlElement("content-types:Default", {Extension: "png", ContentType: "image/png"}), + new XmlElement("content-types:Override", {PartName: "/word/media/hat.png", ContentType: "image/hat"}) + ]) + }); + assert.equal(contentTypes.findContentType("word/media/hat.png"), "image/hat"); + }); +}); diff --git a/tests/docx/document-xml-reader.tests.js b/tests/docx/document-xml-reader.tests.js new file mode 100644 index 0000000..7cdbefc --- /dev/null +++ b/tests/docx/document-xml-reader.tests.js @@ -0,0 +1,291 @@ +var assert = require("assert"); + +var DocumentXmlReader = require("../../lib/docx/document-xml-reader").DocumentXmlReader; +var documents = require("../../lib/documents"); +var XmlElement = require("../../lib/xmlreader").Element; +var Numbering = require("../../lib/docx/numbering-xml").Numbering; + +var testing = require("../testing"); +var test = testing.test; +var createFakeDocxFile = testing.createFakeDocxFile; + +function readXmlElement(element, options) { + options = options || {} + return new DocumentXmlReader(options.relationships || {}).readXmlElement(element); +} + +function readXmlElementValue(element) { + var result = readXmlElement(element); + assert.deepEqual(result.messages, []); + return result.value; +} + +var fakeContentTypes = { + findContentType: function(path) { + return ""; + } +}; + +describe("readXmlElement: ", function() { + test("paragraph has no style if it has no properties", function() { + var paragraphXml = new XmlElement("w:p", {}, []); + var paragraph = readXmlElementValue(paragraphXml); + assert.deepEqual(paragraph.styleName, null); + }); + + test("paragraph has style name read from paragraph properties if present", function() { + var styleXml = new XmlElement("w:pStyle", {"w:val": "Heading1"}, []); + var propertiesXml = new XmlElement("w:pPr", {}, [styleXml]); + var paragraphXml = new XmlElement("w:p", {}, [propertiesXml]); + var paragraph = readXmlElementValue(paragraphXml); + assert.deepEqual(paragraph.styleName, "Heading1"); + }); + + test("paragraph has justification read from paragraph properties if present", function() { + var justificationXml = new XmlElement("w:jc", {"w:val": "center"}, []); + var propertiesXml = new XmlElement("w:pPr", {}, [justificationXml]); + var paragraphXml = new XmlElement("w:p", {}, [propertiesXml]); + var paragraph = readXmlElementValue(paragraphXml); + assert.deepEqual(paragraph.alignment, "center"); + }); + + test("paragraph has numbering properties from paragraph properties if present", function() { + var numberingPropertiesXml = new XmlElement("w:numPr", {}, [ + new XmlElement("w:ilvl", {"w:val": "1"}), + new XmlElement("w:numId", {"w:val": "42"}) + ]); + var propertiesXml = new XmlElement("w:pPr", {}, [numberingPropertiesXml]); + var paragraphXml = new XmlElement("w:p", {}, [propertiesXml]); + + var numbering = new Numbering({"42": {"1": {isOrdered: true, level: "1"}}}); + + var reader = new DocumentXmlReader( + {}, + null, + null, + numbering + ); + var paragraph = reader.readXmlElement(paragraphXml).value; + assert.deepEqual(paragraph.numbering, {level: "1", isOrdered: true}); + }); + + test("run has no style if it has no properties", function() { + var runXml = runWithProperties([]); + var run = readXmlElementValue(runXml); + assert.deepEqual(run.styleName, null); + }); + + test("run has style name read from run properties if present", function() { + var runStyleXml = new XmlElement("w:rStyle", {"w:val": "Emphasis"}); + var runXml = runWithProperties([runStyleXml]); + var run = readXmlElementValue(runXml); + assert.deepEqual(run.styleName, "Emphasis"); + }); + + test("isBold is false if bold element is not present", function() { + var runXml = runWithProperties([]); + var run = readXmlElementValue(runXml); + assert.deepEqual(run.isBold, false); + }); + + test("isBold is true if bold element is present", function() { + var boldXml = new XmlElement("w:b"); + var runXml = runWithProperties([boldXml]); + var run = readXmlElementValue(runXml); + assert.equal(run.isBold, true); + }); + + test("isItalic is false if bold element is not present", function() { + var runXml = runWithProperties([]); + var run = readXmlElementValue(runXml); + assert.deepEqual(run.isItalic, false); + }); + + test("isItalic is true if bold element is present", function() { + var italicXml = new XmlElement("w:i"); + var runXml = runWithProperties([italicXml]); + var run = readXmlElementValue(runXml); + assert.equal(run.isItalic, true); + }); + + 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 result = readXmlElement(runXml); + assert.deepEqual(result.value.children, []); + }); + + test("w:tab is read as document tab element", function() { + var tabXml = new XmlElement("w:tab"); + var result = readXmlElement(tabXml); + assert.deepEqual(result.value, new documents.Tab()); + }); + + test("emits warning on unrecognised element", function() { + var unrecognisedElement = new XmlElement("w:not-an-element"); + var result = readXmlElement(unrecognisedElement); + assert.deepEqual( + result.messages, + [{ + type: "warning", + message: "An unrecognised element was ignored: w:not-an-element" + }] + ); + }); + + test("w:bookmarkStart is ignored without warning", function() { + var ignoredElement = new XmlElement("w:bookmarkStart"); + var result = readXmlElement(ignoredElement); + assert.deepEqual(result.messages, []); + assert.deepEqual([], result.value); + }); + + test("can read inline pictures", function() { + var drawing = createInlineImage({ + relationshipId: "rId5", + description: "It's a hat" + }); + + var imageBuffer = new Buffer("Not an image at all!"); + var reader = new DocumentXmlReader( + { + "rId5": {target: "media/hat.png"} + }, + fakeContentTypes, + createFakeDocxFile({ + "word/media/hat.png": imageBuffer + }) + ); + var result = reader.readXmlElement(drawing); + assert.deepEqual(result.messages, []); + var element = single(result.value); + assert.equal("image", element.type); + assert.equal(element.altText, "It's a hat"); + assert.equal(element.contentType, ""); + return element.read() + .then(function(readValue) { + assert.equal(readValue, imageBuffer); + }); + }); + + test("can read anchored pictures", function() { + var drawing = new XmlElement("w:drawing", {}, [ + new XmlElement("wp:anchor", {}, [ + new XmlElement("wp:docPr", {descr: "It's a hat"}), + new XmlElement("a:graphic", {}, [ + new XmlElement("a:graphicData", {}, [ + new XmlElement("pic:pic", {}, [ + new XmlElement("pic:blipFill", {}, [ + new XmlElement("a:blip", {"r:embed": "rId5"}) + ]) + ]) + ]) + ]) + ]) + ]); + + var imageBuffer = new Buffer("Not an image at all!"); + var reader = new DocumentXmlReader( + { + "rId5": {target: "media/hat.png"} + }, + fakeContentTypes, + createFakeDocxFile({ + "word/media/hat.png": imageBuffer + }) + ); + var result = reader.readXmlElement(drawing); + assert.deepEqual(result.messages, []); + 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, []); + }); + + test("no elements created if image cannot be found in wp:inline", function() { + var drawing = new XmlElement("wp:inline", {}, []); + + var reader = new DocumentXmlReader(); + var result = reader.readXmlElement(drawing); + assert.deepEqual(result.messages, []); + assert.deepEqual(result.value, []); + }); + + test("children of w:ins are converted normally", function() { + var runXml = new XmlElement("w:r", {}, []); + var insXml = new XmlElement("w:ins", {}, [runXml]); + var result = readXmlElement(insXml); + assert.deepEqual(result.value[0].type, "run"); + }); + + test("children of w:smartTag are converted normally", function() { + var runXml = new XmlElement("w:r", {}, []); + var smartTagXml = new XmlElement("w:smartTag", {}, [runXml]); + var result = readXmlElement(smartTagXml); + assert.deepEqual(result.value[0].type, "run"); + }); + + test("w:hyperlink is read as document hyperlink if it has a relationship ID", function() { + var runXml = new XmlElement("w:r", {}, []); + var hyperlinkXml = new XmlElement("w:hyperlink", {"r:id": "r42"}, [runXml]); + var relationships = { + "r42": {target: "http://example.com"} + }; + var result = readXmlElement(hyperlinkXml, {relationships: relationships}); + assert.deepEqual(result.value.href, "http://example.com"); + assert.deepEqual(result.value.children[0].type, "run"); + }); + + test("w:hyperlink is ignored if it does not have a relationship ID", function() { + var runXml = new XmlElement("w:r", {}, []); + var hyperlinkXml = new XmlElement("w:hyperlink", {}, [runXml]); + var result = readXmlElement(hyperlinkXml); + assert.deepEqual(result.value[0].type, "run"); + }); +}); + +function runWithProperties(children) { + return new XmlElement("w:r", {}, [createRunPropertiesXml(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"); + } +} + +function createInlineImage(options) { + return new XmlElement("w:drawing", {}, [ + new XmlElement("wp:inline", {}, [ + new XmlElement("wp:docPr", {descr: options.description}), + new XmlElement("a:graphic", {}, [ + new XmlElement("a:graphicData", {}, [ + new XmlElement("pic:pic", {}, [ + new XmlElement("pic:blipFill", {}, [ + new XmlElement("a:blip", {"r:embed": options.relationshipId}) + ]) + ]) + ]) + ]) + ]) + ]); +} diff --git a/tests/docx/docx-reader.tests.js b/tests/docx/docx-reader.tests.js new file mode 100644 index 0000000..9dc1921 --- /dev/null +++ b/tests/docx/docx-reader.tests.js @@ -0,0 +1,43 @@ +var assert = require("assert"); + +var docxReader = require("../../lib/docx/docx-reader"); +var documents = require("../../lib/documents"); +var XmlElement = require("../../lib/xmlreader").Element; + +var testing = require("../testing"); +var test = testing.test; +var testData = testing.testData; +var createFakeDocxFile = testing.createFakeDocxFile; + + +describe("docx-reader", function() { + test("can read document with single paragraph with single run of text", function() { + var expectedDocument = documents.Document([ + documents.Paragraph([ + documents.Run([ + documents.Text("Hello.") + ]) + ]) + ]); + var docxFile = createFakeDocxFile({ + "word/document.xml": testData("simple/word/document.xml") + }); + return docxReader.read({file: docxFile}).then(function(result) { + assert.deepEqual(expectedDocument, result.document); + }); + }); + + test("hyperlink hrefs are read from relationships file", function() { + var docxFile = createFakeDocxFile({ + "word/document.xml": testData("hyperlinks/word/document.xml"), + "word/_rels/document.xml.rels": testData("hyperlinks/word/_rels/document.xml.rels") + }); + return docxReader.read({file: docxFile}).then(function(result) { + var paragraph = result.document.children[0]; + assert.equal(1, paragraph.children.length); + var hyperlink = paragraph.children[0]; + assert.equal(hyperlink.href, "http://www.example.com"); + assert.equal(hyperlink.children.length, 1); + }); + }); +}); diff --git a/tests/docx/numbering-xml.tests.js b/tests/docx/numbering-xml.tests.js new file mode 100644 index 0000000..a101806 --- /dev/null +++ b/tests/docx/numbering-xml.tests.js @@ -0,0 +1,34 @@ +var assert = require("assert"); + +var duck = require("duck"); + +var readNumberingXml = require("../../lib/docx/numbering-xml").readNumberingXml; +var XmlElement = require("../../lib/xmlreader").Element; +var test = require("../testing").test; + + +describe('readNumberingXml', function() { + test('w:num element inherits levels from w:abstractNum', function() { + var numbering = readNumberingXml({ + root: new XmlElement("w:numbering", {}, [ + new XmlElement("w:abstractNum", {"w:abstractNumId": "42"}, [ + new XmlElement("w:lvl", {"w:ilvl": "0"}, [ + new XmlElement("w:numFmt", {"w:val": "bullet"}) + ]), + new XmlElement("w:lvl", {"w:ilvl": "1"}, [ + new XmlElement("w:numFmt", {"w:val": "decimal"}) + ]) + ]), + new XmlElement("w:num", {"w:numId": "47"}, [ + new XmlElement("w:abstractNumId", {"w:val": "42"}) + ]) + ]) + }); + duck.assertThat(numbering.findLevel("47", "0"), duck.hasProperties({ + isOrdered: false + })); + duck.assertThat(numbering.findLevel("47", "1"), duck.hasProperties({ + isOrdered: true + })); + }); +}); diff --git a/tests/numbering-xml.tests.js b/tests/numbering-xml.tests.js deleted file mode 100644 index 3312dfe..0000000 --- a/tests/numbering-xml.tests.js +++ /dev/null @@ -1,34 +0,0 @@ -var assert = require("assert"); - -var duck = require("duck"); - -var readNumberingXml = require("../lib/numbering-xml").readNumberingXml; -var XmlElement = require("../lib/xmlreader").Element; -var test = require("./testing").test; - - -describe('readNumberingXml', function() { - test('w:num element inherits levels from w:abstractNum', function() { - var numbering = readNumberingXml({ - root: new XmlElement("w:numbering", {}, [ - new XmlElement("w:abstractNum", {"w:abstractNumId": "42"}, [ - new XmlElement("w:lvl", {"w:ilvl": "0"}, [ - new XmlElement("w:numFmt", {"w:val": "bullet"}) - ]), - new XmlElement("w:lvl", {"w:ilvl": "1"}, [ - new XmlElement("w:numFmt", {"w:val": "decimal"}) - ]) - ]), - new XmlElement("w:num", {"w:numId": "47"}, [ - new XmlElement("w:abstractNumId", {"w:val": "42"}) - ]) - ]) - }); - duck.assertThat(numbering.findLevel("47", "0"), duck.hasProperties({ - isOrdered: false - })); - duck.assertThat(numbering.findLevel("47", "1"), duck.hasProperties({ - isOrdered: true - })); - }); -}); -- cgit v1.2.3