var htmlToPdfMake = require('../index.js'); var test = require("simple-test-framework"); var jsdom = require("jsdom"); var { JSDOM } = jsdom; var { window } = new JSDOM(""); var debug = false; test("b",function(t) { var ret = htmlToPdfMake("bold word", {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( ret.text === "bold word" && ret.bold === true && Array.isArray(ret.style) && ret.style[0] === 'html-b', ""); t.finish(); }) test("strong",function(t) { var ret = htmlToPdfMake("bold word", {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( ret.text === "bold word" && ret.bold === true && Array.isArray(ret.style) && ret.style[0] === 'html-strong', ""); t.finish(); }) test("u",function(t) { var ret = htmlToPdfMake("underline word", {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( ret.text === "underline word" && Array.isArray(ret.decoration) && ret.decoration.length === 1 && ret.decoration[0] && Array.isArray(ret.style) && ret.style[0] === 'html-u', ""); t.finish(); }) test("em",function(t) { var ret = htmlToPdfMake("italic word", {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( ret.text === "italic word" && ret.italics === true && Array.isArray(ret.style) && ret.style[0] === 'html-em', ""); t.finish(); }) test("i",function(t) { var ret = htmlToPdfMake("italic word", {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( ret.text === "italic word" && ret.italics === true && Array.isArray(ret.style) && ret.style[0] === 'html-i', ""); t.finish(); }) test("h1",function(t) { var ret = htmlToPdfMake("

level 1

", {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret), "return is OK"); ret = ret[0]; t.check( ret.text === "level 1" && ret.fontSize === 24 && ret.bold === true && ret.marginBottom === 5 && Array.isArray(ret.style) && ret.style[0] === 'html-h1', "

"); t.finish(); }) test("h2",function(t) { var ret = htmlToPdfMake("

level 2

", {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret), "return is OK"); ret = ret[0]; t.check( ret.text === "level 2" && ret.fontSize === 22 && ret.bold === true && ret.marginBottom === 5 && Array.isArray(ret.style) && ret.style[0] === 'html-h2', "

"); t.finish(); }) test("h3",function(t) { var ret = htmlToPdfMake("

level 3

", {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret), "return is OK"); ret = ret[0]; t.check( ret.text === "level 3" && ret.fontSize === 20 && ret.bold === true && ret.marginBottom === 5 && Array.isArray(ret.style) && ret.style[0] === 'html-h3', "

"); t.finish(); }) test("h4",function(t) { var ret = htmlToPdfMake("

level 4

", {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret), "return is OK"); ret = ret[0]; t.check( ret.text === "level 4" && ret.fontSize === 18 && ret.bold === true && ret.marginBottom === 5 && Array.isArray(ret.style) && ret.style[0] === 'html-h4', "

"); t.finish(); }) test("h5",function(t) { var ret = htmlToPdfMake("

level 5
", {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret), "return is OK"); ret = ret[0]; t.check( ret.text === "level 5" && ret.fontSize === 16 && ret.bold === true && ret.marginBottom === 5 && Array.isArray(ret.style) && ret.style[0] === 'html-h5', "
"); t.finish(); }) test("h6",function(t) { var ret = htmlToPdfMake("
level 6
", {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret), "return is OK"); ret = ret[0]; t.check( ret.text === "level 6" && ret.fontSize === 14 && ret.bold === true && ret.marginBottom === 5 && Array.isArray(ret.style) && ret.style[0] === 'html-h6', "
"); t.finish(); }) test("a",function(t) { var ret = htmlToPdfMake('link', {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check(ret.text === "link", "text"); t.check(ret.color === "blue", "color"); t.check(Array.isArray(ret.decoration) && ret.decoration.length === 1 && ret.decoration[0] === "underline", "decoration"); t.check(ret.link === "https://www.somewhere.com", "href"); t.check(Array.isArray(ret.style), "style is array"); t.check(ret.style[0] === 'html-a', "class"); t.finish(); }) test("strike",function(t) { var ret = htmlToPdfMake("strike", {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( ret.text === "strike" && Array.isArray(ret.decoration) && ret.decoration.length === 1 && ret.decoration[0] === "lineThrough" && Array.isArray(ret.style) && ret.style[0] === 'html-strike', ""); t.finish(); }) // [{"table":{"body":[[{"text":"Header Column A","bold":true,"fillColor":"#EEEEEE","style":["html-th"]},{"text":"Header Column B","bold":true,"fillColor":"#EEEEEE","style":["html-th"]}],[{"text":"Value Cell A2","style":["html-td"]},{"text":"Value Cell B2","style":["html-td"]}],[{"text":"Value Cell A3","style":["html-td"]},{"text":"Value Cell B3","style":["html-td"]}]]},"style":"html-table","marginBottom":5}] test("table",function(t) { var html = `
Header Column A Header Column B
Value Cell A2 Value Cell B2
Value Cell A3 Value Cell B3
`; var ret = htmlToPdfMake(html, {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( ret.table && Array.isArray(ret.table.body) && ret.table.body.length === 3 && ret.table.body[0][0].text === "Header Column A" && ret.table.body[0][0].style[0] === 'html-th' && ret.table.body[0][0].style[1] === 'html-tr' && ret.table.body[1][1].text === "Value Cell B2" && ret.table.body[1][1].style[0] === 'html-td' && ret.table.body[1][1].style[1] === 'html-tr' && Array.isArray(ret.style) && ret.style[0] === 'html-table', ""); t.finish(); }) // { table: { body: [ [ { text: 'Cell1', style: [ 'html-td', 'html-tr' ] } ] ] }, style: [ 'html-table' ], marginBottom: 5 } test("table (one row/one column)",function(t) { var html = `
Cell1
`; var ret = htmlToPdfMake(html, {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( ret.table && Array.isArray(ret.table.body) && ret.table.body.length === 1 && ret.table.body[0][0].text === "Cell1" && ret.table.body[0][0].style[0] === 'html-td' && ret.table.body[0][0].style[1] === 'html-tr' && Array.isArray(ret.style) && ret.style[0] === 'html-table', "table (one row/one column)"); t.finish(); }) test("table (one row/two columns)",function(t) { var html = `
Cell1Cell2
`; var ret = htmlToPdfMake(html, {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( ret.table && Array.isArray(ret.table.body) && ret.table.body.length === 1 && ret.table.body[0][0].text === "Cell1" && ret.table.body[0][0].style[0] === 'html-td' && ret.table.body[0][0].style[1] === 'html-tr' && ret.table.body[0][1].text === "Cell2" && ret.table.body[0][1].style[0] === 'html-td' && ret.table.body[0][1].style[1] === 'html-tr' && Array.isArray(ret.style) && ret.style[0] === 'html-table', "table (one row/two columns)"); t.finish(); }) test("table (two rows/one column)",function(t) { var html = `
Cell1
Cell2
`; var ret = htmlToPdfMake(html, {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( ret.table && Array.isArray(ret.table.body) && ret.table.body.length === 2 && ret.table.body[0][0].text === "Cell1" && ret.table.body[0][0].style[0] === 'html-td' && ret.table.body[0][0].style[1] === 'html-tr' && ret.table.body[1][0].text === "Cell2" && ret.table.body[1][0].style[0] === 'html-td' && ret.table.body[1][0].style[1] === 'html-tr' && Array.isArray(ret.style) && ret.style[0] === 'html-table', "table (two rows/one column)"); t.finish(); }) test("table (rowspan/colspan)", function(t) { var html = `
Col A Col B Col C Col D
Cell A1 Cell B1 & B2 Cell C1 Cell D1 & D2
Cell A2 Cell C2
Cell A3 Cell B3 & C3 Cell D3
Cell A4 & A5 & B4 & B5 & C4 & C5 Cell D4
Cell D5
`; var ret = htmlToPdfMake(html, {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( ret.table && Array.isArray(ret.table.body) && ret.table.body.length === 6, "base"); t.check( ret.table.body[1][0].text === "Cell A1" && ret.table.body[1][0].style[0] === 'html-td' && ret.table.body[1][0].style[1] === 'html-tr', "row 1"); t.check( ret.table.body[1][1].text === "Cell B1 & B2" && ret.table.body[1][2].text === "Cell C1" && ret.table.body[1][3].text === "Cell D1 & D2", "row 2"); t.check( ret.table.body[2][0].text === "Cell A2" && ret.table.body[2][1].text === "" && ret.table.body[2][2].text === "Cell C2" && ret.table.body[2][3].text === "", "row 3"); t.check( ret.table.body[3][0].text === "Cell A3" && ret.table.body[3][1].text === "Cell B3 & C3" && ret.table.body[3][2].text === "" && ret.table.body[3][3].text === "Cell D3", "row 4"); t.check( ret.table.body[4][0].text === "Cell A4 & A5 & B4 & B5 & C4 & C5" && ret.table.body[4][1].text === "" && ret.table.body[4][2].text === "" && ret.table.body[4][3].text === "Cell D4", "row 5"); t.check( ret.table.body[5][0].text === "" && ret.table.body[5][1].text === "" && ret.table.body[5][2].text === "" && ret.table.body[5][3].text === "Cell D5", "row 6"); t.check( Array.isArray(ret.style) && ret.style[0] === 'html-table', "table style"); t.finish(); }) test("table (rowspan/colspan) with thead tbody", function(t) { var html = `
Col A Col B Col C Col D
Cell A1 Cell B1 & B2 Cell C1 Cell D1 & D2
Cell A2 Cell C2
Cell A3 Cell B3 & C3 Cell D3
Cell A4 & A5 & B4 & B5 & C4 & C5 Cell D4
Cell D5
`; var ret = htmlToPdfMake(html, {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( ret.table && Array.isArray(ret.table.body) && ret.table.body.length === 6, "base"); t.check( ret.table.body[1][0].text === "Cell A1" && ret.table.body[1][0].style[0] === 'html-td' && ret.table.body[1][0].style[1] === 'html-tr', "row 1"); t.check( ret.table.body[1][1].text === "Cell B1 & B2" && ret.table.body[1][2].text === "Cell C1" && ret.table.body[1][3].text === "Cell D1 & D2", "row 2"); t.check( ret.table.body[2][0].text === "Cell A2" && ret.table.body[2][1].text === "" && ret.table.body[2][2].text === "Cell C2" && ret.table.body[2][3].text === "", "row 3"); t.check( ret.table.body[3][0].text === "Cell A3" && ret.table.body[3][1].text === "Cell B3 & C3" && ret.table.body[3][2].text === "" && ret.table.body[3][3].text === "Cell D3", "row 4"); t.check( ret.table.body[4][0].text === "Cell A4 & A5 & B4 & B5 & C4 & C5" && ret.table.body[4][1].text === "" && ret.table.body[4][2].text === "" && ret.table.body[4][3].text === "Cell D4", "row 5"); t.check( ret.table.body[5][0].text === "" && ret.table.body[5][1].text === "" && ret.table.body[5][2].text === "" && ret.table.body[5][3].text === "Cell D5", "row 6"); t.check( Array.isArray(ret.style) && ret.style[0] === 'html-table', "table style"); t.finish(); }) test("table (colspan + empty cell)", function(t) { var html = `
header
Cell A1 Cell A2
Cell B1
`; var ret = htmlToPdfMake(html, {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( ret.table && Array.isArray(ret.table.body) && ret.table.body.length === 3, "base"); t.check( ret.table.body[0].length === 2 && ret.table.body[0][0].text === "header" && ret.table.body[0][0].style[0] === 'html-th' && ret.table.body[0][0].style[1] === 'html-tr', "row 1"); t.check( ret.table.body[1].length === 2 && ret.table.body[1][0].text === "Cell A1" && ret.table.body[1][1].text === "Cell A2", "row 2"); t.check( ret.table.body[2].length === 2 && ret.table.body[2][0].text === "Cell B1" && ret.table.body[2][1].text === "", "row 3"); t.check( Array.isArray(ret.style) && ret.style[0] === 'html-table', "table style"); t.finish(); }) test("img",function(t) { var ret = htmlToPdfMake('', {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( ret.image === "data:image/jpeg;base64,...encodedContent..." && ret.width === 8 && ret.height === 8 && Array.isArray(ret.style) && ret.style[0] === 'html-img', ""); t.finish(); }) test("svg",function(t) { var ret = htmlToPdfMake(` SVG `, {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( 'svg' in ret && ret.svg.length > 0, "return has svg property") t.check( Array.isArray(ret.style) && ret.style[0] === 'html-svg', "svg style"); t.finish(); }) test("cascade_tags", function(t) { var ret = htmlToPdfMake('

test

', {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0].text[0].text[0].text[0]; t.check( ret.text === "test" && ret.bold && ret.italics && ret.fontSize === 11 && ret.alignment === 'center' && Array.isArray(ret.style) && ret.style.includes('html-strong') && ret.style.includes('html-em') && ret.style.includes('html-span') && ret.style.includes('html-p'), "cascade_tags"); t.finish(); }) test("hr", function(t) { var ret = htmlToPdfMake("
", {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length === 1, "return is OK"); ret = ret[0]; t.check( !!ret.canvas && ret.canvas.length === 1 && ret.canvas[0].type === "line", "hr tag" ); t.finish(); }) test("table non empty inside div styles",function(t) { var html = `
Header Column B
Value Cell A2 Value Cell B2
Value Cell A3 Value Cell B3
`; var ret = htmlToPdfMake(html, {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( ret.table && Array.isArray(ret.table.body) && ret.table.body[0].length === ret.table.body[1].length, "global"); t.finish(); }) test("table empty inside div header",function(t) { var html = `
Header Column B
Value Cell A2 Value Cell B2
Value Cell A3 Value Cell B3
`; var ret = htmlToPdfMake(html, {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( ret.table && Array.isArray(ret.table.body) && ret.table.body[0].length === ret.table.body[1].length, "global"); t.finish(); }) test("inherit css styles",function(t) { var html = `
bluegreenbluered
`; var ret = htmlToPdfMake(html, {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( ret.color === 'red' && Array.isArray(ret.style) && ret.style.includes('html-div') && Array.isArray(ret.text) && Array.isArray(ret.text[0].text) && ret.text[0].text[0].text === 'blue' && ret.text[0].text[0].color === 'blue' && ret.text[0].text[1].text === 'green' && ret.text[0].text[1].color === 'green' && ret.text[0].text[1].bold && ret.text[0].text[2].text === 'blue' && ret.text[0].text[2].color === 'blue' && ret.text[0].color === 'blue' && ret.text[1].text === 'red' && ret.text[1].color === 'red', "inherit"); t.finish(); }) test("colored borders", function(t) { var html = `
Cell with border left and right in blue
`; var ret = htmlToPdfMake(html, {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( ret.table.body[0][0].text === "Cell with border left and right in blue" && Array.isArray(ret.table.body[0][0].border) && ret.table.body[0][0].border[0] && !ret.table.body[0][0].border[1] && ret.table.body[0][0].border[2] && !ret.table.body[0][0].border[3] && Array.isArray(ret.table.body[0][0].borderColor) && ret.table.body[0][0].borderColor[0] === '#0080c0' && ret.table.body[0][0].borderColor[1] === '#000000' && ret.table.body[0][0].borderColor[2] === '#0080c0' && ret.table.body[0][0].borderColor[3] === '#000000', "colored borders"); t.finish(); }) test("cell with P and DIV", function(t) { var html = `
some text

p1span1span2

p2

span3

p3span4

span5

p4

strong
`; var ret = htmlToPdfMake(html, {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0].table.body[0][0]; t.check(ret.stack[0].text === "some text", "some text"); t.check(ret.stack[1].text[0].text === "p1", "p1"); t.check(ret.stack[1].text[1].text === "span1", "span1"); t.check(ret.stack[1].text[2].text === "span2", "span2"); t.check(ret.stack[2].text === "p2", "p2"); t.check(ret.stack[3].text === "span3", "span3"); t.check(ret.stack[4].text[0].text === "p3span4", "p3span4"); t.check(ret.stack[5].stack[0].text === "span5", "span5"); t.check(ret.stack[5].stack[1].text === "p4", "p4"); t.check(ret.stack[6].text === "strong", "strong"); t.finish(); }) test("tableAutoSize", function(t) { var html = `
`; var ret = htmlToPdfMake(html, {window:window, tableAutoSize:true}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check( Array.isArray(ret.table.widths) && ret.table.widths.length === 2 && ret.table.widths[0] === 264 && ret.table.widths[1] === 'auto' && ret.table.heights.length === 2 && ret.table.heights[0] === 75 && ret.table.heights[1] === 151 , "tableAutoSize"); t.finish(); }) test("convertUnit and stack", function(t) { var html = `
points
points
`; var ret = htmlToPdfMake(html, {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); ret = ret[0]; t.check(Array.isArray(ret.stack), "stack"); t.check( ret.stack[0].marginLeft===12 && ret.stack[0].fontSize===12 && ret.stack[1].marginLeft===12 , "convertUnit"); t.finish(); }) test("'decoration' style", function(t) { var html = `

Test

`; var ret = htmlToPdfMake(html, {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); t.check(Array.isArray(ret[0].text) && ret[0].text.length===1 && Array.isArray(ret[0].text[0].text) && ret[0].text[0].text.length===1, "structure is OK"); ret = ret[0].text[0].text[0]; t.check(ret.text === "Test", "text is 'Test'"); t.check(ret.nodeName === "S", "nodeName is 'S'"); t.check(Array.isArray(ret.decoration), "'decoration' is array"); t.check(ret.decoration.includes("underline"), "includes 'underline'"); t.check(ret.decoration.includes("lineThrough"), "includes 'lineThrough'"); t.finish(); }) test("'decoration' style 2", function(t) { var html = `

Test

`; var ret = htmlToPdfMake(html, {window:window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length===1, "return is OK"); t.check(Array.isArray(ret[0].text) && ret[0].text.length===1 && Array.isArray(ret[0].text[0].text) && ret[0].text[0].text.length===1, "structure is OK"); ret = ret[0].text[0].text[0]; t.check(ret.text === "Test", "text is 'Test'"); t.check(ret.nodeName === "SPAN", "nodeName is 'SPAN'"); t.check(Array.isArray(ret.decoration), "'decoration' is array"); t.check(ret.decoration.includes("underline"), "includes 'underline'"); t.check(ret.decoration.includes("lineThrough"), "includes 'lineThrough'"); t.finish(); }) test("font", function (t) { var html = `font element`; var ret = htmlToPdfMake(html, {window: window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length === 1, "return is OK"); ret = ret[0]; t.check(ret.color === "#ff0033" && ret.fontSize === 18, ""); t.finish(); }); test("sup", function (t) { var html = `sup`; var ret = htmlToPdfMake(html, {window: window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length === 1, "return is OK"); ret = ret[0]; t.check(ret.text === "sup" && ret.sup && ret.sup.offset && ret.sup.fontSize, ""); t.finish(); }); test("sub", function (t) { var html = `sub`; var ret = htmlToPdfMake(html, {window: window}); if (debug) console.log(JSON.stringify(ret)); t.check(Array.isArray(ret) && ret.length === 1, "return is OK"); ret = ret[0]; t.check(ret.text === "sub" && ret.sub && ret.sub.offset && ret.sub.fontSize, ""); t.finish(); });