mammoth.js/lib/document-to-html.js
2013-04-09 21:36:35 +01:00

116 lines
3.5 KiB
JavaScript

var q = require("q");
var async = require("async");
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 q.nfcall(elementToHtml, document, html).then(function() {
html.closeAll();
return {
html: html.asString()
};
});
}
function convertElements(elements, html, callback) {
async.eachSeries(elements, function(element, callback) {
return elementToHtml(element, html, callback);
}, callback);
}
function elementToHtml(element, html, callback) {
var handler = elementConverters[element.type];
if (handler) {
handler(element, html, callback);
} else {
callback();
}
}
function convertParagraph(element, html, callback) {
html.satisfyPath(styleForParagraph(element));
convertElements(element.children, html, callback);
}
function styleForParagraph(element) {
return paragraphStyleMap[element.styleName] || defaultParagraphStyle;
}
function convertRun(run, html, callback) {
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"));
}
convertElements(run.children, runHtml, function(err) {
if (err) {
callback(err);
} else {
runHtml.closeAll();
html.append(runHtml);
callback();
}
});
}
var elementConverters = {
"document": function(document, html, callback) {
convertElements(document.children, html, callback);
},
"paragraph": convertParagraph,
"run": convertRun,
"text": function(element, html, callback) {
html.text(element.value);
callback();
},
"hyperlink": function(element, html, callback) {
html.open(htmlPaths.element("a", {href: element.href}));
convertElements(element.children, html, function(err) {
if (err) {
callback(err);
} else {
html.close();
callback();
}
});
},
"image": function(element, html, callback) {
element.read("base64").then(function(imageBuffer) {
// TODO: set alt attribute to wp:inline/wp:docPr/@descr
var src = "data:image/png;base64," + imageBuffer;
var attributes = {src: src};
if (element.altText) {
attributes.alt = element.altText;
}
html.selfClosing(htmlPaths.element("img", attributes));
callback();
}).fail(callback);
}
};
return {
convertToHtml: convertToHtml
}
}