html-to-pdfmake
Advanced tools
Comparing version 2.4.26 to 2.5.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){function htmlToPdfMake(htmlText,options){"use strict";this.wndw=options&&options.window?options.window:window;this.tableAutoSize=options&&typeof options.tableAutoSize==="boolean"?options.tableAutoSize:false;this.imagesByReference=options&&typeof options.imagesByReference==="boolean"?options.imagesByReference:false;this.removeExtraBlanks=options&&typeof options.removeExtraBlanks==="boolean"?options.removeExtraBlanks:false;this.showHidden=options&&typeof options.showHidden==="boolean"?options.showHidden:false;this.removeTagClasses=options&&typeof options.removeTagClasses==="boolean"?options.removeTagClasses:false;this.ignoreStyles=options&&Array.isArray(options.ignoreStyles)?options.ignoreStyles:[];var imagesByReferenceSuffix=Math.random().toString(36).slice(2,8);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.imagesRef=[];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;if(this.removeExtraBlanks)htmlText=htmlText.replace(/(<\/?(div|p|h1|h2|h3|h4|h5|h6|ul|li)([^>]+)?>)\s+(<\/?(div|p|h1|h2|h3|h4|h5|h6|ul|li))/gi,"$1$4").replace(/(<\/?(div|p|h1|h2|h3|h4|h5|h6|ul|li)([^>]+)?>)\s+(<\/?(div|p|h1|h2|h3|h4|h5|h6|ul|li))/gi,"$1$4");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=parents.findIndex(function(p){return p.nodeName==="PRE"})>-1;for(i=0;i<styleParentTextNode.length;i++){if(styleParentTextNode[i].key==="preserveLeadingSpaces"){hasWhiteSpace=styleParentTextNode[i].value;break}}if(!hasWhiteSpace)text=text.replace(/\s*\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:{if(!this.showHidden&&(element.style.display&&element.style.display==="none")||element.style.visibility&&element.style.visibility==="hidden"){return}ret.nodeName=nodeName;if(element.id)ret.id=element.id;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>1){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=[];var fullWidth=element.getAttribute("width")==="100%"||(element.getAttribute("style")||"").replace(/width\s*:\s*100%/,"width:100%").includes("width:100%");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>1){if(!isNaN(width))width/=cell.colSpan;else width="auto"}if(height!=="auto"&&cell.rowSpan>1){if(!isNaN(height))height/=cell.rowSpan;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){if(fullWidth)tableWidths=tableWidths.map(function(w){return w==="auto"?"*":w});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"};if(!this.removeTagClasses)ret.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(element.getAttribute("start")){ret.start=element.getAttribute("start")*1}switch(element.getAttribute("type")){case"A":ret.type="upper-alpha";break;case"a":ret.type="lower-alpha";break;case"I":ret.type="upper-roman";break;case"i":ret.type="lower-roman";break}if(ret.listStyle||ret.listStyleType)ret.type=ret.listStyle||ret.listStyleType;break}case"LI":{if(ret.stack&&!ret.stack[ret.stack.length-1].text){text=ret.stack.slice(0,-1);ret=[{text:text},ret.stack[ret.stack.length-1]]}if(Array.isArray(ret)){ret={stack:ret}}break}case"PRE":{ret.preserveLeadingSpaces=true;break}case"IMG":{if(this.imagesByReference){var src=element.getAttribute("data-src")||element.getAttribute("src");var index=this.imagesRef.indexOf(src);if(index>-1)ret.image="img_ref_"+imagesByReferenceSuffix+index;else{ret.image="img_ref_"+imagesByReferenceSuffix+this.imagesRef.length;this.imagesRef.push(src)}}else{ret.image=element.getAttribute("src")}delete ret.stack;delete ret.text;ret=this.applyStyle({ret:ret,parents:parents.concat([element])});break}case"A":{var setLink=function(pointer,href){pointer=pointer||{text:""};if(Array.isArray(pointer.text)){return setLink(pointer.text[0],href)}else if(Array.isArray(pointer.stack)){pointer.stack=pointer.stack.map(function(stack){return setLink(stack,href)});return pointer}if(href.indexOf("#")===0)pointer.linkToDestination=href.slice(1);else pointer.link=href;return pointer};if(element.getAttribute("href")){ret=setLink(ret,element.getAttribute("href"));ret.nodeName="A"}break}default:{if(options&&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){var len=params.cell.rowSpan;for(var i=1;i<=len-1;i++){cells=params.rows[params.rowIndex+i].text||params.rows[params.rowIndex+i].stack;if(cells)cells.splice(params.cellIndex,0,{text:""});else{params.cell.rowSpan--}}}};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();if(!_this.removeTagClasses){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]=[];if(params.ret[style].indexOf(_this.defaultStyles[parentNodeName][style])===-1){params.ret[style].push(_this.defaultStyles[parentNodeName][style])}}else{params.ret[style]=JSON.parse(JSON.stringify(_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}}})});if(cssClass.length>0)params.ret.style=cssClass;return params.ret};this.borderValueRearrange=function(styleStr){try{var styleArray=styleStr.split(" ");if(styleArray.length!==3)return styleStr;var v1="0px",v2="none",v3="transparent";var style=["dotted","dashed","solid","double","groove","ridge","inset","outset","none","hidden","mix"];styleArray.forEach(function(v){if(v.match(/^\d/)){v1=v}else if(style.indexOf(v)>-1){v2=v}else{v3=v}});return v1+" "+v2+" "+v3}catch(e){return styleStr}};this.parseStyle=function(element,ignoreProperties){var style=element.getAttribute("style")||"";var ret=[];style=style.split(";");var width=element.getAttribute("width");var height=element.getAttribute("height");if(width){style.unshift("width:"+this.convertToUnit(width+(isNaN(width)?"":"px")))}if(height){style.unshift("height:"+this.convertToUnit(height+(isNaN(height)?"":"px")))}var color=element.getAttribute("color");if(color){ret.push({key:"color",value:this.parseColor(color)})}var size=element.getAttribute("size");if(size!==null){size=Math.min(Math.max(1,parseInt(size)),7);ret.push({key:"fontSize",value:Math.max(this.fontSizes[0],this.fontSizes[size-1])})}var styleDefs=style.map(function(style){return style.toLowerCase().split(":")});var borders=[];var nodeName=element.nodeName.toUpperCase();var _this=this;styleDefs.forEach(function(styleDef){if(styleDef.length===2){var key=styleDef[0].trim().toLowerCase();var value=styleDef[1].trim();if(_this.ignoreStyles.indexOf(key)===-1){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"line-height":{if(typeof value==="string"&&value.slice(-1)==="%"){value=value.slice(0,-1)/100}else{value=_this.convertToUnit(value)}ret.push({key:"lineHeight",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(nodeName==="IMG"&&(key==="width"||key==="height")){ret.push({key:key,value:_this.convertToUnit(value)});break}if(key.indexOf("padding")===0)break;if(key.indexOf("-")>-1)key=_this.toCamelCase(key);if(value){var parsedValue=_this.convertToUnit(value);if(key==="font-size"&&parsedValue===false)break;ret.push({key:key,value:parsedValue===false?value:parsedValue})}}}}}}});if(borders.length>0){var border=[];var borderColor=[];borders.forEach(function(b){b.value=_this.borderValueRearrange(b.value);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.hsl2rgb=function(h,s,l){var a=s*Math.min(l,1-l);var f=function(n){var k=(n+h/30)%12;return Math.min(Math.floor((l-a*Math.max(Math.min(k-3,9-k,1),-1))*256),255)};return"rgb("+f(0)+","+f(8)+","+f(4)+")"};this.parseColor=function(color){var haxRegex=new RegExp("^#([0-9a-f]{3}|[0-9a-f]{6})$","i");var rgbRegex=/^rgba?\(\s*(\d+(\.\d+)?%?),\s*(\d+(\.\d+)?%?),\s*(\d+(\.\d+)?%?)(,\s*\d+(\.\d+)?)?\)$/;var hslRegex=new RegExp("^hsl\\((\\d+(\\.\\d+)?%?),\\s*(\\d+(\\.\\d+)?%?),\\s*(\\d+(\\.\\d+)?%?)\\)$");var nameRegex=new RegExp("^[a-z]+$","i");var decimalColors,decimalValue,hexString,ret=[];if(haxRegex.test(color)){return color}if(hslRegex.test(color)){decimalColors=hslRegex.exec(color).slice(1);if(decimalColors[0].endsWith("%"))decimalValue=decimalColors[0].slice(0,-1)*360/100;else decimalValue=decimalColors[0]*1;ret.push(decimalValue);ret.push(decimalColors[2].slice(0,-1)/100);ret.push(decimalColors[4].slice(0,-1)/100);color=this.hsl2rgb(ret[0],ret[1],ret[2]);ret=[]}if(rgbRegex.test(color)){decimalColors=rgbRegex.exec(color).slice(1).filter(function(v,i){return i%2===0&&typeof v!=="undefined"});decimalColors.forEach(function(decimalValue,i){if(i===3){hexString=Math.round(decimalValue.replace(",","")*255).toString(16)}else{if(decimalValue.endsWith("%")){decimalValue=Math.round(decimalValue.slice(0,-1)*255/100)}else decimalValue=decimalValue*1;if(decimalValue>255){decimalValue=255}hexString="0"+decimalValue.toString(16);hexString=hexString.slice(-2)}ret.push(hexString)});return"#"+ret.join("")}if(nameRegex.test(color))return color;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|r?em|cm|in)$/);if(!mtch)return false;val=mtch[1];switch(mtch[3]){case"px":{val=Math.round(val*.75292857248934);break}case"em":case"rem":{val*=12;break}case"cm":{val=Math.round(val*28.34646);break}case"in":{val*=72;break}}return val*1};var result=this.convertHtml(htmlText);if(typeof result==="string")result={text:result};if(this.imagesByReference){result={content:result,images:{}};this.imagesRef.forEach(function(src,i){result.images["img_ref_"+imagesByReferenceSuffix+i]=src.startsWith("{")?JSON.parse(src):src})}return result}module.exports=function(htmlText,options){return new htmlToPdfMake(htmlText,options)}},{}]},{},[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){function htmlToPdfMake(htmlText,options){"use strict";this.wndw=options&&options.window?options.window:window;this.tableAutoSize=options&&typeof options.tableAutoSize==="boolean"?options.tableAutoSize:false;this.imagesByReference=options&&typeof options.imagesByReference==="boolean"?options.imagesByReference:false;this.removeExtraBlanks=options&&typeof options.removeExtraBlanks==="boolean"?options.removeExtraBlanks:false;this.showHidden=options&&typeof options.showHidden==="boolean"?options.showHidden:false;this.removeTagClasses=options&&typeof options.removeTagClasses==="boolean"?options.removeTagClasses:false;this.ignoreStyles=options&&Array.isArray(options.ignoreStyles)?options.ignoreStyles:[];var imagesByReferenceSuffix=Math.random().toString(36).slice(2,8);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.imagesRef=[];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;if(this.removeExtraBlanks)htmlText=htmlText.replace(/(<\/?(div|p|h1|h2|h3|h4|h5|h6|ul|li)([^>]+)?>)\s+(<\/?(div|p|h1|h2|h3|h4|h5|h6|ul|li))/gi,"$1$4").replace(/(<\/?(div|p|h1|h2|h3|h4|h5|h6|ul|li)([^>]+)?>)\s+(<\/?(div|p|h1|h2|h3|h4|h5|h6|ul|li))/gi,"$1$4");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=parents.findIndex(function(p){return p.nodeName==="PRE"})>-1;for(i=0;i<styleParentTextNode.length;i++){if(styleParentTextNode[i].key==="preserveLeadingSpaces"){hasWhiteSpace=styleParentTextNode[i].value;break}}if(!hasWhiteSpace)text=text.replace(/\s*\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:{if(!this.showHidden&&(element.style.display&&element.style.display==="none")||element.style.visibility&&element.style.visibility==="hidden"){return}ret.nodeName=nodeName;if(element.id)ret.id=element.id;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;ret.table={body:[]};var tbodies=ret.stack||ret.text;if(Array.isArray(tbodies)){rowIndex=0;var hasRowSpan=false;tbodies.forEach(function(tbody){var rows=tbody.stack||tbody.text;if(Array.isArray(rows)){rows.forEach(function(row){var cells=row.stack||row.text;if(Array.isArray(cells)){ret.table.body[rowIndex]=[];cells.forEach(function(cell){ret.table.body[rowIndex].push(cell);if(cell.colSpan>1){i=cell.colSpan;while(--i>0){ret.table.body[rowIndex].push({text:""})}}if(cell.rowSpan>1)hasRowSpan=true});rowIndex++}})}});if(hasRowSpan){ret.table.body.forEach(function(row,rowIndex){row.forEach(function(cell,cellIndex){if(cell.rowSpan>1){var len=cell.rowSpan;var colspan=cell.colSpan?cell.colSpan:1;for(var i=1;i<=len-1;i++){if(ret.table.body[rowIndex+i]){while(colspan--)ret.table.body[rowIndex+i].splice(cellIndex,0,{text:""})}else{cell.rowSpan--}}}})})}}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=[];var fullWidth=element.getAttribute("width")==="100%"||(element.getAttribute("style")||"").replace(/width\s*:\s*100%/,"width:100%").includes("width:100%");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>1){if(!isNaN(width))width/=cell.colSpan;else width="auto"}if(height!=="auto"&&cell.rowSpan>1){if(!isNaN(height))height/=cell.rowSpan;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){if(fullWidth)tableWidths=tableWidths.map(function(w){return w==="auto"?"*":w});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"};if(!this.removeTagClasses)ret.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(element.getAttribute("start")){ret.start=element.getAttribute("start")*1}switch(element.getAttribute("type")){case"A":ret.type="upper-alpha";break;case"a":ret.type="lower-alpha";break;case"I":ret.type="upper-roman";break;case"i":ret.type="lower-roman";break}if(ret.listStyle||ret.listStyleType)ret.type=ret.listStyle||ret.listStyleType;break}case"LI":{if(ret.stack&&!ret.stack[ret.stack.length-1].text){text=ret.stack.slice(0,-1);ret=[{text:text},ret.stack[ret.stack.length-1]]}if(Array.isArray(ret)){ret={stack:ret}}break}case"PRE":{ret.preserveLeadingSpaces=true;break}case"IMG":{if(this.imagesByReference){var src=element.getAttribute("data-src")||element.getAttribute("src");var index=this.imagesRef.indexOf(src);if(index>-1)ret.image="img_ref_"+imagesByReferenceSuffix+index;else{ret.image="img_ref_"+imagesByReferenceSuffix+this.imagesRef.length;this.imagesRef.push(src)}}else{ret.image=element.getAttribute("src")}delete ret.stack;delete ret.text;ret=this.applyStyle({ret:ret,parents:parents.concat([element])});break}case"A":{var setLink=function(pointer,href){pointer=pointer||{text:""};if(Array.isArray(pointer.text)){return setLink(pointer.text[0],href)}else if(Array.isArray(pointer.stack)){pointer.stack=pointer.stack.map(function(stack){return setLink(stack,href)});return pointer}if(href.indexOf("#")===0)pointer.linkToDestination=href.slice(1);else pointer.link=href;return pointer};if(element.getAttribute("href")){ret=setLink(ret,element.getAttribute("href"));ret.nodeName="A"}break}default:{if(options&&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.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();if(!_this.removeTagClasses){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]=[];if(params.ret[style].indexOf(_this.defaultStyles[parentNodeName][style])===-1){params.ret[style].push(_this.defaultStyles[parentNodeName][style])}}else{params.ret[style]=JSON.parse(JSON.stringify(_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}}})});if(cssClass.length>0)params.ret.style=cssClass;return params.ret};this.borderValueRearrange=function(styleStr){try{var styleArray=styleStr.split(" ");if(styleArray.length!==3)return styleStr;var v1="0px",v2="none",v3="transparent";var style=["dotted","dashed","solid","double","groove","ridge","inset","outset","none","hidden","mix"];styleArray.forEach(function(v){if(v.match(/^\d/)){v1=v}else if(style.indexOf(v)>-1){v2=v}else{v3=v}});return v1+" "+v2+" "+v3}catch(e){return styleStr}};this.parseStyle=function(element,ignoreProperties){var style=element.getAttribute("style")||"";var ret=[];style=style.split(";");var width=element.getAttribute("width");var height=element.getAttribute("height");if(width){style.unshift("width:"+this.convertToUnit(width+(isNaN(width)?"":"px")))}if(height){style.unshift("height:"+this.convertToUnit(height+(isNaN(height)?"":"px")))}var color=element.getAttribute("color");if(color){ret.push({key:"color",value:this.parseColor(color)})}var size=element.getAttribute("size");if(size!==null){size=Math.min(Math.max(1,parseInt(size)),7);ret.push({key:"fontSize",value:Math.max(this.fontSizes[0],this.fontSizes[size-1])})}var styleDefs=style.map(function(style){return style.toLowerCase().split(":")});var borders=[];var nodeName=element.nodeName.toUpperCase();var _this=this;styleDefs.forEach(function(styleDef){if(styleDef.length===2){var key=styleDef[0].trim().toLowerCase();var value=styleDef[1].trim();if(_this.ignoreStyles.indexOf(key)===-1){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"line-height":{if(typeof value==="string"&&value.slice(-1)==="%"){value=value.slice(0,-1)/100}else{value=_this.convertToUnit(value)}ret.push({key:"lineHeight",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(nodeName==="IMG"&&(key==="width"||key==="height")){ret.push({key:key,value:_this.convertToUnit(value)});break}if(key.indexOf("padding")===0)break;if(key.indexOf("-")>-1)key=_this.toCamelCase(key);if(value){var parsedValue=_this.convertToUnit(value);if(key==="font-size"&&parsedValue===false)break;ret.push({key:key,value:parsedValue===false?value:parsedValue})}}}}}}});if(borders.length>0){var border=[];var borderColor=[];borders.forEach(function(b){b.value=_this.borderValueRearrange(b.value);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.hsl2rgb=function(h,s,l){var a=s*Math.min(l,1-l);var f=function(n){var k=(n+h/30)%12;return Math.min(Math.floor((l-a*Math.max(Math.min(k-3,9-k,1),-1))*256),255)};return"rgb("+f(0)+","+f(8)+","+f(4)+")"};this.parseColor=function(color){var haxRegex=new RegExp("^#([0-9a-f]{3}|[0-9a-f]{6})$","i");var rgbRegex=/^rgba?\(\s*(\d+(\.\d+)?%?),\s*(\d+(\.\d+)?%?),\s*(\d+(\.\d+)?%?)(,\s*\d+(\.\d+)?)?\)$/;var hslRegex=new RegExp("^hsl\\((\\d+(\\.\\d+)?%?),\\s*(\\d+(\\.\\d+)?%?),\\s*(\\d+(\\.\\d+)?%?)\\)$");var nameRegex=new RegExp("^[a-z]+$","i");var decimalColors,decimalValue,hexString,ret=[];if(haxRegex.test(color)){return color}if(hslRegex.test(color)){decimalColors=hslRegex.exec(color).slice(1);if(decimalColors[0].endsWith("%"))decimalValue=decimalColors[0].slice(0,-1)*360/100;else decimalValue=decimalColors[0]*1;ret.push(decimalValue);ret.push(decimalColors[2].slice(0,-1)/100);ret.push(decimalColors[4].slice(0,-1)/100);color=this.hsl2rgb(ret[0],ret[1],ret[2]);ret=[]}if(rgbRegex.test(color)){decimalColors=rgbRegex.exec(color).slice(1).filter(function(v,i){return i%2===0&&typeof v!=="undefined"});decimalColors.forEach(function(decimalValue,i){if(i===3){hexString=Math.round(decimalValue.replace(",","")*255).toString(16)}else{if(decimalValue.endsWith("%")){decimalValue=Math.round(decimalValue.slice(0,-1)*255/100)}else decimalValue=decimalValue*1;if(decimalValue>255){decimalValue=255}hexString="0"+decimalValue.toString(16);hexString=hexString.slice(-2)}ret.push(hexString)});return"#"+ret.join("")}if(nameRegex.test(color))return color;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|r?em|cm|in)$/);if(!mtch)return false;val=mtch[1];switch(mtch[3]){case"px":{val=Math.round(val*.75292857248934);break}case"em":case"rem":{val*=12;break}case"cm":{val=Math.round(val*28.34646);break}case"in":{val*=72;break}}return val*1};var result=this.convertHtml(htmlText);if(typeof result==="string")result={text:result};if(this.imagesByReference){result={content:result,images:{}};this.imagesRef.forEach(function(src,i){result.images["img_ref_"+imagesByReferenceSuffix+i]=src.startsWith("{")?JSON.parse(src):src})}return result}module.exports=function(htmlText,options){return new htmlToPdfMake(htmlText,options)}},{}]},{},[1])(1)}); |
68
index.js
@@ -212,3 +212,3 @@ // source: https://github.com/OpenSlides/OpenSlides/blob/f4f8b8422f9b3fbab58e35ac3f8f870d35813b7d/client/src/app/core/ui-services/html-to-pdf.service.ts | ||
case "TABLE":{ | ||
var rowIndex, cellIndex; | ||
var rowIndex; | ||
// the format for the table is table.body[[], [], …] | ||
@@ -221,3 +221,4 @@ ret.table = {body:[]}; | ||
// Array with All Rows including THEAD | ||
var allRows = []; | ||
var hasRowSpan = false; // TRUE if we have some rowspan | ||
// first round is to deal with colspan | ||
// for each THEAD / TBODY | ||
@@ -228,4 +229,2 @@ tbodies.forEach(function(tbody) { | ||
if (Array.isArray(rows)) { | ||
// Add rows to allRows | ||
allRows = allRows.concat(rows); | ||
rows.forEach(function(row) { | ||
@@ -235,7 +234,5 @@ 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); | ||
// do we have a colSpan? | ||
@@ -245,16 +242,10 @@ // if yes, insert empty cells due to colspan | ||
i = cell.colSpan; | ||
// do we have a rowSpan in addition of the colSpan? | ||
_this.setRowSpan({rows:allRows, cell:cell, rowIndex:rowIndex, cellIndex:cellIndex}); | ||
// insert an empty cell for each colspan | ||
while (--i > 0) { | ||
ret.table.body[rowIndex].push({text:''}); | ||
// keep adding empty cell due to rowspan | ||
_this.setRowSpan({rows:allRows, cell:cell, rowIndex:rowIndex, cellIndex:cellIndex}); | ||
cellIndex++; | ||
} | ||
} else { | ||
// do we have a rowSpan ? | ||
_this.setRowSpan({rows:allRows, cell:cell, rowIndex:rowIndex, cellIndex:cellIndex}); | ||
} | ||
cellIndex++; | ||
// do we have a rowSpan ? | ||
if (cell.rowSpan > 1) hasRowSpan=true; | ||
}); | ||
@@ -266,2 +257,24 @@ rowIndex++; | ||
}); | ||
if (hasRowSpan) { | ||
// we go through all again, just to deal with rowspan | ||
ret.table.body.forEach(function(row, rowIndex) { | ||
// for each row | ||
row.forEach(function(cell, cellIndex) { | ||
// do we have a rowSpan? | ||
if (cell.rowSpan>1) { | ||
var len = cell.rowSpan; | ||
var colspan = (cell.colSpan ? cell.colSpan : 1); | ||
for (var i=1; i <= len-1; i++) { | ||
if (ret.table.body[rowIndex+i]) { | ||
while (colspan--) ret.table.body[rowIndex+i].splice(cellIndex, 0, {text:''}); | ||
} else { | ||
// if we have an empty <tr></tr> | ||
cell.rowSpan--; | ||
} | ||
} | ||
} | ||
}) | ||
}); | ||
} | ||
} | ||
@@ -534,27 +547,2 @@ | ||
/** | ||
* Add empty cells due to rowspan | ||
* | ||
* @param {Object} params | ||
* @param {Array} rows | ||
* @param {Object} cell | ||
* @param {Number} rowIndex Current row index | ||
* @param {Number} cellIndex Current cell index | ||
*/ | ||
this.setRowSpan = function(params) { | ||
var cells; | ||
if (params.cell.rowSpan) { | ||
var len = params.cell.rowSpan; | ||
for (var i=1; i <= len-1; i++) { | ||
cells = (params.rows[params.rowIndex+i].text || params.rows[params.rowIndex+i].stack); | ||
if (cells) cells.splice(params.cellIndex, 0, {text:''}); | ||
else { | ||
// if we have an empty <tr></tr> after a row with rowspan, then we need to remove rowSpan | ||
// cf https://github.com/Aymkdn/html-to-pdfmake/issues/189 | ||
params.cell.rowSpan--; | ||
} | ||
} | ||
} | ||
} | ||
/** | ||
* Apply style and classes from all the parents | ||
@@ -561,0 +549,0 @@ * |
{ | ||
"name": "html-to-pdfmake", | ||
"version": "2.4.26", | ||
"version": "2.5.0", | ||
"description": "Convert HTML code to PDFMake", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -486,3 +486,3 @@ # html-to-pdfmake | ||
Otherwise the `src` attribute must be a **base64 encoded content** (as describe in the [PDFMake documentation](https://pdfmake.github.io/docs/document-definition-object/images/)) or a reference ([see more here](https://github.com/Aymkdn/html-to-pdfmake/issues/109#issue-932953144)). | ||
Otherwise, for example when using this library with **Node** instead of a Web browser, the `src` attribute must be a **base64 encoded content** (as describe in the [PDFMake documentation](https://pdfmake.github.io/docs/document-definition-object/images/)) or a reference ([see more here](https://github.com/Aymkdn/html-to-pdfmake/issues/109#issue-932953144)). | ||
@@ -489,0 +489,0 @@ You can check [this Stackoverflow question](https://stackoverflow.com/questions/934012/get-image-data-in-javascript/42916772#42916772) to know the different ways to get a base64 encoded content from an image. |
@@ -1025,3 +1025,18 @@ var htmlToPdfMake = require('../index.js'); | ||
t.test("complex table with rowspan and colspan", function (t) { | ||
var html = `<table><th colspan="3" rowspan="2">ABC</th><th colspan="13">DEF</th><th colspan="4" rowspan="2">GHI</th><th colspan="13">JKL</th></tr><tr><th colspan="10">123</th><th colspan="3">456</th><th colspan="10">789</th><th colspan="3">111</th></tr></table>`; | ||
var ret = htmlToPdfMake(html, {window: window}); | ||
// [{"nodeName":"TABLE","marginBottom":5,"style":["html-table"],"table":{"body":[[{"text":"ABC","nodeName":"TH","bold":true,"fillColor":"#EEEEEE","style":["html-th","html-tr","html-tbody","html-table"],"rowSpan":2,"colSpan":3},{"text":""},{"text":""},{"text":"DEF","nodeName":"TH","bold":true,"fillColor":"#EEEEEE","style":["html-th","html-tr","html-tbody","html-table"],"colSpan":13},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":"GHI","nodeName":"TH","bold":true,"fillColor":"#EEEEEE","style":["html-th","html-tr","html-tbody","html-table"],"rowSpan":2,"colSpan":4},{"text":""},{"text":""},{"text":""},{"text":"JKL","nodeName":"TH","bold":true,"fillColor":"#EEEEEE","style":["html-th","html-tr","html-tbody","html-table"],"colSpan":13},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""}],[{"text":""},{"text":""},{"text":""},{"text":"123","nodeName":"TH","bold":true,"fillColor":"#EEEEEE","style":["html-th","html-tr","html-tbody","html-table"],"colSpan":10},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":"456","nodeName":"TH","bold":true,"fillColor":"#EEEEEE","style":["html-th","html-tr","html-tbody","html-table"],"colSpan":3},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":"789","nodeName":"TH","bold":true,"fillColor":"#EEEEEE","style":["html-th","html-tr","html-tbody","html-table"],"colSpan":10},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":""},{"text":"111","nodeName":"TH","bold":true,"fillColor":"#EEEEEE","style":["html-th","html-tr","html-tbody","html-table"],"colSpan":3},{"text":""},{"text":""}]]}}] | ||
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 && ret.table.body, "table.body is here"); | ||
t.check(Array.isArray(ret.table.body) && ret.table.body.length===2, "table has 2 rows"); | ||
t.check(Array.isArray(ret.table.body[0]) && ret.table.body[0].length===33 && Array.isArray(ret.table.body[1]) && ret.table.body[1].length===33, "each row has 33 cells"); | ||
t.check(ret.table.body[0][0].text==="ABC" && ret.table.body[0][2].text==="" && ret.table.body[0][6].text==="" && ret.table.body[0][16].text==="GHI" && ret.table.body[0][19].text==="" && ret.table.body[0][21].text==="" && ret.table.body[0][24].text==="", "row #0 is OK"); | ||
t.check(ret.table.body[1][0].text==="" && ret.table.body[1][5].text==="" && ret.table.body[1][6].text==="" && ret.table.body[1][13].text==="456" && ret.table.body[1][19].text==="" && ret.table.body[1][21].text==="" && ret.table.body[1][30].text==="111", "row #1 is OK"); | ||
t.finish(); | ||
}); | ||
t.finish(); | ||
}) |
Sorry, the diff of this file is not supported yet
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
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
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
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
217606
2365