diff options
| author | Michael Williamson <mike@zwobble.org> | 2013-05-03 18:12:21 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2013-05-03 18:12:21 +0100 |
| commit | 23438dd97f93b86115cc4196c88d12e5168acbd5 (patch) | |
| tree | 79b37ef7b0474b64f8649d33a86d7f17b877085e | |
| parent | 7663d1a7e71df101f177ce5b19dade4696f753b0 (diff) | |
Read numbering from document.xml
| -rw-r--r-- | lib/document-xml-reader.js | 10 | ||||
| -rw-r--r-- | lib/docx-reader.js | 6 | ||||
| -rw-r--r-- | lib/numbering-xml.js | 24 | ||||
| -rw-r--r-- | tests/document-xml-reader.tests.js | 14 |
4 files changed, 41 insertions, 13 deletions
diff --git a/lib/document-xml-reader.js b/lib/document-xml-reader.js index 6f75745..b5e379c 100644 --- a/lib/document-xml-reader.js +++ b/lib/document-xml-reader.js @@ -9,7 +9,7 @@ var Result = require("./results").Result; var warning = require("./results").warning; -function DocumentXmlReader(relationships, contentTypes, docxFile) { +function DocumentXmlReader(relationships, contentTypes, docxFile, numbering) { function convertXmlToDocument(documentXml) { var body = documentXml.root.first("w:body"); @@ -46,7 +46,6 @@ function DocumentXmlReader(relationships, contentTypes, docxFile) { return readXmlElements(element.children) .map(function(children) { var properties = _.find(children, isParagraphProperties); - return new documents.Paragraph( children.filter(negate(isParagraphProperties)), properties @@ -64,9 +63,10 @@ function DocumentXmlReader(relationships, contentTypes, docxFile) { } var numberingPropertiesElement = element.first("w:numPr"); if (numberingPropertiesElement) { - properties.numbering = { - level: numberingPropertiesElement.first("w:ilvl").attributes["w:val"] - }; + var levelElement = numberingPropertiesElement.first("w:ilvl"); + var level = levelElement.attributes["w:val"]; + var numId = numberingPropertiesElement.first("w:numId").attributes["w:val"]; + properties.numbering = numbering.findLevel(numId, level); } return new Result(properties); diff --git a/lib/docx-reader.js b/lib/docx-reader.js index 0861758..2215b35 100644 --- a/lib/docx-reader.js +++ b/lib/docx-reader.js @@ -10,6 +10,7 @@ var documents = require("./documents"); var DocumentXmlReader = require("./document-xml-reader").DocumentXmlReader; var readRelationshipsFromZipFile = require("./relationships-reader").readRelationshipsFromZipFile; var readContentTypesFromZipFile = require("./content-types-reader").readContentTypesFromZipFile; +var readNumberingFromZipFile = require("./numbering-xml").readNumberingFromZipFile; var Result = require("./results").Result; @@ -28,9 +29,10 @@ function read(options) { return q.all([ readRelationshipsFromZipFile(docxFile), readContentTypesFromZipFile(docxFile), + readNumberingFromZipFile(docxFile), readXmlFromZipFile(docxFile, "word/document.xml") - ]).spread(function(relationships, contentTypes, documentXml) { - var reader = new DocumentXmlReader(relationships, contentTypes, docxFile); + ]).spread(function(relationships, contentTypes, numbering, documentXml) { + var reader = new DocumentXmlReader(relationships, contentTypes, docxFile, numbering); return reader.convertXmlToDocument(documentXml); }); }); diff --git a/lib/numbering-xml.js b/lib/numbering-xml.js index f983448..7e64dc2 100644 --- a/lib/numbering-xml.js +++ b/lib/numbering-xml.js @@ -1,8 +1,17 @@ +var readXmlFromZipFile = require("./office-xml-reader").readXmlFromZipFile; + exports.readNumberingXml = readNumberingXml; +exports.readNumberingFromZipFile = readNumberingFromZipFile; +exports.Numbering = Numbering; -function readNumberingXml(xml) { - var abstractNums = readAbstractNums(xml); - var nums = readNums(xml, abstractNums); +function readNumberingFromZipFile(file) { + return readXmlFromZipFile(file, "word/numbering.xml") + .then(function(xml) { + return xml ? readNumberingXml(xml) : new Numbering({}); + }); +} + +function Numbering(nums) { return { findLevel: function(numId, level) { var num = nums[numId]; @@ -15,6 +24,12 @@ function readNumberingXml(xml) { }; } +function readNumberingXml(xml) { + var abstractNums = readAbstractNums(xml); + var nums = readNums(xml, abstractNums); + return new Numbering(nums); +} + function readAbstractNums(xml) { var abstractNums = {}; xml.root.getElementsByTagName("w:abstractNum").forEach(function(element) { @@ -30,7 +45,8 @@ function readAbstractNum(element) { var levelIndex = levelElement.attributes["w:ilvl"]; var numFmt = levelElement.first("w:numFmt").attributes["w:val"]; levels[levelIndex] = { - isOrdered: numFmt !== "bullet" + isOrdered: numFmt !== "bullet", + level: levelIndex }; }); return levels; diff --git a/tests/document-xml-reader.tests.js b/tests/document-xml-reader.tests.js index 1cffb13..e05e8a8 100644 --- a/tests/document-xml-reader.tests.js +++ b/tests/document-xml-reader.tests.js @@ -3,6 +3,7 @@ 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; @@ -46,8 +47,17 @@ describe("readXmlElement: ", function() { ]); var propertiesXml = new XmlElement("w:pPr", {}, [numberingPropertiesXml]); var paragraphXml = new XmlElement("w:p", {}, [propertiesXml]); - var paragraph = readXmlElementValue(paragraphXml); - assert.deepEqual(paragraph.numbering, {level: 1}); + + 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() { |
