1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
var q = require("q");
var styles = require("./styles");
var HtmlGenerator = require("./html-generator").HtmlGenerator;
exports.DocumentConverter = DocumentConverter;
function DocumentConverter(options) {
options = options || {};
var defaultParagraphStyle = options.defaultParagraphStyle || styles.topLevelElement("p");
var paragraphStyleMap = options.paragraphStyleMap || {};
var runStyleMap = options.runStyleMap || {};
function convertToHtml(document) {
var html = new HtmlGenerator();
elementToHtml(document, html);
html.closeAll();
return q.when({
html: html.asString()
});
}
function convertElements(elements, html) {
elements.forEach(function(element) {
elementToHtml(element, html);
});
}
function elementToHtml(element, html) {
var handler = elementConverters[element.type];
if (handler) {
handler(element, html);
}
}
function convertParagraph(element, html) {
html.style(styleForParagraph(element));
convertElements(element.children, html);
}
function styleForParagraph(element) {
return paragraphStyleMap[element.properties.styleName] || defaultParagraphStyle;
}
function convertRun(run, html) {
var runHtml = new HtmlGenerator();
if (run.properties.styleName) {
var style = runStyleMap[run.properties.styleName];
if (style) {
runHtml.style(style);
}
}
if (run.properties.isBold) {
runHtml.push(styles.element("strong"));
}
if (run.properties.isItalic) {
runHtml.push(styles.element("em"));
}
convertElements(run.children, runHtml);
runHtml.closeAll();
html.append(runHtml);
}
var elementConverters = {
"document": function(document, html) {
convertElements(document.children, html);
},
"paragraph": convertParagraph,
"run": convertRun,
"text": function(element, html) {
html.text(element.value);
},
"hyperlink": function(element, html) {
html.push(styles.element("a", {href: element.href}));
convertElements(element.children, html);
html.pop();
}
};
return {
convertToHtml: convertToHtml
}
}
|