var assert = require("assert"); var promises = require("../lib/promises"); var mammoth = require("../lib"); var documents = require("../lib/documents"); var DocumentConverter = require("../lib/document-to-html").DocumentConverter; var test = require("./testing").test; var htmlPaths = require("../lib/html-paths"); var xmlreader = require("../lib/xmlreader"); var results = require("../lib/results"); var documentMatchers = require("../lib/document-matchers"); describe('DocumentConverter', function() { test('should empty document to empty string', function() { var document = new documents.Document([]); var converter = new DocumentConverter(); return converter.convertToHtml(document).then(function(result) { assert.equal(result.value, ""); }); }); test('should convert document containing one paragraph to single p element', function() { var document = new documents.Document([ paragraphOfText("Hello.") ]); var converter = new DocumentConverter(); return converter.convertToHtml(document).then(function(result) { assert.equal(result.value, "
Hello.
"); }); }); test('ignores empty paragraphs', function() { var document = new documents.Document([ paragraphOfText("") ]); var converter = new DocumentConverter(); return converter.convertToHtml(document).then(function(result) { assert.equal(result.value, ""); }); }); test('text is HTML-escaped', function() { var document = new documents.Document([ paragraphOfText("1 < 2") ]); var converter = new DocumentConverter(); return converter.convertToHtml(document).then(function(result) { assert.equal(result.value, "1 < 2
"); }); }); test('should convert document containing multiple paragraphs to multiple p elements', function() { var document = new documents.Document([ paragraphOfText("Hello."), paragraphOfText("Goodbye.") ]); var converter = new DocumentConverter(); return converter.convertToHtml(document).then(function(result) { assert.equal(result.value, "Hello.
Goodbye.
"); }); }); test('uses style mappings to pick HTML element for docx paragraph', function() { var document = new documents.Document([ paragraphOfText("Hello.", "Heading1", "Heading 1"), ]); var converter = new DocumentConverter({ styleMap: [ { from: documentMatchers.paragraph({styleName: "Heading 1"}), to: htmlPaths.topLevelElement("h1") } ] }); return converter.convertToHtml(document).then(function(result) { assert.equal(result.value, "Hello.
"); }); }); // TODO //~ test('consecutive bold runs are wrapped in a single element', function() { //~ var paragraph = new documents.Paragraph([ //~ runOfText("Hello", {isBold: true}), //~ runOfText(".", {isBold: true}) //~ ]); //~ var converter = new DocumentConverter(); //~ return converter.convertToHtml(paragraph).then(function(result) { //~ assert.equal(result.value, "Hello.
"); //~ }); //~ }); test('underline runs are ignored by default', function() { var run = runOfText("Hello.", {isUnderline: true}); var converter = new DocumentConverter(); return converter.convertToHtml(run).then(function(result) { assert.equal(result.value, "Hello."); }); }); test('underline runs can be wrapped in tags', function() { var run = runOfText("Hello.", {isUnderline: true}); var converter = new DocumentConverter({ convertUnderline: mammoth.underline.element("u") }); return converter.convertToHtml(run).then(function(result) { assert.equal(result.value, "Hello."); }); }); test('italic runs are wrapped in tags', function() { var run = runOfText("Hello.", {isItalic: true}); var converter = new DocumentConverter(); return converter.convertToHtml(run).then(function(result) { assert.equal(result.value, "Hello."); }); }); test('run can be both bold and italic', function() { var run = runOfText("Hello.", {isBold: true, isItalic: true}); var converter = new DocumentConverter(); return converter.convertToHtml(run).then(function(result) { assert.equal(result.value, "Hello."); }); }); test('superscript runs are wrapped in tags', function() { var run = runOfText("Hello.", { verticalAlignment: documents.verticalAlignment.superscript }); var converter = new DocumentConverter(); return converter.convertToHtml(run).then(function(result) { assert.equal(result.value, "Hello."); }); }); test('subscript runs are wrapped in tags', function() { var run = runOfText("Hello.", { verticalAlignment: documents.verticalAlignment.subscript }); var converter = new DocumentConverter(); return converter.convertToHtml(run).then(function(result) { assert.equal(result.value, "Hello."); }); }); test('run styles are converted to HTML if mapping exists', function() { var run = runOfText("Hello.", {styleId: "Heading1Char", styleName: "Heading 1 Char"}); var converter = new DocumentConverter({ styleMap: [ { from: documentMatchers.run({styleName: "Heading 1 Char"}), to: htmlPaths.elements(["strong"]) } ] }); return converter.convertToHtml(run).then(function(result) { assert.equal(result.value, "Hello."); }); }); test('warning is emitted if run style is unrecognised', function() { var run = runOfText("Hello.", {styleId: "Heading1Char", styleName: "Heading 1 Char"}); var converter = new DocumentConverter(); return converter.convertToHtml(run).then(function(result) { assert.deepEqual(result.messages, [results.warning("Unrecognised run style: 'Heading 1 Char' (Style ID: Heading1Char)")]); }); }); test('docx hyperlink is converted to ', function() { var hyperlink = new documents.Hyperlink( [runOfText("Hello.")], {href: "http://www.example.com"} ); var converter = new DocumentConverter(); return converter.convertToHtml(hyperlink).then(function(result) { assert.equal(result.value, 'Hello.'); }); }); test('docx hyperlink with anchor is converted to ', function() { var hyperlink = new documents.Hyperlink( [runOfText("Hello.")], {anchor: "_Peter"} ); var converter = new DocumentConverter({ idPrefix: "doc-42" }); return converter.convertToHtml(hyperlink).then(function(result) { assert.equal(result.value, 'Hello.'); }); }); test('bookmarks are converted to anchors', function() { var bookmarkStart = new documents.BookmarkStart({name: "_Peter"}); var converter = new DocumentConverter({ idPrefix: "doc-42" }); var document = new documents.Document([bookmarkStart]); return converter.convertToHtml(document).then(function(result) { assert.equal(result.value, ''); }); }); test('docx tab is converted to tab in HTML', function() { var tab = new documents.Tab(); var converter = new DocumentConverter(); return converter.convertToHtml(tab).then(function(result) { assert.equal(result.value, "\t"); }); }); test('docx table is converted to table in HTML', function() { var table = new documents.Table([ new documents.TableRow([ new documents.TableCell([paragraphOfText("Top left")]), new documents.TableCell([paragraphOfText("Top right")]) ]), new documents.TableRow([ new documents.TableCell([paragraphOfText("Bottom left")]), new documents.TableCell([paragraphOfText("Bottom right")]) ]) ]); var converter = new DocumentConverter(); return converter.convertToHtml(table).then(function(result) { var expectedHtml = "Top left | Top right |
Bottom left | Bottom right |
Top right |
Knock knock[1]
' + 'Who\'s there? ↑
Hello.
"), 0); }); }); }); function paragraphOfText(text, styleId, styleName) { var run = runOfText(text); return new documents.Paragraph([run], { styleId: styleId, styleName: styleName }); } function runOfText(text, properties) { var textElement = new documents.Text(text); return new documents.Run([textElement], properties); }