diff options
| author | Michael Williamson <mike@zwobble.org> | 2013-04-09 20:21:45 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2013-04-09 20:21:45 +0100 |
| commit | a424b4fd717ab97f66a00be5ac026d6dcf3b46ce (patch) | |
| tree | bcb774e92c9ebe2a044d22e179cdc721f9deb8d2 /lib | |
| parent | a09303c9085c6eb17a0c943a7c1441d85ee3a5f2 (diff) | |
Switch to callback-style in document-to-html for performance reasons
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/document-to-html.js | 72 |
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 { |
