summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2013-05-03 18:12:21 +0100
committerMichael Williamson <mike@zwobble.org>2013-05-03 18:12:21 +0100
commit23438dd97f93b86115cc4196c88d12e5168acbd5 (patch)
tree79b37ef7b0474b64f8649d33a86d7f17b877085e
parent7663d1a7e71df101f177ce5b19dade4696f753b0 (diff)
Read numbering from document.xml
-rw-r--r--lib/document-xml-reader.js10
-rw-r--r--lib/docx-reader.js6
-rw-r--r--lib/numbering-xml.js24
-rw-r--r--tests/document-xml-reader.tests.js14
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() {