var q = require("q"); var htmlPaths = require("./html-paths"); var HtmlGenerator = require("./html-generator").HtmlGenerator; exports.DocumentConverter = DocumentConverter; function DocumentConverter(options) { options = options || {}; var defaultParagraphStyle = options.defaultParagraphStyle || htmlPaths.topLevelElement("p"); var paragraphStyleMap = options.paragraphStyleMap || {}; var runStyleMap = options.runStyleMap || {}; function convertToHtml(document) { var html = new HtmlGenerator(); return 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 elementToHtml(element, html) { var handler = elementConverters[element.type]; if (handler) { return q.when(handler(element, html)); } else { return q.when(); } } function convertParagraph(element, html) { html.satisfyPath(styleForParagraph(element)); return convertElements(element.children, html); } function styleForParagraph(element) { return paragraphStyleMap[element.styleName] || defaultParagraphStyle; } function convertRun(run, html) { var runHtml = new HtmlGenerator(); if (run.styleName) { var style = runStyleMap[run.styleName]; if (style) { runHtml.satisfyPath(style); } } if (run.isBold) { runHtml.open(htmlPaths.element("strong")); } if (run.isItalic) { runHtml.open(htmlPaths.element("em")); } return convertElements(run.children, runHtml) .then(function() { runHtml.closeAll(); html.append(runHtml); }); } var elementConverters = { "document": function(document, html) { return convertElements(document.children, html); }, "paragraph": convertParagraph, "run": convertRun, "text": function(element, html) { html.text(element.value); }, "hyperlink": function(element, html) { html.open(htmlPaths.element("a", {href: element.href})); return convertElements(element.children, html).then(function() { html.close(); }); }, "image": function(element, html) { return 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}; if (element.altText) { attributes.alt = element.altText; } html.selfClosing(htmlPaths.element("img", attributes)); }); } }; return { convertToHtml: convertToHtml } } function forEachPromise(array, func) { var index = -1; return next(); function next() { index++; if (index < array.length) { return q.when(func(array[index])) .then(next); } else { return q.when(); } } }