aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2013-03-29 20:31:19 +0000
committerMichael Williamson <mike@zwobble.org>2013-03-29 20:31:19 +0000
commit15aaddae7a7e2dd8d369b514218778931a1543e0 (patch)
tree3564634c61e53dfa15f82f02757c289da988ce3f /lib
parent12aa4a332cf40f5aab393bc7eafc2020945ea9f4 (diff)
Convert XML into simple document elements
Diffstat (limited to 'lib')
-rw-r--r--lib/documents.js64
-rw-r--r--lib/index.js45
2 files changed, 91 insertions, 18 deletions
diff --git a/lib/documents.js b/lib/documents.js
index a470b84..d51e604 100644
--- a/lib/documents.js
+++ b/lib/documents.js
@@ -1,38 +1,68 @@
+var q = require("q");
+
exports.DocumentConverter = DocumentConverter;
+exports.Document = Document;
+exports.Paragraph = Paragraph;
+exports.Run = Run;
+exports.Text = Text;
function DocumentConverter() {
}
-DocumentConverter.prototype.convertToHtml = function(documentXml) {
- var body = documentXml.root.first("w:body");
-
- var html = body.children.map(elementToHtml).join("");
+DocumentConverter.prototype.convertToHtml = function(document) {
+ var html = document.children.map(elementToHtml).join("");
- return {
+ return q.when({
html: html
- };
+ });
}
function elementToHtml(element) {
- if (element.type === "element") {
- var handler = elementConverters[element.name];
- if (handler) {
- return handler(element);
- } else {
- return "";
- }
+ var handler = elementConverters[element.type];
+ if (handler) {
+ return handler(element);
+ } else {
+ return "";
}
}
var elementConverters = {
- "w:p": function(element) {
+ "paragraph": function(element) {
var innerHtml = element.children.map(elementToHtml).join("");
return "<p>" + innerHtml + "</p>";
},
- "w:r": function(element) {
+ "run": function(element) {
return element.children.map(elementToHtml).join("");
},
- "w:t": function(element) {
- return element.children[0].value;
+ "text": function(element) {
+ return element.value;
}
};
+
+function Document(children) {
+ return {
+ type: "document",
+ children: children
+ };
+}
+
+function Paragraph(children) {
+ return {
+ type: "paragraph",
+ children: children
+ };
+}
+
+function Run(children) {
+ return {
+ type: "run",
+ children: children
+ };
+}
+
+function Text(value) {
+ return {
+ type: "text",
+ value: value
+ };
+}
diff --git a/lib/index.js b/lib/index.js
index 25bf0f5..9fd3b16 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -14,10 +14,53 @@ Converter.prototype.convertToHtml = function(docxFile) {
return docxFile.read("word/document.xml").then(function(documentXmlString) {
return parseXml(documentXmlString);
}).then(function(documentXml) {
- return documentConverter.convertToHtml(documentXml);
+ var document = convertXmlToDocument(documentXml);
+ return documentConverter.convertToHtml(document);
});
}
+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;
+}