diff --git a/html2pdf4doc/html2pdf4doc.py b/html2pdf4doc/html2pdf4doc.py
index 1b6f8b2..491028e 100644
--- a/html2pdf4doc/html2pdf4doc.py
+++ b/html2pdf4doc/html2pdf4doc.py
@@ -19,7 +19,7 @@
from selenium.webdriver.chrome.service import Service
from webdriver_manager.core.os_manager import ChromeType, OperationSystemManager
-__version__ = "0.0.20"
+__version__ = "0.0.21"
PATH_TO_HTML2PDF4DOC_JS = os.path.join(
os.path.dirname(os.path.join(__file__)),
diff --git a/html2pdf4doc/html2pdf4doc_js/html2pdf4doc.min.js b/html2pdf4doc/html2pdf4doc_js/html2pdf4doc.min.js
index 1d6435c..4cf2f30 100644
--- a/html2pdf4doc/html2pdf4doc_js/html2pdf4doc.min.js
+++ b/html2pdf4doc/html2pdf4doc_js/html2pdf4doc.min.js
@@ -1,2 +1,2 @@
/*! Version: 0.2.3 */
-var HTML2PDF4DOC;(()=>{"use strict";var e={d:(t,n)=>{for(var o in n)e.o(n,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:n[o]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{init:()=>mt});var n={};e.r(n),e.d(n,{isAfterContentFlowStart:()=>F,isComplexTextBlock:()=>C,isContentFlowEnd:()=>v,isContentFlowStart:()=>y,isForcedPageBreak:()=>H,isFullySPlitted:()=>V,isGrid:()=>I,isGridAutoFlowRow:()=>j,isIMG:()=>D,isInline:()=>A,isInlineBlock:()=>$,isLiNode:()=>N,isNeutral:()=>k,isNoBreak:()=>x,isNoHanging:()=>L,isOBJECT:()=>E,isPRE:()=>G,isPageStartElement:()=>B,isSTYLE:()=>O,isSVG:()=>P,isSelectorMatching:()=>b,isSignificantTextNode:()=>M,isSlough:()=>z,isTableLikeNode:()=>R,isTableNode:()=>W,isWrappedTextGroup:()=>T,isWrappedTextLine:()=>w,isWrappedTextNode:()=>S});var o={};e.r(o),e.d(o,{isFirstChildOfFirstChild:()=>U,isLastChildOfLastChild:()=>Y,isLineChanged:()=>q,isLineKept:()=>K});var s={};e.r(s),e.d(s,{getBottom:()=>X,getBottomWithMargin:()=>Q,getEmptyNodeHeight:()=>ne,getHeightWithMargin:()=>Z,getLineHeight:()=>oe,getMaxWidth:()=>te,getTableEntries:()=>ie,getTableRowHeight:()=>se,getTop:()=>J,getTopWithMargin:()=>ee});var i={};e.r(i),e.d(i,{create:()=>re,createComplexTextBlock:()=>pe,createForcedPageBreak:()=>fe,createNeutral:()=>ae,createNeutralBlock:()=>le,createPrintPageBreak:()=>_e,createSignpost:()=>be,createTable:()=>Me,createTestNodeFrom:()=>ue,createTextGroup:()=>ge,createTextLine:()=>de,createTextNodeWrapper:()=>he,createWithFlagNoBreak:()=>ce,createWord:()=>me});var r={};e.r(r),e.d(r,{prepareSplittedNode:()=>Oe,splitByWordsGreedyWithSpacesFilter:()=>Ee,splitTextByLinesGreedy:()=>De,splitTextByWordsGreedy:()=>Pe});var a={};e.r(a),e.d(a,{markPageStartElement:()=>we,markPartNodesWithClass:()=>Be,markProcessed:()=>Ne,setFlagNoBreak:()=>ke,setFlagNoHanging:()=>Se,unmarkPageStartElement:()=>Te});var l={};e.r(l);var h={};e.r(h),e.d(h,{copyNodeWidth:()=>Fe,fitElementWithinBoundaries:()=>ye,lockTableWidths:()=>ve});var d={};e.r(d),e.d(d,{findAllForcedPageBreakInside:()=>Le,findBetterForcedPageStarter:()=>Ce,findBetterPageStart:()=>xe,findFirstChildParent:()=>$e,findFirstChildParentFromPage:()=>He,findLastChildParent:()=>Ie,findPreviousNonHangingsFromPage:()=>Ae,findSuitableNonHangingPageStart:()=>Re});var g={};e.r(g),e.d(g,{getPreparedChildren:()=>We,getProcessedChildren:()=>Ge});const c={init:"[html2pdf]",pageDivider:"html2pdf-page",pageStartMarker:"[html2pdf-page-start]",contentFlowStart:"html2pdf-content-flow-start",contentFlowEnd:"html2pdf-content-flow-end",style:"[html2pdf-style]",footerTemplate:"[html2pdf-footer]",headerTemplate:"[html2pdf-header]",frontpageTemplate:"[html2pdf-frontpage]",frontpageContent:"html2pdf-frontpage",headerContent:"html2pdf-header",footerContent:"html2pdf-footer",pageNumberRoot:"[html2pdf-page-number]",pageNumberCurrent:"[html2pdf-page-number-current]",pageNumberTotal:"[html2pdf-page-number-total]",root:"html2pdf-root",paperFlow:"html2pdf-paper-flow",contentFlow:"html2pdf-content-flow",virtualPaper:"html2pdf-virtual-paper",virtualPaperTopMargin:"html2pdf-virtual-paper-margin-top",virtualPaperBottomMargin:"html2pdf-virtual-paper-margin-bottom",virtualPaperGap:"html2pdf-virtual-paper-gap",paperBody:"html2pdf-paper-body",paperHeader:"html2pdf-paper-header",paperFooter:"html2pdf-paper-footer",runningSafety:"html2pdf-print-running",printPageBreak:"html2pdf-print-page-break",printIgnore:"[html2pdf-print-ignore]",printHide:"[html2pdf-print-hide]",neutral:"html2pdf-neutral",word:"html2pdf-word",textNode:"html2pdf-text-node",textLine:"html2pdf-text-line",textGroup:"html2pdf-text-group",complexTextBlock:"html2pdf-complex-text-block",printForcedPageBreak:"html2pdf-print-forced-page-break",split:"[html2pdf-split]",processed:"[html2pdf-processed]",flagNoBreak:"[html2pdf-flag-no-break]",flagNoHanging:"[html2pdf-flag-no-hanging]",topCutPart:".html2pdf-top-cut",bottomCutPart:".html2pdf-bottom-cut",tocPageNumber:"html2pdf-toc-page-number"};function _(e){let t={debugMode:!1,consoleAssert:!1,preloader:!1,preloaderTarget:"",preloaderBackground:"",mask:!0,noHangingSelectors:"",forcedPageBreakSelectors:"",pageBreakBeforeSelectors:"",pageBreakAfterSelectors:"",noBreakSelectors:"",tocPageNumberSelector:"html2pdf-toc-page-number",printLeftMargin:"21mm",printRightMargin:"21mm",printTopMargin:"12mm",printBottomMargin:"12mm",printFontSize:"12pt",printWidth:"210mm",printHeight:"297mm",headerMargin:"16px",footerMargin:"16px",virtualPagesGap:"16px",splitLabelHeight:"24px"};const n={printWidth:"210mm",printHeight:"297mm"},o={printWidth:"148.5mm",printHeight:"210mm"};switch((e=function(e){const t={...e};for(const e in t){const n=t[e];if("string"==typeof n){const o=n.toLowerCase();"true"===o||"1"===o?t[e]=!0:"false"!==o&&"0"!==o&&""!==o||(t[e]=!1)}}return t}(e)).printPaperSize){case"A5":case"a5":t={...t,...o};break;default:t={...t,...n}}t={...t,initialRoot:c.init,tocPageNumberSelector:c.tocPageNumber,...e},console.info("[HTML2PDF4DOC] Config:",t);const s={printLeftMargin:t.printLeftMargin,printRightMargin:t.printRightMargin,printTopMargin:t.printTopMargin,printBottomMargin:t.printBottomMargin,printFontSize:t.printFontSize,printWidth:t.printWidth,printHeight:t.printHeight,headerMargin:t.headerMargin,footerMargin:t.footerMargin,virtualPagesGap:t.virtualPagesGap},i=document.createElement("div");return i.style="\n position:absolute;\n z-index:1000;\n left: 200%;\n ",document.body.append(i),Object.entries(s).forEach((([e,t])=>{i.style.width=t,s[e]=`${Math.trunc(i.getBoundingClientRect().width)}px`})),i.remove(),t={...t,...s},t.noHangingSelectors=t.noHangingSelectors+" H1 H2 H3 H4 H5 H6",t.forcedPageBreakSelectors=t.forcedPageBreakSelectors+" "+c.printForcedPageBreak,t.debugMode&&console.info("Config with converted units:",t),t}const p={DOM:{_:!1},layout:{_:!0},pages:{_:!0,_parseNode:!1,_parseNodes:!1,_registerPageStart:!1},paper:{_:!1},preview:{_:!1},toc:{_:!1},node:{_:!1},paragraph:{_:!1},grid:{_:!1},pre:{_:!1},table:{_:!1},tableLike:{_:!1}};class u{constructor({DOM:e,config:t}){this.document=e,this.body=e.body,this._debug=t.debugMode?{...t.debugConfig.DOM}:{},this._assert=!!t.consoleAssert}createElement(e){return this.document.createElement(e)}createDocumentFragment(){return this.document.createDocumentFragment()}cloneNode(e){return e?.cloneNode(!0)}cloneNodeWrapper(e){return e?.cloneNode(!1)}insertBefore(e,...t){const n=t.filter((e=>null!=e));e.before(...n)}insertAfter(e,...t){const n=t.filter((e=>null!=e));e.after(...n)}insertAtEnd(e,...t){const n=t.filter((e=>null!=e));e.append(...n)}insertAtStart(e,...t){const n=t.filter((e=>null!=e));e.prepend(...n)}insertInsteadOf(e,...t){this.insertBefore(e,...t),e.remove()}wrap(e,t){return e.before(t),t.append(e),t}moveContent(e,t){for(;e.firstChild;)t.append(e.firstChild);this._assert&&console.assert(""===this.getInnerHTML(e))}replaceNodeContentsWith(e,...t){this.setInnerHTML(e,""),this.insertAtEnd(e,...t)}removeNode(e){e.remove()}getAll(e,t=this.document){return this._assert&&console.assert(e),"string"==typeof e&&(e=e.split(",").filter(Boolean)),this._assert&&console.assert(Array.isArray(e),"Selectors must be provided as an array or string (one selector or multiple selectors, separated by commas). Now the selectors are:",e),this._assert&&console.assert(e.length>0,"getAll(selectors), selectors:",e),1===e.length?[...this.getAllElements(e[0],t)]:[...e].flatMap((e=>[...this.getAllElements(e,t)]))}getElement(e,t=this.document){return this._assert&&console.assert(e),t.querySelector(e)}getAllElements(e,t=this.document){return this._assert&&console.assert(e),t.querySelectorAll(e)}getElementById(e,t=this.document){return t.getElementById(e)}getRightNeighbor(e){return e.nextElementSibling}getLeftNeighbor(e){return e.previousElementSibling}getParentNode(e){return e.parentElement}getNodeValue(e){return e.nodeValue}getLastElementChild(e){return e.lastElementChild}getFirstElementChild(e){return e.firstElementChild}getChildNodes(e){return e.childNodes}getChildren(e){return e.children}getElementOffsetParent(e){return e.offsetParent}getComputedStyle(e){return window.getComputedStyle(e)}getElementBCR(e){return e.getBoundingClientRect()}getElementOffsetLeft(e){return e?.offsetLeft}getElementOffsetHeight(e){return e?.offsetHeight}getElementOffsetWidth(e){return e?.offsetWidth}getElementOffsetTop(e){return e?.offsetTop}getElementOffsetBottom(e){return e?.offsetTop+e?.offsetHeight||void 0}getElementTagName(e){return e.tagName}getDataId(e){return e.dataset.id}getAttribute(e,t){if(!e||!t)return void(this._debug._&&console.warn("getAttribute() must have 2 params"));const n=t.charAt(0);if("."!==n&&"#"!==n||this._debug._&&console.log(`you're really sure ${t} is attribute selector?`),"["===n){this._assert&&console.assert("]"===t.at(-1),`the ${t} selector is not OK.`);const n=t.substring(1,t.length-1);return e.getAttribute(n)}e.getAttribute(t)}setAttribute(e,t,n){if(!e||!t)return void(this._debug._&&console.warn("setAttribute() must have 2 params"));const o=t.charAt(0);if("."!==o)if("#"!==o)if("["!==o)this._debug._&&console.log(`you're really sure ${t} is a selector?`);else{this._assert&&console.assert("]"===t.at(-1),`the ${t} selector is not OK.`);const o=t.substring(1,t.length-1);e.setAttribute(o,n||"")}else{const n=t.substring(1);e.id=n}else{const n=t.substring(1);e.classList.add(n)}}setStyles(e,t){Object.entries(t).forEach((([t,n])=>e.style[t]=n))}addClasses(e,...t){e.classList.add(...t)}removeAttribute(e,t){if(!e||!t)return void(this._debug._&&console.warn("removeAttribute() must have 2 params"));const n=t.charAt(0);if(this._assert&&console.assert(n.match(/[a-zA-Z#\[\.]/),`removeAttribute() expects a valid selector, but received ${t}`),"."!==n)if("#"!==n)if("["!==n)e.removeAttribute(attr);else{this._assert&&console.assert("]"===t.at(-1),`the ${t} selector is not OK.`);const n=t.substring(1,t.length-1);e.removeAttribute(n)}else{const n=t.substring(1);e.removeAttribute(n)}else{const n=t.substring(1);e.classList.remove(n)}}removeAllAttributes(e){for(;e.attributes.length>0;)e.removeAttribute(e.attributes[0].name)}removeClasses(e,...t){e.classList.remove(...t)}removeAllClasses(e){e.classList=""}removeAllStyles(e){e.style=""}getInnerHTML(e){if("string"==typeof e){const t=this.document.querySelector(e);return t?t.innerHTML:void 0}return e.innerHTML}setInnerHTML(e,t){if("string"==typeof e){const n=this.document.querySelector(e);n&&(n.innerHTML=t)}e.innerHTML=t}isDocumentBody(e){return"BODY"===e.tagName}isTextNode(e){return e.nodeType===Node.TEXT_NODE}isElementNode(e){return e.nodeType===Node.ELEMENT_NODE}hasClass(e,t){return e.classList.contains(t)}hasID(e,t){return e.id===t}hasAttribute(e,t){return e.hasAttribute(t)}}class m{constructor(e){this.config=e,this.charWidth="10px"}create(){return this._baseStyle()+this._testStyle()}_baseStyle(){return`\n\n@page {\n size: A4;\n /* 2 values: width then height */\n size: ${this.config.printWidth} ${this.config.printHeight};\n\n margin-left: ${this.config.printLeftMargin};\n margin-right: ${this.config.printRightMargin};\n margin-top: ${this.config.printTopMargin};\n margin-bottom: 0; /* hack */\n}\n\n${c.root} {\n /* reset user styles */\n display: block;\n\n /* for proper printable flow positioning */\n position: relative;\n\n /* to compensate for possible BG in the parent node */\n z-index: 1;\n\n /* set print styles: affects previews */\n margin: 0 auto;\n width: calc(${this.config.printWidth} - ${this.config.printLeftMargin} - ${this.config.printRightMargin});\n font-size: ${this.config.printFontSize};\n\n /* protection against unpredictability of margins */\n padding-top: .1px;\n padding-bottom: calc(2 * ${this.config.virtualPagesGap});\n}\n\n${c.contentFlowStart},\n${c.contentFlowEnd},\n${c.pageDivider} {\n display: block;\n /* to avoid the effect of margins of neighboring elements on the positioning of this marker: */\n overflow: auto;\n}\n\n${c.virtualPaper} {\n display: grid;\n grid-template-columns: 1fr;\n grid-template-rows: minmax(min-content, max-content) minmax(min-content, max-content) 1fr minmax(min-content, max-content) minmax(min-content, max-content);\n place-items: stretch stretch;\n place-content: stretch stretch;\n width: calc(${this.config.printWidth} - ${this.config.printLeftMargin} - ${this.config.printRightMargin});\n height: ${this.config.printHeight};\n font-size: ${this.config.printFontSize};\n}\n\n${c.virtualPaper}::before {\n position: absolute;\n content: '';\n width: ${this.config.printWidth};\n height: ${this.config.printHeight};\n left: -${this.config.printLeftMargin};\n background-color: #fff;\n box-shadow: rgba(0, 0, 0, 0.1) 2px 2px 12px 0px;\n z-index: -1;\n}\n\n${c.paperFooter},\n${c.paperHeader} {\n display: block;\n position: relative;\n}\n\n${c.headerContent},\n${c.footerContent} {\n display: block;\n font-size: small;\n}\n\n${c.headerContent} p,\n${c.footerContent} p {\n margin: 0;\n}\n\n${c.headerContent} {\n padding-bottom: ${this.config.headerMargin};\n /* padding-top: 1px; */\n /* Page numbers: */\n padding-top: 10px;\n}\n\n${c.footerContent} {\n padding-top: ${this.config.footerMargin};\n /* padding-bottom: 1px; */\n /* Page numbers: */\n min-height: 32px;\n}\n\n${c.tocPageNumber} {\n min-width: 3ch;\n display: flex;\n justify-content: flex-end;\n align-items: baseline;\n}\n\n${c.pageNumberRoot} {\n display: flex;\n column-gap: 2px;\n position: absolute;\n /* left: 100%; */\n right: 0;\n text-align: right;\n line-height: 1;\n}\n\n${c.headerContent} ${c.pageNumberRoot} {\n top: 0;\n}\n\n${c.footerContent} ${c.pageNumberRoot} {\n bottom: 0;\n}\n\n${c.paperFlow} {\n display: block;\n position: absolute;\n width: 100%;\n z-index: -1;\n /* affect only screen */\n padding-bottom: 100px;\n}\n\n${c.contentFlow} {\n display: block;\n}\n\n${c.runningSafety} {\n display: block;\n overflow: auto;\n}\n\n${c.virtualPaperTopMargin} {\n display: block;\n height: ${this.config.printTopMargin};\n}\n\n${c.virtualPaperBottomMargin} {\n display: block;\n height: ${this.config.printBottomMargin};\n}\n\n${c.virtualPaperGap} {\n display: block;\n padding-top: ${this.config.virtualPagesGap};\n}\n\n${c.paperBody} {\n display: block;\n}\n\n${c.frontpageContent} {\n display: block;\n transform-origin: top center;\n padding: .1px;\n height: 100%;\n}\n\n.null {\n display: inline;\n padding: 0;\n margin: 0;\n font: 0;\n color: transparent;\n line-height: 0;\n border: none;\n outline: none;\n background: none;\n background-color: transparent;\n}\n\n${c.word},\n${c.textNode},\n${c.textLine},\n${c.textGroup},\n${c.neutral},\n${c.neutral} span {\n display: inline;\n padding: 0;\n margin: 0;\n font: inherit;\n color: inherit;\n line-height: inherit;\n background: none;\n background-color: transparent;\n}\n\n${c.textGroup} {\n display: block;\n}\n\n/*${c.split} ${c.textGroup} {\n display: inline;\n}*/\n\n${c.complexTextBlock} > ${c.textLine} {\n /* Firefox and inconsistent values of offset top for inline element */\n display: inline-block;\n // TODO: it removes spaces between parts of the string, it should leave the text inline after processing.\n}\n\n${c.textGroup} ${c.textLine} {\n display: inline;\n}\n\n${c.complexTextBlock} {\n display: block;\n}\n\n${c.complexTextBlock} ${c.complexTextBlock} {\n display: inline;\n}\n\n${c.printPageBreak} {\n display: block;\n}\n\n${c.printForcedPageBreak} {\n display: block;\n visibility: hidden;\n height: 0;\n overflow: hidden;\n}\n\n@media print {\n ${c.root} {\n /* to prevent a blank last page */\n padding: 0;\n }\n\n ${c.paperFlow} {\n padding-bottom: 0;\n }\n\n ${c.contentFlow} {\n -webkit-mask-image: none !important;\n mask-image: none !important;\n }\n\n ${c.printIgnore} {\n display: contents;\n }\n\n ${c.printHide},\n ${c.virtualPaper}::before,\n ${c.virtualPaperTopMargin},\n ${c.virtualPaperBottomMargin},\n ${c.virtualPaperGap} {\n display: none;\n }\n\n ${c.virtualPaper} {\n break-inside: avoid;\n height: auto;\n }\n\n ${c.paperBody} {\n break-inside: avoid;\n }\n\n ${c.printPageBreak} {\n break-after: page;\n /* padding: .1px; */\n overflow: auto;\n }\n\n ${c.printForcedPageBreak} {\n /* JUST MANUAL! */\n /* break-after: page; */\n }\n\n ${c.flagNoBreak} {\n /*\n TODO: temporary commented!\n When splitting blocks, printPageBreak falls INTO this element,\n and in Firefox it causes a blank page.\n FIX the split of complex blocks and check in Firefox.\n */\n /* break-inside: avoid-page; */\n }\n}\n\n/* arrangement */\n${c.topCutPart} {\n margin-top: 0 !important;\n border-top: none !important;\n}\n${c.bottomCutPart} {\n margin-bottom: 0 !important;\n border-bottom: none !important;\n}\n `}_testStyle(){return this.config.debugMode?`\n/* FOR TEST */\n${c.contentFlow} {\n background:repeating-linear-gradient(\n -45deg,\n rgba(222, 222, 222, .1),\n rgba(222, 222, 222, .1) 10px,\n rgba(222, 222, 222, .2) 10px,\n rgba(222, 222, 222, .2) 20px\n );\n}\n\n${c.virtualPaperGap} {\n background: #ff000020;\n}\n\n${c.paperFooter},\n${c.paperHeader} {\n background: #fa96ff20;\n}\n${c.paperBody} {\n background: #ffee0020;\n}\n${c.runningSafety} {\n background: #f200ff;\n outline: 0.1px solid #f200ff88;\n}\n${c.frontpageContent} {\n background: #00fcff20;\n}\n\n${c.neutral} {\n background: #00ffee10;\n}\n\n${c.textNode} {\n background: #00ff0010;\n}\n\n${c.textGroup},\n${c.textLine} {\n background: #0000ff08;\n}\n\n `:""}}class f{constructor({config:e,DOM:t,node:n,selector:o}){this.success=!1,this.root,this.paperFlow,this.contentFlow,this.frontpageTemplate,this.headerTemplate,this.footerTemplate,this._initialRoot,this._contentRoot,this._config=e,this._debug=e.debugMode?{...e.debugConfig.layout}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._selector=o,this._node=n,this._customInitialRootSelector=e.initialRoot,this._defaultInitialRootSelector=o.init}create(){if(this._getTemplates(),this._insertStyle(),this._DOM.getElement(`style${this._selector.style}`)){if(this._createLayout(),this._DOM.getParentNode(this.root)!==this._initialRoot||this._DOM.getElementOffsetParent(this.paperFlow)!==this.root||this._DOM.getElementOffsetParent(this.contentFlow)!==this.root)return this._assert&&console.assert(this._DOM.getParentNode(this.root)===this._initialRoot,"Failed to insert the layout root into the DOM."),this._assert&&console.assert(this._DOM.getElementOffsetParent(this.paperFlow)===this.root,"Failed to insert the paperFlow element into the DOM."),void(this._assert&&console.assert(this._DOM.getElementOffsetParent(this.contentFlow)===this.root,"Failed to insert the contentFlow element into the DOM."));this.success=!0}else console.error("Failed to add print styles into the DOM.")}_getTemplates(){this._assert&&console.assert(this._selector.frontpageTemplate,"frontpageTemplate selector is missing"),this._assert&&console.assert(this._selector.headerTemplate,"headerTemplate selector is missing"),this._assert&&console.assert(this._selector.footerTemplate,"footerTemplate selector is missing"),this.frontpageTemplate=this._DOM.getInnerHTML(this._selector.frontpageTemplate),this.headerTemplate=this._DOM.getInnerHTML(this._selector.headerTemplate),this.footerTemplate=this._DOM.getInnerHTML(this._selector.footerTemplate)}_insertStyle(){const e=this._DOM.getElement("head"),t=this._DOM.body;if(!e&&!t)return void console.error("Check the structure of your document. We didn`t find HEAD and BODY tags. HTML2PDF4DOC expects valid HTML.");const n=this._node.create("style",new m(this._config).create());n?(this._DOM.setAttribute(n,this._selector.style,""),e?this._DOM.insertAtEnd(e,n):t?this._DOM.insertBefore(t,n):this._assert&&console.assert(!1,"We expected to find the HEAD and BODY tags.")):console.error("Failed to create print styles")}_createLayout(){this._getInitialRoot(),this._initialRoot?(this._debug._&&console.log("initial root:",this._initialRoot),this._createRoot(),this._createPaperFlow(),this._createContentFlow(),this._DOM.moveContent(this._initialRoot,this.contentFlow),this._DOM.insertAtEnd(this._initialRoot,this.root),this._DOM.insertAtEnd(this.root,this.paperFlow,this.contentFlow),this._insertContentFlowStartAndEnd(this.contentFlow),this._ignoreUnprintableEnvironment(this.root)):console.error("Failed to initialize the root element.")}_insertContentFlowStartAndEnd(e){const t=this._node.create(this._selector.contentFlowStart),n=this._node.create(this._selector.contentFlowEnd);return this._DOM.insertAtStart(e,t),this._DOM.insertAtEnd(e,n),{contentFlowStart:t,contentFlowEnd:n}}_getInitialRoot(){let e=this._customInitialRootSelector?this._DOM.getElement(this._customInitialRootSelector):this._DOM.getElement(this._defaultInitialRootSelector);if(!e){if(!this._DOM.body)return void console.error("We expected to find the BODY tag.");e=this._DOM.body,console.warn(`The printable area is currently unspecified and encompasses the entire contents of the BODY tag. To restrict the printed content to a specific area, include ${this._defaultInitialRootSelector} in the root element of the desired printing area.`)}return this._initialRoot=e,e}_createRoot(){const e=this._node.create(this._selector.root);return this.root=e,e}_createPaperFlow(){const e=this._node.create(this._selector.paperFlow);return this.paperFlow=e,e}_createContentFlow(){const e=this._node.create(this._selector.contentFlow);return this.contentFlow=e,e}_ignoreUnprintableEnvironment(e){if(e===this._DOM.body)return void(this._assert&&console.assert(!1,"misshapen root"));let t=this._DOM.getParentNode(e);this._DOM.setAttribute(t,this._selector.printIgnore),this._DOM.getChildNodes(t).forEach((t=>{if(t!==e&&this._DOM.isElementNode(t))this._DOM.setAttribute(t,this._selector.printHide);else{if(!this._node.isSignificantTextNode(t))return;{const e=this._node.createTextNodeWrapper();this._DOM.wrap(t,e),this._DOM.setAttribute(e,this._selector.printHide)}}})),this._DOM.isDocumentBody(t)||this._ignoreUnprintableEnvironment(t)}}function b(e,t){if(!e||!t)return void(this._debug._&&console.warn("isSelectorMatching() must have 2 params","\n element: ",e,"\n selector: ",t));const n=t.charAt(0);if("."===n){const n=t.substring(1);return this._DOM.hasClass(e,n)}if("#"===n){const n=t.substring(1);return this._DOM.hasID(e,n)}if("["===n){this._debug._&&console.assert("]"===t.at(-1),`the ${t} selector is not OK.`);const n=t.substring(1,t.length-1);return this._DOM.hasAttribute(e,n)}return this._DOM.getElementTagName(e)===t.toUpperCase()}function M(e){return!!this._DOM.isTextNode(e)&&this._DOM.getNodeValue(e).trim().length>0}function O(e){return"STYLE"===this._DOM.getElementTagName(e)}function D(e){return"IMG"===this._DOM.getElementTagName(e)}function P(e){return"svg"===this._DOM.getElementTagName(e)}function E(e){return"OBJECT"===this._DOM.getElementTagName(e)}function N(e){return"LI"===this._DOM.getElementTagName(e)}function k(e){return this.isSelectorMatching(e,this._selector.neutral)}function S(e){return this.isSelectorMatching(e,this._selector.textNode)}function w(e){return this.isSelectorMatching(e,this._selector.textLine)}function T(e){return this.isSelectorMatching(e,this._selector.textGroup)}function B(e){return this.isSelectorMatching(e,this._selector.pageStartMarker)}function y(e){return this.isSelectorMatching(e,this._selector.contentFlowStart)}function F(e){const t=this._DOM.getLeftNeighbor(e);return this.isSelectorMatching(t,this._selector.contentFlowStart)}function v(e){return this.isSelectorMatching(e,this._selector.contentFlowEnd)}function C(e){return this.isSelectorMatching(e,this._selector.complexTextBlock)}function x(e,t=this._DOM.getComputedStyle(e)){return this.isSelectorMatching(e,this._selector.flagNoBreak)||this.isWrappedTextLine(e)||this.isWrappedTextGroup(e)||this.isInlineBlock(t)||this.notSolved(e)}function L(e){return this.isSelectorMatching(e,this._selector.flagNoHanging)}function H(e){return this.isSelectorMatching(e,this._selector.printForcedPageBreak)}function A(e){const t=e.display;return"inline"===t||"inline-block"===t||"inline-table"===t||"inline-flex"===t||"inline-grid"===t}function $(e){const t=e.display;return"inline-block"===t||"inline-table"===t||"inline-flex"===t||"inline-grid"===t}function I(e){return"grid"===e.display}function R(e,t=this._DOM.getComputedStyle(e)){return"TABLE"!==this._DOM.getElementTagName(e)&&["table"].includes(t.display)}function W(e,t=this._DOM.getComputedStyle(e)){return"TABLE"===this._DOM.getElementTagName(e)||["table"].includes(t.display)}function G(e,t=this._DOM.getComputedStyle(e)){return["block"].includes(t.display)&&["pre","pre-wrap","pre-line","break-spaces","nowrap"].includes(t.whiteSpace)}function j(e){const t=e.display,n=e.gridAutoFlow;return("grid"===t||"inline-grid"===t)&&"row"===n}function V(e){const t=this._DOM.getComputedStyle(e);return this.isPRE(e,t)||this.isTableNode(e,t)||this.isTableLikeNode(e,t)||this.isGridAutoFlowRow(t)}function z(e){return this._DOM.hasAttribute(e,"slough-node")}function U(e,t){if(!e||!this._DOM.getParentNode(e))return!1;let n=e;for(;this._DOM.getParentNode(n)&&n!==t;){if(this._DOM.getFirstElementChild(this._DOM.getParentNode(n))!==n)return!1;n=this._DOM.getParentNode(n)}return n===t}function Y(e,t){if(!e||!this._DOM.getParentNode(e))return!1;let n=e;for(;this._DOM.getParentNode(n)&&n!==t;){if(this._DOM.getParentNode(n)===t){let e=this._DOM.getRightNeighbor(n);for(;!this._DOM.getElementOffsetHeight(e)&&!this._DOM.getElementOffsetWidth(e);)if(e=this._DOM.getRightNeighbor(e),this.isContentFlowEnd(e))return!0;return this.isContentFlowEnd(e)}if(this._DOM.getLastElementChild(this._DOM.getParentNode(n))!==n)return!1;n=this._DOM.getParentNode(n)}return n===t}function q(e,t){return this._DOM.getElementOffsetTop(t)-this._DOM.getElementOffsetBottom(e)>-2}function K(e,t,n){const o=this._DOM.getElementOffsetBottom(e),s=this._DOM.getElementOffsetTop(t),i=o-s,r=i>=2;return n&&console.group("isLineKept?"),n&&console.log("\n",r,"\n","\n currentBottom",o,[e],"\n nextTop",s,[t],"\n delta",i),n&&console.groupEnd("isLineKept?"),r}function J(e,t=null,n=0){if(!e)return void(this._debug._&&console.warn("element must be provided, but was received:",e,"\nThe function returned:",void 0));if(null===t)return this._DOM.getElementOffsetTop(e);if(!t)return void(this._debug._&&console.warn("root must be provided, but was received:",t,"\nThe function returned:",void 0));const o=this._DOM.getElementOffsetParent(e);if(!o)return void(this._debug._&&console.warn("Element has no offset parent.","\n element:",[e],"\n offsetParent:",o,"\n The function returned:",void 0));const s=this._DOM.getElementOffsetTop(e);return o===t?s+n:this.getTop(o,t,n+s)}function X(e,t=null){if(e){if(null===t)return this._DOM.getElementOffsetBottom(e);if(t)return this.getTop(e,t)+this._DOM.getElementOffsetHeight(e);this._debug._&&console.warn("root must be provided, but was received:",t,"\nThe function returned:",void 0)}else this._debug._&&console.warn("element must be provided, but was received:",e,"\nThe function returned:",void 0)}function Z(e){const t=parseInt(this._DOM.getComputedStyle(e).marginTop),n=parseInt(this._DOM.getComputedStyle(e).marginBottom);return this._DOM.getElementOffsetHeight(e)+t+n}function Q(e,t){if(!e)return;const n=this.getBottom(e,t);let o;const s=this.createNeutralBlock();this._DOM.insertAfter(e,s);const i=this.getTop(s,t);this._DOM.removeNode(s);if(i>=n)o=i;else{o=n+this._DOM.getComputedStyle(e).marginBottom}return o}function ee(e,t){const n=parseInt(this._DOM.getComputedStyle(e).marginTop);return this.getTop(e,t)-n}function te(e){const t=this.create();this._DOM.insertAtEnd(e,t);const n=this._DOM.getElementOffsetWidth(t);return this._DOM.removeNode(t),n}function ne(e,t=!0){const n=this.create();t&&this._DOM.setStyles(n,{padding:"0.1px"});const o=this._DOM.cloneNodeWrapper(e);"TABLE"===this._DOM.getElementTagName(e)&&this._DOM.setInnerHTML(o,"
|
"),this._DOM.insertAtEnd(n,o),this._DOM.insertBefore(e,n);const s=this._DOM.getElementOffsetHeight(n);return this._DOM.removeNode(n),s}function oe(e){const t=this.createNeutral();this._DOM.setInnerHTML(t,"!"),this._DOM.setStyles(t,{display:"block"}),this._DOM.insertAtEnd(e,t);const n=this._DOM.getElementOffsetHeight(t);return this._DOM.removeNode(t),n}function se(e,t=0){const n=this._DOM.getElementOffsetTop(e),o=this._DOM.cloneNode(e),s="!
".repeat(t);[...o.children].forEach((e=>this._DOM.setInnerHTML(e,s))),this._DOM.insertBefore(e,o);const i=this._DOM.getElementOffsetTop(e);return this._DOM.removeNode(o),i-n}function ie(e){const t=[...e.children].reduce(((e,t)=>{const n=t.tagName;return"TBODY"===n?{...e,rows:[...e.rows,...t.children]}:"CAPTION"===n?(this.setFlagNoBreak(t),{...e,caption:t}):"COLGROUP"===n?(this.setFlagNoBreak(t),{...e,colgroup:t}):"THEAD"===n?(this.setFlagNoBreak(t),{...e,thead:t}):"TFOOT"===n?(this.setFlagNoBreak(t),{...e,tfoot:t}):"TR"===n?{...e,rows:[...e.rows,...t]}:{...e,unexpected:[...e.unexpected,...t]}}),{caption:null,thead:null,tfoot:null,rows:[],unexpected:[]});return t.unexpected.length>0&&this._debug._&&console.warn(`something unexpected is found in the table ${e}`),t}function re(e,t){let n;if(e){const t=e.charAt(0);if(t.match(/[#\[\.]/))n=this._DOM.createElement("div"),this._DOM.setAttribute(n,e);else{if(!t.match(/[a-zA-Z]/))return void(this._assert&&console.assert(!1,"Expected valid html selector ot tag name, but received:",e));n=this._DOM.createElement(e)}}else n=this._DOM.createElement("div");return t&&this._DOM.setInnerHTML(n,t),n}function ae(){return this.create(this._selector.neutral)}function le(){const e=this.createNeutral();return e.style.display="block",e}function he(){return this.create(this._selector.textNode)}function de(){return this.create(this._selector.textLine)}function ge(){return this.create(this._selector.textGroup)}function ce(e){const t=this.create(this._selector.flagNoBreak);return e&&this._DOM.setStyles(t,e),t}function _e(){return this.create(this._selector.printPageBreak)}function pe(){return this.create(this._selector.complexTextBlock)}function ue(e){const t=this._DOM.cloneNodeWrapper(e);return this._DOM.setAttribute(t,".test-node"),this._DOM.setStyles(t,{position:"absolute",background:"rgb(255 239 177)",width:this.getMaxWidth(e)+"px"}),t}function me(e,t){const n=this.create(this._selector.word);return this._DOM.setInnerHTML(n,e),n.dataset.index=t,n}function fe(){return this.create(this._selector.printForcedPageBreak)}function be(e,t){if(!t)return null;const n=this.create();return this._DOM.setStyles(n,{display:"flex",flexWrap:"nowrap",alignItems:"center",justifyContent:"center",textAlign:"center",fontSize:"8px",fontFamily:"sans-serif",letterSpacing:"1px",textTransform:"uppercase",height:t+"px"}),e&&this._DOM.setInnerHTML(n,e),n}function Me({wrapper:e,caption:t,colgroup:n,thead:o,tfoot:s,tbody:i}){const r=e||this.create("table"),a=this.create("TBODY");return t&&this._DOM.insertAtEnd(r,t),n&&this._DOM.insertAtEnd(r,n),o&&this._DOM.insertAtEnd(r,o),i&&this._DOM.insertAtEnd(a,...i),this._DOM.insertAtEnd(r,a),s&&this._DOM.insertAtEnd(r,s),r}function Oe(e){const t=e,n=this.splitTextByWordsGreedy(e),o=n.map((e=>{const t=this._DOM.createElement("span");return this._DOM.setInnerHTML(t,e+" "),t})),s=this.createTestNodeFrom(e);return this._DOM.insertAtEnd(s,...o),this._DOM.insertAtEnd(e,s),{splittedNode:t,nodeWords:n,nodeWordItems:o}}function De(e){return e.split(/(?<=\n)/)}function Pe(e){return(this._DOM.getNodeValue(e)||this._DOM.getInnerHTML(e)).split(/(?<=\s|-)/)}function Ee(e){return(this._DOM.getNodeValue(e)||this._DOM.getInnerHTML(e)).trim().split(/(?<=\s|-)/).filter((e=>" "!=e))}function Ne(e,t){this._markupDebugMode&&this._DOM.setAttribute(e,this._selector.processed,"π·οΈ "+t)}function ke(e){this._DOM.setAttribute(e,this._selector.flagNoBreak)}function Se(e,t){this._DOM.setAttribute(e,this._selector.flagNoHanging,t)}function we(e,t){this._DOM.setAttribute(e,this._selector.pageStartMarker,t)}function Te(e){this._DOM.removeAttribute(e,this._selector.pageStartMarker)}function Be(e){e.forEach((e=>{this._DOM.setAttribute(e,this._selector.topCutPart),this._DOM.setAttribute(e,this._selector.bottomCutPart)})),this._DOM.removeAttribute(e.at(0),this._selector.topCutPart),this._DOM.removeAttribute(e.at(-1),this._selector.bottomCutPart)}function ye({element:e,height:t,width:n,vspace:o,hspace:s}){const i=o/t,r=s/n,a=ithis.copyNodeWidth(e,e)))}function Ce(e,t){let n=e;for(;;){const e=this.findFirstChildParent(n,t);if(e&&e!==n){n=e;continue}const o=this._DOM.getLeftNeighbor(n);if(!o||!this.isNoHanging(o))break;n=o}return n}function xe(e,t,n){this._debug._&&console.groupCollapsed("β findBetterPageStart");let o=!1,s=!1;const i=this.getTop(t,n);this._debug._&&console.log("Start calculations:",{pageStart:e,lastPageStart:t,topLimit:i});let r=this.findFirstChildParentFromPage(e,i,n)||e;this._debug._&&console.log("betterCandidate:",r);let a=r;for(;;){const e=this.findPreviousNonHangingsFromPage(a,i,n);if(void 0===e){this._debug._&&console.warn("π«₯ previousCandidate",e),o=!0;break}if(this._debug._&&console.log("β’ previousCandidate",{previousCandidate:e}),e){a=e;continue}this._debug._&&console.log("β’ update currentCandidate",{previousCandidate:e});const t=this.findFirstChildParentFromPage(a,i,n);if(void 0===t){this._debug._&&console.warn("π«₯ firstChildParent",t),o=!0;break}if(this._debug._&&console.log("β’ firstChildParent",{firstChildParent:t}),!t){this._debug._&&console.log("β’ update currentCandidate",{firstChildParent:t});break}a=t}(a==t||this.getTop(a,n)<=i)&&(s=!0,this._debug._&&console.log("βοΈ Top page limit has been reached",r));const l=this._DOM.getLeftNeighbor(a);l==t&&(s=!0,this._debug._&&console.log("π Left limit has been reached (left neighbor is the last page start)",l,r));let h=o||s?r:a;return this.isAfterContentFlowStart(h)&&(h=e),this._debug._&&console.log({interruptedWithUndefined:o,interruptedWithLimit:s,pageStart:e,betterCandidate:r,currentCandidate:a,result:h}),this._debug._&&console.log("β end, return:",h),this._debug._&&console.groupEnd(),h}function Le(e){return this._DOM.getAll(this._selector.printForcedPageBreak,e)}function He(e,t,n){this._debug._&&console.groupCollapsed("β¬ findFirstChildParentFromPage");let o=null,s=e,i=!1;for(;;){const e=this._DOM.getParentNode(s);if(!e)break;if(!(this._DOM.getFirstElementChild(e)===s)){this._debug._&&console.warn({"!isFirstChild":e});break}if(this.isPageStartElement(e)||this.getTop(e,n)t?o:null}function We(e){if(this.isComplexTextBlock(e))return[...this._DOM.getChildren(e)];{let t=[...this._DOM.getChildNodes(e)].reduce(((e,t)=>{if(this.isSTYLE(t))return e;if(this.isSignificantTextNode(t)){const n=this.createTextNodeWrapper();return this._DOM.wrap(t,n),e.push(n),this._debugMode&&console.info("πΈ (getPreparedChildren) wrap and return TEXT NODE",[t]),e}if(!this._DOM.getElementOffsetParent(t)){const n=this.getPreparedChildren(t);return n.length>0&&e.push(...n),e}return this._DOM.isElementNode(t)?(e.push(t),e):void 0}),[]);return je.call(this,t)&&(t=Ve.call(this,t)),t}}function Ge(e,t,n){const o=["%c_getProcessedChildren\n","color:white"];let s=[];if(this.isNoBreak(e))return this._debugMode&&console.info(...o,"π§‘ isNoBreak",e),[];if(this.isComplexTextBlock(e))return this._debugMode&&console.info(...o,"π ComplexTextBlock",e),this._paragraph.split(e)||[];if(this.isWrappedTextNode(e))return this._debugMode&&console.info(...o,"π TextNode",e),this._paragraph.split(e)||[];const i=this._DOM.getComputedStyle(e);return this.isTableLikeNode(e,i)?(this._debugMode&&console.info(...o,"π TABLE like",e),s=this._tableLike.split(e,t,n,i)||[]):this.isTableNode(e,i)?(this._debugMode&&console.info(...o,"π TABLE",e),s=this._table.split(e,t,n)||[]):this.isPRE(e,i)?(this._debugMode&&console.info(...o,"π PRE",e),s=this._pre.split(e,t,n)||[]):this.isGridAutoFlowRow(this._DOM.getComputedStyle(e))?(this._debugMode&&console.info(...o,"π GRID"),s=this._grid.split(e,t,n)||[]):(this._debugMode&&console.info(...o,"π some node",e),s=this.getPreparedChildren(e),this._debugMode&&console.info(...o,"πΈ get element children ",s)),s}function je(e){return e.some(((e,t,n)=>{const o=e,s=n[t+1];if(!s)return!1;return this._DOM.getElementOffsetBottom(o)>this._DOM.getElementOffsetTop(s)}))}function Ve(e){let t=null;const n=[];return e.forEach((e=>{this.isInline(this._DOM.getComputedStyle(e))?(t||(t=this.createComplexTextBlock(),this._DOM.wrap(e,t),n.push(t)),this._DOM.insertAtEnd(t,e)):(t=null,n.push(e))})),n}class ze{constructor({config:e,DOM:t,node:n,selector:o}){this._debug=e.debugMode?{...e.debugConfig.paragraph}:{},this._DOM=t,this._selector=o,this._node=n,this._minParagraphLeftLines=2,this._minParagraphDanglingLines=2,this._minParagraphBreakableLines=this._minParagraphLeftLines+this._minParagraphDanglingLines||2}split(e){return this._splitComplexTextBlockIntoLines(e)}_estimateLineCount(e){return Math.ceil(this._DOM.getElementOffsetHeight(e)/this._node.getLineHeight(e))}_splitComplexTextBlockIntoLines(e){if(this._debug._&&console.group("_splitComplexTextBlockIntoLines",[e]),this._estimateLineCount(e){const t=this._node.getLineHeight(e),n=this._DOM.getElementOffsetHeight(e),o=this._DOM.getElementOffsetLeft(e),s=this._DOM.getElementOffsetTop(e);return{element:e,lines:Math.ceil(n/t),left:o,top:s,height:n,lineHeight:t,text:this._DOM.getInnerHTML(e)}}));this._debug._&&console.log("\nπΈ nodeChildren",[...t],"\nπΈ extendedChildrenArray",[...n]);const o=n.flatMap((e=>e.lines>1&&!this._node.isNoBreak(e.element)?this._breakItIntoLines(e.element):e.element));this._debug._&&console.log("\nπΈπΈπΈ\n partiallyLinedChildren",[...o]);const s=o.reduce(((e,t,n,o)=>(e||(e=[]),"BR"===this._DOM.getElementTagName(t)?(e.at(-1).push(t),e.push([]),this._debug._&&console.log("br; push:",t),e):!e.length||this._node.isLineChanged(e.at(-1).at(-1),t)?(e.push([t]),this._debug._&&console.log("βΌοΈ start new line:",t),e):0===e.at(-1).length||e.length&&this._node.isLineKept(e.at(-1).at(-1),t)?(this._debug._&&console.log("β¬ add to line:",t),e.at(-1).push(t),e):void(this._debug._&&console.assert(!0,"groupedPartiallyLinedChildren: An unexpected case of splitting a complex paragraph into lines.","\nOn the element:",t)))),[]);if(this._debug._&&console.log("π‘π‘π‘ groupedPartiallyLinedChildren \n",s.length,[...s]),s.length{let n;if(0==e.length)n=e[0],n.setAttribute("role","π«"),console.assert(0==e.length,"The string cannot be empty (_splitComplexTextBlockIntoLines)");else if(1==e.length)n=e[0];else{n=this._node.createTextGroup(),this._DOM.insertBefore(e[0],n),this._DOM.insertAtEnd(n,...e)}return n.dataset.child=t,n}));return this._end("OK _splitComplexTextBlockIntoLines"),this._DOM.setAttribute(e,this._selector.split),a}_breakItIntoLines(e){if(this._debug._&&console.group("_breakItIntoLines",[e]),this._node.isNoBreak(e))return this._end("isNoBreak"),e;if(this._node.isWrappedTextNode(e)){const t=this._breakWrappedTextNodeIntoLines(e);return this._end("TextNode newLines"),t}return this._end("(recursive _breakItIntoLines)"),this._processNestedInlineElements(e)}_processNestedInlineElements(e){this._debug._&&console.group("_processNestedInlineElements",[e]);const t=this._getNestedInlineChildren(e).flatMap((e=>this._estimateLineCount(e)>1?this._breakItIntoLines(e):e)),n=this._findNewLineStarts(t),o=n.map(((o,s)=>{const i=t[o],r=t[n[s+1]];return this._cloneAndCleanOutsideRange(e,i,r)}));return this._DOM.insertInsteadOf(e,...o),this._end("Nested Inline parts"),o}_cloneAndCleanOutsideRange(e,t,n){t&&t.setAttribute("split","start"),n&&n.setAttribute("split","end");let o=e.cloneNode(!0);if(t){let t=o.querySelector('[split="start"]'),n=t.previousElementSibling;for(;n;){let e=n;n=n.previousElementSibling,e.remove()}let s=t.parentElement;for(;s&&s!==e;){let e=s.previousElementSibling;for(;e;){let t=e;e=e.previousElementSibling,t.remove()}s=s.parentElement}t.removeAttribute("split")}if(n){let t=o.querySelector('[split="end"]'),n=t.nextElementSibling;for(;n;){let e=n;n=n.nextElementSibling,e.remove()}let s=t.parentElement;for(;s&&s!==e;){let e=s.nextElementSibling;for(;e;){let t=e;e=e.nextElementSibling,t.remove()}s=s.parentElement}t.remove()}return t&&t.removeAttribute("split"),n&&n.removeAttribute("split"),o}_getNestedInlineChildren(e){return[...this._DOM.getChildNodes(e)].reduce(((e,t)=>{if(this._node.isSignificantTextNode(t)){const n=this._node.createTextNodeWrapper();return this._DOM.wrap(t,n),e.push(n),e}if(!this._DOM.getElementOffsetParent(t)){const n=this._node.getPreparedChildren(t);return n.length>0&&e.push(...n),e}if(this._DOM.isElementNode(t)){return this._getNestedInlineChildren(t).forEach((t=>e.push(t))),e}}),[])}_makeWordsFromTextNode(e){const t=this._node.splitTextByWordsGreedy(e);this._debug._&&console.log("wordArray",t);const n=t.map(((e,t)=>this._node.createWord(e+"",t)));return this._debug._&&console.log("wrappedWordArray",n),{wordArray:t,wrappedWordArray:n}}_breakWrappedTextNodeIntoLines(e){e.classList.add("π _breakItIntoLines");const{wordArray:t,wrappedWordArray:n}=this._makeWordsFromTextNode(e);this._DOM.setInnerHTML(e,""),this._DOM.insertAtEnd(e,...n);const o=this._findNewLineStarts(n),s=o.reduce(((n,s,i)=>{const r=this._node.createTextLine(),a=o[i],l=o[i+1],h=t.slice(a,l).join("")+"";return this._DOM.setInnerHTML(r,h),this._DOM.insertBefore(e,r),n.push(r),n}),[]);return e.remove(),s}_findNewLineStarts(e){return e.reduce(((t,n,o)=>(o>0&&e[o-1].offsetTop+e[o-1].offsetHeight<=n.offsetTop&&t.push(o),t)),[0])}_end(e){this._debug._&&console.log(`%c β² ${e} `,"background:#eee;color:#888;padding: 0 1px 0 0;"),this._debug._&&console.groupEnd()}}class Ue{constructor({config:e,DOM:t,node:n,selector:o}){this._debug=e.debugMode?{...e.debugConfig.table}:{},this._DOM=t,this._selector=o,this._node=n,this._minLeftRows=1,this._minDanglingRows=1,this._minBreakableRows=1,this._minBreakableLines=4,this._signpostHeight=24,this._isFirefox="undefined"!=typeof InstallTrigger}split(e,t,n){return this._splitTableNode(e,t,n)}_splitTableNode(e,t,n){this._debug._&&console.group("%c_splitTableNode","background:cyan",[e]),this._lockWidths(e);const o=this._node.getEmptyNodeHeight(e," |
"),s=this._getEntries(e);this._debug._&&console.log("tableEntries",s);const i=this._node.getTopWithMargin(e,this._root),r=this._DOM.getElementOffsetHeight(s.caption)||0,a=this._DOM.getElementOffsetHeight(s.thead)||0,l=this._DOM.getElementOffsetHeight(s.tfoot)||0,h=(r??0)*(this._isFirefox??0),d=t-i-o-this._signpostHeight,g=n-r-a-l-o-2*this._signpostHeight;this._debug._&&console.log("\n β’ tableFirstPartBottom",d,"\n","\n pageBottom",t,"\n - tableTop(WithTopMargin)",i,"\n - tableCaptionHeight",r,"\n - tableTheadHeight",a,"\n - tableWrapperHeight",o,"\n - this._signpostHeight",this._signpostHeight,"\n","\n fullPageHeight",n,"\n - tableCaptionHeight",r,"\n - tableTheadHeight",a,"\n - tableTfootHeight",l,"\n - 2 * this._signpostHeight",2*this._signpostHeight,"\n - tableWrapperHeight",o,"\n = tableFullPartContentHeight",g);const c=e=>[...e.rows,...e.tfoot?[e.tfoot]:[]];let _=c(s);this._debug._&&console.log("distributedRows",_);let p=[],u=d;this._debug._&&console.log(this._node.getTop(_[1],e)-this._node.getBottom(_[0],e),"(row[1].top - row[0].bottom)"),this._node.getTop(_[0],e)>u&&(u=g,this._debug._&&console.log("The Row 0 goes to the 2nd page"));for(let n=0;n<_.length;n++){this._debug._&&console.log(`%c πͺ Check the Row # ${n}`,"color:blueviolet",[_[n]]);const o=_[n],i=this._node.getBottom(o,e)+h,r=this._node.getTop(o,e)+h,a=_[n+1];if((a?this._node.getTop(a,e)+h:i)>u){const i=n,a=o,l=this._DOM.getElementOffsetHeight(a),d=this._node.getTableRowHeight(a,this._minBreakableLines),m=this._node.getTableRowHeight(a),f=r,b=this._node.isNoBreak(a),M=l>=d&&!b;if(this._debug._&&console.log(`%c β’ Row # ${n}: try to split`,"color:blueviolet",a),M){this._debug._&&console.groupCollapsed(`Split The ROW.${i}`);const e=u-f-m,o=g-m,r=this._DOM.getChildren(a);let l;l=[...r].map(((n,s)=>{const r=this._node.getPreparedChildren(n);this._debug._&&console.groupCollapsed(`Split TD.${s} in ROW.${i}`);const a=this._getInternalBlockSplitters({rootNode:n,children:r,pageBottom:t,firstPartHeight:e,fullPageHeight:o});return this._debug._&&console.groupEnd(`Split TD.${s} in ROW.${i}`),a})),this._debug._&&console.log("π£ \ntheRowContentSlicesByTD",l);const h=l.some((e=>(this._debug._&&console.log("π£","\nobj.result.length",e.result.length,"\nobj.result[0]",e.result[0]),e.result.length&&null===e.result[0])));this._debug._&&console.log("π£","\nshouldFirstPartBeSkipped",h),h&&(l=[...r].map((e=>{const n=this._node.getPreparedChildren(e);return this._getInternalBlockSplitters({rootNode:e,children:n,pageBottom:t,firstPartHeight:o,fullPageHeight:o})}))),this._debug._&&console.log("π£","\n theRowContentSlicesByTD",l);const d=l.some((e=>e.result.length));if(this._debug._&&console.log("π£ ifThereIsSplit",d),d){const e=l.map((e=>{if(e.result.length)return this._createSlicesBySplitFlag(e.trail);{const t=this._node.createWithFlagNoBreak();t.classList.add("π£"),this._DOM.setStyles(t,{display:"contents"});const n=e.trail.map((e=>e.element));return this._DOM.insertAtEnd(t,...n),[t]}}));this._debug._&&console.log("π£ theTdContentElements",e);const t=Math.max(...e.map((e=>e.length)));this._debug._&&console.log("π£ theNewTrCount",t);const o=[];for(let n=0;n{const i=this._DOM.cloneNodeWrapper(o);e[s][n]&&this._DOM.insertAtEnd(i,e[s][n]),this._DOM.insertAtEnd(t,i)})),o.push(t)}this._debug._&&console.log("π£","\n theNewRows",o),this._DOM.setAttribute(a,".π«_must_be_removed"),this._debug._&&console.log("π£ splittingRow",a),this._DOM.insertInsteadOf(a,...o),s.rows.splice(i,1,...o),_=c(s),n-=1}this._end(`Split The ROW.${i} (...if makesSenseToSplitTheRow)`)}else b?this._debug._&&b&&console.log(`%c β’ Row # ${n}: noBreak`,"color:red",a):this._debug._&&console.log(`%c β’ Row # ${n}: small`,"color:blueviolet",a),n>=this._minLeftRows&&(p.push(n),this._debug._&&console.log(`%c β’ Row # ${n}: REGISTER as start, index >= ${this._minLeftRows} (_minLeftRows) `,"color:blueviolet",a)),u=this._node.getTop(_[n],e)+h+g}else this._debug._&&console.log(`%c β’ Row # ${n}: PASS ...`,"color:blueviolet")}if(this._debug._&&console.log("\n splitsIds",p,"\n distributedRows",[..._]),!p.length)return this._end("_splitTableNode !splitsIds.length"),[];const m=p.map(((t,n,o)=>this._insertTableSplit({startId:o[n-1]||0,endId:t,table:e,tableEntries:s})));this._debug._&&console.log("splits",m);const f=this._node.createWithFlagNoBreak();return e.before(f),this._DOM.insertAtEnd(f,this._node.createSignpost("(table continued)",this._signpostHeight),e),this._end("_splitTableNode"),[...m,f]}_createSlicesBySplitFlag(e){this._debug._&&console.group("_createSlicesBySplitFlag");const t=this._node.createWithFlagNoBreak();this._DOM.setStyles(t,{display:"contents"}),t.classList.add("π§°");const n=[t];let o=[t],s=t;const i=e=>{if(0===e.length)return null;const t=e[0];let n=t;for(let t=1;t{this._debug._&&console.group("processChildren"),this._debug._&&console.log("*start* children",e);for(let t=0;t{const t=e.children?.length>0,a=e.split,l=e.element,h=e.id;if(this._debug._&&console.group(`processObj # ${h}`),this._debug._&&console.log("currentElement",l),l&&this._DOM.removeNode(l),a){this._debug._&&console.log("β’β’β’ hasSplitFlag"),o=o.map((e=>{const t=this._DOM.cloneNodeWrapper(e);return t.classList.add("π©"),t})),this._debug._&&console.log("β’ hasSplitFlag: NEW wrappers.map:",[...o]);const e=i(o);n.push(e),this._debug._&&console.log("β’ hasSplitFlag: slices.push(nextWrapper):",[...n]),s=o.at(-1),this._debug._&&console.log("β’ hasSplitFlag: currentTargetInSlice:",s)}if(t){this._debug._&&console.log("β’β’β’ hasChildren");const t=this._DOM.cloneNodeWrapper(l);o.push(t),this._debug._&&console.log("β’ hasChildren: wrappers.push(cloneCurrentElementWrapper)",t,[...o]),this._debug._&&console.log("β’ hasChildren: currentTargetInSlice (check):",s),s?(this._debug._&&console.log("β’ hasChildren: currentTargetInSlice","TRUE, add to existing",t),this._DOM.insertAtEnd(s,t)):(this._debug._&&console.log("β’ hasChildren: currentTargetInSlice","FALSE, init the first",t),t.classList.add("πfirst"),this._DOM.setStyles(t,{background:"yellow"}),n.push(t),this._debug._&&console.log("β’ hasChildren: slices.push(cloneCurrentElementWrapper)",t,[...n])),s=o.at(-1),this._debug._&&console.log("β’ hasChildren: currentTargetInSlice (=):",s),r(e.children,l)}else s=o.at(-1),this._debug._&&console.log("insert currentElement",l,"to target",s),this._DOM.insertAtEnd(s,l);this._end(`processObj # ${h}`)};return this._debug._&&console.log("####### currentTargetInSlice (=):",s),r(e),this._debug._&&console.log("slices:",n),this._debug._&&n.forEach((e=>console.log("slice:",e))),this._end("_createSlicesBySplitFlag"),n}_getInternalBlockSplitters({rootNode:e,rootComputedStyle:t,children:n,pageBottom:o,firstPartHeight:s,fullPageHeight:i,result:r=[],trail:a=[],indexTracker:l=[],stack:h=[]}){const d=t||this._DOM.getComputedStyle(e),g=d.position;"relative"!=g&&this._DOM.setStyles(e,{position:"relative"}),this._debug._&&console.group("π _getInternalBlockSplitters");const c=e=>{e>=0?l.push(e):l.pop()},_=(e,t)=>{this._debug._&&console.assert(t>=0,"registerResult: ID mast be provided",e);let n,o=a[t];if(this._debug._&&console.groupCollapsed("πππ registerResult(element, id)"),this._debug._&&console.log("\n element",e,"\n id",t,"\n theElementObject (trail[id])",o,"\n theElementIndexInStack",n),0==t){const e=(e=>{let t,n=null;for(let o=e.length-1;o>=0;o--){if(0!==e[o].id)return{item:n,index:t};n=e[o],t=o}return{item:n,index:t}})(h);this._debug._&&console.log("ππ id == 0","\nπ [...stack]",[...h],"\nπ topParentElementFromStack",e),e.item&&(o=e.item,n=e.index)}this._debug._&&console.log("π","\n theElementObject",o,"\n theElementIndexInStack",n,"\n [...indexTracker]",[...l]),0===n?(r.push(null),this._debug._&&console.log("result.push(null)","\n\nπππ")):(r.push(o.element),o&&(o.split=!0),this._debug._&&console.log("\n theElementObject",o,"\n theElementObject.element",o.element,"\n result.push(theElementObject.element)","\n\nπππ ")),this._end("_getInternalBlockSplitters registerResult")};this._debug._&&console.log("π result π",r,"\n\n","\n rootNode:",e,"\n children:",n,"\n pageBottom:",o,"\n firstPartHeight:",s,"\n fullPageHeight:",i,"\n\n\n","π stack",[...h]);for(let t=0;t floater \n ${m} > ${M} `),(this._node.isSVG(p)||this._node.isIMG(p))&&this._debug._&&console.log("%cIMAGE ππ","color:red;text-weight:bold");const n=this._node.getBottomWithMargin(p,e);if(this._debug._&&console.log("ππ current ???","\n currentElement",p,"\n currentElementBottom",n,"\n floater",M),n<=M)this._debug._&&console.log("πππ currentElementBottom <= floater"),u&&(this._debug._&&console.log("ππππ register nextElement"),a.push(b),_(u,t+1));else{this._debug._&&console.log("πππ currentElementBottom > floater,\ntry to split",p);const n=this._node.processedBlockChildren(p,o,i);if(n.length)c(t),h.push(f),this._getInternalBlockSplitters({rootNode:e,rootComputedStyle:d,children:n,pageBottom:o,firstPartHeight:s,fullPageHeight:i,result:r,trail:a[t].children=[],indexTracker:l,stack:h}),h.pop(),this._debug._&&console.log("πͺ back from _getInternalBlockSplitters;\n trail[i]",a[t]);else if(g&&this._node.isNoHanging(g)){console.warn("tst improveResult",g);let e=g;e=this._node.findFirstChildParent(e,this._contentFlow)||e;e=this._node.findPreviousNoHangingsFromPage(e,this.pages.at(-2)?.pageBottom,this._root)||e,this._debug._&&console.log("previousElement _isNoHanging"),_(e,t-1)}else this._debug._&&console.log(p,"currentElement has no children"),_(p,t)}}}return c(),this._DOM.setStyles(e,{position:g}),this._end("_getInternalBlockSplitters"),{result:r,trail:a}}_getEntries(e){const t=[...e.children].reduce(((e,t)=>{const n=t.tagName;return"TBODY"===n?{...e,rows:[...e.rows,...t.children]}:"CAPTION"===n?(this._node.setFlagNoBreak(t),{...e,caption:t}):"COLGROUP"===n?(this._node.setFlagNoBreak(t),{...e,colgroup:t}):"THEAD"===n?(this._node.setFlagNoBreak(t),{...e,thead:t}):"TFOOT"===n?(this._node.setFlagNoBreak(t),{...e,tfoot:t}):"TR"===n?{...e,rows:[...e.rows,...t]}:{...e,unexpected:[...e.unexpected,...t]}}),{caption:null,thead:null,tfoot:null,rows:[],unexpected:[]});return t.unexpected.length>0&&this._debug._&&console.warn(`something unexpected is found in the table ${e}`),t}_insertTableSplit({startId:e,endId:t,table:n,tableEntries:o}){const s=this._DOM.cloneNodeWrapper(n),i=o.rows.slice(e,t),r=this._node.createWithFlagNoBreak();return n.before(r),e&&this._DOM.insertAtEnd(r,this._node.createSignpost("(table continued)",this._signpostHeight)),this._DOM.insertAtEnd(r,this._node.createTable({wrapper:s,colgroup:this._DOM.cloneNode(o.colgroup),caption:this._DOM.cloneNode(o.caption),thead:this._DOM.cloneNode(o.thead),tbody:i}),this._node.createSignpost("(table continues on the next page)",this._signpostHeight)),r}_lockWidths(e){this._node.copyNodeWidth(e,e),this._DOM.getAll("td",e).forEach((e=>this._node.copyNodeWidth(e,e)))}_end(e){this._debug._&&console.log(`%c β² ${e} `,"background:#eee;color:#888;padding: 0 1px 0 0;"),this._debug._&&console.groupEnd()}}class Ye{constructor({config:e,DOM:t,node:n,selector:o}){this._debug=e.debugMode?{...e.debugConfig.tableLike}:{},this._DOM=t,this._selector=o,this._node=n,this._minLeftLines=2,this._minDanglingLines=2,this._minBreakableLines=this._minLeftLines+this._minDanglingLines,this._minLeftRows=1,this._minDanglingRows=1,this._minBreakableRows=1,this._minPreFirstBlockLines=3,this._minPreLastBlockLines=3,this._minPreBreakableLines=this._minPreFirstBlockLines+this._minPreLastBlockLines,this._minBreakableGridRows=4,this._imageReductionRatio=.8,this._signpostHeight=24}split(e,t,n,o,s){const i=s||this._DOM.getComputedStyle(e);this._debug._&&console.log("root",o);const r=this._node.getPreparedChildren(e),a=this._node.getTop(e,o),l=this._node.getEmptyNodeHeight(e),h=n-l;let d=r,g=0,c=[],_=t-a-l;const p=i.position;"relative"!=p&&this._DOM.setStyles(e,{position:"relative"});for(let t=0;t_&&(t&&c.push(t),t&&(g+=1),_=t?this._node.getTop(n,e)+h:h)}if(this._DOM.setStyles(e,{position:p}),!c.length)return this._debug._&&console.log("splitters.length",c.length),[];c.push(null);const u=c.map(((t,n,o)=>{const s=this._DOM.cloneNodeWrapper(e);this._node.setFlagNoBreak(s),this._node.unmarkPageStartElement(s);const i=o[n-1]||0,r=t||o[o.length];return this._DOM.insertAtEnd(s,...d.slice(i,r)),s}));return this._node.markPartNodesWithClass(u),this._DOM.replaceNodeContentsWith(e,...u),this._DOM.removeAllClasses(e),this._DOM.removeAllStyles(e),this._DOM.setStyles(e,{display:"contents"}),this._DOM.setAttribute(e,"[slough-node]",""),u}}const qe="background:#999;color:#FFF;padding: 0 4px;";class Ke{constructor({config:e,DOM:t,node:n,selector:o}){this._debug=e.debugMode?{...e.debugConfig.grid}:{},this._DOM=t,this._selector=o,this._node=n,this._minLeftLines=2,this._minDanglingLines=2,this._minBreakableLines=this._minLeftLines+this._minDanglingLines,this._minLeftRows=1,this._minDanglingRows=1,this._minBreakableRows=1,this._minPreFirstBlockLines=3,this._minPreLastBlockLines=3,this._minPreBreakableLines=this._minPreFirstBlockLines+this._minPreLastBlockLines,this._minBreakableGridRows=4,this._imageReductionRatio=.8,this._signpostHeight=24}split(e,t,n,o){this._debug._&&console.group("%c_splitGridNode","background:#00FFFF");const s=this._node.getPreparedChildren(e);this._debug._&&console.log("π children",s),this._debug._&&console.groupCollapsed("make childrenGroups");const i=s.reduce(((e,t,n,o)=>{const s=this._DOM.getComputedStyle(t),i=s.getPropertyValue("grid-column-start"),r=s.getPropertyValue("grid-column-end"),a={element:t,start:"auto"===i?"auto":parseInt(s.getPropertyValue("grid-column-start")),end:"auto"===r?"auto":parseInt(s.getPropertyValue("grid-column-end")),top:this._DOM.getElementOffsetTop(t)};return!e.length||e.at(-1).at(-1).start>=a.start||"auto"===e.at(-1).at(-1).start||"auto"===a.start?(e.at(-1)&&this._node.isNoHanging(e.at(-1).at(-1).element)?(e.at(-1).push(a),this._debug._&&console.log("Add to group (after no-hang.)",a)):(e.push([a]),this._debug._&&console.log("Start new group:",a)),this._debug._&&console.log("result:",[...e]),e):e.length&&e.at(-1).at(-1).starte.map((e=>e.top)).sort())).map((e=>e[0])),a];this._debug._&&console.log("gridPseudoRowsTopPoints",l);const h=this._node.getTop(e,o),d=this._node.getEmptyNodeHeight(e),g=t-h-d,c=n-d;this._debug._&&console.log("\n β’ firstPartHeight",g,"\n β’ fullPagePartHeight",c);const _=l;let p=[],u=g;for(let e=0;e<_.length;e++)_[e]>u&&(e>this._minLeftRows&&p.push(e-1),u=_[e-1]+c);this._debug._&&console.log("splitsIds",p);const m=(t,n)=>{this._debug._&&console.log(`=> insertGridSplit(${t}, ${n})`);const o=i.slice(t,n).flat().map((e=>e.element));this._debug._&&console.log("partEntries",o);const s=this._DOM.cloneNodeWrapper(e);return this._node.copyNodeWidth(s,e),this._node.setFlagNoBreak(s),e.before(s),this._DOM.insertAtEnd(s,...o),s},f=[...p.map(((e,t,n)=>m(n[t-1]||0,e))),e];return this._debug._&&console.log("splits",f),f.forEach(((e,t)=>this._DOM.setAttribute(e,"[part]",`${t}`))),this._node.setFlagNoBreak(e),this._debug._&&console.log("%c END _splitGridNode",qe),this._debug._&&console.groupEnd(),f}}const Je="background:#999;color:#FFF;padding: 0 4px;";class Xe{constructor({config:e,DOM:t,node:n,selector:o}){this._debug=e.debugMode?{...e.debugConfig.pre}:{},this._DOM=t,this._selector=o,this._node=n,this._minLeftLines=2,this._minDanglingLines=2,this._minBreakableLines=this._minLeftLines+this._minDanglingLines,this._minLeftRows=1,this._minDanglingRows=1,this._minBreakableRows=1,this._minPreFirstBlockLines=3,this._minPreLastBlockLines=3,this._minPreBreakableLines=this._minPreFirstBlockLines+this._minPreLastBlockLines,this._minBreakableGridRows=4,this._imageReductionRatio=.8,this._signpostHeight=24}split(e,t,n,o,s){const i=o||this._DOM.getComputedStyle(e),r=["%c_splitPreNode\n","color:white"];this._debug._&&console.group("%c_splitPreNode","background:cyan"),this._debug._&&console.log(...r,"node",e);const a=this._node.getTop(e,s),l=this._DOM.getElementOffsetHeight(e),h=this._node.getLineHeight(e),d=this._node.getEmptyNodeHeight(e,!1);if(l1)return this._debug._&&console.log("%c END _splitPreNode TODO!",Je),[];{if(this._DOM.isElementNode(g[0])){const e=g[0];return this._debug._&&console.warn("is Element Node",e),this._debug._&&console.log("%c END _splitPreNode ???????",Je),[]}this._node.isWrappedTextNode(g[0])&&this._debug._&&console.warn(`is TEXT Node: ${g[0]}`);const o=g[0].wholeText,s=this._node.splitTextByLinesGreedy(o);if(s.length{const t=this._node.createWithFlagNoBreak();return this._DOM.setInnerHTML(t,e),t}));this._debug._&&console.log("linesFromNode",c),this._DOM.replaceNodeContentsWith(e,...c);const _=n-d;let p=0,u=[],m=t-a-d;const f=i.position;"relative"!=f&&this._DOM.setStyles(e,{position:"relative"});for(let t=0;tm&&(t&&u.push(t),t&&(p+=1),m=t?this._node.getTop(n,e)+_:_)}if(this._DOM.setStyles(e,{position:f}),!u.length)return this._debug._&&console.log("%c END _splitPreNode NO SPLIITERS",Je),[];u.push(null),this._debug._&&console.log(...r,"splitters",u);const b=u.map(((t,n,o)=>{const s=this._DOM.cloneNodeWrapper(e);this._node.setFlagNoBreak(s);const i=o[n-1]||0,r=t||o[o.length];return this._DOM.insertAtEnd(s,...c.slice(i,r)),s}));return this._node.markPartNodesWithClass(b),this._debug._&&console.log(...r,"newPreElementsArray",b),this._DOM.replaceNodeContentsWith(e,...b),this._DOM.setStyles(e,{display:"contents"}),this._DOM.setAttribute(e,"[slough-node]",""),this._DOM.removeAllClasses(e),this._debug._&&console.log("%c END _splitPreNode",Je),this._debug._&&console.groupEnd(),b}}}class Ze{constructor({config:e,DOM:t,selector:c}){this._config=e,this._DOM=t,this._selector=c,this._debug=e.debugMode?{...e.debugConfig.node}:{},this._assert=!!e.consoleAssert,this._markupDebugMode=this._config.markupDebugMode,Object.assign(this,n),Object.assign(this,o),Object.assign(this,s),Object.assign(this,i),Object.assign(this,r),Object.assign(this,a),Object.assign(this,l),Object.assign(this,h),Object.assign(this,d),Object.assign(this,g),this._paragraph=new ze({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._pre=new Xe({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._table=new Ue({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._grid=new Ke({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._tableLike=new Ye({config:this._config,DOM:this._DOM,selector:this._selector,node:this})}clearTemplates(e){this._DOM.getAll("template",e).forEach((e=>this._DOM.removeNode(e)))}notSolved(e){this._DOM.getElementTagName(e);return!1}}function Qe(e){return e?.length?e?.split(/\s+/).filter(Boolean):[]}const et="#66CC00",tt=`color: ${et};font-weight:bold`,nt=`border:1px solid ${et};background:#EEEEEE;color:${et};`,ot="background:#999;color:#FFF;padding: 0 4px;";class st{constructor({config:e,DOM:t,node:n,selector:o,layout:s,referenceWidth:i,referenceHeight:r}){this._debug=e.debugMode?{...e.debugConfig.pages}:{},this._assert=!!e.consoleAssert,this._selector=o,this._node=n,this._noHangingSelectors=Qe(e.noHangingSelectors),this._pageBreakBeforeSelectors=Qe(e.pageBreakBeforeSelectors),this._pageBreakAfterSelectors=Qe(e.pageBreakAfterSelectors),this._forcedPageBreakSelectors=Qe(e.forcedPageBreakSelectors),this._noBreakSelectors=Qe(e.noBreakSelectors),this._garbageSelectors=Qe(e.garbageSelectors),this._DOM=t,this._root=s.root,this._contentFlow=s.contentFlow,this._referenceWidth=i,this._referenceHeight=r,this._minLeftLines=2,this._minDanglingLines=2,this._minBreakableLines=this._minLeftLines+this._minDanglingLines,this._minLeftRows=1,this._minDanglingRows=1,this._minBreakableRows=this._minLeftRows+this._minDanglingRows,this._minPreFirstBlockLines=3,this._minPreLastBlockLines=3,this._minPreBreakableLines=this._minPreFirstBlockLines+this._minPreLastBlockLines,this._minBreakableGridRows=4,this._imageReductionRatio=.8,this._signpostHeight=parseFloat(e.splitLabelHeight)||0,this._commonLineHeight=this._node.getLineHeight(this._root),this._minimumBreakableHeight=this._commonLineHeight*this._minBreakableLines,this._isFirefox="undefined"!=typeof InstallTrigger,this.pages=[]}calculate(){return this._removeGarbageElements(),this._prepareNoHangingElements(),this._prepareForcedPageBreakElements(),this._prepareNoBreakElements(),this._calculate(),this._debug._&&console.log("%c β Pages.calculate()",nt,this.pages),this.pages}_removeGarbageElements(){if(this._garbageSelectors.length){this._DOM.getAll(this._garbageSelectors,this._contentFlow).forEach((e=>{this._DOM.removeNode(e)}))}}_prepareNoHangingElements(){if(this._noHangingSelectors.length){this._DOM.getAll(this._noHangingSelectors,this._contentFlow).forEach((e=>{this._node.setFlagNoHanging(e);const t=this._node.findLastChildParent(e,this._contentFlow);t&&this._node.setFlagNoHanging(t,"parent")}))}}_prepareNoBreakElements(){if(this._noBreakSelectors.length){this._DOM.getAll(this._noBreakSelectors,this._contentFlow).forEach((e=>this._node.setFlagNoBreak(e)))}}_prepareForcedPageBreakElements(){const e=this._pageBreakBeforeSelectors.length?this._DOM.getAll(this._pageBreakBeforeSelectors,this._contentFlow):[],t=this._pageBreakAfterSelectors.length?this._DOM.getAll(this._pageBreakAfterSelectors,this._contentFlow):[],n=this._DOM.getAll(this._forcedPageBreakSelectors,this._contentFlow);if(e.length){const t=e[0],n=this._node.findFirstChildParent(t,this._contentFlow)||t;this._node.isAfterContentFlowStart(n)&&e.shift()}if(t.length){const e=t.at(-1),n=this._node.findLastChildParent(e,this._contentFlow)||e,o=this._DOM.getRightNeighbor(n);this._node.isContentFlowEnd(o)&&t.pop()}e.length&&e.forEach((e=>{const t=this._node.findBetterForcedPageStarter(e,this._contentFlow);t&&this._DOM.insertBefore(t,this._node.createForcedPageBreak())})),n&&n.forEach((e=>{if(!this._node.isForcedPageBreak(e)){const t=this._node.findBetterForcedPageStarter(e,this._contentFlow);t&&this._DOM.insertBefore(t,this._node.createForcedPageBreak())}})),t.length&&t.forEach((e=>{const t=this._node.findLastChildParent(e,this._contentFlow);t&&(e=t),this._node.isForcedPageBreak(e.nextElementSibling)||this._DOM.insertAfter(e,this._node.createForcedPageBreak())}))}_calculate(){this._debug._&&console.groupCollapsed("β’β’ init data β’β’"),this._debug._&&console.log("this._referenceHeight",this._referenceHeight,"\n","this._noHangingSelectors",this._noHangingSelectors,"\n","this._pageBreakBeforeSelectors",this._pageBreakBeforeSelectors,"\n","this._pageBreakAfterSelectors",this._pageBreakAfterSelectors,"\n","this._forcedPageBreakSelectors",this._forcedPageBreakSelectors,"\n","this._noBreakSelectors",this._noBreakSelectors,"\n","isFirefox",this._isFirefox),this._debug._&&console.groupEnd("β’β’ init data β’β’"),this._registerPageStart(this._DOM.getElement(this._selector.contentFlowStart,this._contentFlow));const e=this._node.getBottomWithMargin(this._contentFlow,this._root);if(ethis._registerPageStart(e)));const t=this._node.getPreparedChildren(this._contentFlow);this._debug._&&console.groupCollapsed("%cπΈ children(contentFlow)",nt),this._debug._&&console.log(t),this._debug._&&console.groupEnd("%cπΈ children(contentFlow)",nt),this._parseNodes({array:t})}_registerPageStart(e,t=!1){if(this._debug._registerPageStart&&console.log("%cπ","background:yellow;font-weight:bold","\n improveResult:",t,"\n passed pageStart:",e),this._node.isPageStartElement(e))return;t&&(e=this._node.findBetterPageStart(e,this.pages.at(-1)?.pageStart,this._root));const n=this._node.getTopWithMargin(e,this._root),o=n+this._referenceHeight;this.pages.push({pageStart:e,pageBottom:o}),this._node.markPageStartElement(e,this.pages.length),this._debug._registerPageStart&&console.log(`%cπregister page ${this.pages.length}`,"background:yellow;font-weight:bold","\n improved result:",t,"\n pageTop:",n,"\n pageBottom:",o,"\n pageStart:",e)}_parseNodes({array:e,previous:t,next:n,parent:o,parentBottom:s}){this._debug._parseNodes&&console.log("π΅ _parseNodes","\narray:",[...e],"\ntracedParent:",o);for(let i=0;ig+this._referenceHeight;if(i&&c){if(d=void 0,this._debug._parseNode&&console.log("πͺ Tile: We got a tail from the lower shells of the last child. Giving up our βlast childβ rule here and will try to insert a page break at the end of some parent. ",{parentBottom:i,currentParentBottom:d,currentElementBottom:l,newPageBottom:a},{currentElement:n,parent:s}),l<=a){this._debug._parseNode&&console.log("πͺ Tile: currentElementBottom <= newPageBottom");const e=[];let t=n;for(this._debug._parseNode&&console.log("πͺ Tile: currentElement",n);t&&t!==s;)e.push({element:t,bottom:this._node.getBottomWithMargin(t,this._root)}),t=t.parentElement;if(t!==s)throw new Error("parent not found in the ancestor chain");e.push({element:s,bottom:i}),this._debug._parseNode&&console.log("πͺ Tile: _parents",e);let o=a;this._debug._parseNode&&console.log("πͺ Tile: _currentPageBottom = newPageBottom",o);for(let t=0;to){this._debug._parseNode&&console.log("πͺ Tile: _parents[i].bottom > _currentPageBottom",e[t].bottom,">",o,e[t].element);const n=this._node.createNeutral();n.classList.add("service"),this._DOM.insertAtEnd(e[t].element,n),this._registerPageStart(n),this._debug._parseNode&&console.log("_registerPageStart",n),this._node.markProcessed(n,"node is ForcedPageBreak");const s=this.pages.at(-1).pageBottom;if(this._debug._parseNode&&console.log(o,s,i),!(i>s))return this._debug._parseNode&&console.log("%c END _parseNode (bottom tile of parents)",ot),void(this._debug._parseNode&&console.groupEnd());this._debug._&&console.log("π§§ β’ parentBottom > justUpdatedPageBottom"),o=s,this._debug._parseNode&&console.log("new _currentPageBottom",o)}return this._debug._parseNode&&console.log("%c END _parseNode (bottom tile of parents)",ot),void(this._debug._parseNode&&console.groupEnd())}this._debug._parseNode&&console.log("πͺ Tile: currentElementBottom > newPageBottom","DOING NOTHING")}const _=d||l;if(this.pages.at(-1).pageStart===n&&(this._node.isNoBreak(n)||_<=a))return this._node.markProcessed(n,"node is already registered and fits in the page"),this._debug._parseNode&&console.log("%c END _parseNode (node is already registered and fits in the next page)",ot),void(this._debug._parseNode&&console.groupEnd());if(g>=a&&l-g){const e=s?this._node.getTopWithMargin(s,this._root):void 0,t=s&&e&&g-e>=this._referenceHeight;this._debug._parseNode&&console.warn("πͺ currentElementTop >= newPageBottom",g,">=",a,"\n beginningTail:",t,g-e,">=",this._referenceHeight),this._registerPageStart(n,!t)}if(this._node.isForcedPageBreak(n))return this._registerPageStart(n),this._node.markProcessed(n,"node is ForcedPageBreak"),this._debug._parseNode&&console.log("%c END _parseNode (isForcedPageBreak)",ot),void(this._debug._parseNode&&console.groupEnd());this._debug._&&console.assert(this._DOM.getElementOffsetParent(n),"it is expected that the element has an offset parent",n);const p=this._node.getTop(o,this._root);if(this._debug._parseNode&&console.log(...r,"β’ newPageBottom",a,"\n","β’ nextElementTop",p),p<=a)this._debug._parseNode&&console.log("nextElementTop <= newPageBottom",p,"<=",a),this._node.markProcessed(n,"node fits"),this._node.findAllForcedPageBreakInside(n).forEach((e=>{this._node.markProcessed(e,"node is ForcedPageBreak (inside a node that fits)"),this._registerPageStart(e)}));else{if(this._debug._parseNode&&console.log("nextElementTop > newPageBottom",p,">",a),_<=a)return this._debug._parseNode&&console.log("currentBlockBottom <= newPageBottom",_,"<=",a,"\n register nextElement as pageStart"),this._node.isNoHanging(n)?(this._debug._parseNode&&console.log("currentElement fits / last, and _isNoHanging => move it to the next page"),this._node.markProcessed(n,"it fits & last & _isNoHanging => move it to the next page"),this._registerPageStart(n,!0),this._debug._parseNode&&console.log("%c END _parseNode (isNoHanging)",ot),void(this._debug._parseNode&&console.groupEnd())):(this._registerPageStart(o),this._node.markProcessed(n,"fits, its bottom falls exactly on the cut"),this._node.markProcessed(o,"starts new page, its top is exactly on the cut"),this._debug._parseNode&&console.log("%c END _parseNode (currentElement fits, register the next element)",ot),void(this._debug._parseNode&&console.groupEnd()));if(this._node.isSVG(n)||this._node.isIMG(n)||this._node.isOBJECT(n)){const e=this._node.isSVG(n)?this._node.createSignpost(n):n;let t=s?a-this._node.getTop(e,this._root):a-this._node.getTop(s,this._root);t-=i?i-this._node.getBottom(e,this._root):0;let r=this._referenceHeight-(s?this._node.getTop(e,this._root)-this._node.getTop(s,this._root):0);const l=this._DOM.getElementOffsetHeight(e),h=this._DOM.getElementOffsetWidth(e);if(this._debug._parseNode&&console.log("πΌοΈπΌοΈπΌοΈπΌοΈπΌοΈπΌοΈ\n",`H-space: ${t}, image Height: ${l}, image Width: ${h}`,n,"\n parent",s,"parentBottom",i,"currentParentBottom",d),lthis._imageReductionRatio?(this._debug._parseNode&&console.log("Register next elements; πΌοΈπΌοΈπΌοΈ IMG RESIZE to availableImageNodeSpace:",t,n),this._node.markProcessed(n,`IMG with ratio ${g}, and next starts on next`),this._node.fitElementWithinBoundaries({element:n,height:l,width:h,vspace:t,hspace:this._referenceWidth}),this._registerPageStart(o),this._debug._parseNode&&console.log("%c END _parseNode πΌοΈ IMG scaled",ot),void(this._debug._parseNode&&console.groupEnd())):(this._node.markProcessed(n,"IMG starts on next"),this._registerPageStart(e,!0),this._debug._parseNode&&console.log("πΌοΈ register Page Start",n),l>r&&(this._node.fitElementWithinBoundaries({element:n,height:l,width:h,vspace:r,hspace:this._referenceWidth}),this._node.markProcessed(n,"IMG starts on next and resized"),this._debug._parseNode&&console.log("πΌοΈ ..and fit it to full page",n)),this._debug._parseNode&&console.log("%c END",ot),void(this._debug._parseNode&&console.groupEnd()))}if(n.style.height){this._debug._parseNode&&console.log("π₯ currentElement has HEIGHT",n.style.height);const e=a-g,t=p-g,s=e/t,i=this._referenceHeight/t;return this._debug._parseNode&&console.log("\nπ₯ currentElementTop",g,"\nπ₯ newPageBottom",a,"\nπ₯ availableSpace",e,"\nπ₯ currentElementContextualHeight",t,"\nπ₯ availableSpaceFactor",s,"\nπ₯ fullPageFactor",i),this._debug._parseNode&&console.assert(s<1),s>.8?(this._debug._parseNode&&console.log("π₯ availableSpaceFactor > 0.8: ",s),this._DOM.setStyles(n,{transform:`scale(${s})`,"transform-origin":"top center"}),this._registerPageStart(o),this._node.markProcessed(n,"processed as a image, has been scaled down within 20%, the next one starts a new page"),this._node.markProcessed(o,"the previous one was scaled down within 20%, and this one starts a new page."),this._debug._parseNode&&console.log("%c END _parseNode (has height & scale)",ot),void(this._debug._parseNode&&console.groupEnd())):(i<1&&(this._debug._parseNode&&console.log("π₯ fullPageFactor < 1: ",i),this._node.markProcessed(n,"processed as a image, has been scaled down, and starts new page"),this._DOM.setStyles(n,{transform:`scale(${i})`,"transform-origin":"top center"})),this._debug._parseNode&&console.log("π₯ _registerPageStart",n),this._registerPageStart(n,!0),this._node.markProcessed(n,"processed as a image, starts new page"),this._debug._parseNode&&console.log("%c END _parseNode (has height & put on next page)",ot),void(this._debug._parseNode&&console.groupEnd()))}this._debug._parseNode&&console.log("split or not? \n","currentBlockBottom",_),this._debug._parseNode&&console.log("currentParentBottom || currentElementBottom",{currentParentBottom:d,currentElementBottom:l},"currentBlockBottom > newPageBottom",_,">",a);const c=this._node.getProcessedChildren(n,a,this._referenceHeight);this._debug._parseNode&&console.log("try to break it and loop the children:",c);const u=c.length;this._debug._parseNode&&console.log(...r,"childrenNumber ",u),this._debug._parseNode&&console.log(...r,"currentElement ",n);const m=(e||i)&&s||n;if(u){const e=this._node.isFullySPlitted(n)||this._node.isSlough(n);this._debug._parseNode&&console.log({isFullySPlittedParent:e,parent:s,tracedParent:m}),this._parseNodes({array:c,previous:t,next:o,parent:e?void 0:m,parentBottom:e?void 0:h}),this._node.markProcessed(n,"getProcessedChildren and _parseNodes")}else this._debug._parseNode&&console.log(...r,"_registerPageStart (from _parseNode): \n",n),this._registerPageStart(n,!0),this._node.markProcessed(n,"doesn't fit, has no children, register it or parents")}this._debug._parseNode&&console.log("%c END _parseNode",ot),this._debug._parseNode&&console.groupEnd()}}class it{constructor({config:e,DOM:t,node:n,selector:o,layout:s}){this._debug=e.debugMode?{...e.debugConfig.paper}:{},this._DOM=t,this._selector=o,this._node=n,this._frontpageTemplate=s.frontpageTemplate,this._headerTemplate=s.headerTemplate,this._footerTemplate=s.footerTemplate,this._paperBodySelector=o?.paperBody||".paperBody",this._paperHeaderSelector=o?.paperHeader||".paperHeader",this._paperFooterSelector=o?.paperFooter||".paperFooter",this._headerContentSelector=o?.headerContent||".headerContent",this._footerContentSelector=o?.footerContent||".footerContent",this._frontpageContentSelector=o?.frontpageContent||".frontpageContent",this._virtualPaperSelector=o?.virtualPaper||".virtualPaper",this._virtualPaperTopMarginSelector=o?.virtualPaperTopMargin||".virtualPaperTopMargin",this._virtualPaperBottomMarginSelector=o?.virtualPaperBottomMargin||".virtualPaperBottomMargin",this._pageNumberRootSelector=o?.pageNumberRoot||void 0,this._pageNumberCurrentSelector=o?.pageNumberCurrent||void 0,this._pageNumberTotalSelector=o?.pageNumberTotal||void 0,this._paperHeight,this._frontpageFactor,this.headerHeight,this.footerHeight,this.bodyHeight,this.bodyWidth,this._calculatePaperParams()}create({currentPage:e,totalPages:t}){const n=this._createPaperBody(this.bodyHeight),o=this._createPaperHeader(this._headerTemplate),s=this._createPaperFooter(this._footerTemplate);return this._createPaper({header:o,body:n,footer:s,currentPage:e,totalPages:t})}createFrontpage({currentPage:e,totalPages:t}){const n=this._createFrontpageContent(this._frontpageTemplate,this._frontpageFactor),o=this._createPaperBody(this.bodyHeight,n),s=this._createPaperHeader(this._headerTemplate),i=this._createPaperFooter(this._footerTemplate);return this._createPaper({header:s,body:o,footer:i,currentPage:e,totalPages:t})}createVirtualTopMargin(){return this._node.create(this._virtualPaperTopMarginSelector)}createVirtualBottomMargin(){return this._node.create(this._virtualPaperBottomMarginSelector)}_createPaper({header:e,body:t,footer:n,currentPage:o,totalPages:s}){const i=this._node.create(this._virtualPaperSelector);return this._DOM.insertAtEnd(i,this.createVirtualTopMargin(),e,t,n,this.createVirtualBottomMargin()),o&&s&&(this._setPageNumber(e,o,s),this._setPageNumber(n,o,s)),i}_createFrontpageContent(e,t){const n=this._node.create(this._frontpageContentSelector);return e&&this._DOM.setInnerHTML(n,e),t&&this._DOM.setStyles(n,{transform:`scale(${t})`}),n}_createPaperBody(e,t){const n=this._node.create(this._paperBodySelector);return this._DOM.setStyles(n,{height:e+"px"}),t&&this._DOM.insertAtEnd(n,t),n}_createPaperHeader(e){const t=this._node.create(this._paperHeaderSelector);if(e){const n=this._node.create(this._headerContentSelector);this._DOM.setInnerHTML(n,e),this._DOM.insertAtEnd(t,n)}return t}_createPaperFooter(e){const t=this._node.create(this._paperFooterSelector);if(e){const n=this._node.create(this._footerContentSelector);this._DOM.setInnerHTML(n,e),this._DOM.insertAtEnd(t,n)}return t}_setPageNumber(e,t,n){const o=this._pageNumberRootSelector?this._DOM.getElement(this._pageNumberRootSelector,e):this._pageNumberRootSelector;if(o){const e=this._DOM.getElement(this._pageNumberCurrentSelector,o),s=this._DOM.getElement(this._pageNumberTotalSelector,o);this._DOM.setInnerHTML(e,t),this._DOM.setInnerHTML(s,n)}}_calculatePaperParams(){const e=this._createPaperBody(),t=this._createFrontpageContent(this._frontpageTemplate),n=this._createPaperHeader(this._headerTemplate),o=this._createPaperFooter(this._footerTemplate),s=this._createPaper({header:n,body:e,footer:o}),i=this._node.create("#workbench");this._DOM.setStyles(i,{position:"absolute",left:"-3000px"}),this._DOM.insertAtEnd(i,s),this._DOM.insertAtStart(this._DOM.body,i);const r=this._DOM.getElementBCR(s).height,a=this._DOM.getElementOffsetHeight(n)||0,l=this._DOM.getElementOffsetHeight(o)||0,h=this._DOM.getElementOffsetHeight(e),d=this._DOM.getElementOffsetWidth(e);this._DOM.insertAtStart(e,t);const g=this._DOM.getElementOffsetHeight(e),c=g>h?h/g:1;this._DOM.removeNode(i),a>.2*r&&console.warn("It seems that your custom header is too high"),l>.15*r&&console.warn("It seems that your custom footer is too high"),c<1&&console.warn("It seems that your frontpage content is too large. We made it smaller to fit on the page. Check out how it looks! It might make sense to fix this with styles or reduce the text amount."),this._paperHeight=r,this.headerHeight=a,this.footerHeight=l,this.bodyHeight=h,this.bodyWidth=d,this._frontpageFactor=c}}class rt{constructor({config:e,DOM:t,selector:n,node:o,pages:s,layout:i,paper:r}){this._config=e,this._debug=e.debugMode?{...e.debugConfig.preview}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._selector=n,this._node=o,this._virtualPaperGapSelector=n.virtualPaperGap,this._runningSafetySelector=n.runningSafety,this._printPageBreakSelector=n.printPageBreak,this._pageDivider=n.pageDivider,this._virtualPaper=n.virtualPaper,this._virtualPaperTopMargin=n.virtualPaperTopMargin,this._paperBody=n.paperBody,this._pages=s,this._root=i.root,this._contentFlow=i.contentFlow,this._paperFlow=i.paperFlow,this._paper=r,this._hasFrontPage=!!i.frontpageTemplate}create(){this._processFirstPage(),this._processOtherPages(),(!0===this._config.mask||"true"===this._config.mask)&&this._addMask()}_addMask(){const e=parseInt(this._config.virtualPagesGap),t=parseInt(this._config.printHeight),n=parseInt(this._config.printTopMargin),o=parseInt(this._config.printBottomMargin),s=parseInt(this._config.headerMargin),i=parseInt(this._config.footerMargin),r=this._paper.headerHeight,a=this._paper.footerHeight,l=this._paper.bodyHeight,h=r?Math.ceil(s/2):0,d=a?Math.ceil(i/2):0,g=r-h,c=a-d,_=l+h+d,p=n+g,u=t+e;this._assert&&console.assert(t===_+g+n+c+o,"Paper size calculation params do not match"),function({targetElement:e,maskStep:t,maskWindow:n,maskFirstShift:o}){e.style=`\n -webkit-mask-image: linear-gradient(\n black 0,\n black ${n}px,\n transparent ${n}px,\n transparent ${t}px\n );\n mask-image: linear-gradient(\n black 0,\n black ${n}px,\n transparent ${n}px,\n transparent ${t}px\n );\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-size: 100% ${t}px;\n mask-size: 100% ${t}px;\n -webkit-mask-position: 100% ${o}px;\n mask-position: 100% ${o}px;\n -webkit-mask-repeat: repeat-y;\n mask-repeat: repeat-y;\n -webkit-mask-origin: border-box;\n mask-origin: border-box;\n `}({targetElement:this._contentFlow,maskStep:u,maskWindow:_,maskFirstShift:p})}_processFirstPage(){let e;if(this._hasFrontPage){const t=this._insertFrontpageSpacer(this._contentFlow,this._paper.bodyHeight);this._pages.unshift({pageStart:t}),e=this._paper.createFrontpage({currentPage:1,totalPages:this._pages.length})}else e=this._paper.create({currentPage:1,totalPages:this._pages.length});this._insertIntoPaperFlow(e),this._insertIntoContentFlow(0)}_processOtherPages(){for(let e=1;e=0,`balancer is negative: ${o} < 0`,t)}}class at{constructor({config:e,DOM:t,selector:n,node:o,layout:s}){this._globalDebugMode=e.debugMode,this._debug=this._globalDebugMode?{...e.debugConfig.toc}:{},this._DOM=t,this._node=o,this._tocPageNumberSelector=e.tocPageNumberSelector,this._root=s.root,this._contentFlow=s.contentFlow,this._pageDividerSelector=n.pageDivider}render(){this._globalDebugMode&&console.time("Processing TOC"),this._debug._&&console.log(`\nπ TOC: I am here!\n\ntocPageNumberSelector:\n β’ ${this._tocPageNumberSelector}\n pageDividerSelector:\n β’ ${this._pageDividerSelector}\n `);const e=this._DOM.getAll(this._tocPageNumberSelector,this._contentFlow);if(this._debug._&&console.log("π tocPageNumberBoxes",e.length),!e.length)return void(this._debug._&&console.log("π no valid toc"));const t=this._DOM.getAll(this._pageDividerSelector,this._contentFlow).reduce(((e,t,n)=>{const o=this._node.getTop(t,this._root)-1,s=this._DOM.getAttribute(t,"[page]");return e[o]=s,e}),{});this._debug._&&console.log("π dataFromPagesMarkers",t);const n=e.reduce(((e,t)=>{const n=this._DOM.getDataId(t),o=this._DOM.getElementById(n),s=this._node.getTop(o,this._root);return e[s]={box:t,id:n,targetTop:s},e}),{});this._debug._&&console.log("π dataFromTOC",n);const o={...t,...n};let s=0;this._debug._&&console.groupCollapsed("Processing obj");for(const e in o){const t=o[e];this._debug._&&console.log(`Processing ${e}: ${t}`),"string"==typeof t?s=t:(t.page=s,this._DOM.setInnerHTML(t.box,s))}this._debug._&&console.groupEnd("Processing obj"),this._debug._&&console.log("π tocObject",o),this._globalDebugMode&&console.timeEnd("Processing TOC")}}class lt{constructor({config:e,DOM:t,selector:n,node:o,layout:s}){this._config=e,this._selector=n,this._DOM=t,this._node=o,this._layout=s,this._root=s.root,this._assert=!!e.consoleAssert}init(){this._config.debugMode&&console.log("π i am Validator!");const e=`${this._selector.paperFlow} ${this._selector.virtualPaperGap}`,t=`${this._selector.contentFlow} ${this._selector.virtualPaperGap}`,n=[...this._DOM.getAllElements(e)],o=[...this._DOM.getAllElements(t)],s=n.map((e=>this._node.getTop(e))),i=o.map((e=>this._node.getTop(e,this._root))),r=s.reduce(((e,t,n)=>(t!==i[n]&&e.push(n+1),e)),[]);this._assert&&console.assert(!r.length,"Problems with preview generation on the following pages: ",r)}}const ht="border:1px dashed #cccccc;background:#ffffff;color:#cccccc;";class dt{constructor(e){this._debugMode=e.debugMode,this._preloader,this._preloaderTarget=document.querySelector(e.preloaderTarget)||document.body,this._preloaderBackground=e.preloaderBackground||"white"}create(){this._debugMode&&console.groupCollapsed("%c Preloader ",ht),this._insertStyle(),this._preloader=document.createElement("div"),this._preloader.classList.add("lds-dual-ring"),this._preloaderTarget.append(this._preloader),this._debugMode&&console.groupEnd("%c Preloader ",ht)}remove(){if(!this._preloader)return;let e=1;const t=setInterval((()=>{e<=.1&&(clearInterval(t),this._preloader.remove()),this._preloader.style.opacity=e,e-=.1*e}),50);this._debugMode&&console.log("%c Preloader removed ",ht)}_insertStyle(){const e=document.querySelector("head"),t=document.createElement("style");t.append(document.createTextNode(this._css())),t.setAttribute("data-preloader-style",""),e.append(t)}_css(){return`\n /* PRELOADER */\n .lds-dual-ring {\n position: absolute;\n z-index: 99999;\n top: 0; left: 0; bottom: 0; right: 0;\n background: ${this._preloaderBackground};\n display: flex;\n justify-content: center;\n align-items: center;\n }\n /*\n .lds-dual-ring:after {\n content: " ";\n display: block;\n width: 64px;\n height: 64px;\n margin: 8px;\n border-radius: 50%;\n border: 6px solid #eee;\n border-color: #eee transparent #eee transparent;\n animation: lds-dual-ring 1.2s linear infinite;\n }\n @keyframes lds-dual-ring {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n */\n `}}class gt{constructor(e){this._debugMode=e.debugMode}run(){let e=[...document.querySelectorAll("object")];this._debugMode&&console.log(e);let t=[];return e.forEach((e=>{const n=new Promise((t=>{e.addEventListener("load",(n=>{this._debugMode&&console.log("β° EVENT: object load",e.clientHeight,e.clientWidth,e),t()}))}));t.push(n)})),Promise.all(t)}}const ct="color:Gray;border:1px solid;";console.info("[HTML2PDF4DOC] Version:","0.2.3");const _t=document.currentScript.dataset,pt=new class{constructor(e){this.params=e,this.debugMode=e.debugMode,this.preloader=e.preloader,this.selector=c,this.config}async render(){console.time("[HTML2PDF4DOC] Total time"),this.debugMode&&console.log("π document.readyState",document.readyState),document.addEventListener("readystatechange",(e=>{this.debugMode&&console.log("π readystatechange",document.readyState)})),this.debugMode&&console.time("β±οΈ await DOMContentLoaded time"),await new Promise((e=>{window.addEventListener("DOMContentLoaded",(t=>{this.debugMode&&console.log("β° EVENT: DOMContentLoaded"),e()}))})),this.debugMode&&console.timeEnd("β±οΈ await DOMContentLoaded time"),this.debugMode&&console.time("β±οΈ create Preloader time");const e=new dt(this.params);"true"===this.preloader&&e.create(),this.debugMode&&console.timeEnd("β±οΈ create Preloader time"),this.debugMode&&console.time("β±οΈ Config time"),this.debugMode&&console.groupCollapsed("%c config ",ct+"color:LightGray"),this.config={..._(this.params),debugConfig:p},this.debugMode&&console.groupEnd(),this.debugMode&&console.info("βοΈ Current config with debugConfig:",this.config),this.debugMode&&console.timeEnd("β±οΈ Config time"),this.config.consoleAssert&&console.info("π§§ Assertions enabled."),this.debugMode&&console.time("β±οΈ DOM helpers init time");const t=new u({DOM:window.document,config:this.config});this.debugMode&&console.timeEnd("β±οΈ DOM helpers init time"),this.debugMode&&console.time("β±οΈ node helpers init time");const n=new Ze({config:this.config,DOM:t,selector:this.selector});this.debugMode&&console.timeEnd("β±οΈ node helpers init time"),this.debugMode&&console.time("β±οΈ await window load time"),await new Promise((e=>{window.addEventListener("load",(t=>{this.debugMode&&console.log("β° EVENT: window load"),e()}))})),this.debugMode&&console.timeEnd("β±οΈ await window load time"),this.debugMode&&console.time("β±οΈ Layout time"),this.debugMode&&console.groupCollapsed("%c Layout ",ct);const o=new f({config:this.config,DOM:t,selector:this.selector,node:n});if(o.create(),this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("β±οΈ Layout time"),!o.success)return void(this.debugMode&&console.error("Failed to create layout.\n\nWe have to interrupt the process of creating PDF preview."));this.debugMode&&console.info("%c calculate Paper params ",ct),this.debugMode&&console.time("β±οΈ Paper time");const s=new it({config:this.config,DOM:t,selector:this.selector,node:n,layout:o});if(this.debugMode&&console.timeEnd("β±οΈ Paper time"),!s||!s.bodyHeight||!s.bodyWidth)return void(this.debugMode&&console.error("Failed to create paper calculations.\n\nWe have to interrupt the process of creating PDF preview."));this.debugMode&&console.time("β±οΈ Preprocess time"),this.debugMode&&console.groupCollapsed("%c Preprocess ",ct),await new gt(this.config).run(),this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("β±οΈ Preprocess time"),this.debugMode&&console.time("β±οΈ Pages time"),this.debugMode&&console.groupCollapsed("%c Pages ",ct);const i=new st({config:this.config,DOM:t,selector:this.selector,node:n,layout:o,referenceHeight:s.bodyHeight,referenceWidth:s.bodyWidth}).calculate();this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("β±οΈ Pages time"),this.debugMode&&console.time("β±οΈ Preview time"),this.debugMode&&console.groupCollapsed("%c Preview ",ct),new rt({config:this.config,DOM:t,selector:this.selector,node:n,layout:o,paper:s,pages:i}).create(),this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("β±οΈ Preview time"),this.debugMode&&console.time("β±οΈ Toc time"),new at({config:this.config,DOM:t,selector:this.selector,node:n,layout:o}).render(),this.debugMode&&console.timeEnd("β±οΈ Toc time"),this.debugMode&&console.time("β±οΈ Validator time"),new lt({config:this.config,DOM:t,selector:this.selector,node:n,layout:o}).init(),this.debugMode&&console.timeEnd("β±οΈ Validator time"),t.setAttribute(o.root,"[success]"),t.setAttribute(o.root,"[pages]",i.length),e.remove(),console.info("[HTML2PDF4DOC] Page count:",i.length),console.timeEnd("[HTML2PDF4DOC] Total time")}}(_t),ut="manual"===_t.init;function mt(){ut&&pt.render()}ut&&console.info("HTML2PDF4DOC in manual initialization mode"),!ut&&pt.render(),HTML2PDF4DOC=t})();
\ No newline at end of file
+var HTML2PDF4DOC;(()=>{"use strict";var e={d:(t,o)=>{for(var n in o)e.o(o,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:o[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{init:()=>T});const o={init:"[html2pdf]",pageDivider:"html2pdf-page",pageStartMarker:"[html2pdf-page-start]",contentFlowStart:"html2pdf-content-flow-start",contentFlowEnd:"html2pdf-content-flow-end",style:"[html2pdf-style]",footerTemplate:"[html2pdf-footer]",headerTemplate:"[html2pdf-header]",frontpageTemplate:"[html2pdf-frontpage]",frontpageContent:"html2pdf-frontpage",headerContent:"html2pdf-header",footerContent:"html2pdf-footer",pageNumberRoot:"[html2pdf-page-number]",pageNumberCurrent:"[html2pdf-page-number-current]",pageNumberTotal:"[html2pdf-page-number-total]",root:"html2pdf-root",paperFlow:"html2pdf-paper-flow",contentFlow:"html2pdf-content-flow",virtualPaper:"html2pdf-virtual-paper",virtualPaperTopMargin:"html2pdf-virtual-paper-margin-top",virtualPaperBottomMargin:"html2pdf-virtual-paper-margin-bottom",virtualPaperGap:"html2pdf-virtual-paper-gap",paperBody:"html2pdf-paper-body",paperHeader:"html2pdf-paper-header",paperFooter:"html2pdf-paper-footer",runningSafety:"html2pdf-print-running",printPageBreak:"html2pdf-print-page-break",printIgnore:"[html2pdf-print-ignore]",printHide:"[html2pdf-print-hide]",neutral:"html2pdf-neutral",word:"html2pdf-word",textNode:"html2pdf-text-node",textLine:"html2pdf-text-line",textGroup:"html2pdf-text-group",complexTextBlock:"html2pdf-complex-text-block",printForcedPageBreak:"html2pdf-print-forced-page-break",splitted:"[html2pdf-splitted]",processed:"[html2pdf-processed]",flagNoBreak:"[html2pdf-flag-no-break]",flagNoHanging:"[html2pdf-flag-no-hanging]",topCutPart:".html2pdf-top-cut",bottomCutPart:".html2pdf-bottom-cut",tocPageNumber:"html2pdf-toc-page-number"};function n(e){let t={debugMode:!1,consoleAssert:!1,preloader:!1,preloaderTarget:"",preloaderBackground:"",mask:!0,noHangingSelectors:"",forcedPageBreakSelectors:"",pageBreakBeforeSelectors:"",pageBreakAfterSelectors:"",noBreakSelectors:"",tocPageNumberSelector:"html2pdf-toc-page-number",printLeftMargin:"21mm",printRightMargin:"21mm",printTopMargin:"12mm",printBottomMargin:"12mm",printFontSize:"12pt",printWidth:"210mm",printHeight:"297mm",headerMargin:"16px",footerMargin:"16px",virtualPagesGap:"16px"};const n={printWidth:"210mm",printHeight:"297mm"},s={printWidth:"148.5mm",printHeight:"210mm"};switch((e=function(e){const t={...e};for(const e in t){const o=t[e];if("string"==typeof o){const n=o.toLowerCase();"true"===n||"1"===n?t[e]=!0:"false"!==n&&"0"!==n&&""!==n||(t[e]=!1)}}return t}(e)).printPaperSize){case"A5":case"a5":t={...t,...s};break;default:t={...t,...n}}t={...t,initialRoot:o.init,tocPageNumberSelector:o.tocPageNumber,...e},console.info("[HTML2PDF4DOC] Config:",t);const i={printLeftMargin:t.printLeftMargin,printRightMargin:t.printRightMargin,printTopMargin:t.printTopMargin,printBottomMargin:t.printBottomMargin,printFontSize:t.printFontSize,printWidth:t.printWidth,printHeight:t.printHeight,headerMargin:t.headerMargin,footerMargin:t.footerMargin,virtualPagesGap:t.virtualPagesGap},r=document.createElement("div");return r.style="\n position:absolute;\n z-index:1000;\n left: 200%;\n ",document.body.append(r),Object.entries(i).forEach((([e,t])=>{r.style.width=t,i[e]=`${Math.trunc(r.getBoundingClientRect().width)}px`})),r.remove(),t={...t,...i},t.noHangingSelectors=t.noHangingSelectors+" H1 H2 H3 H4 H5 H6",t.forcedPageBreakSelectors=t.forcedPageBreakSelectors+" "+o.printForcedPageBreak,t.debugMode&&console.info("Config with converted units:",t),t}const s={DOM:{_:!1},layout:{_:!0},pages:{_:!0,_parseNode:!1,_parseNodes:!1,_registerPageStart:!1,_getProcessedChildren:!1,_splitPreNode:!1,_splitTableNode:!1,_splitTableLikeNode:!1,_splitTableRow:!1,_splitGridNode:!1,_createSlicesBySplitFlag:!1,_getInternalBlockSplitters:!1},paragraph:{_:!1},node:{_:!1},paper:{_:!1},preview:{_:!1},toc:{_:!1}};class i{constructor({DOM:e,config:t}){this.document=e,this.body=e.body,this._debugMode=t.debugMode,this._debug=t.debugMode?{...t.debugConfig.DOM}:{},this._assert=!!t.consoleAssert}createElement(e){return this.document.createElement(e)}createDocumentFragment(){return this.document.createDocumentFragment()}cloneNode(e){return e?.cloneNode(!0)}cloneNodeWrapper(e){return e?.cloneNode(!1)}insertBefore(e,...t){e.before(...t)}insertAfter(e,...t){e.after(...t)}insertAtEnd(e,...t){e.append(...t)}insertAtStart(e,...t){e.prepend(...t)}insertInsteadOf(e,...t){e.before(...t),e.remove()}moveContent(e,t){for(;e.firstChild;)t.append(e.firstChild);console.assert(""===this.getInnerHTML(e))}removeNode(e){e.remove()}getElement(e,t=this.document){return t.querySelector(e)}getAllElements(e,t=this.document){return t.querySelectorAll(e)}getElementById(e,t=this.document){return t.getElementById(e)}getRightNeighbor(e){return e.nextElementSibling}getLeftNeighbor(e){return e.previousElementSibling}getParentNode(e){return e.parentElement}getNodeValue(e){return e.nodeValue}getLastElementChild(e){return e.lastElementChild}getFirstElementChild(e){return e.firstElementChild}getChildNodes(e){return e.childNodes}getChildren(e){return e.children}getElementOffsetParent(e){return e.offsetParent}getComputedStyle(e){return window.getComputedStyle(e)}getElementBCR(e){return e.getBoundingClientRect()}getElementOffsetLeft(e){return e?.offsetLeft}getElementOffsetHeight(e){return e?.offsetHeight}getElementOffsetWidth(e){return e?.offsetWidth}getElementOffsetTop(e){return e?.offsetTop}getElementOffsetBottom(e){return e?.offsetTop+e?.offsetHeight||void 0}getElementTagName(e){return e.tagName}getDataId(e){return e.dataset.id}getAttribute(e,t){if(!e||!t)return void(this._debug._&&console.warn("getAttribute() must have 2 params"));const o=t.charAt(0);if("."!==o&&"#"!==o||this._debug._&&console.log(`you're really sure ${t} is attribute selector?`),"["===o){this._assert&&console.assert("]"===t.at(-1),`the ${t} selector is not OK.`);const o=t.substring(1,t.length-1);return e.getAttribute(o)}e.getAttribute(t)}setAttribute(e,t,o){if(!e||!t)return void(this._debug._&&console.warn("setAttribute() must have 2 params"));const n=t.charAt(0);if("."!==n)if("#"!==n)if("["!==n)this._debug._&&console.log(`you're really sure ${t} is a selector?`);else{this._assert&&console.assert("]"===t.at(-1),`the ${t} selector is not OK.`);const n=t.substring(1,t.length-1);e.setAttribute(n,o||"")}else{const o=t.substring(1);e.id=o}else{const o=t.substring(1);e.classList.add(o)}}setStyles(e,t){Object.entries(t).forEach((([t,o])=>e.style[t]=o))}addClasses(e,...t){e.classList.add(...t)}removeAttribute(e,t){if(!e||!t)return void(this._debug._&&console.warn("removeAttribute() must have 2 params"));const o=t.charAt(0);if(this._assert&&console.assert(o.match(/[a-zA-Z#\[\.]/),`removeAttribute() expects a valid selector, but received ${t}`),"."!==o)if("#"!==o)if("["!==o)e.removeAttribute(attr);else{this._assert&&console.assert("]"===t.at(-1),`the ${t} selector is not OK.`);const o=t.substring(1,t.length-1);e.removeAttribute(o)}else{const o=t.substring(1);e.removeAttribute(o)}else{const o=t.substring(1);e.classList.remove(o)}}removeAllAttributes(e){for(;e.attributes.length>0;)e.removeAttribute(e.attributes[0].name)}removeClasses(e,...t){e.classList.remove(...t)}removeAllClasses(e){e.classList=""}removeAllStyles(e){e.style=""}getInnerHTML(e){if("string"==typeof e){const t=this.document.querySelector(e);return t?t.innerHTML:void 0}return e.innerHTML}setInnerHTML(e,t){if("string"==typeof e){const o=this.document.querySelector(e);o&&(o.innerHTML=t)}e.innerHTML=t}isDocumentBody(e){return"BODY"===e.tagName}isTextNode(e){return e.nodeType===Node.TEXT_NODE}isElementNode(e){return e.nodeType===Node.ELEMENT_NODE}hasClass(e,t){return e.classList.contains(t)}hasID(e,t){return e.id===t}hasAttribute(e,t){return e.hasAttribute(t)}}class r{constructor(e){this.config=e,this.charWidth="10px"}create(){return this._baseStyle()+this._testStyle()}_baseStyle(){return`\n\n@page {\n size: A4;\n /* 2 values: width then height */\n size: ${this.config.printWidth} ${this.config.printHeight};\n\n margin-left: ${this.config.printLeftMargin};\n margin-right: ${this.config.printRightMargin};\n margin-top: ${this.config.printTopMargin};\n margin-bottom: 0; /* hack */\n}\n\n${o.root} {\n /* reset user styles */\n display: block;\n\n /* for proper printable flow positioning */\n position: relative;\n\n /* to compensate for possible BG in the parent node */\n z-index: 1;\n\n /* set print styles: affects previews */\n margin: 0 auto;\n width: calc(${this.config.printWidth} - ${this.config.printLeftMargin} - ${this.config.printRightMargin});\n font-size: ${this.config.printFontSize};\n\n /* protection against unpredictability of margins */\n padding-top: .1px;\n padding-bottom: calc(2 * ${this.config.virtualPagesGap});\n}\n\n${o.contentFlowStart},\n${o.contentFlowEnd},\n${o.pageDivider} {\n display: block;\n}\n\n${o.virtualPaper} {\n display: grid;\n grid-template-columns: 1fr;\n grid-template-rows: minmax(min-content, max-content) minmax(min-content, max-content) 1fr minmax(min-content, max-content) minmax(min-content, max-content);\n place-items: stretch stretch;\n place-content: stretch stretch;\n width: calc(${this.config.printWidth} - ${this.config.printLeftMargin} - ${this.config.printRightMargin});\n height: ${this.config.printHeight};\n font-size: ${this.config.printFontSize};\n}\n\n${o.virtualPaper}::before {\n position: absolute;\n content: '';\n width: ${this.config.printWidth};\n height: ${this.config.printHeight};\n left: -${this.config.printLeftMargin};\n background-color: #fff;\n box-shadow: rgba(0, 0, 0, 0.1) 2px 2px 12px 0px;\n z-index: -1;\n}\n\n${o.paperFooter},\n${o.paperHeader} {\n display: block;\n position: relative;\n}\n\n${o.headerContent},\n${o.footerContent} {\n display: block;\n font-size: small;\n}\n\n${o.headerContent} p,\n${o.footerContent} p {\n margin: 0;\n}\n\n${o.headerContent} {\n padding-bottom: ${this.config.headerMargin};\n /* padding-top: 1px; */\n /* Page numbers: */\n padding-top: 10px;\n}\n\n${o.footerContent} {\n padding-top: ${this.config.footerMargin};\n /* padding-bottom: 1px; */\n /* Page numbers: */\n min-height: 32px;\n}\n\n${o.tocPageNumber} {\n min-width: 3ch;\n display: flex;\n justify-content: flex-end;\n align-items: baseline;\n}\n\n${o.pageNumberRoot} {\n display: flex;\n column-gap: 2px;\n position: absolute;\n /* left: 100%; */\n right: 0;\n text-align: right;\n line-height: 1;\n}\n\n${o.headerContent} ${o.pageNumberRoot} {\n top: 0;\n}\n\n${o.footerContent} ${o.pageNumberRoot} {\n bottom: 0;\n}\n\n${o.paperFlow} {\n display: block;\n position: absolute;\n width: 100%;\n z-index: -1;\n /* affect only screen */\n padding-bottom: 100px;\n}\n\n${o.contentFlow} {\n display: block;\n}\n\n${o.runningSafety} {\n display: block;\n /* ? should be checked and updated,\n but in the meantime, bring back the common solution:\n firefox ignores 0.1px size, so it's necessary to make a full-size pixel\n and take it into account in the calculations:\n padding-top: 1px;\n */\n padding-top: .1px;\n}\n\n${o.virtualPaperTopMargin} {\n display: block;\n height: ${this.config.printTopMargin};\n}\n\n${o.virtualPaperBottomMargin} {\n display: block;\n height: ${this.config.printBottomMargin};\n}\n\n${o.virtualPaperGap} {\n display: block;\n padding-top: ${this.config.virtualPagesGap};\n}\n\n${o.paperBody} {\n display: block;\n}\n\n${o.frontpageContent} {\n display: block;\n transform-origin: top center;\n padding: .1px;\n height: 100%;\n}\n\n.null {\n display: inline;\n padding: 0;\n margin: 0;\n font: 0;\n color: transparent;\n line-height: 0;\n border: none;\n outline: none;\n background: none;\n background-color: transparent;\n}\n\n${o.word},\n${o.textNode},\n${o.textLine},\n${o.textGroup},\n${o.neutral},\n${o.neutral} span {\n display: inline;\n padding: 0;\n margin: 0;\n font: inherit;\n color: inherit;\n line-height: inherit;\n background: none;\n background-color: transparent;\n}\n\n${o.textGroup} {\n display: block;\n}\n\n/*${o.splitted} ${o.textGroup} {\n display: inline;\n}*/\n\n${o.complexTextBlock} > ${o.textLine} {\n /* Firefox and inconsistent values of offset top for inline element */\n display: inline-block;\n // TODO: it removes spaces between parts of the string, it should leave the text inline after processing.\n}\n\n${o.textGroup} ${o.textLine} {\n display: inline;\n}\n\n${o.complexTextBlock} {\n display: block;\n}\n\n${o.complexTextBlock} ${o.complexTextBlock} {\n display: inline;\n}\n\n${o.printPageBreak} {\n display: block;\n}\n\n${o.printForcedPageBreak} {\n display: block;\n visibility: hidden;\n height: 0;\n overflow: hidden;\n}\n\n@media print {\n ${o.root} {\n /* to prevent a blank last page */\n padding: 0;\n }\n\n ${o.paperFlow} {\n padding-bottom: 0;\n }\n\n ${o.contentFlow} {\n -webkit-mask-image: none !important;\n mask-image: none !important;\n }\n\n ${o.printIgnore} {\n display: contents;\n }\n\n ${o.printHide},\n ${o.virtualPaper}::before,\n ${o.virtualPaperTopMargin},\n ${o.virtualPaperBottomMargin},\n ${o.virtualPaperGap} {\n display: none;\n }\n\n ${o.virtualPaper} {\n break-inside: avoid;\n height: auto;\n }\n\n ${o.paperBody} {\n break-inside: avoid;\n }\n\n ${o.printPageBreak} {\n break-after: page;\n padding: .1px;\n }\n\n ${o.printForcedPageBreak} {\n /* JUST MANUAL! */\n /* break-after: page; */\n }\n\n ${o.flagNoBreak} {\n /*\n TODO: temporary commented!\n When splitting blocks, printPageBreak falls INTO this element,\n and in Firefox it causes a blank page.\n FIX the split of complex blocks and check in Firefox.\n */\n /* break-inside: avoid-page; */\n }\n}\n\n/* arrangement */\n${o.topCutPart} {\n margin-top: 0 !important;\n border-top: none !important;\n}\n${o.bottomCutPart} {\n margin-bottom: 0 !important;\n border-bottom: none !important;\n}\n `}_testStyle(){return this.config.debugMode?`\n/* FOR TEST */\n${o.contentFlow} {\n background:repeating-linear-gradient(\n -45deg,\n rgba(222, 222, 222, .1),\n rgba(222, 222, 222, .1) 10px,\n rgba(222, 222, 222, .2) 10px,\n rgba(222, 222, 222, .2) 20px\n );\n}\n\n${o.virtualPaperGap} {\n background: #ff000020;\n}\n\n${o.paperFooter},\n${o.paperHeader} {\n background: #fa96ff20;\n}\n${o.paperBody} {\n background: #ffee0020;\n}\n${o.runningSafety} {\n background: #f200ff;\n}\n${o.frontpageContent} {\n background: #00fcff20;\n}\n\n${o.neutral} {\n background: #00ffee10;\n}\n\n${o.textNode} {\n background: #00ff0010;\n}\n\n${o.textGroup},\n${o.textLine} {\n background: #0000ff08;\n}\n\n `:""}}class l{constructor({config:e,DOM:t,node:o,selector:n}){this.success=!1,this.root,this.paperFlow,this.contentFlow,this.frontpageTemplate,this.headerTemplate,this.footerTemplate,this._initialRoot,this._contentRoot,this._config=e,this._debug=e.debugMode?{...e.debugConfig.layout}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._selector=n,this._node=o,this._customInitialRootSelector=e.initialRoot,this._defaultInitialRootSelector=n.init}create(){if(this._getTemplates(),this._insertStyle(),this._DOM.getElement(`style${this._selector.style}`)){if(this._createLayout(),this._DOM.getParentNode(this.root)!==this._initialRoot||this._DOM.getElementOffsetParent(this.paperFlow)!==this.root||this._DOM.getElementOffsetParent(this.contentFlow)!==this.root)return this._assert&&console.assert(this._DOM.getParentNode(this.root)===this._initialRoot,"Failed to insert the layout root into the DOM."),this._assert&&console.assert(this._DOM.getElementOffsetParent(this.paperFlow)===this.root,"Failed to insert the paperFlow element into the DOM."),void(this._assert&&console.assert(this._DOM.getElementOffsetParent(this.contentFlow)===this.root,"Failed to insert the contentFlow element into the DOM."));this.success=!0}else console.error("Failed to add print styles into the DOM.")}_getTemplates(){this._assert&&console.assert(this._selector.frontpageTemplate,"frontpageTemplate selector is missing"),this._assert&&console.assert(this._selector.headerTemplate,"headerTemplate selector is missing"),this._assert&&console.assert(this._selector.footerTemplate,"footerTemplate selector is missing"),this.frontpageTemplate=this._DOM.getInnerHTML(this._selector.frontpageTemplate),this.headerTemplate=this._DOM.getInnerHTML(this._selector.headerTemplate),this.footerTemplate=this._DOM.getInnerHTML(this._selector.footerTemplate)}_insertStyle(){const e=this._DOM.getElement("head"),t=this._DOM.body;if(!e&&!t)return void console.error("Check the structure of your document. We didn`t find HEAD and BODY tags. HTML2PDF4DOC expects valid HTML.");const o=this._node.create("style",new r(this._config).create());o?(this._DOM.setAttribute(o,this._selector.style,""),e?this._DOM.insertAtEnd(e,o):t?this._DOM.insertBefore(t,o):this._assert&&console.assert(!1,"We expected to find the HEAD and BODY tags.")):console.error("Failed to create print styles")}_createLayout(){this._getInitialRoot(),this._initialRoot?(this._debug._&&console.log("initial root:",this._initialRoot),this._createRoot(),this._createPaperFlow(),this._createContentFlow(),this._DOM.moveContent(this._initialRoot,this.contentFlow),this._DOM.insertAtEnd(this._initialRoot,this.root),this._DOM.insertAtEnd(this.root,this.paperFlow,this.contentFlow),this._insertContentFlowStartAndEnd(this.contentFlow),this._ignoreUnprintableEnvironment(this.root)):console.error("Failed to initialize the root element.")}_insertContentFlowStartAndEnd(e){const t=this._node.create(this._selector.contentFlowStart),o=this._node.create(this._selector.contentFlowEnd);return this._DOM.insertAtStart(e,t),this._DOM.insertAtEnd(e,o),{contentFlowStart:t,contentFlowEnd:o}}_getInitialRoot(){let e=this._customInitialRootSelector?this._DOM.getElement(this._customInitialRootSelector):this._DOM.getElement(this._defaultInitialRootSelector);if(!e){if(!this._DOM.body)return void console.error("We expected to find the BODY tag.");e=this._DOM.body,console.warn(`The printable area is currently unspecified and encompasses the entire contents of the BODY tag. To restrict the printed content to a specific area, include ${this._defaultInitialRootSelector} in the root element of the desired printing area.`)}return this._initialRoot=e,e}_createRoot(){const e=this._node.create(this._selector.root);return this.root=e,e}_createPaperFlow(){const e=this._node.create(this._selector.paperFlow);return this.paperFlow=e,e}_createContentFlow(){const e=this._node.create(this._selector.contentFlow);return this.contentFlow=e,e}_ignoreUnprintableEnvironment(e){if(e===this._DOM.body)return void(this._assert&&console.assert(!1,"misshapen root"));let t=this._DOM.getParentNode(e);this._DOM.setAttribute(t,this._selector.printIgnore),this._DOM.getChildNodes(t).forEach((t=>{if(t!==e&&this._DOM.isElementNode(t))this._DOM.setAttribute(t,this._selector.printHide);else{if(!this._node.isSignificantTextNode(t))return;this._DOM.setAttribute(this._node.wrapTextNode(t),this._selector.printHide)}})),this._DOM.isDocumentBody(t)||this._ignoreUnprintableEnvironment(t)}}class a{constructor({config:e,DOM:t,selector:o}){this._config=e,this._DOM=t,this._selector=o,this._debug=e.debugMode?{...e.debugConfig.node}:{},this._assert=!!e.consoleAssert,this._markupDebugMode=this._config.markupDebugMode}get(e,t=this._DOM){return this._debug._&&console.assert(e),this._DOM.getElement(e,t)}getAll(e,t=this._DOM){return this._debug._&&console.assert(e),"string"==typeof e&&(e=e.split(",").filter(Boolean)),this._assert&&console.assert(Array.isArray(e),"Selectors must be provided as an array or string (one selector or multiple selectors, separated by commas). Now the selectors are:",e),this._debug._&&console.assert(e.length>0,"getAll(selectors), selectors:",e),1===e.length?[...this._DOM.getAllElements(e[0],t)]:[...e].flatMap((e=>[...this._DOM.getAllElements(e,t)]))}getTableEntries(e){const t=[...e.children].reduce(((e,t)=>{const o=t.tagName;return"TBODY"===o?{...e,rows:[...e.rows,...t.children]}:"CAPTION"===o?(this.setFlagNoBreak(t),{...e,caption:t}):"COLGROUP"===o?(this.setFlagNoBreak(t),{...e,colgroup:t}):"THEAD"===o?(this.setFlagNoBreak(t),{...e,thead:t}):"TFOOT"===o?(this.setFlagNoBreak(t),{...e,tfoot:t}):"TR"===o?{...e,rows:[...e.rows,...t]}:{...e,unexpected:[...e.unexpected,...t]}}),{caption:null,thead:null,tfoot:null,rows:[],unexpected:[]});return t.unexpected.length>0&&this._debug._&&console.warn(`something unexpected is found in the table ${e}`),t}getPreparedChildren(e){if(this.isComplexTextBlock(e))return[...this._DOM.getChildren(e)];{let t=[...this._DOM.getChildNodes(e)].reduce(((e,t)=>{if(this.isSTYLE(t))return e;if(this.isSignificantTextNode(t))return e.push(this.wrapTextNode(t)),e;if(!this._DOM.getElementOffsetParent(t)){const o=this.getPreparedChildren(t);return o.length>0&&e.push(...o),e}return this._DOM.isElementNode(t)?(e.push(t),e):void 0}),[]);return this.isVerticalFlowDisrupted(t)&&(t=this._processInlineChildren(t)),t}}_processInlineChildren(e){let t=null;const o=[];return e.forEach((e=>{this.isInline(this._DOM.getComputedStyle(e))?(t||(t=this.createComplexTextBlock(),this.wrapNode(e,t),o.push(t)),this._DOM.insertAtEnd(t,e)):(t=null,o.push(e))})),o}clearTemplates(e){this.getAll("template",e).forEach((e=>this._DOM.removeNode(e)))}isSelectorMatching(e,t){if(!e||!t)return void(this._debug._&&console.warn("isSelectorMatching() must have 2 params","\n element: ",e,"\n selector: ",t));const o=t.charAt(0);if("."===o){const o=t.substring(1);return this._DOM.hasClass(e,o)}if("#"===o){const o=t.substring(1);return this._DOM.hasID(e,o)}if("["===o){this._debug._&&console.assert("]"===t.at(-1),`the ${t} selector is not OK.`);const o=t.substring(1,t.length-1);return this._DOM.hasAttribute(e,o)}return this._DOM.getElementTagName(e)===t.toUpperCase()}isSignificantTextNode(e){return!!this._DOM.isTextNode(e)&&this._DOM.getNodeValue(e).trim().length>0}isSTYLE(e){return"STYLE"===this._DOM.getElementTagName(e)}isIMG(e){return"IMG"===this._DOM.getElementTagName(e)}isSVG(e){return"svg"===this._DOM.getElementTagName(e)}isOBJECT(e){return"OBJECT"===this._DOM.getElementTagName(e)}isLiNode(e){return"LI"===this._DOM.getElementTagName(e)}isNeutral(e){return this.isSelectorMatching(e,this._selector.neutral)}isWrappedTextNode(e){return this.isSelectorMatching(e,this._selector.textNode)}isWrappedTextLine(e){return this.isSelectorMatching(e,this._selector.textLine)}isWrappedTextGroup(e){return this.isSelectorMatching(e,this._selector.textGroup)}isPageStartElement(e){return this.isSelectorMatching(e,this._selector.pageStartMarker)}isContentFlowStart(e){return this.isSelectorMatching(e,this._selector.contentFlowStart)}isAfterContentFlowStart(e){const t=this._DOM.getLeftNeighbor(e);return this.isSelectorMatching(t,this._selector.contentFlowStart)}isContentFlowEnd(e){return this.isSelectorMatching(e,this._selector.contentFlowEnd)}isComplexTextBlock(e){return this.isSelectorMatching(e,this._selector.complexTextBlock)}isNoBreak(e,t=this._DOM.getComputedStyle(e)){return this.isSelectorMatching(e,this._selector.flagNoBreak)||this.isWrappedTextLine(e)||this.isWrappedTextGroup(e)||this.isInlineBlock(t)||this.notSolved(e)}isNoHanging(e){return this.isSelectorMatching(e,this._selector.flagNoHanging)}isForcedPageBreak(e){return this.isSelectorMatching(e,this._selector.printForcedPageBreak)}isInline(e){const t=e.display;return"inline"===t||"inline-block"===t||"inline-table"===t||"inline-flex"===t||"inline-grid"===t}isInlineBlock(e){const t=e.display;return"inline-block"===t||"inline-table"===t||"inline-flex"===t||"inline-grid"===t}isGrid(e){return"grid"===e.display}isTableLikeNode(e,t=this._DOM.getComputedStyle(e)){return"TABLE"!==this._DOM.getElementTagName(e)&&["table"].includes(t.display)}isTableNode(e,t=this._DOM.getComputedStyle(e)){return"TABLE"===this._DOM.getElementTagName(e)||["table"].includes(t.display)}isPRE(e,t=this._DOM.getComputedStyle(e)){return["block"].includes(t.display)&&["pre","pre-wrap","pre-line","break-spaces","nowrap"].includes(t.whiteSpace)}isGridAutoFlowRow(e){const t=e.display,o=e.gridAutoFlow;return("grid"===t||"inline-grid"===t)&&"row"===o}isFullySPlitted(e){const t=this._DOM.getComputedStyle(e);return this.isPRE(e,t)||this.isTableNode(e,t)||this.isTableLikeNode(e,t)||this.isGridAutoFlowRow(t)}isSlough(e){return this._DOM.hasAttribute(e,"slough-node")}isFirstChildOfFirstChild(e,t){if(!e||!this._DOM.getParentNode(e))return!1;let o=e;for(;this._DOM.getParentNode(o)&&o!==t;){if(this._DOM.getFirstElementChild(this._DOM.getParentNode(o))!==o)return!1;o=this._DOM.getParentNode(o)}return o===t}isLastChildOfLastChild(e,t){if(!e||!this._DOM.getParentNode(e))return!1;let o=e;for(;this._DOM.getParentNode(o)&&o!==t;){if(this._DOM.getParentNode(o)===t){let e=this._DOM.getRightNeighbor(o);for(;!this._DOM.getElementOffsetHeight(e)&&!this._DOM.getElementOffsetWidth(e);)if(e=this._DOM.getRightNeighbor(e),this.isContentFlowEnd(e))return!0;return this.isContentFlowEnd(e)}if(this._DOM.getLastElementChild(this._DOM.getParentNode(o))!==o)return!1;o=this._DOM.getParentNode(o)}return o===t}isLineChanged(e,t){return this._DOM.getElementOffsetTop(t)-this._DOM.getElementOffsetBottom(e)>-2}isLineKept(e,t,o){const n=this._DOM.getElementOffsetBottom(e),s=this._DOM.getElementOffsetTop(t),i=n-s,r=i>=2;return o&&console.group("isLineKept?"),o&&console.log("\n",r,"\n","\n currentBottom",n,[e],"\n nextTop",s,[t],"\n delta",i),o&&console.groupEnd("isLineKept?"),r}findFirstChildParent(e,t){let o=this._DOM.getParentNode(e),n=null;for(;o&&o!==t;){if(e!==this._DOM.getFirstElementChild(o))return n;n=o,e=o,o=this._DOM.getParentNode(e)}return n}findLastChildParent(e,t){let o=this._DOM.getParentNode(e),n=null;for(;o&&o!==t;){if(e!==this._DOM.getLastElementChild(o))return n;n=o,e=o,o=this._DOM.getParentNode(e)}return n}isVerticalFlowDisrupted(e){return e.some(((e,t,o)=>{const n=e,s=o[t+1];if(!s)return!1;return this._DOM.getElementOffsetBottom(n)>this._DOM.getElementOffsetTop(s)}))}findBetterForcedPageStarter(e,t){let o=e;for(;;){const e=this.findFirstChildParent(o,t);if(e&&e!==o){o=e;continue}const n=this._DOM.getLeftNeighbor(o);if(!n||!this.isNoHanging(n))break;o=n}return o}findBetterPageStart(e,t,o){this._debug._&&console.groupCollapsed("β findBetterPageStart");let n=!1,s=!1;const i=this.getTop(t,o);this._debug._&&console.log("Start calculations:",{pageStart:e,lastPageStart:t,topLimit:i});let r=this.findFirstChildParentFromPage(e,i,o)||e;this._debug._&&console.log("betterCandidate:",r);let l=r;for(;;){const e=this.findPreviousNonHangingsFromPage(l,i,o);if(void 0===e){this._debug._&&console.warn("π«₯ previousCandidate",e),n=!0;break}if(this._debug._&&console.log("β’ previousCandidate",{previousCandidate:e}),e){l=e;continue}this._debug._&&console.log("β’ update currentCandidate",{previousCandidate:e});const t=this.findFirstChildParentFromPage(l,i,o);if(void 0===t){this._debug._&&console.warn("π«₯ firstChildParent",t),n=!0;break}if(this._debug._&&console.log("β’ firstChildParent",{firstChildParent:t}),!t){this._debug._&&console.log("β’ update currentCandidate",{firstChildParent:t});break}l=t}(l==t||this.getTop(l,o)<=i)&&(s=!0,this._debug._&&console.log("βοΈ Top page limit has been reached",r));const a=this._DOM.getLeftNeighbor(l);a==t&&(s=!0,this._debug._&&console.log("π Left limit has been reached (left neighbor is the last page start)",a,r));let h=n||s?r:l;return this.isAfterContentFlowStart(h)&&(h=e),this._debug._&&console.log({interruptedWithUndefined:n,interruptedWithLimit:s,pageStart:e,betterCandidate:r,currentCandidate:l,result:h}),this._debug._&&console.log("β end, return:",h),this._debug._&&console.groupEnd(),h}findAllForcedPageBreakInside(e){return this.getAll(this._selector.printForcedPageBreak,e)}findFirstChildParentFromPage(e,t,o){this._debug._&&console.groupCollapsed("β¬ findFirstChildParentFromPage");let n=null,s=e,i=!1;for(;;){const e=this._DOM.getParentNode(s);if(!e)break;if(!(this._DOM.getFirstElementChild(e)===s)){this._debug._&&console.warn({"!isFirstChild":e});break}if(this.isPageStartElement(e)||this.getTop(e,o)t?n:null}insertForcedPageBreakBefore(e){const t=this.create(this._selector.printForcedPageBreak);return this._DOM.insertBefore(e,t),t}insertForcedPageBreakAfter(e){const t=this.create(this._selector.printForcedPageBreak);return this._DOM.insertAfter(e,t),t}replaceNodeContentsWith(e,...t){this._DOM.setInnerHTML(e,""),this._DOM.insertAtEnd(e,...t)}fitElementWithinBoundaries({element:e,height:t,width:o,vspace:n,hspace:s}){const i=n/t,r=s/o,l=i{this._DOM.setAttribute(e,this._selector.topCutPart),this._DOM.setAttribute(e,this._selector.bottomCutPart)})),this._DOM.removeAttribute(e.at(0),this._selector.topCutPart),this._DOM.removeAttribute(e.at(-1),this._selector.bottomCutPart)}wrapNode(e,t){this._DOM.insertBefore(e,t),this._DOM.insertAtEnd(t,e)}wrapTextNode(e){if(!this.isSignificantTextNode(e))return;const t=this.create(this._selector.textNode);return this._DOM.insertBefore(e,t),this._DOM.insertAtEnd(t,e),t}getTop(e,t=null,o=0){if(!e)return void(this._debug._&&console.warn("element must be provided, but was received:",e,"\nThe function returned:",void 0));if(null===t)return this._DOM.getElementOffsetTop(e);if(!t)return void(this._debug._&&console.warn("root must be provided, but was received:",t,"\nThe function returned:",void 0));const n=this._DOM.getElementOffsetParent(e);if(!n)return void(this._debug._&&console.warn("Element has no offset parent.","\n element:",[e],"\n offsetParent:",n,"\n The function returned:",void 0));const s=this._DOM.getElementOffsetTop(e);return n===t?s+o:this.getTop(n,t,o+s)}getBottom(e,t=null){if(e){if(null===t)return this._DOM.getElementOffsetBottom(e);if(t)return this.getTop(e,t)+this._DOM.getElementOffsetHeight(e);this._debug._&&console.warn("root must be provided, but was received:",t,"\nThe function returned:",void 0)}else this._debug._&&console.warn("element must be provided, but was received:",e,"\nThe function returned:",void 0)}getHeightWithMargin(e){const t=parseInt(this._DOM.getComputedStyle(e).marginTop),o=parseInt(this._DOM.getComputedStyle(e).marginBottom);return this._DOM.getElementOffsetHeight(e)+t+o}getBottomWithMargin(e,t){if(!e)return;const o=this.getBottom(e,t);let n;const s=this.createNeutralBlock();this._DOM.insertAfter(e,s);const i=this.getTop(s,t);this._DOM.removeNode(s);if(i>=o)n=i;else{n=o+this._DOM.getComputedStyle(e).marginBottom}return n}getTopWithMargin(e,t){const o=parseInt(this._DOM.getComputedStyle(e).marginTop);return this.getTop(e,t)-o}getMaxWidth(e){const t=this.create();this._DOM.insertAtEnd(e,t);const o=this._DOM.getElementOffsetWidth(t);return this._DOM.removeNode(t),o}getEmptyNodeHeight(e,t=!0){const o=this.create();t&&this._DOM.setStyles(o,{padding:"0.1px"});const n=this._DOM.cloneNodeWrapper(e);"TABLE"===this._DOM.getElementTagName(e)&&this._DOM.setInnerHTML(n," |
"),this._DOM.insertAtEnd(o,n),this._DOM.insertBefore(e,o);const s=this._DOM.getElementOffsetHeight(o);return this._DOM.removeNode(o),s}getLineHeight(e){const t=this.createNeutral();this._DOM.setInnerHTML(t,"!"),this._DOM.setStyles(t,{display:"block"}),this._DOM.insertAtEnd(e,t);const o=this._DOM.getElementOffsetHeight(t);return this._DOM.removeNode(t),o}getTableRowHeight(e,t=0){const o=this._DOM.getElementOffsetTop(e),n=this._DOM.cloneNode(e),s="!
".repeat(t);[...n.children].forEach((e=>this._DOM.setInnerHTML(e,s))),this._DOM.insertBefore(e,n);const i=this._DOM.getElementOffsetTop(e);return this._DOM.removeNode(n),i-o}copyNodeWidth(e,t){this._DOM.setStyles(e,{width:`${this._DOM.getElementOffsetWidth(t)}px`,"min-width":`${this._DOM.getElementOffsetWidth(t)}px`})}lockTableWidths(e){this.copyNodeWidth(e,e),this.getAll("td",e).forEach((e=>this.copyNodeWidth(e,e)))}prepareSplittedNode(e){const t=e,o=this.splitByWordsGreedy(e),n=o.map((e=>{const t=this._DOM.createElement("span");return this._DOM.setInnerHTML(t,e+" "),t})),s=this.createTestNodeFrom(e);return this._DOM.insertAtEnd(s,...n),this._DOM.insertAtEnd(e,s),{splittedNode:t,nodeWords:o,nodeWordItems:n}}splitByLinesGreedy(e){return e.split(/(?<=\n)/)}splitByWordsGreedy(e){return(this._DOM.getNodeValue(e)||this._DOM.getInnerHTML(e)).split(/(?<=\s|-)/)}splitByWordsGreedyWithSpacesFilter(e){return(this._DOM.getNodeValue(e)||this._DOM.getInnerHTML(e)).trim().split(/(?<=\s|-)/).filter((e=>" "!=e))}notSolved(e){this._DOM.getElementTagName(e);return!1}}function h(e){return e?.length?e?.split(/\s+/).filter(Boolean):[]}class d{constructor({config:e,DOM:t,node:o,selector:n}){this._debug=e.debugMode?{...e.debugConfig.paragraph}:{},this._DOM=t,this._selector=n,this._node=o,this._minParagraphLeftLines=2,this._minParagraphDanglingLines=2,this._minParagraphBreakableLines=this._minParagraphLeftLines+this._minParagraphDanglingLines||2}init(){this._debug._&&console.log("π¨ init Paragraph")}split(e){return this._splitComplexTextBlockIntoLines(e)}_getLines(e){return Math.ceil(this._DOM.getElementOffsetHeight(e)/this._node.getLineHeight(e))}_splitComplexTextBlockIntoLines(e){if(this._debug._&&console.group("_splitComplexTextBlockIntoLines",[e]),this._node.isSelectorMatching(e,this._selector.splitted))return this._end(this._selector.splitted),this._DOM.getChildren(e);const t=this._node.getPreparedChildren(e),o=t.map((e=>{const t=this._node.getLineHeight(e),o=this._DOM.getElementOffsetHeight(e),n=this._DOM.getElementOffsetLeft(e),s=this._DOM.getElementOffsetTop(e);return{element:e,lines:Math.ceil(o/t),left:n,top:s,height:o,lineHeight:t,text:this._DOM.getInnerHTML(e)}}));this._debug._&&console.log("\nπΈ nodeChildren",[...t],"\nπΈ extendedChildrenArray",[...o]);const n=o.flatMap((e=>e.lines>1&&!this._node.isNoBreak(e.element)?this._breakItIntoLines(e.element):e.element));this._debug._&&console.log("\nπΈπΈπΈ\n partiallyLinedChildren",[...n]);const s=n.reduce(((e,t,o,n)=>(e||(e=[]),"BR"===this._DOM.getElementTagName(t)?(e.at(-1).push(t),e.push([]),this._debug._&&console.log("br; push:",t),e):!e.length||this._node.isLineChanged(e.at(-1).at(-1),t)?(e.push([t]),this._debug._&&console.log("βΌοΈ start new line:",t),e):0===e.at(-1).length||e.length&&this._node.isLineKept(e.at(-1).at(-1),t)?(this._debug._&&console.log("β¬ add to line:",t),e.at(-1).push(t),e):void(this._debug._&&console.assert(!0,"groupedPartiallyLinedChildren: An unexpected case of splitting a complex paragraph into lines.","\nOn the element:",t)))),[]);if(this._debug._&&console.log("π‘π‘π‘ groupedPartiallyLinedChildren \n",s.length,[...s]),s.length{let o;if(0==e.length)o=e[0],o.setAttribute("role","π«"),console.assert(0==e.length,"The string cannot be empty (_splitComplexTextBlockIntoLines)");else if(1==e.length)o=e[0];else{o=this._node.createTextGroup(),this._DOM.insertBefore(e[0],o),this._DOM.insertAtEnd(o,...e)}return o.dataset.child=t,o}));return this._end("OK _splitComplexTextBlockIntoLines"),this._DOM.setAttribute(e,this._selector.splitted),l}_breakItIntoLines(e){if(this._debug._&&console.group("_breakItIntoLines",[e]),this._node.isNoBreak(e))return this._end("isNoBreak"),e;if(this._node.isWrappedTextNode(e)){const t=this._breakWrappedTextNodeIntoLines(e);return this._end("TextNode newLines"),t}return this._end("(recursive _breakItIntoLines)"),this._processNestedInlineElements(e)}_processNestedInlineElements(e){this._debug._&&console.group("_processNestedInlineElements",[e]);const t=this._getNestedInlineChildren(e).flatMap((e=>this._getLines(e)>1?this._breakItIntoLines(e):e)),o=this._findNewLineStarts(t),n=o.map(((n,s)=>{const i=t[n],r=t[o[s+1]];return this._cloneAndCleanOutsideRange(e,i,r)}));return this._DOM.insertInsteadOf(e,...n),this._end("Nested Inline parts"),n}_cloneAndCleanOutsideRange(e,t,o){t&&t.setAttribute("split","start"),o&&o.setAttribute("split","end");let n=e.cloneNode(!0);if(t){let t=n.querySelector('[split="start"]'),o=t.previousElementSibling;for(;o;){let e=o;o=o.previousElementSibling,e.remove()}let s=t.parentElement;for(;s&&s!==e;){let e=s.previousElementSibling;for(;e;){let t=e;e=e.previousElementSibling,t.remove()}s=s.parentElement}t.removeAttribute("split")}if(o){let t=n.querySelector('[split="end"]'),o=t.nextElementSibling;for(;o;){let e=o;o=o.nextElementSibling,e.remove()}let s=t.parentElement;for(;s&&s!==e;){let e=s.nextElementSibling;for(;e;){let t=e;e=e.nextElementSibling,t.remove()}s=s.parentElement}t.remove()}return t&&t.removeAttribute("split"),o&&o.removeAttribute("split"),n}_getNestedInlineChildren(e){return[...this._DOM.getChildNodes(e)].reduce(((e,t)=>{if(this._node.isSignificantTextNode(t))return e.push(this._node.wrapTextNode(t)),e;if(!this._DOM.getElementOffsetParent(t)){const o=this._node.getPreparedChildren(t);return o.length>0&&e.push(...o),e}if(this._DOM.isElementNode(t)){return this._getNestedInlineChildren(t).forEach((t=>e.push(t))),e}}),[])}_makeWordsFromTextNode(e){const t=this._node.splitByWordsGreedy(e);this._debug._&&console.log("wordArray",t);const o=t.map(((e,t)=>this._node.createWord(e+"",t)));return this._debug._&&console.log("wrappedWordArray",o),{wordArray:t,wrappedWordArray:o}}_breakWrappedTextNodeIntoLines(e){e.classList.add("π _breakItIntoLines");const{wordArray:t,wrappedWordArray:o}=this._makeWordsFromTextNode(e);this._DOM.setInnerHTML(e,""),this._DOM.insertAtEnd(e,...o);const n=this._findNewLineStarts(o),s=n.reduce(((o,s,i)=>{const r=this._node.createTextLine(),l=n[i],a=n[i+1],h=t.slice(l,a).join("")+"";return this._DOM.setInnerHTML(r,h),this._DOM.insertBefore(e,r),o.push(r),o}),[]);return e.remove(),s}_findNewLineStarts(e){return e.reduce(((t,o,n)=>(n>0&&e[n-1].offsetTop+e[n-1].offsetHeight<=o.offsetTop&&t.push(n),t)),[0])}_end(e){this._debug._&&console.log(`%c β² ${e} `,"background:#eee;color:#888;padding: 0 1px 0 0;"),this._debug._&&console.groupEnd()}}const g="#66CC00",c=`color: ${g};font-weight:bold`,p=`border:1px solid ${g};background:#EEEEEE;color:${g};`,_="background:#999;color:#FFF;padding: 0 4px;";class u{constructor({config:e,DOM:t,node:o,selector:n,layout:s,referenceWidth:i,referenceHeight:r}){this._debug=e.debugMode?{...e.debugConfig.pages}:{},this._assert=!!e.consoleAssert,this._selector=n,this._node=o,this._noHangingSelectors=h(e.noHangingSelectors),this._pageBreakBeforeSelectors=h(e.pageBreakBeforeSelectors),this._pageBreakAfterSelectors=h(e.pageBreakAfterSelectors),this._forcedPageBreakSelectors=h(e.forcedPageBreakSelectors),this._noBreakSelectors=h(e.noBreakSelectors),this._garbageSelectors=h(e.garbageSelectors),this._DOM=t,this._paragraph=new d({config:e,DOM:t,node:o,selector:n}),this._paragraph.init(),this._root=s.root,this._contentFlow=s.contentFlow,this._referenceWidth=i,this._referenceHeight=r,this._minLeftLines=2,this._minDanglingLines=2,this._minBreakableLines=this._minLeftLines+this._minDanglingLines,this._minLeftRows=1,this._minDanglingRows=1,this._minBreakableRows=this._minLeftRows+this._minDanglingRows,this._minPreFirstBlockLines=3,this._minPreLastBlockLines=3,this._minPreBreakableLines=this._minPreFirstBlockLines+this._minPreLastBlockLines,this._minBreakableGridRows=4,this._imageReductionRatio=.8,this._signpostHeight=24,this._commonLineHeight=this._node.getLineHeight(this._root),this._minimumBreakableHeight=this._commonLineHeight*this._minBreakableLines,this._isFirefox="undefined"!=typeof InstallTrigger,this.pages=[]}calculate(){return this._removeGarbageElements(),this._prepareNoHangingElements(),this._prepareForcedPageBreakElements(),this._prepareNoBreakElements(),this._calculate(),this._debug._&&console.log("%c β Pages.calculate()",p,this.pages),this.pages}_removeGarbageElements(){if(this._garbageSelectors.length){this._node.getAll(this._garbageSelectors,this._contentFlow).forEach((e=>{this._DOM.removeNode(e)}))}}_prepareNoHangingElements(){if(this._noHangingSelectors.length){this._node.getAll(this._noHangingSelectors,this._contentFlow).forEach((e=>{this._node.setFlagNoHanging(e);const t=this._node.findLastChildParent(e,this._contentFlow);t&&this._node.setFlagNoHanging(t,"parent")}))}}_prepareNoBreakElements(){if(this._noBreakSelectors.length){this._node.getAll(this._noBreakSelectors,this._contentFlow).forEach((e=>this._node.setFlagNoBreak(e)))}}_prepareForcedPageBreakElements(){const e=this._pageBreakBeforeSelectors.length?this._node.getAll(this._pageBreakBeforeSelectors,this._contentFlow):[],t=this._pageBreakAfterSelectors.length?this._node.getAll(this._pageBreakAfterSelectors,this._contentFlow):[],o=this._node.getAll(this._forcedPageBreakSelectors,this._contentFlow);if(e.length){const t=e[0],o=this._node.findFirstChildParent(t,this._contentFlow)||t;this._node.isAfterContentFlowStart(o)&&e.shift()}if(t.length){const e=t.at(-1),o=this._node.findLastChildParent(e,this._contentFlow)||e,n=this._DOM.getRightNeighbor(o);this._node.isContentFlowEnd(n)&&t.pop()}e.length&&e.forEach((e=>{const t=this._node.findBetterForcedPageStarter(e,this._contentFlow);t&&this._node.insertForcedPageBreakBefore(t)})),o&&o.forEach((e=>{if(!this._node.isForcedPageBreak(e)){const t=this._node.findBetterForcedPageStarter(e,this._contentFlow);t&&this._node.insertForcedPageBreakBefore(t)}})),t.length&&t.forEach((e=>{const t=this._node.findLastChildParent(e,this._contentFlow);t&&(e=t),this._node.isForcedPageBreak(e.nextElementSibling)||this._node.insertForcedPageBreakAfter(e)}))}_calculate(){this._debug._&&console.groupCollapsed("β’β’ init data β’β’"),this._debug._&&console.log("this._referenceHeight",this._referenceHeight,"\n","this._noHangingSelectors",this._noHangingSelectors,"\n","this._pageBreakBeforeSelectors",this._pageBreakBeforeSelectors,"\n","this._pageBreakAfterSelectors",this._pageBreakAfterSelectors,"\n","this._forcedPageBreakSelectors",this._forcedPageBreakSelectors,"\n","this._noBreakSelectors",this._noBreakSelectors,"\n","isFirefox",this._isFirefox),this._debug._&&console.groupEnd("β’β’ init data β’β’"),this._registerPageStart(this._node.get(this._selector.contentFlowStart,this._contentFlow));const e=this._node.getBottomWithMargin(this._contentFlow,this._root);if(ethis._registerPageStart(e)));const t=this._node.getPreparedChildren(this._contentFlow);this._debug._&&console.groupCollapsed("%cπΈ children(contentFlow)",p),this._debug._&&console.log(t),this._debug._&&console.groupEnd("%cπΈ children(contentFlow)",p),this._parseNodes({array:t})}_registerPageStart(e,t=!1){if(this._debug._registerPageStart&&console.log("%cπ","background:yellow;font-weight:bold","\n improveResult:",t,"\n passed pageStart:",e),this._node.isPageStartElement(e))return;t&&(e=this._node.findBetterPageStart(e,this.pages.at(-1)?.pageStart,this._root));const o=this._node.getTopWithMargin(e,this._root),n=o+this._referenceHeight;this.pages.push({pageStart:e,pageBottom:n}),this._node.markPageStartElement(e,this.pages.length),this._debug._registerPageStart&&console.log(`%cπregister page ${this.pages.length}`,"background:yellow;font-weight:bold","\n improved result:",t,"\n pageTop:",o,"\n pageBottom:",n,"\n pageStart:",e)}_parseNodes({array:e,previous:t,next:o,parent:n,parentBottom:s}){this._debug._parseNodes&&console.log("π΅ _parseNodes","\narray:",[...e],"\ntracedParent:",n);for(let i=0;ig+this._referenceHeight;if(i&&p){if(d=void 0,this._debug._parseNode&&console.log("πͺ Tile: We got a tail from the lower shells of the last child. Giving up our βlast childβ rule here and will try to insert a page break at the end of some parent. ",{parentBottom:i,currentParentBottom:d,currentElementBottom:a,newPageBottom:l},{currentElement:o,parent:s}),a<=l){this._debug._parseNode&&console.log("πͺ Tile: currentElementBottom <= newPageBottom");const e=[];let t=o;for(this._debug._parseNode&&console.log("πͺ Tile: currentElement",o);t&&t!==s;)e.push({element:t,bottom:this._node.getBottomWithMargin(t,this._root)}),t=t.parentElement;if(t!==s)throw new Error("parent not found in the ancestor chain");e.push({element:s,bottom:i}),this._debug._parseNode&&console.log("πͺ Tile: _parents",e);let n=l;this._debug._parseNode&&console.log("πͺ Tile: _currentPageBottom = newPageBottom",n);for(let t=0;tn){this._debug._parseNode&&console.log("πͺ Tile: _parents[i].bottom > _currentPageBottom",e[t].bottom,">",n,e[t].element);const o=this._node.createNeutral();o.classList.add("service"),this._DOM.insertAtEnd(e[t].element,o),this._registerPageStart(o),this._debug._parseNode&&console.log("_registerPageStart",o),this._node.markProcessed(o,"node is ForcedPageBreak");const s=this.pages.at(-1).pageBottom;if(this._debug._parseNode&&console.log(n,s,i),!(i>s))return this._debug._parseNode&&console.log("%c END _parseNode (bottom tile of parents)",_),void(this._debug._parseNode&&console.groupEnd());this._debug._&&console.log("π§§ β’ parentBottom > justUpdatedPageBottom"),n=s,this._debug._parseNode&&console.log("new _currentPageBottom",n)}return this._debug._parseNode&&console.log("%c END _parseNode (bottom tile of parents)",_),void(this._debug._parseNode&&console.groupEnd())}this._debug._parseNode&&console.log("πͺ Tile: currentElementBottom > newPageBottom","DOING NOTHING")}const u=d||a;if(this.pages.at(-1).pageStart===o&&(this._node.isNoBreak(o)||u<=l))return this._node.markProcessed(o,"node is already registered and fits in the page"),this._debug._parseNode&&console.log("%c END _parseNode (node is already registered and fits in the next page)",_),void(this._debug._parseNode&&console.groupEnd());if(g>=l&&a-g){const e=s?this._node.getTopWithMargin(s,this._root):void 0,t=s&&e&&g-e>=this._referenceHeight;this._debug._parseNode&&console.warn("πͺ currentElementTop >= newPageBottom",g,">=",l,"\n beginningTail:",t,g-e,">=",this._referenceHeight),this._registerPageStart(o,!t)}if(this._node.isForcedPageBreak(o))return this._registerPageStart(o),this._node.markProcessed(o,"node is ForcedPageBreak"),this._debug._parseNode&&console.log("%c END _parseNode (isForcedPageBreak)",_),void(this._debug._parseNode&&console.groupEnd());this._debug._&&console.assert(this._DOM.getElementOffsetParent(o),"it is expected that the element has an offset parent",o);const m=this._node.getTop(n,this._root);if(this._debug._parseNode&&console.log(...r,"β’ newPageBottom",l,"\n","β’ nextElementTop",m),m<=l)this._debug._parseNode&&console.log("nextElementTop <= newPageBottom",m,"<=",l),this._node.markProcessed(o,"node fits"),this._node.findAllForcedPageBreakInside(o).forEach((e=>{this._node.markProcessed(e,"node is ForcedPageBreak (inside a node that fits)"),this._registerPageStart(e)}));else{if(this._debug._parseNode&&console.log("nextElementTop > newPageBottom",m,">",l),u<=l)return this._debug._parseNode&&console.log("currentBlockBottom <= newPageBottom",u,"<=",l,"\n register nextElement as pageStart"),this._node.isNoHanging(o)?(this._debug._parseNode&&console.log("currentElement fits / last, and _isNoHanging => move it to the next page"),this._node.markProcessed(o,"it fits & last & _isNoHanging => move it to the next page"),this._registerPageStart(o,!0),this._debug._parseNode&&console.log("%c END _parseNode (isNoHanging)",_),void(this._debug._parseNode&&console.groupEnd())):(this._registerPageStart(n),this._node.markProcessed(o,"fits, its bottom falls exactly on the cut"),this._node.markProcessed(n,"starts new page, its top is exactly on the cut"),this._debug._parseNode&&console.log("%c END _parseNode (currentElement fits, register the next element)",_),void(this._debug._parseNode&&console.groupEnd()));if(this._node.isSVG(o)||this._node.isIMG(o)||this._node.isOBJECT(o)){const e=this._node.isSVG(o)?this._node.createSignpost(o):o;let t=s?l-this._node.getTop(e,this._root):l-this._node.getTop(s,this._root);t-=i?i-this._node.getBottom(e,this._root):0;let r=this._referenceHeight-(s?this._node.getTop(e,this._root)-this._node.getTop(s,this._root):0);const a=this._DOM.getElementOffsetHeight(e),h=this._DOM.getElementOffsetWidth(e);if(this._debug._parseNode&&console.log("πΌοΈπΌοΈπΌοΈπΌοΈπΌοΈπΌοΈ\n",`H-space: ${t}, image Height: ${a}, image Width: ${h}`,o,"\n parent",s,"parentBottom",i,"currentParentBottom",d),athis._imageReductionRatio?(this._debug._parseNode&&console.log("Register next elements; πΌοΈπΌοΈπΌοΈ IMG RESIZE to availableImageNodeSpace:",t,o),this._node.markProcessed(o,`IMG with ratio ${g}, and next starts on next`),this._node.fitElementWithinBoundaries({element:o,height:a,width:h,vspace:t,hspace:this._referenceWidth}),this._registerPageStart(n),this._debug._parseNode&&console.log("%c END _parseNode πΌοΈ IMG scaled",_),void(this._debug._parseNode&&console.groupEnd())):(this._node.markProcessed(o,"IMG starts on next"),this._registerPageStart(e,!0),this._debug._parseNode&&console.log("πΌοΈ register Page Start",o),a>r&&(this._node.fitElementWithinBoundaries({element:o,height:a,width:h,vspace:r,hspace:this._referenceWidth}),this._node.markProcessed(o,"IMG starts on next and resized"),this._debug._parseNode&&console.log("πΌοΈ ..and fit it to full page",o)),this._debug._parseNode&&console.log("%c END",_),void(this._debug._parseNode&&console.groupEnd()))}if(o.style.height){this._debug._parseNode&&console.log("π₯ currentElement has HEIGHT",o.style.height);const e=l-g,t=m-g,s=e/t,i=this._referenceHeight/t;return this._debug._parseNode&&console.log("\nπ₯ currentElementTop",g,"\nπ₯ newPageBottom",l,"\nπ₯ availableSpace",e,"\nπ₯ currentElementContextualHeight",t,"\nπ₯ availableSpaceFactor",s,"\nπ₯ fullPageFactor",i),this._debug._parseNode&&console.assert(s<1),s>.8?(this._debug._parseNode&&console.log("π₯ availableSpaceFactor > 0.8: ",s),this._DOM.setStyles(o,{transform:`scale(${s})`,"transform-origin":"top center"}),this._registerPageStart(n),this._node.markProcessed(o,"processed as a image, has been scaled down within 20%, the next one starts a new page"),this._node.markProcessed(n,"the previous one was scaled down within 20%, and this one starts a new page."),this._debug._parseNode&&console.log("%c END _parseNode (has height & scale)",_),void(this._debug._parseNode&&console.groupEnd())):(i<1&&(this._debug._parseNode&&console.log("π₯ fullPageFactor < 1: ",i),this._node.markProcessed(o,"processed as a image, has been scaled down, and starts new page"),this._DOM.setStyles(o,{transform:`scale(${i})`,"transform-origin":"top center"})),this._debug._parseNode&&console.log("π₯ _registerPageStart",o),this._registerPageStart(o,!0),this._node.markProcessed(o,"processed as a image, starts new page"),this._debug._parseNode&&console.log("%c END _parseNode (has height & put on next page)",_),void(this._debug._parseNode&&console.groupEnd()))}this._debug._parseNode&&console.log("split or not? \n","currentBlockBottom",u),this._debug._parseNode&&console.log("currentParentBottom || currentElementBottom",{currentParentBottom:d,currentElementBottom:a},"currentBlockBottom > newPageBottom",u,">",l);const c=this._getProcessedChildren(o,l,this._referenceHeight);this._debug._parseNode&&console.log("try to break it and loop the children:",c);const p=c.length;this._debug._parseNode&&console.log(...r,"childrenNumber ",p),this._debug._parseNode&&console.log(...r,"currentElement ",o);const f=(e||i)&&s||o;if(p){const e=this._node.isFullySPlitted(o)||this._node.isSlough(o);this._debug._parseNode&&console.log({isFullySPlittedParent:e,parent:s,tracedParent:f}),this._parseNodes({array:c,previous:t,next:n,parent:e?void 0:f,parentBottom:e?void 0:h}),this._node.markProcessed(o,"getProcessedChildren and _parseNodes")}else this._debug._parseNode&&console.log(...r,"_registerPageStart (from _parseNode): \n",o),this._registerPageStart(o,!0),this._node.markProcessed(o,"doesn't fit, has no children, register it or parents")}this._debug._parseNode&&console.log("%c END _parseNode",_),this._debug._parseNode&&console.groupEnd()}_getProcessedChildren(e,t,o){const n=["%c_getProcessedChildren\n","color:white"];let s=[];if(this._node.isNoBreak(e))return this._debug._getProcessedChildren&&console.info(...n,"π§‘ isNoBreak",e),[];if(this._node.isComplexTextBlock(e))return this._debug._getProcessedChildren&&console.info(...n,"π ComplexTextBlock",e),this._paragraph.split(e)||[];if(this._node.isWrappedTextNode(e))return this._debug._getProcessedChildren&&console.info(...n,"π TextNode",e),this._paragraph.split(e)||[];const i=this._DOM.getComputedStyle(e);return this._node.isTableLikeNode(e,i)?(this._debug._getProcessedChildren&&console.info(...n,"π TABLE like",e),s=this._splitTableLikeNode(e,t,o,i)||[]):this._node.isTableNode(e,i)?(this._debug._getProcessedChildren&&console.info(...n,"π TABLE",e),s=this._splitTableNode(e,t,o,i)||[]):this._node.isPRE(e,i)?(this._debug._getProcessedChildren&&console.info(...n,"π PRE",e),s=this._splitPreNode(e,t,o)||[]):this._node.isGridAutoFlowRow(this._DOM.getComputedStyle(e))?(this._debug._getProcessedChildren&&console.info(...n,"π GRID"),s=this._splitGridNode(e,t,o)||[]):(this._debug._getProcessedChildren&&console.info(...n,"π some node",e),s=this._node.getPreparedChildren(e),this._debug._getProcessedChildren&&console.info(...n,"πΈ get element children ",s)),s}_splitPreNode(e,t,o,n){const s=n||this._DOM.getComputedStyle(e),i=["%c_splitPreNode\n","color:white"];this._debug._splitPreNode&&console.group("%c_splitPreNode","background:cyan"),this._debug._splitPreNode&&console.log(...i,"node",e);const r=this._node.getTop(e,this._root),l=this._DOM.getElementOffsetHeight(e),a=this._node.getLineHeight(e),h=this._node.getEmptyNodeHeight(e,!1);if(l1)return this._debug._splitPreNode&&console.log("%c END _splitPreNode TODO!",_),[];{if(this._DOM.isElementNode(d[0])){const e=d[0];return this._debug._splitPreNode&&console.warn("is Element Node",e),this._debug._splitPreNode&&console.log("%c END _splitPreNode ???????",_),[]}this._node.isWrappedTextNode(d[0])&&this._debug._splitPreNode&&console.warn(`is TEXT Node: ${d[0]}`);const n=d[0].wholeText,l=this._node.splitByLinesGreedy(n);if(l.length{const t=this._node.createWithFlagNoBreak();return this._DOM.setInnerHTML(t,e),t}));this._debug._splitPreNode&&console.log("linesFromNode",c),this._node.replaceNodeContentsWith(e,...c);const p=o-h;let u=0,m=[],f=t-r-h;const b=s.position;"relative"!=b&&this._DOM.setStyles(e,{position:"relative"});for(let t=0;tf&&(t&&m.push(t),t&&(u+=1),f=t?this._node.getTop(o,e)+p:p)}if(this._DOM.setStyles(e,{position:b}),!m.length)return this._debug._splitPreNode&&console.log("%c END _splitPreNode NO SPLIITERS",_),[];m.push(null),this._debug._splitPreNode&&console.log(...i,"splitters",m);const M=m.map(((t,o,n)=>{const s=this._DOM.cloneNodeWrapper(e);this._node.setFlagNoBreak(s);const i=n[o-1]||0,r=t||n[n.length];return this._DOM.insertAtEnd(s,...c.slice(i,r)),s}));return this._node.markPartNodesWithClass(M),this._debug._splitPreNode&&console.log(...i,"newPreElementsArray",M),this._node.replaceNodeContentsWith(e,...M),this._DOM.setStyles(e,{display:"contents"}),this._DOM.setAttribute(e,"[slough-node]",""),this._DOM.removeAllClasses(e),this._debug._splitPreNode&&console.log("%c END _splitPreNode",_),this._debug._splitPreNode&&console.groupEnd(),M}}_insertTableSplit({startId:e,endId:t,table:o,tableEntries:n}){const s=this._DOM.cloneNodeWrapper(o),i=n.rows.slice(e,t),r=this._node.createWithFlagNoBreak();return o.before(r),e&&this._DOM.insertAtEnd(r,this._node.createSignpost("(table continued)",this._signpostHeight)),this._DOM.insertAtEnd(r,this._node.createTable({wrapper:s,colgroup:this._DOM.cloneNode(n.colgroup),caption:this._DOM.cloneNode(n.caption),thead:this._DOM.cloneNode(n.thead),tbody:i}),this._node.createSignpost("(table continues on the next page)",this._signpostHeight)),r}_splitTableLikeNode(e,t,o,n){const s=n||this._DOM.getComputedStyle(e),i=this._node.getPreparedChildren(e),r=this._node.getTop(e,this._root),l=this._node.getEmptyNodeHeight(e),a=o-l;let h=i,d=0,g=[],c=t-r-l;const p=s.position;"relative"!=p&&this._DOM.setStyles(e,{position:"relative"});for(let t=0;tc&&(t&&g.push(t),t&&(d+=1),c=t?this._node.getTop(o,e)+a:a)}if(this._DOM.setStyles(e,{position:p}),!g.length)return this._debug._splitTableLikeNode&&console.log("splitters.length",g.length),[];g.push(null);const _=g.map(((t,o,n)=>{const s=this._DOM.cloneNodeWrapper(e);this._node.setFlagNoBreak(s),this._node.unmarkPageStartElement(s);const i=n[o-1]||0,r=t||n[n.length];return this._DOM.insertAtEnd(s,...h.slice(i,r)),s}));return this._node.markPartNodesWithClass(_),this._node.replaceNodeContentsWith(e,..._),this._DOM.removeAllClasses(e),this._DOM.removeAllStyles(e),this._DOM.setStyles(e,{display:"contents"}),this._DOM.setAttribute(e,"[slough-node]",""),_}_splitTableNode(e,t,o){const n=["%c_splitTableNode\n","color:white"];this._debug._splitTableNode&&console.time("_splitTableNode"),this._debug._splitTableNode&&console.group("%c_splitTableNode","background:cyan"),this._node.lockTableWidths(e);const s=this._node.getEmptyNodeHeight(e),i=this._node.getTableEntries(e);this._debug._splitTableNode&&console.log(...n,e,"\ntableEntries",i);const r=this._node.getTopWithMargin(e,this._root),l=this._DOM.getElementOffsetHeight(i.caption)||0,a=this._DOM.getElementOffsetHeight(i.thead)||0,h=this._DOM.getElementOffsetHeight(i.tfoot)||0,d=(l??0)*(this._isFirefox??0),g=t-r-s-this._signpostHeight,c=o-l-a-h-s-2*this._signpostHeight;this._debug._splitTableNode&&console.log(...n,"\n β’ tableFirstPartBottom",g,"\n","\n pageBottom",t,"\n - tableTop",r,"\n - tableCaptionHeight",l,"\n - tableTheadHeight",a,"\n - tableWrapperHeight",s,"\n - this._signpostHeight",this._signpostHeight,"\n","\n fullPageHeight",o,"\n - tableCaptionHeight",l,"\n - tableTheadHeight",a,"\n - tableTfootHeight",h,"\n - 2 * this._signpostHeight",2*this._signpostHeight,"\n - tableWrapperHeight",s,"\n = tableFullPartContentHeight",c);const p=e=>[...e.rows,...e.tfoot?[e.tfoot]:[]];let u=p(i),m=[],f=g;this._debug._splitTableNode&&console.log(this._node.getTop(u[1],e)-this._node.getBottom(u[0],e),"(row[1].top - row[0].bottom)"),this._node.getTop(u[0],e)>f&&(f=c,this._debug._splitTableNode&&console.log("The Row 0 goes to the 2nd page"));for(let o=0;of){const s=o,l=n,a=this._DOM.getElementOffsetHeight(l),h=this._node.getTableRowHeight(l,this._minBreakableLines),g=this._node.getTableRowHeight(l),b=r,M=this._node.isNoBreak(l),P=a>=h&&!M;if(this._debug._splitTableNode&&console.log(`%c β’ Row # ${o}: try to split`,"color:blueviolet"),P){this._debug._splitTableRow&&console.groupCollapsed(`Split The ROW.${s}`);const e=f-b-g,n=c-g,r=this._DOM.getChildren(l);let a;a=[...r].map(((o,i)=>{const r=this._node.getPreparedChildren(o);this._debug._splitTableRow&&console.groupCollapsed(`Split TD.${i} in ROW.${s}`);const l=this._getInternalBlockSplitters({rootNode:o,children:r,pageBottom:t,firstPartHeight:e,fullPageHeight:n});return this._debug._splitTableRow&&console.groupEnd(`Split TD.${i} in ROW.${s}`),l})),this._debug._splitTableRow&&console.log("π£ \ntheRowContentSlicesByTD",a);const h=a.some((e=>(this._debug._splitTableRow&&console.log("π£","\nobj.result.length",e.result.length,"\nobj.result[0]",e.result[0]),e.result.length&&null===e.result[0])));this._debug._splitTableRow&&console.log("π£","\nshouldFirstPartBeSkipped",h),h&&(a=[...r].map((e=>{const o=this._node.getPreparedChildren(e);return this._getInternalBlockSplitters({rootNode:e,children:o,pageBottom:t,firstPartHeight:n,fullPageHeight:n})}))),this._debug._splitTableRow&&console.log("π£","\n theRowContentSlicesByTD",a);const d=a.some((e=>e.result.length));if(this._debug._splitTableRow&&console.log("π£ ifThereIsSplit",d),d){const e=a.map((e=>{if(e.result.length)return this._createSlicesBySplitFlag(e.trail);{const t=this._node.createWithFlagNoBreak();t.classList.add("π£"),this._DOM.setStyles(t,{display:"contents"});const o=e.trail.map((e=>e.element));return this._DOM.insertAtEnd(t,...o),[t]}}));this._debug._splitTableRow&&console.log("π£ theTdContentElements",e);const t=Math.max(...e.map((e=>e.length)));this._debug._splitTableRow&&console.log("π£ theNewTrCount",t);const n=[];for(let o=0;o{const i=this._DOM.cloneNodeWrapper(n);e[s][o]&&this._DOM.insertAtEnd(i,e[s][o]),this._DOM.insertAtEnd(t,i)})),n.push(t)}this._debug._splitTableRow&&console.log("π£","\n theNewRows",n),this._DOM.setAttribute(l,".π«_must_be_removed"),this._debug._splitTableRow&&console.log("π£ splittingRow",l),this._DOM.insertInsteadOf(l,...n),i.rows.splice(s,1,...n),u=p(i),o-=1}this._debug._splitTableRow&&console.log(`%c END πͺ Split The ROW.${s}`,_),this._debug._splitTableRow&&console.groupEnd("END OF 'if makesSenseToSplitTheRow'")}else this._debug._splitTableNode&&console.log(`%c β’ Row # ${o}: small or noBreak`,"color:blueviolet"),o>=this._minLeftRows&&(m.push(o),this._debug._splitTableNode&&console.log(`%c β’ Row # ${o}: REGISTER as start, index >= ${this._minLeftRows} (_minLeftRows) `,"color:blueviolet")),f=this._node.getTop(u[o],e)+d+c}else this._debug._splitTableNode&&console.log(`%c β’ Row # ${o}: PASS ...`,"color:blueviolet")}if(this._debug._splitTableNode&&console.log(...n,"splitsIds",m),!m.length)return this._debug._splitTableNode&&console.log("%c END _splitTableNode !splitsIds.length",_),this._debug._splitTableNode&&console.groupEnd(),[];const b=u.length-1-this._minDanglingRows;m[m.length-1]>b&&(m[m.length-1]=b);const M=m.map(((t,o,n)=>this._insertTableSplit({startId:n[o-1]||0,endId:t,table:e,tableEntries:i})));this._debug._splitTableNode&&console.log(...n,"splits",M);const P=this._node.createWithFlagNoBreak();return e.before(P),this._DOM.insertAtEnd(P,this._node.createSignpost("(table continued)",this._signpostHeight),e),this._debug._splitTableNode&&console.timeEnd("_splitTableNode"),this._debug._splitTableNode&&console.log("%c END _splitTableNode",_),this._debug._splitTableNode&&console.groupEnd(),[...M,P]}_createSlicesBySplitFlag(e){this._debug._createSlicesBySplitFlag&&console.group("_createSlicesBySplitFlag");const t=this._node.createWithFlagNoBreak();this._DOM.setStyles(t,{display:"contents"}),t.classList.add("π§°");const o=[t];let n=[t],s=t;const i=e=>{if(0===e.length)return null;const t=e[0];let o=t;for(let t=1;t{this._debug._createSlicesBySplitFlag&&console.group("processChildren"),this._debug._createSlicesBySplitFlag&&console.log("*start* children",e);for(let t=0;t{const t=e.children?.length>0,l=e.split,a=e.element,h=e.id;if(this._debug._createSlicesBySplitFlag&&console.group(`processObj # ${h}`),this._debug._createSlicesBySplitFlag&&console.log("currentElement",a),a&&this._DOM.removeNode(a),l){this._debug._createSlicesBySplitFlag&&console.log("β’β’β’ hasSplitFlag"),n=n.map((e=>{const t=this._DOM.cloneNodeWrapper(e);return t.classList.add("π©"),t})),this._debug._createSlicesBySplitFlag&&console.log("β’ hasSplitFlag: NEW wrappers.map:",[...n]);const e=i(n);o.push(e),this._debug._createSlicesBySplitFlag&&console.log("β’ hasSplitFlag: slices.push(nextWrapper):",[...o]),s=n.at(-1),this._debug._createSlicesBySplitFlag&&console.log("β’ hasSplitFlag: currentTargetInSlice:",s)}if(t){this._debug._createSlicesBySplitFlag&&console.log("β’β’β’ hasChildren");const t=this._DOM.cloneNodeWrapper(a);n.push(t),this._debug._createSlicesBySplitFlag&&console.log("β’ hasChildren: wrappers.push(cloneCurrentElementWrapper)",t,[...n]),this._debug._createSlicesBySplitFlag&&console.log("β’ hasChildren: currentTargetInSlice (check):",s),s?(this._debug._createSlicesBySplitFlag&&console.log("β’ hasChildren: currentTargetInSlice","TRUE, add to existing",t),this._DOM.insertAtEnd(s,t)):(this._debug._createSlicesBySplitFlag&&console.log("β’ hasChildren: currentTargetInSlice","FALSE, init the first",t),t.classList.add("πfirst"),this._DOM.setStyles(t,{background:"yellow"}),o.push(t),this._debug._createSlicesBySplitFlag&&console.log("β’ hasChildren: slices.push(cloneCurrentElementWrapper)",t,[...o])),s=n.at(-1),this._debug._createSlicesBySplitFlag&&console.log("β’ hasChildren: currentTargetInSlice (=):",s),r(e.children,a)}else s=n.at(-1),this._debug._createSlicesBySplitFlag&&console.log("insert currentElement",a,"to target",s),this._DOM.insertAtEnd(s,a);this._debug._createSlicesBySplitFlag&&console.log(`%c END processObj # ${h}`,_),this._debug._createSlicesBySplitFlag&&console.groupEnd()};return this._debug._createSlicesBySplitFlag&&console.log("####### currentTargetInSlice (=):",s),r(e),this._debug._createSlicesBySplitFlag&&console.log("slices:",o),this._debug._createSlicesBySplitFlag&&o.forEach((e=>console.log("slice:",e))),this._debug._createSlicesBySplitFlag&&console.log("%c END _createSlicesBySplitFlag",_),this._debug._createSlicesBySplitFlag&&console.groupEnd(),o}_getInternalBlockSplitters({rootNode:e,rootComputedStyle:t,children:o,pageBottom:n,firstPartHeight:s,fullPageHeight:i,result:r=[],trail:l=[],indexTracker:a=[],stack:h=[]}){const d=t||this._DOM.getComputedStyle(e),g=d.position;"relative"!=g&&this._DOM.setStyles(e,{position:"relative"}),this._debug._getInternalBlockSplitters&&console.group("π _getInternalBlockSplitters");const c=e=>{e>=0?a.push(e):a.pop()},p=(e,t)=>{this._debug._getInternalBlockSplitters&&console.assert(t>=0,"registerResult: ID mast be provided",e);let o,n=l[t];if(this._debug._getInternalBlockSplitters&&console.groupCollapsed("πππ registerResult(element, id)"),this._debug._getInternalBlockSplitters&&console.log("\n element",e,"\n id",t,"\n theElementObject (trail[id])",n,"\n theElementIndexInStack",o),0==t){const e=(e=>{let t,o=null;for(let n=e.length-1;n>=0;n--){if(0!==e[n].id)return{item:o,index:t};o=e[n],t=n}return{item:o,index:t}})(h);this._debug._getInternalBlockSplitters&&console.log("ππ id == 0","\nπ [...stack]",[...h],"\nπ topParentElementFromStack",e),e.item&&(n=e.item,o=e.index)}this._debug._getInternalBlockSplitters&&console.log("π","\n theElementObject",n,"\n theElementIndexInStack",o,"\n [...indexTracker]",[...a]),0===o?(r.push(null),this._debug._getInternalBlockSplitters&&console.log("result.push(null)","\n\nπππ")):(r.push(n.element),n&&(n.split=!0),this._debug._getInternalBlockSplitters&&console.log("\n theElementObject",n,"\n theElementObject.element",n.element,"\n result.push(theElementObject.element)","\n\nπππ ")),this._debug._getInternalBlockSplitters&&console.log("%c END _getInternalBlockSplitters registerResult",_),this._debug._getInternalBlockSplitters&&console.groupEnd()};this._debug._getInternalBlockSplitters&&console.log("π result π",r,"\n\n","\n rootNode:",e,"\n children:",o,"\n pageBottom:",n,"\n firstPartHeight:",s,"\n fullPageHeight:",i,"\n\n\n","π stack",[...h]);for(let t=0;t floater \n ${m} > ${M} `),(this._node.isSVG(_)||this._node.isIMG(_))&&this._debug._getInternalBlockSplitters&&console.log("%cIMAGE ππ","color:red;text-weight:bold");const o=this._node.getBottomWithMargin(_,e);if(this._debug._getInternalBlockSplitters&&console.log("ππ current ???","\n currentElement",_,"\n currentElementBottom",o,"\n floater",M),o<=M)this._debug._getInternalBlockSplitters&&console.log("πππ currentElementBottom <= floater"),u&&(this._debug._getInternalBlockSplitters&&console.log("ππππ register nextElement"),l.push(b),p(u,t+1));else{this._debug._getInternalBlockSplitters&&console.log("πππ currentElementBottom > floater,\ntry to split",_);const o=this._getProcessedChildren(_,n,i);if(o.length)c(t),h.push(f),this._getInternalBlockSplitters({rootNode:e,rootComputedStyle:d,children:o,pageBottom:n,firstPartHeight:s,fullPageHeight:i,result:r,trail:l[t].children=[],indexTracker:a,stack:h}),h.pop(),this._debug._getInternalBlockSplitters&&console.log("πͺ back from _getInternalBlockSplitters;\n trail[i]",l[t]);else if(g&&this._node.isNoHanging(g)){console.warn("tst improveResult",g);let e=g;e=this._node.findFirstChildParent(e,this._contentFlow)||e;e=this._node.findPreviousNonHangingsFromPage(e,this.pages.at(-2)?.pageBottom,this._root)||e,this._debug._getInternalBlockSplitters&&console.log("previousElement _isNoHanging"),p(e,t-1)}else this._debug._getInternalBlockSplitters&&console.log(_,"currentElement has no children"),p(_,t)}}}return c(),this._DOM.setStyles(e,{position:g}),this._debug._getInternalBlockSplitters&&console.log("%c END _getInternalBlockSplitters",_),this._debug._getInternalBlockSplitters&&console.groupEnd(),{result:r,trail:l}}_splitGridNode(e,t,o){this._debug._splitGridNode&&console.group("%c_splitGridNode","background:#00FFFF");const n=this._node.getPreparedChildren(e);this._debug._splitGridNode&&console.log("π children",n),this._debug._splitGridNode&&console.groupCollapsed("make childrenGroups");const s=n.reduce(((e,t,o,n)=>{const s=this._DOM.getComputedStyle(t),i=s.getPropertyValue("grid-column-start"),r=s.getPropertyValue("grid-column-end"),l={element:t,start:"auto"===i?"auto":parseInt(s.getPropertyValue("grid-column-start")),end:"auto"===r?"auto":parseInt(s.getPropertyValue("grid-column-end")),top:this._DOM.getElementOffsetTop(t)};return!e.length||e.at(-1).at(-1).start>=l.start||"auto"===e.at(-1).at(-1).start||"auto"===l.start?(e.at(-1)&&this._node.isNoHanging(e.at(-1).at(-1).element)?(e.at(-1).push(l),this._debug._splitGridNode&&console.log("Add to group (after no-hang.)",l)):(e.push([l]),this._debug._splitGridNode&&console.log("Start new group:",l)),this._debug._splitGridNode&&console.log("result:",[...e]),e):e.length&&e.at(-1).at(-1).starte.map((e=>e.top)).sort())).map((e=>e[0])),r];this._debug._splitGridNode&&console.log("gridPseudoRowsTopPoints",l);const a=this._node.getTop(e,this._root),h=this._node.getEmptyNodeHeight(e),d=t-a-h,g=o-h;this._debug._splitGridNode&&console.log("\n β’ firstPartHeight",d,"\n β’ fullPagePartHeight",g);const c=l;let p=[],u=d;for(let e=0;eu&&(e>this._minLeftRows&&p.push(e-1),u=c[e-1]+g);this._debug._splitGridNode&&console.log("splitsIds",p);const m=(t,o)=>{this._debug._splitGridNode&&console.log(`=> insertGridSplit(${t}, ${o})`);const n=s.slice(t,o).flat().map((e=>e.element));this._debug._splitGridNode&&console.log("partEntries",n);const i=this._DOM.cloneNodeWrapper(e);return this._node.copyNodeWidth(i,e),this._node.setFlagNoBreak(i),e.before(i),this._DOM.insertAtEnd(i,...n),i},f=[...p.map(((e,t,o)=>m(o[t-1]||0,e))),e];return this._debug._splitGridNode&&console.log("splits",f),f.forEach(((e,t)=>this._DOM.setAttribute(e,"[part]",`${t}`))),this._node.setFlagNoBreak(e),this._debug._splitGridNode&&console.log("%c END _splitGridNode",_),this._debug._splitGridNode&&console.groupEnd(),f}}class m{constructor({config:e,DOM:t,node:o,selector:n,layout:s}){this._DOM=t,this._selector=n,this._node=o,this._frontpageTemplate=s.frontpageTemplate,this._headerTemplate=s.headerTemplate,this._footerTemplate=s.footerTemplate,this._paperBodySelector=n?.paperBody||".paperBody",this._paperHeaderSelector=n?.paperHeader||".paperHeader",this._paperFooterSelector=n?.paperFooter||".paperFooter",this._headerContentSelector=n?.headerContent||".headerContent",this._footerContentSelector=n?.footerContent||".footerContent",this._frontpageContentSelector=n?.frontpageContent||".frontpageContent",this._virtualPaperSelector=n?.virtualPaper||".virtualPaper",this._virtualPaperTopMarginSelector=n?.virtualPaperTopMargin||".virtualPaperTopMargin",this._virtualPaperBottomMarginSelector=n?.virtualPaperBottomMargin||".virtualPaperBottomMargin",this._pageNumberRootSelector=n?.pageNumberRoot||void 0,this._pageNumberCurrentSelector=n?.pageNumberCurrent||void 0,this._pageNumberTotalSelector=n?.pageNumberTotal||void 0,this._paperHeight,this._frontpageFactor,this.headerHeight,this.footerHeight,this.bodyHeight,this.bodyWidth,this._calculatePaperParams()}create({currentPage:e,totalPages:t}){const o=this._createPaperBody(this.bodyHeight),n=this._createPaperHeader(this._headerTemplate),s=this._createPaperFooter(this._footerTemplate);return this._createPaper({header:n,body:o,footer:s,currentPage:e,totalPages:t})}createFrontpage({currentPage:e,totalPages:t}){const o=this._createFrontpageContent(this._frontpageTemplate,this._frontpageFactor),n=this._createPaperBody(this.bodyHeight,o),s=this._createPaperHeader(this._headerTemplate),i=this._createPaperFooter(this._footerTemplate);return this._createPaper({header:s,body:n,footer:i,currentPage:e,totalPages:t})}createVirtualTopMargin(){return this._node.create(this._virtualPaperTopMarginSelector)}createVirtualBottomMargin(){return this._node.create(this._virtualPaperBottomMarginSelector)}_createPaper({header:e,body:t,footer:o,currentPage:n,totalPages:s}){const i=this._node.create(this._virtualPaperSelector);return this._DOM.insertAtEnd(i,this.createVirtualTopMargin(),e,t,o,this.createVirtualBottomMargin()),n&&s&&(this._setPageNumber(e,n,s),this._setPageNumber(o,n,s)),i}_createFrontpageContent(e,t){const o=this._node.create(this._frontpageContentSelector);return e&&this._DOM.setInnerHTML(o,e),t&&this._DOM.setStyles(o,{transform:`scale(${t})`}),o}_createPaperBody(e,t){const o=this._node.create(this._paperBodySelector);return this._DOM.setStyles(o,{height:e+"px"}),t&&this._DOM.insertAtEnd(o,t),o}_createPaperHeader(e){const t=this._node.create(this._paperHeaderSelector);if(e){const o=this._node.create(this._headerContentSelector);this._DOM.setInnerHTML(o,e),this._DOM.insertAtEnd(t,o)}return t}_createPaperFooter(e){const t=this._node.create(this._paperFooterSelector);if(e){const o=this._node.create(this._footerContentSelector);this._DOM.setInnerHTML(o,e),this._DOM.insertAtEnd(t,o)}return t}_setPageNumber(e,t,o){const n=this._pageNumberRootSelector?this._DOM.getElement(this._pageNumberRootSelector,e):this._pageNumberRootSelector;if(n){const e=this._DOM.getElement(this._pageNumberCurrentSelector,n),s=this._DOM.getElement(this._pageNumberTotalSelector,n);this._DOM.setInnerHTML(e,t),this._DOM.setInnerHTML(s,o)}}_calculatePaperParams(){const e=this._createPaperBody(),t=this._createFrontpageContent(this._frontpageTemplate),o=this._createPaperHeader(this._headerTemplate),n=this._createPaperFooter(this._footerTemplate),s=this._createPaper({header:o,body:e,footer:n}),i=this._node.create("#workbench");this._DOM.setStyles(i,{position:"absolute",left:"-3000px"}),this._DOM.insertAtEnd(i,s),this._DOM.insertAtStart(this._DOM.body,i);const r=this._DOM.getElementBCR(s).height,l=this._DOM.getElementOffsetHeight(o)||0,a=this._DOM.getElementOffsetHeight(n)||0,h=this._DOM.getElementOffsetHeight(e),d=this._DOM.getElementOffsetWidth(e);this._DOM.insertAtStart(e,t);const g=this._DOM.getElementOffsetHeight(e),c=g>h?h/g:1;this._DOM.removeNode(i),l>.2*r&&console.warn("It seems that your custom header is too high"),a>.15*r&&console.warn("It seems that your custom footer is too high"),c<1&&console.warn("It seems that your frontpage content is too large. We made it smaller to fit on the page. Check out how it looks! It might make sense to fix this with styles or reduce the text amount."),this._paperHeight=r,this.headerHeight=l,this.footerHeight=a,this.bodyHeight=h,this.bodyWidth=d,this._frontpageFactor=c}}class f{constructor({config:e,DOM:t,selector:o,node:n,pages:s,layout:i,paper:r}){this._config=e,this._debug=e.debugMode?{...e.debugConfig.preview}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._selector=o,this._node=n,this._virtualPaperGapSelector=o.virtualPaperGap,this._runningSafetySelector=o.runningSafety,this._printPageBreakSelector=o.printPageBreak,this._pageDivider=o.pageDivider,this._virtualPaper=o.virtualPaper,this._virtualPaperTopMargin=o.virtualPaperTopMargin,this._paperBody=o.paperBody,this._pages=s,this._root=i.root,this._contentFlow=i.contentFlow,this._paperFlow=i.paperFlow,this._paper=r,this._hasFrontPage=!!i.frontpageTemplate}create(){this._processFirstPage(),this._processOtherPages(),(!0===this._config.mask||"true"===this._config.mask)&&this._addMask()}_addMask(){const e=parseInt(this._config.virtualPagesGap),t=parseInt(this._config.printHeight),o=parseInt(this._config.printTopMargin),n=parseInt(this._config.printBottomMargin),s=parseInt(this._config.headerMargin),i=parseInt(this._config.footerMargin),r=this._paper.headerHeight,l=this._paper.footerHeight,a=this._paper.bodyHeight,h=r?Math.ceil(s/2):0,d=l?Math.ceil(i/2):0,g=r-h,c=l-d,p=a+h+d,_=o+g,u=t+e;this._assert&&console.assert(t===p+g+o+c+n,"Paper size calculation params do not match"),function({targetElement:e,maskStep:t,maskWindow:o,maskFirstShift:n}){e.style=`\n -webkit-mask-image: linear-gradient(\n black 0,\n black ${o}px,\n transparent ${o}px,\n transparent ${t}px\n );\n mask-image: linear-gradient(\n black 0,\n black ${o}px,\n transparent ${o}px,\n transparent ${t}px\n );\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-size: 100% ${t}px;\n mask-size: 100% ${t}px;\n -webkit-mask-position: 100% ${n}px;\n mask-position: 100% ${n}px;\n -webkit-mask-repeat: repeat-y;\n mask-repeat: repeat-y;\n -webkit-mask-origin: border-box;\n mask-origin: border-box;\n `}({targetElement:this._contentFlow,maskStep:u,maskWindow:p,maskFirstShift:_})}_processFirstPage(){let e;if(this._hasFrontPage){const t=this._insertFrontpageSpacer(this._contentFlow,this._paper.bodyHeight);this._pages.unshift({pageStart:t}),e=this._paper.createFrontpage({currentPage:1,totalPages:this._pages.length})}else e=this._paper.create({currentPage:1,totalPages:this._pages.length});this._insertIntoPaperFlow(e),this._insertIntoContentFlow(0)}_processOtherPages(){for(let e=1;e=0,`balancer is negative: ${n} < 0`,t)}}class b{constructor({config:e,DOM:t,selector:o,node:n,layout:s}){this._debugMode=e.debugMode,this._debug=e.debugMode?{...e.debugConfig.toc}:{},this._DOM=t,this._node=n,this._tocPageNumberSelector=e.tocPageNumberSelector,this._root=s.root,this._contentFlow=s.contentFlow,this._pageDividerSelector=o.pageDivider}render(){this._debugMode&&console.time("Processing TOC"),this._debug._&&console.log(`\nπ TOC: I am here!\n\ntocPageNumberSelector:\n β’ ${this._tocPageNumberSelector}\n pageDividerSelector:\n β’ ${this._pageDividerSelector}\n `);const e=this._node.getAll(this._tocPageNumberSelector,this._contentFlow);if(this._debug._&&console.log("π tocPageNumberBoxes",e.length),!e.length)return void(this._debug._&&console.log("π no valid toc"));const t=this._node.getAll(this._pageDividerSelector,this._contentFlow).reduce(((e,t,o)=>{const n=this._node.getTop(t,this._root)-1,s=this._DOM.getAttribute(t,"[page]");return e[n]=s,e}),{});this._debug._&&console.log("π dataFromPagesMarkers",t);const o=e.reduce(((e,t)=>{const o=this._DOM.getDataId(t),n=this._DOM.getElementById(o),s=this._node.getTop(n,this._root);return e[s]={box:t,id:o,targetTop:s},e}),{});this._debug._&&console.log("π dataFromTOC",o);const n={...t,...o};let s=0;this._debug._&&console.groupCollapsed("Processing obj");for(const e in n){const t=n[e];this._debug._&&console.log(`Processing ${e}: ${t}`),"string"==typeof t?s=t:(t.page=s,this._DOM.setInnerHTML(t.box,s))}this._debug._&&console.groupEnd("Processing obj"),this._debug._&&console.log("π tocObject",n),this._debugMode&&console.timeEnd("Processing TOC")}}class M{constructor({config:e,DOM:t,selector:o,node:n,layout:s}){this._config=e,this._selector=o,this._DOM=t,this._node=n,this._layout=s,this._root=s.root,this._assert=!!e.consoleAssert}init(){this._config.debugMode&&console.log("π i am Validator!");const e=`${this._selector.paperFlow} ${this._selector.virtualPaperGap}`,t=`${this._selector.contentFlow} ${this._selector.virtualPaperGap}`,o=[...this._DOM.getAllElements(e)],n=[...this._DOM.getAllElements(t)],s=o.map((e=>this._node.getTop(e))),i=n.map((e=>this._node.getTop(e,this._root))),r=s.reduce(((e,t,o)=>(t!==i[o]&&e.push(o+1),e)),[]);this._assert&&console.assert(!r.length,"Problems with preview generation on the following pages: ",r)}}const P="border:1px dashed #cccccc;background:#ffffff;color:#cccccc;";class O{constructor(e){this._debugMode=e.debugMode,this._preloader,this._preloaderTarget=document.querySelector(e.preloaderTarget)||document.body,this._preloaderBackground=e.preloaderBackground||"white"}create(){this._debugMode&&console.groupCollapsed("%c Preloader ",P),this._insertStyle(),this._preloader=document.createElement("div"),this._preloader.classList.add("lds-dual-ring"),this._preloaderTarget.append(this._preloader),this._debugMode&&console.groupEnd("%c Preloader ",P)}remove(){if(!this._preloader)return;let e=1;const t=setInterval((()=>{e<=.1&&(clearInterval(t),this._preloader.remove()),this._preloader.style.opacity=e,e-=.1*e}),50);this._debugMode&&console.log("%c Preloader removed ",P)}_insertStyle(){const e=document.querySelector("head"),t=document.createElement("style");t.append(document.createTextNode(this._css())),t.setAttribute("data-preloader-style",""),e.append(t)}_css(){return`\n /* PRELOADER */\n .lds-dual-ring {\n position: absolute;\n z-index: 99999;\n top: 0; left: 0; bottom: 0; right: 0;\n background: ${this._preloaderBackground};\n display: flex;\n justify-content: center;\n align-items: center;\n }\n /*\n .lds-dual-ring:after {\n content: " ";\n display: block;\n width: 64px;\n height: 64px;\n margin: 8px;\n border-radius: 50%;\n border: 6px solid #eee;\n border-color: #eee transparent #eee transparent;\n animation: lds-dual-ring 1.2s linear infinite;\n }\n @keyframes lds-dual-ring {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n */\n `}}class N{constructor(e){this._debugMode=e.debugMode}run(){let e=[...document.querySelectorAll("object")];this._debugMode&&console.log(e);let t=[];return e.forEach((e=>{const o=new Promise((t=>{e.addEventListener("load",(o=>{this._debugMode&&console.log("β° EVENT: object load",e.clientHeight,e.clientWidth,e),t()}))}));t.push(o)})),Promise.all(t)}}const S="color:Gray;border:1px solid;";console.info("[HTML2PDF4DOC] Version:","0.2.3");const D=document.currentScript.dataset,E=new class{constructor(e){this.params=e,this.debugMode=e.debugMode,this.preloader=e.preloader,this.selector=o,this.config}async render(){console.time("[HTML2PDF4DOC] Total time"),this.debugMode&&console.log("π document.readyState",document.readyState),document.addEventListener("readystatechange",(e=>{this.debugMode&&console.log("π readystatechange",document.readyState)})),this.debugMode&&console.time("β±οΈ await DOMContentLoaded time"),await new Promise((e=>{window.addEventListener("DOMContentLoaded",(t=>{this.debugMode&&console.log("β° EVENT: DOMContentLoaded"),e()}))})),this.debugMode&&console.timeEnd("β±οΈ await DOMContentLoaded time"),this.debugMode&&console.time("β±οΈ create Preloader time");const e=new O(this.params);"true"===this.preloader&&e.create(),this.debugMode&&console.timeEnd("β±οΈ create Preloader time"),this.debugMode&&console.time("β±οΈ Config time"),this.debugMode&&console.groupCollapsed("%c config ",S+"color:LightGray"),this.config={...n(this.params),debugConfig:s},this.debugMode&&console.groupEnd(),this.debugMode&&console.info("βοΈ Current config with debugConfig:",this.config),this.debugMode&&console.timeEnd("β±οΈ Config time"),this.config.consoleAssert&&console.info("π§§ Assertions enabled."),this.debugMode&&console.time("β±οΈ DOM helpers init time");const t=new i({DOM:window.document,config:this.config});this.debugMode&&console.timeEnd("β±οΈ DOM helpers init time"),this.debugMode&&console.time("β±οΈ node helpers init time");const o=new a({config:this.config,DOM:t,selector:this.selector});this.debugMode&&console.timeEnd("β±οΈ node helpers init time"),this.debugMode&&console.time("β±οΈ await window load time"),await new Promise((e=>{window.addEventListener("load",(t=>{this.debugMode&&console.log("β° EVENT: window load"),e()}))})),this.debugMode&&console.timeEnd("β±οΈ await window load time"),this.debugMode&&console.time("β±οΈ Layout time"),this.debugMode&&console.groupCollapsed("%c Layout ",S);const r=new l({config:this.config,DOM:t,selector:this.selector,node:o});if(r.create(),this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("β±οΈ Layout time"),!r.success)return void(this.debugMode&&console.error("Failed to create layout.\n\nWe have to interrupt the process of creating PDF preview."));this.debugMode&&console.info("%c calculate Paper params ",S),this.debugMode&&console.time("β±οΈ Paper time");const h=new m({config:this.config,DOM:t,selector:this.selector,node:o,layout:r});if(this.debugMode&&console.timeEnd("β±οΈ Paper time"),!h||!h.bodyHeight||!h.bodyWidth)return void(this.debugMode&&console.error("Failed to create paper calculations.\n\nWe have to interrupt the process of creating PDF preview."));this.debugMode&&console.time("β±οΈ Preprocess time"),this.debugMode&&console.groupCollapsed("%c Preprocess ",S),await new N(this.config).run(),this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("β±οΈ Preprocess time"),this.debugMode&&console.time("β±οΈ Pages time"),this.debugMode&&console.groupCollapsed("%c Pages ",S);const d=new u({config:this.config,DOM:t,selector:this.selector,node:o,layout:r,referenceHeight:h.bodyHeight,referenceWidth:h.bodyWidth}).calculate();this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("β±οΈ Pages time"),this.debugMode&&console.time("β±οΈ Preview time"),this.debugMode&&console.groupCollapsed("%c Preview ",S),new f({config:this.config,DOM:t,selector:this.selector,node:o,layout:r,paper:h,pages:d}).create(),this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("β±οΈ Preview time"),this.debugMode&&console.time("β±οΈ Toc time"),new b({config:this.config,DOM:t,selector:this.selector,node:o,layout:r}).render(),this.debugMode&&console.timeEnd("β±οΈ Toc time"),this.debugMode&&console.time("β±οΈ Validator time"),new M({config:this.config,DOM:t,selector:this.selector,node:o,layout:r}).init(),this.debugMode&&console.timeEnd("β±οΈ Validator time"),t.setAttribute(r.root,"[success]"),t.setAttribute(r.root,"[pages]",d.length),e.remove(),console.info("[HTML2PDF4DOC] Page count:",d.length),console.timeEnd("[HTML2PDF4DOC] Total time")}}(D),B="manual"===D.init;function T(){B&&E.render()}B&&console.info("HTML2PDF4DOC in manual initialization mode"),!B&&E.render(),HTML2PDF4DOC=t})();
\ No newline at end of file
diff --git a/tasks.py b/tasks.py
index 65967d0..725ec1a 100644
--- a/tasks.py
+++ b/tasks.py
@@ -263,7 +263,7 @@ def release(context, test_pypi=False, username=None, password=None):
run_invoke(
context,
f"""
- twine upload dist/html2pdf4doc-*.tar.gz
+ twine upload dist/html2pdf4doc-*.tar.gz dist/html2pdf4doc-*.whl
{repository_argument_or_none}
{user_password}
""",