aboutsummaryrefslogtreecommitdiff
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
parenta09303c9085c6eb17a0c943a7c1441d85ee3a5f2 (diff)
Switch to callback-style in document-to-html for performance reasons
-rw-r--r--lib/document-to-html.js72
-rw-r--r--package.json3
2 files changed, 44 insertions, 31 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 {
diff --git a/package.json b/package.json
index 8607b47..3b815f2 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,8 @@
"zipfile": "~0.3.4",
"optimist": "~0.3.5",
"connect": "~2.7.3",
- "dustjs-linkedin": "~1.2.1"
+ "dustjs-linkedin": "~1.2.1",
+ "async": "0.2.6"
},
"devDependencies": {
"mocha": "~1.8"