aboutsummaryrefslogtreecommitdiff
path: root/lib/docx-reader.js
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2013-03-30 22:07:37 +0000
committerMichael Williamson <mike@zwobble.org>2013-03-30 22:07:37 +0000
commit6ebcdcfad1ff8584fe4ee4f49aae0e1d51dd164a (patch)
tree0f7555af1fd2099268528b984cc1bdc7f2891e49 /lib/docx-reader.js
parent500261b4dc62024ead038bbda6a0d3325e657573 (diff)
Split out docx reading into separate module
Diffstat (limited to 'lib/docx-reader.js')
-rw-r--r--lib/docx-reader.js74
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;
+}
+