aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2013-04-09 20:21:45 +0100
committerMichael Williamson <mike@zwobble.org>2013-04-09 20:21:45 +0100
commita424b4fd717ab97f66a00be5ac026d6dcf3b46ce (patch)
treebcb774e92c9ebe2a044d22e179cdc721f9deb8d2 /lib
parenta09303c9085c6eb17a0c943a7c1441d85ee3a5f2 (diff)
Switch to callback-style in document-to-html for performance reasons
Diffstat (limited to 'lib')
-rw-r--r--lib/document-to-html.js72
1 files changed, 42 insertions, 30 deletions
diff --git a/lib/document-to-html.js b/lib/document-to-html.js
index da1a69f..ab7dca4 100644
--- a/lib/document-to-html.js
+++ b/lib/document-to-html.js
@@ -1,4 +1,5 @@
var q = require("q");
+var async = require("async");
var htmlPaths = require("./html-paths");
var HtmlGenerator = require("./html-generator").HtmlGenerator;
@@ -15,41 +16,41 @@ function DocumentConverter(options) {
function convertToHtml(document) {
var html = new HtmlGenerator();
- return elementToHtml(document, html)
- .then(function() {
- html.closeAll();
-
- return {
- html: html.asString()
- };
- });
+
+ return q.nfcall(elementToHtml, document, html).then(function() {
+ html.closeAll();
+
+ return {
+ html: html.asString()
+ };
+ });
}
- function convertElements(elements, html) {
- return forEachPromise(elements, function(element) {
- return elementToHtml(element, html);
- });
+ function convertElements(elements, html, callback) {
+ async.eachSeries(elements, function(element, callback) {
+ return elementToHtml(element, html, callback);
+ }, callback);
}
- function elementToHtml(element, html) {
+ function elementToHtml(element, html, callback) {
var handler = elementConverters[element.type];
if (handler) {
- return q.when(handler(element, html));
+ handler(element, html, callback);
} else {
- return q.when();
+ callback();
}
}
- function convertParagraph(element, html) {
+ function convertParagraph(element, html, callback) {
html.satisfyPath(styleForParagraph(element));
- return convertElements(element.children, html);
+ convertElements(element.children, html, callback);
}
function styleForParagraph(element) {
return paragraphStyleMap[element.styleName] || defaultParagraphStyle;
}
- function convertRun(run, html) {
+ function convertRun(run, html, callback) {
var runHtml = new HtmlGenerator();
if (run.styleName) {
var style = runStyleMap[run.styleName];
@@ -63,30 +64,40 @@ function DocumentConverter(options) {
if (run.isItalic) {
runHtml.open(htmlPaths.element("em"));
}
- return convertElements(run.children, runHtml)
- .then(function() {
+ convertElements(run.children, runHtml, function(err) {
+ if (err) {
+ callback(err);
+ } else {
runHtml.closeAll();
html.append(runHtml);
- });
+ callback();
+ }
+ });
}
var elementConverters = {
- "document": function(document, html) {
- return convertElements(document.children, html);
+ "document": function(document, html, callback) {
+ convertElements(document.children, html, callback);
},
"paragraph": convertParagraph,
"run": convertRun,
- "text": function(element, html) {
+ "text": function(element, html, callback) {
html.text(element.value);
+ callback();
},
- "hyperlink": function(element, html) {
+ "hyperlink": function(element, html, callback) {
html.open(htmlPaths.element("a", {href: element.href}));
- return convertElements(element.children, html).then(function() {
- html.close();
+ convertElements(element.children, html, function(err) {
+ if (err) {
+ callback(err);
+ } else {
+ html.close();
+ callback();
+ }
});
},
- "image": function(element, html) {
- return element.read().then(function(imageBuffer) {
+ "image": function(element, html, callback) {
+ element.read().then(function(imageBuffer) {
// TODO: set alt attribute to wp:inline/wp:docPr/@descr
var src = "data:image/png;base64," + imageBuffer.toString("base64");
var attributes = {src: src};
@@ -94,7 +105,8 @@ function DocumentConverter(options) {
attributes.alt = element.altText;
}
html.selfClosing(htmlPaths.element("img", attributes));
- });
+ callback();
+ }).fail(callback);
}
};
return {