$ npm run test -- notPrettyXmlStream
$ npm run test -- notPrettyXml
$ npm run test -- testHtml
$ npm run test -- selfClose
$ npm run test -- treeBuilder
Parse a HTML string to a tree of VNodes and use Snabbdom to patch a DOM element
// Note below that you need to provide functions// to decode and encode html entities// (ex: < to <, " to ", etc)functionelGetHtml(el){vart=String(el.tagName).toLowerCase();vara='';varea=el.attributes;vareac=ea.length;for(vari=0;i<eac;i++){vareai=ea[i];// ↓ provide your encode function ↓varean=htmlEntitiesEncode(eai.name);vareav=htmlEntitiesEncode(eai.value);a+=' '+ean+'='+JSON.stringify(eav);}varsc=StreamXMLParser.htmlVoidTagMap[t];return{open: '<'+t+a+(sc?'/':'')+'>',close: sc ? '' : '</'+t+'>'};}functionhtmlToVnodes(html){vartb=newStreamXMLParser.TreeBuilder({element: StreamXMLParser.elementSnabbdom()});varxp=newStreamXMLParser.XMLParser({event: tb.parserEvent.bind(tb),// ↓ provide your decode function ↓decodeString: htmlEntitiesDecode});xp.end(html);returntb.root.tag.children;}functionpatchElHtml(el,html){varpatch=snabbdom.init([require('snabbdom/modules/attrs').default]);varouter=elGetHtml(el);html=outer.open+html+outer.close;html=htmlToVnodes(html);el=snabbdom.toVNode(el);patch(el,html[0]);}// How to use:patchElHtml(your_element,your_html_string);varmmPerInch=25.4;varpointsPerInch=72;varpointsPerMm=pointsPerInch/mmPerInch;varmmPerPoints=mmPerInch/pointsPerInch;varpageWidth=210;// A4 papervarpageHeight=297;functionrenderNode(doc,node,lineX,lineY){varspan=node.span;varfont=span.fontFamily.split('\t');doc.setFont(font[0]);doc.setFontStyle(font[1]||"normal");doc.setFontSize(span.fontSize);doc.text(node.text,node.x*mmPerPoints+lineX,lineY);}functionhtmlToParagraphs(html,rootStyle){varht=newStreamXMLParser.HTMLTypeset();vartb=newStreamXMLParser.TreeBuilder(ht.treeEvent);varxp=newStreamXMLParser.XMLParser({event: tb.parserEvent// ↓ provide your decode function ↓decodeString: htmlEntitiesDecode});Object.assign(ht.rootStyle,rootStyle);xp.end(html);returnht;}functionrenderHtmlColumnsToPdf(html,rootStyle)varht=newStreamXMLParser.HTMLTypeset();varrootStyle=ht.rootStyle;rootStyle.fontSize=8;rootStyle.lineLeading=10;rootStyle.paragraphLeading=6;vartb=newStreamXMLParser.TreeBuilder(ht.treeEvent);varxp=newStreamXMLParser.XMLParser({event: tb.parserEvent// ↓ provide your decode function ↓decodeString: htmlEntitiesDecode});xp.end(this.sumarioExecutivo);ht=ht.getResult();varmeasures=Leerraum.jsPdfDocMeasures(doc);varcolNum=3;varcolGap=2;varcolTop=10;varcolLeft=10;varcolWidth=62;varcolHeight=pageHeight-(colTop*2);varfirstPageOffset=12;varlineHeight=rootStyle.lineLeading*mmPerPoints;varparMargin=rootStyle.paragraphLeading*mmPerPoints;varparsLines=Leerraum.paragraphsToTextNodes(measures,ht.result,function(){returncolWidth*pointsPerMm;});vargetPageHeight=function(page){// page number starting from zero on the first page,// content has less space because of space reserved// for a title on the page.// This function can return a custom height for each page.returnpage ? colHeight : colHeight-firstPageOffset;};vargetPageTop=function(page){returncolTop+(page ? 0 : firstPageOffset);};varpagesCols=Leerraum.columns.paragraphsToPageColumns(parsLines,getPageHeight,colNum,lineHeight,parMargin);varpageCols;varpageIndex=0;while(pageCols=pagesCols.shift()){varcolPars=null;varx=colLeft;vary=getPageTop(pageIndex);while(colPars=pageCols.shift()){varparLines;while(parLines=colPars.shift()){varlineWords;while(lineWords=parLines.shift()){varword;while(word=lineWords.shift()){renderNode(doc,word,x,y+1);}y+=lineHeight;}y+=parMargin;}x+=colWidth+colGap;y=getPageTop(pageIndex);}if(pagesCols.length){doc.addPage('a4','p');this.createPDFBackground(doc,cs);pageIndex++;}}}MIT.