diff options
| author | Michael Williamson <mike@zwobble.org> | 2013-03-30 22:07:37 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2013-03-30 22:07:37 +0000 |
| commit | 6ebcdcfad1ff8584fe4ee4f49aae0e1d51dd164a (patch) | |
| tree | 0f7555af1fd2099268528b984cc1bdc7f2891e49 /lib/docx-reader.js | |
| parent | 500261b4dc62024ead038bbda6a0d3325e657573 (diff) | |
Split out docx reading into separate module
Diffstat (limited to 'lib/docx-reader.js')
| -rw-r--r-- | lib/docx-reader.js | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/lib/docx-reader.js b/lib/docx-reader.js new file mode 100644 index 0000000..3078d2f --- /dev/null +++ b/lib/docx-reader.js @@ -0,0 +1,74 @@ +exports.read = read; + +var q = require("q"); +var _ = require("underscore"); +var ZipFile = require("zipfile").ZipFile; + +var xmlreader = require("./xmlreader"); +var documents = require("./documents"); + + +function read(docxFile) { + if (_.isString(docxFile)) { + var zipFile = new ZipFile(docxFile); + docxFile = { + read: function(path) { + return q.ninvoke(zipFile, "readFile", path, "utf-8") + .then(function(value) { + return value.toString(); + }); + } + }; + } + + return docxFile.read("word/document.xml") + .then(xmlreader.read) + .then(convertXmlToDocument); +} + +function convertXmlToDocument(documentXml) { + var body = documentXml.root.first("w:body"); + + var children = readXmlElements(body.children); + return new documents.Document(children); +} + +function readXmlElements(elements) { + return elements.map(readXmlElement).filter(notNull); +} + +function readXmlElement(element) { + if (element.type === "element") { + var handler = xmlElementReaders[element.name]; + if (handler) { + return handler(element); + } else { + return null; + } + } else { + return null; + } +} + +var xmlElementReaders = { + "w:p": function(element) { + var children = readXmlElements(element.children); + return new documents.Paragraph(children); + }, + "w:r": function(element) { + var children = readXmlElements(element.children); + return new documents.Run(children); + }, + "w:t": function(element) { + return new documents.Text(element.children[0].value); + } +}; + +function parseXml(string) { + return xmlreader.read(string); +} + +function notNull(value) { + return value !== null; +} + |
