diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-07-03 22:31:29 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-07-03 22:31:29 +0100 |
| commit | 27f3d32cabc5fae5b163ddf5a5449d93ebd959d5 (patch) | |
| tree | 373e830e2c15ad5252000c06aba70e4b144127d4 /lib/docx/docx-reader.js | |
| parent | cd3b84e15ea1a47ff8ebcca18d68ef0cdccf20b8 (diff) | |
Read note bodies immediately using relationships
Diffstat (limited to 'lib/docx/docx-reader.js')
| -rw-r--r-- | lib/docx/docx-reader.js | 89 |
1 files changed, 54 insertions, 35 deletions
diff --git a/lib/docx/docx-reader.js b/lib/docx/docx-reader.js index 80842d7..a976ef3 100644 --- a/lib/docx/docx-reader.js +++ b/lib/docx/docx-reader.js @@ -2,6 +2,8 @@ exports.read = read; var promises = require("../promises"); var unzip = require("../unzip"); +var documents = require("../documents"); +var Result = require("../results").Result; var readXmlFromZipFile = require("./office-xml-reader").readXmlFromZipFile; var BodyReader = require("./body-reader").BodyReader; @@ -18,32 +20,45 @@ function read(options) { docxFile: unzip.openZip(options) }).also(function(result) { return { - relationships: readRelationshipsFromZipFile(result.docxFile), contentTypes: readContentTypesFromZipFile(result.docxFile), numbering: readNumberingFromZipFile(result.docxFile), styles: readStylesFromZipFile(result.docxFile) }; }).also(function(result) { - var bodyReader = new BodyReader({ - relationships: result.relationships, - contentTypes: result.contentTypes, - docxFile: result.docxFile, - numbering: result.numbering, - styles: result.styles - }); return { - documentBodyReader: bodyReader, - footnotes: readFootnotesFromZipFile(result.docxFile), - endnotes: readEndnotesFromZipFile(result.docxFile), - documentXml: readXmlFromZipFile(result.docxFile, "word/document.xml") + footnotes: readXmlFileWithBody("footnotes", result, function(bodyReader, xml) { + if (xml) { + return notesReader.createFootnotesReader(bodyReader)(xml); + } else { + return new Result([]); + } + }), + endnotes: readXmlFileWithBody("endnotes", result, function(bodyReader, xml) { + if (xml) { + return notesReader.createEndnotesReader(bodyReader)(xml); + } else { + return new Result([]); + } + }) + }; + }).also(function(result) { + return { + notes: result.footnotes.flatMap(function(footnotes) { + return result.endnotes.map(function(endnotes) { + return new documents.Notes(footnotes.concat(endnotes)); + }); + }) }; }).then(function(result) { - var reader = new DocumentXmlReader({ - bodyReader: result.documentBodyReader, - footnotes: result.footnotes, - endnotes: result.endnotes + return readXmlFileWithBody("document", result, function(bodyReader, xml) { + return result.notes.flatMap(function(notes) { + var reader = new DocumentXmlReader({ + bodyReader: bodyReader, + notes: notes, + }); + return reader.convertXmlToDocument(xml); + }); }); - return reader.convertXmlToDocument(result.documentXml); }); } @@ -56,18 +71,34 @@ function xmlFileReader(options) { }; } +function readXmlFileWithBody(name, options, func) { + var readRelationshipsFromZipFile = xmlFileReader({ + filename: "word/_rels/" + name + ".xml.rels", + readElement: relationshipsReader.readRelationships, + defaultValue: {} + }); + + return readRelationshipsFromZipFile(options.docxFile).then(function(relationships) { + var bodyReader = new BodyReader({ + relationships: relationships, + contentTypes: options.contentTypes, + docxFile: options.docxFile, + numbering: options.numbering, + styles: options.styles + }); + return readXmlFromZipFile(options.docxFile, "word/" + name + ".xml") + .then(function(xml) { + return func(bodyReader, xml); + }); + }); +} + var readContentTypesFromZipFile = xmlFileReader({ filename: "[Content_Types].xml", readElement: contentTypesReader.readContentTypesFromXml, defaultValue: contentTypesReader.defaultContentTypes }); -var readRelationshipsFromZipFile = xmlFileReader({ - filename: "word/_rels/document.xml.rels", - readElement: relationshipsReader.readRelationships, - defaultValue: {} -}); - var readNumberingFromZipFile = xmlFileReader({ filename: "word/numbering.xml", readElement: numberingXml.readNumberingXml, @@ -79,15 +110,3 @@ var readStylesFromZipFile = xmlFileReader({ readElement: stylesReader.readStylesXml, defaultValue: stylesReader.defaultStyles }); - -var readFootnotesFromZipFile = xmlFileReader({ - filename: "word/footnotes.xml", - readElement: notesReader.readFootnotesXml, - defaultValue: undefined -}); - -var readEndnotesFromZipFile = xmlFileReader({ - filename: "word/endnotes.xml", - readElement: notesReader.readEndnotesXml, - defaultValue: undefined -}); |
