html-to-pdfmake
Advanced tools
Comparing version 2.1.7 to 2.2.0
@@ -1,1 +0,1 @@ | ||
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.htmlToPdfmake=f()}})(function(){var define,module,exports;return function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r}()({1:[function(require,module,exports){module.exports=function(htmlText,options){var wndw=options&&options.window?options.window:window;var tableAutoSize=options&&typeof options.tableAutoSize==="boolean"?options.tableAutoSize:false;var fontSizes=options&&Array.isArray(options.fontSizes)?options.fontSizes:[10,14,16,18,20,24,28];var defaultStyles={b:{bold:true},strong:{bold:true},u:{decoration:"underline"},del:{decoration:"lineThrough"},s:{decoration:"lineThrough"},em:{italics:true},i:{italics:true},h1:{fontSize:24,bold:true,marginBottom:5},h2:{fontSize:22,bold:true,marginBottom:5},h3:{fontSize:20,bold:true,marginBottom:5},h4:{fontSize:18,bold:true,marginBottom:5},h5:{fontSize:16,bold:true,marginBottom:5},h6:{fontSize:14,bold:true,marginBottom:5},a:{color:"blue",decoration:"underline"},strike:{decoration:"lineThrough"},p:{margin:[0,5,0,10]},ul:{marginBottom:5,marginLeft:5},table:{marginBottom:5},th:{bold:true,fillColor:"#EEEEEE"}};function changeDefaultStyles(){for(var keyStyle in options.defaultStyles){if(defaultStyles.hasOwnProperty(keyStyle)){if(options.defaultStyles.hasOwnProperty(keyStyle)&&!options.defaultStyles[keyStyle]){delete defaultStyles[keyStyle]}else{for(var k in options.defaultStyles[keyStyle]){if(options.defaultStyles[keyStyle][k]==="")delete defaultStyles[keyStyle][k];else defaultStyles[keyStyle][k]=options.defaultStyles[keyStyle][k]}}}else{defaultStyles[keyStyle]={};for(var ks in options.defaultStyles[keyStyle]){defaultStyles[keyStyle][ks]=options.defaultStyles[keyStyle][ks]}}}}if(options&&options.defaultStyles){changeDefaultStyles()}var convertHtml=function(htmlText){var parser=new wndw.DOMParser;var parsedHtml=parser.parseFromString(htmlText,"text/html");var docDef=parseElement(parsedHtml.body,[]);return docDef.stack||docDef.text};var parseElement=function(element,parents){var nodeName=element.nodeName.toUpperCase();var nodeNameLowerCase=nodeName.toLowerCase();var ret={text:[]};var text,needStack=false;var dataset,i,key;if(["COLGROUP","COL"].indexOf(nodeName)>-1)return"";switch(element.nodeType){case 3:{if(element.textContent){text=element.textContent;var styleParentTextNode=parseStyle(parents[parents.length-1],true);var hasWhiteSpace=false;for(i=0;i<styleParentTextNode.length;i++){if(styleParentTextNode[i].key==="preserveLeadingSpaces"){hasWhiteSpace=styleParentTextNode[i].value;break}}if(!hasWhiteSpace)text=element.textContent.replace(/\n(\s+)?/g,"");if(options&&typeof options.replaceText==="function")text=options.replaceText(text,parents);if(["TABLE","THEAD","TBODY","TFOOT","TR","UL","OL"].indexOf(parents[parents.length-1].nodeName)>-1)text=text.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");if(text){ret={text:text};ret=applyStyle({ret:ret,parents:parents});return ret}}return""}case 1:{ret.nodeName=nodeName;parents.push(element);if(element.childNodes&&element.childNodes.length>0){[].forEach.call(element.childNodes,function(child){var res=parseElement(child,parents);if(res){if(Array.isArray(res.text)&&res.text.length===0)res.text="";ret.text.push(res)}});needStack=searchForStack(ret);if(needStack){ret.stack=ret.text.slice(0);delete ret.text}else{ret=applyStyle({ret:ret,parents:parents})}}parents.pop();switch(nodeName){case"TABLE":{var rowIndex,cellIndex;ret.table={body:[]};var tbodies=ret.stack||ret.text;if(Array.isArray(tbodies)){rowIndex=0;var allRows=[];tbodies.forEach(function(tbody){var rows=tbody.stack||tbody.text;if(Array.isArray(rows)){allRows=allRows.concat(rows);rows.forEach(function(row){var cells=row.stack||row.text;if(Array.isArray(cells)){cellIndex=0;ret.table.body[rowIndex]=[];cells.forEach(function(cell){ret.table.body[rowIndex].push(cell);if(cell.colSpan){i=cell.colSpan;setRowSpan({rows:allRows,cell:cell,rowIndex:rowIndex,cellIndex:cellIndex});while(--i>0){ret.table.body[rowIndex].push({text:""});setRowSpan({rows:allRows,cell:cell,rowIndex:rowIndex,cellIndex:cellIndex});cellIndex++}}else{setRowSpan({rows:allRows,cell:cell,rowIndex:rowIndex,cellIndex:cellIndex})}cellIndex++});rowIndex++}})}})}delete ret.stack;delete ret.text;ret=applyStyle({ret:ret,parents:parents.concat([element])});if(tableAutoSize){var cellsWidths=[];var cellsHeights=[];var tableWidths=[];var tableHeights=[];ret.table.body.forEach(function(row,rowIndex){cellsWidths.push([]);cellsHeights.push([]);row.forEach(function(cell){var width=typeof cell.width!=="undefined"?cell.width:"auto";var height=typeof cell.height!=="undefined"?cell.height:"auto";if(width!=="auto"&&cell.colSpan){if(!isNaN(width))width/=cell.colSpan;else width="auto"}if(height!=="auto"&&cell.rowSpan){if(!isNaN(height))height/=cell.colSpan;else height="auto"}cellsWidths[rowIndex].push(width);cellsHeights[rowIndex].push(height)})});cellsWidths.forEach(function(row){row.forEach(function(cellWidth,cellIndex){var type=typeof tableWidths[cellIndex];if(type==="undefined"||cellWidth!=="auto"&&type==="number"&&cellWidth>tableWidths[cellIndex]||cellWidth!=="auto"&&tableWidths[cellIndex]==="auto"){tableWidths[cellIndex]=cellWidth}})});cellsHeights.forEach(function(row,rowIndex){row.forEach(function(cellHeight){var type=typeof tableHeights[rowIndex];if(type==="undefined"||cellHeight!=="auto"&&type==="number"&&cellHeight>tableHeights[rowIndex]||cellHeight!=="auto"&&tableHeights[rowIndex]==="auto"){tableHeights[rowIndex]=cellHeight}})});if(tableWidths.length>0)ret.table.widths=tableWidths;if(tableHeights.length>0)ret.table.heights=tableHeights}if(element.dataset&&element.dataset.pdfmake){dataset=JSON.parse(element.dataset.pdfmake);for(key in dataset){if(key==="layout"){ret.layout=dataset[key]}else{ret.table[key]=dataset[key]}}}break}case"TH":case"TD":{if(element.getAttribute("rowspan"))ret.rowSpan=element.getAttribute("rowspan")*1;if(element.getAttribute("colspan"))ret.colSpan=element.getAttribute("colspan")*1;ret=applyStyle({ret:ret,parents:parents.concat([element])});break}case"SVG":{ret={svg:element.outerHTML.replace(/\n(\s+)?/g,""),nodeName:"SVG",style:["html-svg"]};break}case"BR":{ret.text=[{text:"\n"}];break}case"SUB":case"SUP":{ret[nodeName.toLowerCase()]={offset:"30%",fontSize:8};break}case"HR":{var styleHR={width:514,type:"line",margin:[0,12,0,12],thickness:.5,color:"#000000",left:0};if(element.dataset&&element.dataset.pdfmake){dataset=JSON.parse(element.dataset.pdfmake);for(key in dataset){styleHR[key]=dataset[key]}}ret.margin=styleHR.margin;ret.canvas=[{type:styleHR.type,x1:styleHR.left,y1:0,x2:styleHR.width,y2:0,lineWidth:styleHR.thickness,lineColor:styleHR.color}];delete ret.text;break}case"OL":case"UL":{ret[nodeNameLowerCase]=(ret.stack||ret.text).slice(0);delete ret.stack;delete ret.text;ret=applyStyle({ret:ret,parents:parents.concat([element])});if(ret.listStyle||ret.listStyleType)ret.type=ret.listStyle||ret.listStyleType;break}case"IMG":{ret.image=element.getAttribute("src");delete ret.stack;delete ret.text;ret=applyStyle({ret:ret,parents:parents.concat([element])});break}case"A":{ret.link=element.getAttribute("href");break}case"FONT":{if(element.getAttribute("color")){ret.color=parseColor(element.getAttribute("color"))}if(element.getAttribute("size")){var size=Math.min(Math.max(1,parseInt(element.getAttribute("size"))),7);var fontSize=Math.max(fontSizes[0],fontSizes[size-1]);ret.fontSize=fontSize}ret=applyStyle({ret:ret,parents:parents.concat([element])});break}}if(Array.isArray(ret.text)&&ret.text.length===1&&ret.text[0].text&&!ret.text[0].nodeName){ret.text=ret.text[0].text}if(["HR","TABLE"].indexOf(nodeName)===-1&&element.dataset&&element.dataset.pdfmake){dataset=JSON.parse(element.dataset.pdfmake);for(key in dataset){ret[key]=dataset[key]}}return ret}}};var searchForStack=function(ret){if(Array.isArray(ret.text)){for(var i=0;i<ret.text.length;i++){if(ret.text[i].stack||["P","DIV","TABLE","SVG","UL","OL","IMG","H1","H2","H3","H4","H5","H6"].indexOf(ret.text[i].nodeName)>-1)return true;if(searchForStack(ret.text[i])===true)return true}}return false};var setRowSpan=function(params){var cells;if(params.cell.rowSpan){for(var i=1;i<=params.cell.rowSpan-1;i++){cells=params.rows[params.rowIndex+i].text||params.rows[params.rowIndex+i].stack;cells.splice(params.cellIndex,0,{text:""})}}};var applyStyle=function(params){var cssClass=[];var lastIndex=params.parents.length-1;params.parents.forEach(function(parent,parentIndex){var parentNodeName=parent.nodeName.toLowerCase();var htmlClass="html-"+parentNodeName;if(htmlClass!=="html-body"&&cssClass.indexOf(htmlClass)===-1)cssClass.unshift(htmlClass);var parentClass=(parent.getAttribute("class")||"").split(" ");parentClass.forEach(function(p){if(p)cssClass.push(p)});var style;var ignoreNonDescendentProperties=parentIndex!==lastIndex;if(defaultStyles[parentNodeName]){for(style in defaultStyles[parentNodeName]){if(defaultStyles[parentNodeName].hasOwnProperty(style)){if(!ignoreNonDescendentProperties||ignoreNonDescendentProperties&&style.indexOf("margin")===-1&&style.indexOf("border")===-1){if(style==="decoration"){if(!Array.isArray(params.ret[style]))params.ret[style]=[];params.ret[style].push(defaultStyles[parentNodeName][style])}else{params.ret[style]=defaultStyles[parentNodeName][style]}}}}}if(parentNodeName==="tr")ignoreNonDescendentProperties=false;style=parseStyle(parent,ignoreNonDescendentProperties);style.forEach(function(stl){if(stl.key==="decoration"){if(!Array.isArray(params.ret[stl.key]))params.ret[stl.key]=[];params.ret[stl.key].push(stl.value)}else{params.ret[stl.key]=stl.value}})});params.ret.style=cssClass;return params.ret};var parseStyle=function(element,ignoreProperties){var style=element.getAttribute("style")||"";style=style.split(";");if(element.getAttribute("width")){style.unshift("width:"+element.getAttribute("width")+"px")}if(element.getAttribute("height")){style.unshift("height:"+element.getAttribute("height")+"px")}var styleDefs=style.map(function(style){return style.toLowerCase().split(":")});var ret=[];var borders=[];var nodeName=element.nodeName.toUpperCase();styleDefs.forEach(function(styleDef){if(styleDef.length===2){var key=styleDef[0].trim();var value=styleDef[1].trim();switch(key){case"margin":{if(ignoreProperties)break;value=value.split(" ");if(value.length===1)value=[value[0],value[0],value[0],value[0]];else if(value.length===2)value=[value[1],value[0]];else if(value.length===3)value=[value[1],value[0],value[1],value[2]];else if(value.length===4)value=[value[3],value[0],value[1],value[2]];value.forEach(function(val,i){value[i]=convertToUnit(val)});if(value.indexOf(false)===-1)ret.push({key:key,value:value});break}case"text-align":{ret.push({key:"alignment",value:value});break}case"font-weight":{if(value==="bold")ret.push({key:"bold",value:true});break}case"text-decoration":{ret.push({key:"decoration",value:toCamelCase(value)});break}case"font-style":{if(value==="italic")ret.push({key:"italics",value:true});break}case"font-family":{ret.push({key:"font",value:value.split(",")[0].replace(/"|^'|^\s*|\s*$|'$/g,"").replace(/^([a-z])/g,function(g){return g[0].toUpperCase()}).replace(/ ([a-z])/g,function(g){return g[1].toUpperCase()})});break}case"color":{ret.push({key:"color",value:parseColor(value)});break}case"background-color":{ret.push({key:nodeName==="TD"||nodeName==="TH"?"fillColor":"background",value:parseColor(value)});break}case"text-indent":{ret.push({key:"leadingIndent",value:convertToUnit(value)});break}case"white-space":{ret.push({key:"preserveLeadingSpaces",value:value==="break-spaces"||value.slice(0,3)==="pre"});break}default:{if(key==="border"||key.indexOf("border-left")===0||key.indexOf("border-top")===0||key.indexOf("border-right")===0||key.indexOf("border-bottom")===0){if(!ignoreProperties)borders.push({key:key,value:value})}else{if(ignoreProperties&&(key.indexOf("margin-")===0||key==="width"||key==="height"))break;if(key.indexOf("padding")===0)break;if(key.indexOf("-")>-1)key=toCamelCase(key);if(value){var parsedValue=convertToUnit(value);ret.push({key:key,value:parsedValue===false?value:parsedValue})}}}}}});if(borders.length>0){var border=[];var borderColor=[];borders.forEach(function(b){var properties=b.value.split(" ");var width=properties[0].replace(/(\d+)(\.\d+)?([^\d]+)/g,"$1$2 ").trim();var index=-1,i;if(b.key.indexOf("-left")>-1)index=0;else if(b.key.indexOf("-top")>-1)index=1;else if(b.key.indexOf("-right")>-1)index=2;else if(b.key.indexOf("-bottom")>-1)index=3;if(index>-1){border[index]=width>0}else{for(i=0;i<4;i++)border[i]=width>0}if(properties.length>2){var color=properties.slice(2).join(" ");if(index>-1){borderColor[index]=parseColor(color)}else{for(i=0;i<4;i++)borderColor[i]=parseColor(color)}}});for(var i=0;i<4;i++){if(border.length>0&&typeof border[i]==="undefined")border[i]=true;if(borderColor.length>0&&typeof borderColor[i]==="undefined")borderColor[i]="#000000"}if(border.length>0)ret.push({key:"border",value:border});if(borderColor.length>0)ret.push({key:"borderColor",value:borderColor})}return ret};var toCamelCase=function(str){return str.replace(/-([a-z])/g,function(g){return g[1].toUpperCase()})};var parseColor=function(color){var haxRegex=new RegExp("^#([0-9a-f]{3}|[0-9a-f]{6})$");var rgbRegex=new RegExp("^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)$");var nameRegex=new RegExp("^[a-z]+$");if(haxRegex.test(color)){return color}else if(rgbRegex.test(color)){var decimalColors=rgbRegex.exec(color).slice(1);for(var i=0;i<3;i++){var decimalValue=+decimalColors[i];if(decimalValue>255){decimalValue=255}var hexString="0"+decimalValue.toString(16);hexString=hexString.slice(-2);decimalColors[i]=hexString}return"#"+decimalColors.join("")}else if(nameRegex.test(color)){return color==="transparent"?"white":color}else{console.error('Could not parse color "'+color+'"');return color}};var convertToUnit=function(val){if(!isNaN(parseFloat(val))&&isFinite(val))return val*1;var mtch=(val+"").trim().match(/^(\d+(\.\d+)?)(pt|px|rem|cm)$/);if(!mtch)return false;val=mtch[1];switch(mtch[3]){case"px":{val=Math.round(val*.75292857248934);break}case"rem":{val*=12;break}case"cm":{val=Math.round(val*28.34646);break}}return val*1};return convertHtml(htmlText)}},{}]},{},[1])(1)}); | ||
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.htmlToPdfmake=f()}})(function(){var define,module,exports;return function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r}()({1:[function(require,module,exports){module.exports=function(htmlText,options){this.wndw=options&&options.window?options.window:window;this.tableAutoSize=options&&typeof options.tableAutoSize==="boolean"?options.tableAutoSize:false;this.fontSizes=options&&Array.isArray(options.fontSizes)?options.fontSizes:[10,14,16,18,20,24,28];this.defaultStyles={b:{bold:true},strong:{bold:true},u:{decoration:"underline"},del:{decoration:"lineThrough"},s:{decoration:"lineThrough"},em:{italics:true},i:{italics:true},h1:{fontSize:24,bold:true,marginBottom:5},h2:{fontSize:22,bold:true,marginBottom:5},h3:{fontSize:20,bold:true,marginBottom:5},h4:{fontSize:18,bold:true,marginBottom:5},h5:{fontSize:16,bold:true,marginBottom:5},h6:{fontSize:14,bold:true,marginBottom:5},a:{color:"blue",decoration:"underline"},strike:{decoration:"lineThrough"},p:{margin:[0,5,0,10]},ul:{marginBottom:5,marginLeft:5},table:{marginBottom:5},th:{bold:true,fillColor:"#EEEEEE"}};this.changeDefaultStyles=function(){for(var keyStyle in options.defaultStyles){if(this.defaultStyles.hasOwnProperty(keyStyle)){if(options.defaultStyles.hasOwnProperty(keyStyle)&&!options.defaultStyles[keyStyle]){delete this.defaultStyles[keyStyle]}else{for(var k in options.defaultStyles[keyStyle]){if(options.defaultStyles[keyStyle][k]==="")delete this.defaultStyles[keyStyle][k];else this.defaultStyles[keyStyle][k]=options.defaultStyles[keyStyle][k]}}}else{this.defaultStyles[keyStyle]={};for(var ks in options.defaultStyles[keyStyle]){this.defaultStyles[keyStyle][ks]=options.defaultStyles[keyStyle][ks]}}}};if(options&&options.defaultStyles){this.changeDefaultStyles()}this.convertHtml=function(htmlText){var parser=new this.wndw.DOMParser;var parsedHtml=parser.parseFromString(htmlText,"text/html");var docDef=this.parseElement(parsedHtml.body,[]);return docDef.stack||docDef.text};this.parseElement=function(element,parents){var nodeName=element.nodeName.toUpperCase();var nodeNameLowerCase=nodeName.toLowerCase();var ret={text:[]};var text,needStack=false;var dataset,i,key,_this=this;if(["COLGROUP","COL"].indexOf(nodeName)>-1)return"";switch(element.nodeType){case 3:{if(element.textContent){text=element.textContent;var styleParentTextNode=this.parseStyle(parents[parents.length-1],true);var hasWhiteSpace=false;for(i=0;i<styleParentTextNode.length;i++){if(styleParentTextNode[i].key==="preserveLeadingSpaces"){hasWhiteSpace=styleParentTextNode[i].value;break}}if(!hasWhiteSpace)text=element.textContent.replace(/\n(\s+)?/g,"");if(options&&typeof options.replaceText==="function")text=options.replaceText(text,parents);if(["TABLE","THEAD","TBODY","TFOOT","TR","UL","OL"].indexOf(parents[parents.length-1].nodeName)>-1)text=text.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");if(text){ret={text:text};ret=this.applyStyle({ret:ret,parents:parents});return ret}}return""}case 1:{ret.nodeName=nodeName;parents.push(element);if(element.childNodes&&element.childNodes.length>0){[].forEach.call(element.childNodes,function(child){var res=_this.parseElement(child,parents);if(res){if(Array.isArray(res.text)&&res.text.length===0)res.text="";ret.text.push(res)}});needStack=this.searchForStack(ret);if(needStack){ret.stack=ret.text.slice(0);delete ret.text}else{ret=this.applyStyle({ret:ret,parents:parents})}}parents.pop();switch(nodeName){case"TABLE":{var rowIndex,cellIndex;ret.table={body:[]};var tbodies=ret.stack||ret.text;if(Array.isArray(tbodies)){rowIndex=0;var allRows=[];tbodies.forEach(function(tbody){var rows=tbody.stack||tbody.text;if(Array.isArray(rows)){allRows=allRows.concat(rows);rows.forEach(function(row){var cells=row.stack||row.text;if(Array.isArray(cells)){cellIndex=0;ret.table.body[rowIndex]=[];cells.forEach(function(cell){ret.table.body[rowIndex].push(cell);if(cell.colSpan){i=cell.colSpan;_this.setRowSpan({rows:allRows,cell:cell,rowIndex:rowIndex,cellIndex:cellIndex});while(--i>0){ret.table.body[rowIndex].push({text:""});_this.setRowSpan({rows:allRows,cell:cell,rowIndex:rowIndex,cellIndex:cellIndex});cellIndex++}}else{_this.setRowSpan({rows:allRows,cell:cell,rowIndex:rowIndex,cellIndex:cellIndex})}cellIndex++});rowIndex++}})}})}delete ret.stack;delete ret.text;ret=this.applyStyle({ret:ret,parents:parents.concat([element])});if(this.tableAutoSize){var cellsWidths=[];var cellsHeights=[];var tableWidths=[];var tableHeights=[];ret.table.body.forEach(function(row,rowIndex){cellsWidths.push([]);cellsHeights.push([]);row.forEach(function(cell){var width=typeof cell.width!=="undefined"?cell.width:"auto";var height=typeof cell.height!=="undefined"?cell.height:"auto";if(width!=="auto"&&cell.colSpan){if(!isNaN(width))width/=cell.colSpan;else width="auto"}if(height!=="auto"&&cell.rowSpan){if(!isNaN(height))height/=cell.colSpan;else height="auto"}cellsWidths[rowIndex].push(width);cellsHeights[rowIndex].push(height)})});cellsWidths.forEach(function(row){row.forEach(function(cellWidth,cellIndex){var type=typeof tableWidths[cellIndex];if(type==="undefined"||cellWidth!=="auto"&&type==="number"&&cellWidth>tableWidths[cellIndex]||cellWidth!=="auto"&&tableWidths[cellIndex]==="auto"){tableWidths[cellIndex]=cellWidth}})});cellsHeights.forEach(function(row,rowIndex){row.forEach(function(cellHeight){var type=typeof tableHeights[rowIndex];if(type==="undefined"||cellHeight!=="auto"&&type==="number"&&cellHeight>tableHeights[rowIndex]||cellHeight!=="auto"&&tableHeights[rowIndex]==="auto"){tableHeights[rowIndex]=cellHeight}})});if(tableWidths.length>0)ret.table.widths=tableWidths;if(tableHeights.length>0)ret.table.heights=tableHeights}if(element.dataset&&element.dataset.pdfmake){dataset=element.dataset.pdfmake;if(dataset.charAt(1)==="'")dataset=dataset.replace(/'/g,'"');try{dataset=JSON.parse(dataset);for(key in dataset){if(key==="layout"){ret.layout=dataset[key]}else{ret.table[key]=dataset[key]}}}catch(e){console.error(e)}}break}case"TH":case"TD":{if(element.getAttribute("rowspan"))ret.rowSpan=element.getAttribute("rowspan")*1;if(element.getAttribute("colspan"))ret.colSpan=element.getAttribute("colspan")*1;ret=this.applyStyle({ret:ret,parents:parents.concat([element])});break}case"SVG":{ret={svg:element.outerHTML.replace(/\n(\s+)?/g,""),nodeName:"SVG",style:["html-svg"]};break}case"BR":{ret.text=[{text:"\n"}];break}case"SUB":case"SUP":{ret[nodeName.toLowerCase()]={offset:"30%",fontSize:8};break}case"HR":{var styleHR={width:514,type:"line",margin:[0,12,0,12],thickness:.5,color:"#000000",left:0};if(element.dataset&&element.dataset.pdfmake){dataset=JSON.parse(element.dataset.pdfmake);for(key in dataset){styleHR[key]=dataset[key]}}ret.margin=styleHR.margin;ret.canvas=[{type:styleHR.type,x1:styleHR.left,y1:0,x2:styleHR.width,y2:0,lineWidth:styleHR.thickness,lineColor:styleHR.color}];delete ret.text;break}case"OL":case"UL":{ret[nodeNameLowerCase]=(ret.stack||ret.text).slice(0);delete ret.stack;delete ret.text;ret=this.applyStyle({ret:ret,parents:parents.concat([element])});if(ret.listStyle||ret.listStyleType)ret.type=ret.listStyle||ret.listStyleType;break}case"IMG":{ret.image=element.getAttribute("src");delete ret.stack;delete ret.text;ret=this.applyStyle({ret:ret,parents:parents.concat([element])});break}case"A":{ret.link=element.getAttribute("href");break}case"FONT":{if(element.getAttribute("color")){ret.color=this.parseColor(element.getAttribute("color"))}if(element.getAttribute("size")){var size=Math.min(Math.max(1,parseInt(element.getAttribute("size"))),7);var fontSize=Math.max(this.fontSizes[0],this.fontSizes[size-1]);ret.fontSize=fontSize}ret=this.applyStyle({ret:ret,parents:parents.concat([element])});break}default:{if(typeof options.customTag==="function"){ret=options.customTag.call(this,{element:element,parents:parents,ret:ret})}}}if(Array.isArray(ret.text)&&ret.text.length===1&&ret.text[0].text&&!ret.text[0].nodeName){ret.text=ret.text[0].text}if(["HR","TABLE"].indexOf(nodeName)===-1&&element.dataset&&element.dataset.pdfmake){dataset=JSON.parse(element.dataset.pdfmake);for(key in dataset){ret[key]=dataset[key]}}return ret}}};this.searchForStack=function(ret){if(Array.isArray(ret.text)){for(var i=0;i<ret.text.length;i++){if(ret.text[i].stack||["P","DIV","TABLE","SVG","UL","OL","IMG","H1","H2","H3","H4","H5","H6"].indexOf(ret.text[i].nodeName)>-1)return true;if(this.searchForStack(ret.text[i])===true)return true}}return false};this.setRowSpan=function(params){var cells;if(params.cell.rowSpan){for(var i=1;i<=params.cell.rowSpan-1;i++){cells=params.rows[params.rowIndex+i].text||params.rows[params.rowIndex+i].stack;cells.splice(params.cellIndex,0,{text:""})}}};this.applyStyle=function(params){var cssClass=[];var lastIndex=params.parents.length-1;var _this=this;params.parents.forEach(function(parent,parentIndex){var parentNodeName=parent.nodeName.toLowerCase();var htmlClass="html-"+parentNodeName;if(htmlClass!=="html-body"&&cssClass.indexOf(htmlClass)===-1)cssClass.unshift(htmlClass);var parentClass=(parent.getAttribute("class")||"").split(" ");parentClass.forEach(function(p){if(p)cssClass.push(p)});var style;var ignoreNonDescendentProperties=parentIndex!==lastIndex;if(_this.defaultStyles[parentNodeName]){for(style in _this.defaultStyles[parentNodeName]){if(_this.defaultStyles[parentNodeName].hasOwnProperty(style)){if(!ignoreNonDescendentProperties||ignoreNonDescendentProperties&&style.indexOf("margin")===-1&&style.indexOf("border")===-1){if(style==="decoration"){if(!Array.isArray(params.ret[style]))params.ret[style]=[];params.ret[style].push(_this.defaultStyles[parentNodeName][style])}else{params.ret[style]=_this.defaultStyles[parentNodeName][style]}}}}}if(parentNodeName==="tr")ignoreNonDescendentProperties=false;style=_this.parseStyle(parent,ignoreNonDescendentProperties);style.forEach(function(stl){if(stl.key==="decoration"){if(!Array.isArray(params.ret[stl.key]))params.ret[stl.key]=[];params.ret[stl.key].push(stl.value)}else{if(params.ret.margin&&stl.key.indexOf("margin")===0){switch(stl.key){case"marginLeft":params.ret.margin[0]=stl.value;break;case"marginTop":params.ret.margin[1]=stl.value;break;case"marginRight":params.ret.margin[2]=stl.value;break;case"marginBottom":params.ret.margin[3]=stl.value;break}}else{params.ret[stl.key]=stl.value}}})});params.ret.style=cssClass;return params.ret};this.parseStyle=function(element,ignoreProperties){var style=element.getAttribute("style")||"";style=style.split(";");if(element.getAttribute("width")){style.unshift("width:"+element.getAttribute("width")+"px")}if(element.getAttribute("height")){style.unshift("height:"+element.getAttribute("height")+"px")}var styleDefs=style.map(function(style){return style.toLowerCase().split(":")});var ret=[];var borders=[];var nodeName=element.nodeName.toUpperCase();var _this=this;styleDefs.forEach(function(styleDef){if(styleDef.length===2){var key=styleDef[0].trim();var value=styleDef[1].trim();switch(key){case"margin":{if(ignoreProperties)break;value=value.split(" ");if(value.length===1)value=[value[0],value[0],value[0],value[0]];else if(value.length===2)value=[value[1],value[0]];else if(value.length===3)value=[value[1],value[0],value[1],value[2]];else if(value.length===4)value=[value[3],value[0],value[1],value[2]];value.forEach(function(val,i){value[i]=_this.convertToUnit(val)});if(value.indexOf(false)===-1)ret.push({key:key,value:value});break}case"text-align":{ret.push({key:"alignment",value:value});break}case"font-weight":{if(value==="bold")ret.push({key:"bold",value:true});break}case"text-decoration":{ret.push({key:"decoration",value:_this.toCamelCase(value)});break}case"font-style":{if(value==="italic")ret.push({key:"italics",value:true});break}case"font-family":{ret.push({key:"font",value:value.split(",")[0].replace(/"|^'|^\s*|\s*$|'$/g,"").replace(/^([a-z])/g,function(g){return g[0].toUpperCase()}).replace(/ ([a-z])/g,function(g){return g[1].toUpperCase()})});break}case"color":{ret.push({key:"color",value:_this.parseColor(value)});break}case"background-color":{ret.push({key:nodeName==="TD"||nodeName==="TH"?"fillColor":"background",value:_this.parseColor(value)});break}case"text-indent":{ret.push({key:"leadingIndent",value:_this.convertToUnit(value)});break}case"white-space":{ret.push({key:"preserveLeadingSpaces",value:value==="break-spaces"||value.slice(0,3)==="pre"});break}default:{if(key==="border"||key.indexOf("border-left")===0||key.indexOf("border-top")===0||key.indexOf("border-right")===0||key.indexOf("border-bottom")===0){if(!ignoreProperties)borders.push({key:key,value:value})}else{if(ignoreProperties&&(key.indexOf("margin-")===0||key==="width"||key==="height"))break;if(key.indexOf("padding")===0)break;if(key.indexOf("-")>-1)key=_this.toCamelCase(key);if(value){var parsedValue=_this.convertToUnit(value);ret.push({key:key,value:parsedValue===false?value:parsedValue})}}}}}});if(borders.length>0){var border=[];var borderColor=[];borders.forEach(function(b){var properties=b.value.split(" ");var width=properties[0].replace(/(\d+)(\.\d+)?([^\d]+)/g,"$1$2 ").trim();var index=-1,i;if(b.key.indexOf("-left")>-1)index=0;else if(b.key.indexOf("-top")>-1)index=1;else if(b.key.indexOf("-right")>-1)index=2;else if(b.key.indexOf("-bottom")>-1)index=3;if(index>-1){border[index]=width>0}else{for(i=0;i<4;i++)border[i]=width>0}if(properties.length>2){var color=properties.slice(2).join(" ");if(index>-1){borderColor[index]=_this.parseColor(color)}else{for(i=0;i<4;i++)borderColor[i]=_this.parseColor(color)}}});for(var i=0;i<4;i++){if(border.length>0&&typeof border[i]==="undefined")border[i]=true;if(borderColor.length>0&&typeof borderColor[i]==="undefined")borderColor[i]="#000000"}if(border.length>0)ret.push({key:"border",value:border});if(borderColor.length>0)ret.push({key:"borderColor",value:borderColor})}return ret};this.toCamelCase=function(str){return str.replace(/-([a-z])/g,function(g){return g[1].toUpperCase()})};this.parseColor=function(color){var haxRegex=new RegExp("^#([0-9a-f]{3}|[0-9a-f]{6})$");var rgbRegex=new RegExp("^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)$");var nameRegex=new RegExp("^[a-z]+$");if(haxRegex.test(color)){return color}else if(rgbRegex.test(color)){var decimalColors=rgbRegex.exec(color).slice(1);for(var i=0;i<3;i++){var decimalValue=+decimalColors[i];if(decimalValue>255){decimalValue=255}var hexString="0"+decimalValue.toString(16);hexString=hexString.slice(-2);decimalColors[i]=hexString}return"#"+decimalColors.join("")}else if(nameRegex.test(color)){return color==="transparent"?"white":color}else{console.error('Could not parse color "'+color+'"');return color}};this.convertToUnit=function(val){if(!isNaN(parseFloat(val))&&isFinite(val))return val*1;var mtch=(val+"").trim().match(/^(\d+(\.\d+)?)(pt|px|rem|cm)$/);if(!mtch)return false;val=mtch[1];switch(mtch[3]){case"px":{val=Math.round(val*.75292857248934);break}case"rem":{val*=12;break}case"cm":{val=Math.round(val*28.34646);break}}return val*1};return this.convertHtml(htmlText)}},{}]},{},[1])(1)}); |
158
index.js
@@ -16,2 +16,3 @@ // source: https://github.com/OpenSlides/OpenSlides/blob/f4f8b8422f9b3fbab58e35ac3f8f870d35813b7d/client/src/app/core/ui-services/html-to-pdf.service.ts | ||
* @param {Boolean} [tableAutoSize=false] It permits to use the width/height defined in styles for a table's cells and rows | ||
* @param {Function} [customTag] It permits to handle non-regular HTML tag | ||
* @param {Object} [window] The `window` object (required for NodeJS server side use) | ||
@@ -38,10 +39,10 @@ * @return {Object} it returns a PdfMake object | ||
module.exports = function(htmlText, options) { | ||
var wndw = (options && options.window ? options.window : window); | ||
var tableAutoSize = (options && typeof options.tableAutoSize === "boolean" ? options.tableAutoSize : false); | ||
this.wndw = (options && options.window ? options.window : window); | ||
this.tableAutoSize = (options && typeof options.tableAutoSize === "boolean" ? options.tableAutoSize : false); | ||
// Used with the size attribute on the font elements to calculate relative font size | ||
var fontSizes = (options && Array.isArray(options.fontSizes) ? options.fontSizes : [10, 14, 16, 18, 20, 24, 28]); | ||
this.fontSizes = (options && Array.isArray(options.fontSizes) ? options.fontSizes : [10, 14, 16, 18, 20, 24, 28]); | ||
// set default styles | ||
var defaultStyles = { | ||
this.defaultStyles = { | ||
b: {bold:true}, | ||
@@ -71,13 +72,13 @@ strong: {bold:true}, | ||
*/ | ||
function changeDefaultStyles () { | ||
this.changeDefaultStyles = function () { | ||
for (var keyStyle in options.defaultStyles) { | ||
if (defaultStyles.hasOwnProperty(keyStyle)) { | ||
if (this.defaultStyles.hasOwnProperty(keyStyle)) { | ||
// if we want to remove a default style | ||
if (options.defaultStyles.hasOwnProperty(keyStyle) && !options.defaultStyles[keyStyle]) { | ||
delete defaultStyles[keyStyle]; | ||
delete this.defaultStyles[keyStyle]; | ||
} else { | ||
for (var k in options.defaultStyles[keyStyle]) { | ||
// if we want to delete a specific property | ||
if (options.defaultStyles[keyStyle][k] === '') delete defaultStyles[keyStyle][k]; | ||
else defaultStyles[keyStyle][k] = options.defaultStyles[keyStyle][k]; | ||
if (options.defaultStyles[keyStyle][k] === '') delete this.defaultStyles[keyStyle][k]; | ||
else this.defaultStyles[keyStyle][k] = options.defaultStyles[keyStyle][k]; | ||
} | ||
@@ -87,5 +88,5 @@ } | ||
// if we add default styles | ||
defaultStyles[keyStyle] = {} | ||
this.defaultStyles[keyStyle] = {} | ||
for (var ks in options.defaultStyles[keyStyle]) { | ||
defaultStyles[keyStyle][ks] = options.defaultStyles[keyStyle][ks]; | ||
this.defaultStyles[keyStyle][ks] = options.defaultStyles[keyStyle][ks]; | ||
} | ||
@@ -97,3 +98,3 @@ } | ||
if (options && options.defaultStyles) { | ||
changeDefaultStyles(); | ||
this.changeDefaultStyles(); | ||
} | ||
@@ -108,8 +109,8 @@ | ||
*/ | ||
var convertHtml = function(htmlText) { | ||
this.convertHtml = function(htmlText) { | ||
// Create a HTML DOM tree out of html string | ||
var parser = new wndw.DOMParser(); | ||
var parser = new this.wndw.DOMParser(); | ||
var parsedHtml = parser.parseFromString(htmlText, 'text/html'); | ||
var docDef = parseElement(parsedHtml.body, []); | ||
var docDef = this.parseElement(parsedHtml.body, []); | ||
// remove first level | ||
@@ -127,3 +128,3 @@ return docDef.stack || docDef.text; | ||
*/ | ||
var parseElement = function(element, parents) { | ||
this.parseElement = function(element, parents) { | ||
var nodeName = element.nodeName.toUpperCase(); | ||
@@ -133,3 +134,3 @@ var nodeNameLowerCase = nodeName.toLowerCase(); | ||
var text, needStack=false; | ||
var dataset, i, key; | ||
var dataset, i, key, _this=this; | ||
@@ -144,3 +145,3 @@ // ignore some HTML tags | ||
// check if we have 'white-space' in the parent's style | ||
var styleParentTextNode = parseStyle(parents[parents.length-1], true); | ||
var styleParentTextNode = this.parseStyle(parents[parents.length-1], true); | ||
var hasWhiteSpace = false; | ||
@@ -161,3 +162,3 @@ for (i=0; i<styleParentTextNode.length; i++) { | ||
ret = {'text':text}; | ||
ret = applyStyle({ret:ret, parents:parents}); | ||
ret = this.applyStyle({ret:ret, parents:parents}); | ||
return ret; | ||
@@ -174,3 +175,3 @@ } | ||
[].forEach.call(element.childNodes, function(child) { | ||
var res = parseElement(child, parents); | ||
var res = _this.parseElement(child, parents); | ||
if (res) { | ||
@@ -183,3 +184,3 @@ if (Array.isArray(res.text) && res.text.length===0) res.text=''; | ||
// find if we need a 'stack' instead of a 'text' | ||
needStack = searchForStack(ret); | ||
needStack = this.searchForStack(ret); | ||
if (needStack) { | ||
@@ -190,3 +191,3 @@ ret.stack = ret.text.slice(0); | ||
// apply all the inhirent classes and styles from the parents | ||
ret = applyStyle({ret:ret, parents:parents}); | ||
ret = this.applyStyle({ret:ret, parents:parents}); | ||
} | ||
@@ -227,7 +228,7 @@ } | ||
// do we have a rowSpan in addition of the colSpan? | ||
setRowSpan({rows:allRows, cell:cell, rowIndex:rowIndex, cellIndex:cellIndex}); | ||
_this.setRowSpan({rows:allRows, cell:cell, rowIndex:rowIndex, cellIndex:cellIndex}); | ||
while (--i > 0) { | ||
ret.table.body[rowIndex].push({text:''}); | ||
// keep adding empty cell due to rowspan | ||
setRowSpan({rows:allRows, cell:cell, rowIndex:rowIndex, cellIndex:cellIndex}); | ||
_this.setRowSpan({rows:allRows, cell:cell, rowIndex:rowIndex, cellIndex:cellIndex}); | ||
cellIndex++; | ||
@@ -237,3 +238,3 @@ } | ||
// do we have a rowSpan ? | ||
setRowSpan({rows:allRows, cell:cell, rowIndex:rowIndex, cellIndex:cellIndex}); | ||
_this.setRowSpan({rows:allRows, cell:cell, rowIndex:rowIndex, cellIndex:cellIndex}); | ||
} | ||
@@ -253,6 +254,6 @@ | ||
// apply all the inhirent classes and styles from the parents, or for the current element | ||
ret = applyStyle({ret:ret, parents:parents.concat([element])}); | ||
ret = this.applyStyle({ret:ret, parents:parents.concat([element])}); | ||
// if option tableAutoSize, then we try to apply the correct width/height on the table | ||
if (tableAutoSize) { | ||
if (this.tableAutoSize) { | ||
var cellsWidths = []; | ||
@@ -309,9 +310,16 @@ var cellsHeights = []; | ||
if (element.dataset && element.dataset.pdfmake) { | ||
dataset = JSON.parse(element.dataset.pdfmake); | ||
for (key in dataset) { | ||
if (key === "layout") { | ||
ret.layout = dataset[key]; | ||
} else { | ||
ret.table[key] = dataset[key]; | ||
// handle when people will use simple quotes, e.g. <table data-pdfmake="{'layout':'noBorders'}"> | ||
dataset = element.dataset.pdfmake; | ||
if (dataset.charAt(1) === "'") dataset=dataset.replace(/'/g,'"'); | ||
try { | ||
dataset = JSON.parse(dataset); | ||
for (key in dataset) { | ||
if (key === "layout") { | ||
ret.layout = dataset[key]; | ||
} else { | ||
ret.table[key] = dataset[key]; | ||
} | ||
} | ||
} catch(e) { | ||
console.error(e); | ||
} | ||
@@ -326,3 +334,3 @@ } | ||
// apply all the inhirent classes and styles from the parents, or for the current element | ||
ret = applyStyle({ret:ret, parents:parents.concat([element])}); | ||
ret = this.applyStyle({ret:ret, parents:parents.concat([element])}); | ||
break; | ||
@@ -388,3 +396,3 @@ } | ||
// apply all the inhirent classes and styles from the parents, or for the current element | ||
ret = applyStyle({ret:ret, parents:parents.concat([element])}); | ||
ret = this.applyStyle({ret:ret, parents:parents.concat([element])}); | ||
// check if we have `list-style-type` or `list-style` | ||
@@ -399,3 +407,3 @@ if (ret.listStyle || ret.listStyleType) ret.type = ret.listStyle || ret.listStyleType; | ||
// apply all the inhirent classes and styles from the parents, or for the current element | ||
ret = applyStyle({ret:ret, parents:parents.concat([element])}); | ||
ret = this.applyStyle({ret:ret, parents:parents.concat([element])}); | ||
break; | ||
@@ -409,11 +417,11 @@ } | ||
if (element.getAttribute("color")) { | ||
ret.color = parseColor(element.getAttribute("color")); | ||
ret.color = this.parseColor(element.getAttribute("color")); | ||
} | ||
// Checking if the element has a size attribute | ||
if (element.getAttribute("size")) { | ||
// Getting and sanitizing the size value – it should be included between 1 and 7 | ||
// Getting and sanitizing the size value: it should be included between 1 and 7 | ||
var size = Math.min(Math.max(1, parseInt(element.getAttribute("size"))), 7); | ||
// Getting the relative fontsize | ||
var fontSize = Math.max(fontSizes[0], fontSizes[size - 1]); | ||
var fontSize = Math.max(this.fontSizes[0], this.fontSizes[size - 1]); | ||
@@ -425,3 +433,3 @@ // Assigning the font size | ||
// Applying inherited styles | ||
ret = applyStyle({ | ||
ret = this.applyStyle({ | ||
ret: ret, | ||
@@ -432,2 +440,8 @@ parents: parents.concat([element]), | ||
} | ||
default: { | ||
// handle other cases | ||
if (typeof options.customTag === "function") { | ||
ret = options.customTag.call(this, {element:element, parents:parents, ret:ret}); | ||
} | ||
} | ||
} | ||
@@ -451,7 +465,7 @@ if (Array.isArray(ret.text) && ret.text.length === 1 && ret.text[0].text && !ret.text[0].nodeName) { | ||
var searchForStack = function(ret) { | ||
this.searchForStack = function(ret) { | ||
if (Array.isArray(ret.text)) { | ||
for (var i=0; i<ret.text.length; i++) { | ||
if (ret.text[i].stack || ['P','DIV','TABLE','SVG','UL','OL','IMG','H1','H2','H3','H4','H5','H6'].indexOf(ret.text[i].nodeName) > -1) return true; | ||
if (searchForStack(ret.text[i]) === true) return true; | ||
if (this.searchForStack(ret.text[i]) === true) return true; | ||
} | ||
@@ -471,3 +485,3 @@ } | ||
*/ | ||
var setRowSpan = function(params) { | ||
this.setRowSpan = function(params) { | ||
var cells; | ||
@@ -490,5 +504,6 @@ if (params.cell.rowSpan) { | ||
*/ | ||
var applyStyle = function(params) { | ||
this.applyStyle = function(params) { | ||
var cssClass = []; | ||
var lastIndex = params.parents.length-1; | ||
var _this = this; | ||
params.parents.forEach(function(parent, parentIndex) { | ||
@@ -508,5 +523,5 @@ // classes | ||
// 1) the default styles | ||
if (defaultStyles[parentNodeName]) { | ||
for (style in defaultStyles[parentNodeName]) { | ||
if (defaultStyles[parentNodeName].hasOwnProperty(style)) { | ||
if (_this.defaultStyles[parentNodeName]) { | ||
for (style in _this.defaultStyles[parentNodeName]) { | ||
if (_this.defaultStyles[parentNodeName].hasOwnProperty(style)) { | ||
if (!ignoreNonDescendentProperties || | ||
@@ -521,5 +536,5 @@ (ignoreNonDescendentProperties && | ||
if (!Array.isArray(params.ret[style])) params.ret[style]=[]; | ||
params.ret[style].push(defaultStyles[parentNodeName][style]); | ||
params.ret[style].push(_this.defaultStyles[parentNodeName][style]); | ||
} else { | ||
params.ret[style] = defaultStyles[parentNodeName][style]; | ||
params.ret[style] = _this.defaultStyles[parentNodeName][style]; | ||
} | ||
@@ -533,3 +548,3 @@ } | ||
if (parentNodeName === 'tr') ignoreNonDescendentProperties=false; | ||
style = parseStyle(parent, ignoreNonDescendentProperties); | ||
style = _this.parseStyle(parent, ignoreNonDescendentProperties); | ||
style.forEach(function(stl) { | ||
@@ -541,3 +556,15 @@ // 'decoration' can be an array | ||
} else { | ||
params.ret[stl.key] = stl.value; | ||
// when 'params.ret.margin' is defined but also a 'marginXYZ' is defined in `stl.key`, | ||
// then we should change the correct index in `params.ret.margin` to reflect it | ||
if (params.ret.margin && stl.key.indexOf('margin') === 0) { | ||
// order: left | top | right | bottom | ||
switch(stl.key) { | ||
case "marginLeft": params.ret.margin[0]=stl.value; break; | ||
case "marginTop": params.ret.margin[1]=stl.value; break; | ||
case "marginRight": params.ret.margin[2]=stl.value; break; | ||
case "marginBottom": params.ret.margin[3]=stl.value; break; | ||
} | ||
} else { | ||
params.ret[stl.key] = stl.value; | ||
} | ||
} | ||
@@ -558,3 +585,3 @@ }); | ||
*/ | ||
var parseStyle = function(element, ignoreProperties) { | ||
this.parseStyle = function(element, ignoreProperties) { | ||
var style = element.getAttribute("style") || ""; | ||
@@ -573,2 +600,3 @@ style = style.split(';'); | ||
var nodeName = element.nodeName.toUpperCase(); | ||
var _this=this; | ||
styleDefs.forEach(function(styleDef) { | ||
@@ -590,3 +618,3 @@ if (styleDef.length===2) { | ||
value.forEach(function(val, i) { | ||
value[i] = convertToUnit(val); | ||
value[i] = _this.convertToUnit(val); | ||
}); | ||
@@ -606,3 +634,3 @@ // ignore if we have a FALSE in the table | ||
case "text-decoration": { | ||
ret.push({key:"decoration", value:toCamelCase(value)}) | ||
ret.push({key:"decoration", value:_this.toCamelCase(value)}) | ||
break; | ||
@@ -619,3 +647,3 @@ } | ||
case "color": { | ||
ret.push({key:"color", value:parseColor(value)}) | ||
ret.push({key:"color", value:_this.parseColor(value)}) | ||
break; | ||
@@ -625,7 +653,7 @@ } | ||
// if TH/TD and key is 'background', then we use 'fillColor' instead | ||
ret.push({key:(nodeName === 'TD' || nodeName === 'TH' ? "fillColor" : "background"), value:parseColor(value)}) | ||
ret.push({key:(nodeName === 'TD' || nodeName === 'TH' ? "fillColor" : "background"), value:_this.parseColor(value)}) | ||
break; | ||
} | ||
case "text-indent": { | ||
ret.push({key:"leadingIndent", value:convertToUnit(value)}); | ||
ret.push({key:"leadingIndent", value:_this.convertToUnit(value)}); | ||
break; | ||
@@ -646,6 +674,6 @@ } | ||
if (key.indexOf("padding") === 0) break; | ||
if (key.indexOf("-") > -1) key=toCamelCase(key); | ||
if (key.indexOf("-") > -1) key=_this.toCamelCase(key); | ||
if (value) { | ||
// convert value to a 'pt' when possible | ||
var parsedValue = convertToUnit(value); | ||
var parsedValue = _this.convertToUnit(value); | ||
ret.push({key:key, value:(parsedValue === false ? value : parsedValue)}); | ||
@@ -682,5 +710,5 @@ } | ||
if (index > -1) { | ||
borderColor[index] = parseColor(color); | ||
borderColor[index] = _this.parseColor(color); | ||
} else { | ||
for (i=0; i<4; i++) borderColor[i] = parseColor(color); | ||
for (i=0; i<4; i++) borderColor[i] = _this.parseColor(color); | ||
} | ||
@@ -700,3 +728,3 @@ } | ||
var toCamelCase = function(str) { | ||
this.toCamelCase = function(str) { | ||
return str.replace(/-([a-z])/g, function (g) { return g[1].toUpperCase() }); | ||
@@ -712,3 +740,3 @@ } | ||
*/ | ||
var parseColor = function(color) { | ||
this.parseColor = function(color) { | ||
var haxRegex = new RegExp('^#([0-9a-f]{3}|[0-9a-f]{6})$'); | ||
@@ -750,3 +778,3 @@ | ||
*/ | ||
var convertToUnit = function(val) { | ||
this.convertToUnit = function(val) { | ||
// if it's just a number, then return it | ||
@@ -775,3 +803,3 @@ if (!isNaN(parseFloat(val)) && isFinite(val)) return val*1; | ||
return convertHtml(htmlText) | ||
return this.convertHtml(htmlText); | ||
} |
{ | ||
"name": "html-to-pdfmake", | ||
"version": "2.1.7", | ||
"version": "2.2.0", | ||
"description": "Convert HTML code to PDFMake", | ||
@@ -24,3 +24,3 @@ "main": "index.js", | ||
"eslint": "^5.16.0", | ||
"jsdom": "^14.1.0", | ||
"jsdom": "^16.6.0", | ||
"pdfmake": "^0.1.70", | ||
@@ -27,0 +27,0 @@ "simple-test-framework": "^0.1.7", |
@@ -194,2 +194,35 @@ # html-to-pdfmake | ||
#### `customTag` | ||
If your HTML code doesn't use regular HTML tags, then you can use `customTag` to define your own result. | ||
Example with a QR code generator: | ||
```js | ||
var html = htmlToPdfMake(`<code typecode="QR" style="foreground:black;background:yellow;fit:300px">texto in code</code>`, {, | ||
customTag:function(params) { | ||
var ret = params.ret; | ||
var element = params.element; | ||
var parents = params.parents; | ||
switch(ret.nodeName) { | ||
case "CODE": { | ||
ret = this.applyStyle({ret:ret, parents:parents.concat([element])}); | ||
ret.qr = ret.text[0].text; | ||
switch(element.getAttribute("typecode")){ | ||
case 'QR': | ||
delete ret.text; | ||
ret.nodeName='QR'; | ||
if(!ret.style || !Array.isArray(ret.style)){ | ||
ret.style = []; | ||
} | ||
ret.style.push('html-qr'); | ||
break; | ||
} | ||
break; | ||
} | ||
} | ||
return ret; | ||
} | ||
}); | ||
``` | ||
### HTML tags supported | ||
@@ -414,3 +447,3 @@ | ||
<table data-pdfmake="{"widths":[100,"*","auto"],"heights":40}"> | ||
<table data-pdfmake="{'widths':[100,'*','auto'],'heights':40}"> | ||
<tr> | ||
@@ -417,0 +450,0 @@ <td colspan="3">Table with <b>widths=[100,"*","auto"]</b> and <b>heights=40</b></td> |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
154609
1878
519