From 769b4cf93a4109003fba01e0a69a7552419c0cb4 Mon Sep 17 00:00:00 2001 From: Stanislav Pankevich Date: Wed, 2 Jul 2025 22:14:55 +0200 Subject: [PATCH] Bump version to 0.0.19 --- html2pdf4doc/html2pdf4doc.py | 2 +- html2pdf4doc/html2pdf4doc_js/html2pdf4doc.min.js | 2 +- submodules/html2pdf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/html2pdf4doc/html2pdf4doc.py b/html2pdf4doc/html2pdf4doc.py index 20b5c8c..60bff76 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.18" +__version__ = "0.0.19" 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 d4ed564..1d6435c 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,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:()=>k});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,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"},i={printWidth:"148.5mm",printHeight:"210mm"};switch(e.printPaperSize){case"A5":case"a5":t={...t,...i};break;default:t={...t,...n}}t={...t,initialRoot:o.init,tocPageNumberSelector:o.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},r=document.createElement("div");return r.style="\n position:absolute;\n z-index:1000;\n left: 200%;\n ",document.body.append(r),Object.entries(s).forEach((([e,t])=>{r.style.width=t,s[e]=`${Math.trunc(r.getBoundingClientRect().width)}px`})),r.remove(),t={...t,...s},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 i={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 s{constructor({DOM:e,config:t}){this.document=e,this.body=e.body,this._debugMode=t.debugMode,this._debug=t.debugMode?{...t.debugConfig.DOM}:{}}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._debug._&&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._debug._&&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(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._debug._&&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}\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._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 console.assert(this._DOM.getParentNode(this.root)===this._initialRoot,"Failed to insert the layout root into the DOM."),console.assert(this._DOM.getElementOffsetParent(this.paperFlow)===this.root,"Failed to insert the paperFlow element into the DOM."),void 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(){console.assert(this._selector.frontpageTemplate,"frontpageTemplate selector is missing"),console.assert(this._selector.headerTemplate,"headerTemplate selector is missing"),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):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 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._markupDebugMode=this._config.markupDebugMode}get(e,t=this._DOM){return console.assert(e),this._DOM.getElement(e,t)}getAll(e,t=this._DOM){return console.assert(e),"string"==typeof e&&(e=e.split(",").filter(Boolean)),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),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)}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),i=this._DOM.getElementOffsetTop(t),s=n-i,r=s>=2;return o&&console.group("isLineKept?"),o&&console.log("\n",r,"\n","\n currentBottom",n,[e],"\n nextTop",i,[t],"\n delta",s),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,i=o[t+1];if(!i)return!1;return this._DOM.getElementOffsetBottom(n)>this._DOM.getElementOffsetTop(i)}))}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,n){let i=e;const s=this.getTop(t,n);for(;;){const e=this.findFirstChildParent(i,o);if(e&&e!==i){i=e;continue}const t=this.findPreviousNonHangingsFromPage(i,s,n);if(!t||t===i)break;i=t}return i}findAllForcedPageBreakInside(e){return this.getAll(this._selector.printForcedPageBreak,e)}findPreviousNonHangingsFromPage(e,t,o){let n=null,i=this._DOM.getLeftNeighbor(e);for(;i&&this.getTop(i,o)>t;){if(!this.isNoHanging(i))return n;if(this.isPageStartElement(i))return e;n=i,e=i,i=this._DOM.getLeftNeighbor(e)}return n}findSuitableNonHangingPageStart(e,t){let o=e,n=null;for(;;){const e=this._DOM.getLastElementChild(o);if(!e)break;if(this.isNoHanging(e)){n=e;break}o=e}if(n)for(o=n;o&&o!==e;){const t=o.parentElement;if(!t||t===e)break;if(this._DOM.getFirstElementChild(t)!==o)break;n=t,o=t}else n=e;return this.getTop(n)>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:i}){const s=n/t,r=i/o,l=s{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 i=this._DOM.getElementOffsetTop(e);return n===t?i+o:this.getTop(n,t,o+i)}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){const o=this.create();e&&this._DOM.insertAfter(e,o);const n=e?this.getTop(o,t):void 0;return this._DOM.removeNode(o),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 i=this._DOM.getElementOffsetHeight(o);return this._DOM.removeNode(o),i}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),i="!
".repeat(t);[...n.children].forEach((e=>this._DOM.setInnerHTML(e,i))),this._DOM.insertBefore(e,n);const s=this._DOM.getElementOffsetTop(e);return this._DOM.removeNode(n),s-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})),i=this.createTestNodeFrom(e);return this._DOM.insertAtEnd(i,...n),this._DOM.insertAtEnd(e,i),{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),i=this._DOM.getElementOffsetTop(e);return{element:e,lines:Math.ceil(o/t),left:n,top:i,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 i=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",i.length,[...i]),i.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,i)=>{const s=t[n],r=t[o[i+1]];return this._cloneAndCleanOutsideRange(e,s,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 i=t.parentElement;for(;i&&i!==e;){let e=i.previousElementSibling;for(;e;){let t=e;e=e.previousElementSibling,t.remove()}i=i.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 i=t.parentElement;for(;i&&i!==e;){let e=i.nextElementSibling;for(;e;){let t=e;e=e.nextElementSibling,t.remove()}i=i.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),i=n.reduce(((o,i,s)=>{const r=this._node.createTextLine(),l=n[s],a=n[s+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(),i}_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:i,referenceWidth:s,referenceHeight:r}){this._debug=e.debugMode?{...e.debugConfig.pages}:{},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=i.root,this._contentFlow=i.contentFlow,this._referenceWidth=s,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,n=this._DOM.getLeftNeighbor(o);this._node.isContentFlowStart(n)&&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){t&&(e=this._node.findBetterPageStart(e,this.pages.at(-1)?.pageStart,this._contentFlow,this._root));const o=this._node.getTopWithMargin(e,this._root)+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 pageBottom:",o,"\n pageStart:",e)}_parseNodes({array:e,previous:t,next:o,parent:n,parentBottom:i}){this._debug._parseNodes&&console.log("πŸ”΅ _parseNodes","\narray:",[...e],"\ntracedParent:",n);for(let s=0;s{this._node.markProcessed(e,"node is ForcedPageBreak (inside a node that fits)"),this._registerPageStart(e)}));else{if(this._debug._parseNode&&console.log("nextElementTop > newPageBottom",h,">",a),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=i?a-this._node.getTop(e,this._root):a-this._node.getTop(i,this._root);t-=s?s-this._node.getBottom(e,this._root):0;let r=this._referenceHeight-(i?this._node.getTop(e,this._root)-this._node.getTop(i,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}`,o,"\n parent",i,"parentBottom",s),lthis._imageReductionRatio?(this._debug._parseNode&&console.log("Register next elements; πŸ–ΌοΈπŸ–ΌοΈπŸ–ΌοΈ IMG RESIZE to availableImageNodeSpace:",t,o),this._node.markProcessed(o,`IMG with ratio ${d}, and next starts on next`),this._node.fitElementWithinBoundaries({element:o,height:l,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),l>r&&(this._node.fitElementWithinBoundaries({element:o,height:l,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=this._node.getTop(o,this._root),t=a-e,i=h-e,s=t/i,r=this._referenceHeight/i;return this._debug._parseNode&&console.log("\nπŸ₯ currentElementTop",e,"\nπŸ₯ newPageBottom",a,"\nπŸ₯ availableSpace",t,"\nπŸ₯ currentElementContextualHeight",i,"\nπŸ₯ availableSpaceFactor",s,"\nπŸ₯ fullPageFactor",r),console.assert(s<1),s>.8?(this._debug._parseNode&&console.log("πŸ₯ availableSpaceFactor > 0.8: ",s),this._DOM.setStyles(o,{transform:`scale(${s})`}),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())):(r<1&&(this._debug._parseNode&&console.log("πŸ₯ fullPageFactor < 1: ",r),this._node.markProcessed(o,"processed as a image, has been scaled down, and starts new page"),this._DOM.setStyles(o,{transform:`scale(${r})`})),this._debug._parseNode&&console.log("πŸ₯ _registerPageStart",o),this._registerPageStart(o),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()))}if(this._debug._parseNode&&console.log("split or not? \n","currentElementBottom",l),l<=a)return this._debug._parseNode&&console.log("currentElementBottom <= newPageBottom",l,"<=",a,"\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()));this._debug._parseNode&&console.log("currentElementBottom > newPageBottom",l,">",a);const d=this._getProcessedChildren(o,a,this._referenceHeight);this._debug._parseNode&&console.log("try to break it and loop the children:",d);const g=d.length;this._debug._parseNode&&console.log(...r,"childrenNumber ",g),this._debug._parseNode&&console.log(...r,"currentElement ",o);const c=e&&i||o;if(g){const e=this._node.isFullySPlitted(o)||this._node.isSlough(o);this._parseNodes({array:d,previous:t,next:n,parent:e?void 0:c,parentBottom:e?void 0:l}),this._node.markProcessed(o,"getProcessedChildren and _parseNodes")}else if(this._node.isNoHanging(t)){const e=this._node.findSuitableNonHangingPageStart(t,this.pages.at(-2)?.pageBottom)||o;this._registerPageStart(e,!0),this._node.markProcessed(o,"doesn't fit, has no children, isNoHanging(previousElement)"),this._node.markProcessed(t,"isNoHanging - register it or parents")}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 i=[];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 s=this._DOM.getComputedStyle(e);return this._node.isTableLikeNode(e,s)?(this._debug._getProcessedChildren&&console.info(...n,"πŸ’š TABLE like",e),i=this._splitTableLikeNode(e,t,o,s)||[]):this._node.isTableNode(e,s)?(this._debug._getProcessedChildren&&console.info(...n,"πŸ’š TABLE",e),i=this._splitTableNode(e,t,o,s)||[]):this._node.isPRE(e,s)?(this._debug._getProcessedChildren&&console.info(...n,"πŸ’š PRE",e),i=this._splitPreNode(e,t,o)||[]):this._node.isGridAutoFlowRow(this._DOM.getComputedStyle(e))?(this._debug._getProcessedChildren&&console.info(...n,"πŸ’œ GRID"),i=this._splitGridNode(e,t,o)||[]):(this._debug._getProcessedChildren&&console.info(...n,"πŸ’š some node",e),i=this._node.getPreparedChildren(e),this._debug._getProcessedChildren&&console.info(...n,"🚸 get element children ",i)),i}_splitPreNode(e,t,o,n){const i=n||this._DOM.getComputedStyle(e),s=["%c_splitPreNode\n","color:white"];this._debug._splitPreNode&&console.group("%c_splitPreNode","background:cyan"),this._debug._splitPreNode&&console.log(...s,"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=i.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(...s,"splitters",m);const M=m.map(((t,o,n)=>{const i=this._DOM.cloneNodeWrapper(e);this._node.setFlagNoBreak(i);const s=n[o-1]||0,r=t||n[n.length];return this._DOM.insertAtEnd(i,...c.slice(s,r)),i}));return this._node.markPartNodesWithClass(M),this._debug._splitPreNode&&console.log(...s,"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 i=this._DOM.cloneNodeWrapper(o),s=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:i,colgroup:this._DOM.cloneNode(n.colgroup),caption:this._DOM.cloneNode(n.caption),thead:this._DOM.cloneNode(n.thead),tbody:s}),this._node.createSignpost("(table continues on the next page)",this._signpostHeight)),r}_splitTableLikeNode(e,t,o,n){const i=n||this._DOM.getComputedStyle(e),s=this._node.getPreparedChildren(e),r=this._node.getTop(e,this._root),l=this._node.getEmptyNodeHeight(e),a=o-l;let h=s,d=0,g=[],c=t-r-l;const p=i.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 i=this._DOM.cloneNodeWrapper(e);this._node.setFlagNoBreak(i),this._node.unmarkPageStartElement(i);const s=n[o-1]||0,r=t||n[n.length];return this._DOM.insertAtEnd(i,...h.slice(s,r)),i}));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 i=this._node.getEmptyNodeHeight(e),s=this._node.getTableEntries(e);this._debug._splitTableNode&&console.log(...n,e,"\ntableEntries",s);const r=this._node.getTopWithMargin(e,this._root),l=this._DOM.getElementOffsetHeight(s.caption)||0,a=this._DOM.getElementOffsetHeight(s.thead)||0,h=this._DOM.getElementOffsetHeight(s.tfoot)||0,d=(l??0)*(this._isFirefox??0),g=t-r-i-this._signpostHeight,c=o-l-a-h-i-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",i,"\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",i,"\n = tableFullPartContentHeight",c);const p=e=>[...e.rows,...e.tfoot?[e.tfoot]:[]];let u=p(s),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 i=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),O=a>=h&&!M;if(this._debug._splitTableNode&&console.log(`%c β€’ Row # ${o}: try to split`,"color:blueviolet"),O){this._debug._splitTableRow&&console.groupCollapsed(`Split The ROW.${i}`);const e=f-b-g,n=c-g,r=this._DOM.getChildren(l);let a;a=[...r].map(((o,s)=>{const r=this._node.getPreparedChildren(o);this._debug._splitTableRow&&console.groupCollapsed(`Split TD.${s} in ROW.${i}`);const l=this._getInternalBlockSplitters({rootNode:o,children:r,pageBottom:t,firstPartHeight:e,fullPageHeight:n});return this._debug._splitTableRow&&console.groupEnd(`Split TD.${s} in ROW.${i}`),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 s=this._DOM.cloneNodeWrapper(n);e[i][o]&&this._DOM.insertAtEnd(s,e[i][o]),this._DOM.insertAtEnd(t,s)})),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),s.rows.splice(i,1,...n),u=p(s),o-=1}this._debug._splitTableRow&&console.log(`%c END πŸŸͺ Split The ROW.${i}`,_),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:s})));this._debug._splitTableNode&&console.log(...n,"splits",M);const O=this._node.createWithFlagNoBreak();return e.before(O),this._DOM.insertAtEnd(O,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,O]}_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],i=t;const s=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=s(n);o.push(e),this._debug._createSlicesBySplitFlag&&console.log("β€’ hasSplitFlag: slices.push(nextWrapper):",[...o]),i=n.at(-1),this._debug._createSlicesBySplitFlag&&console.log("β€’ hasSplitFlag: currentTargetInSlice:",i)}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):",i),i?(this._debug._createSlicesBySplitFlag&&console.log("β€’ hasChildren: currentTargetInSlice","TRUE, add to existing",t),this._DOM.insertAtEnd(i,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])),i=n.at(-1),this._debug._createSlicesBySplitFlag&&console.log("β€’ hasChildren: currentTargetInSlice (=):",i),r(e.children,a)}else i=n.at(-1),this._debug._createSlicesBySplitFlag&&console.log("insert currentElement",a,"to target",i),this._DOM.insertAtEnd(i,a);this._debug._createSlicesBySplitFlag&&console.log(`%c END processObj # ${h}`,_),this._debug._createSlicesBySplitFlag&&console.groupEnd()};return this._debug._createSlicesBySplitFlag&&console.log("####### currentTargetInSlice (=):",i),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:i,fullPageHeight:s,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:",i,"\n fullPageHeight:",s,"\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,s);if(o.length)c(t),h.push(f),this._getInternalBlockSplitters({rootNode:e,rootComputedStyle:d,children:o,pageBottom:n,firstPartHeight:i,fullPageHeight:s,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 i=n.reduce(((e,t,o,n)=>{const i=this._DOM.getComputedStyle(t),s=i.getPropertyValue("grid-column-start"),r=i.getPropertyValue("grid-column-end"),l={element:t,start:"auto"===s?"auto":parseInt(i.getPropertyValue("grid-column-start")),end:"auto"===r?"auto":parseInt(i.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=i.slice(t,o).flat().map((e=>e.element));this._debug._splitGridNode&&console.log("partEntries",n);const s=this._DOM.cloneNodeWrapper(e);return this._node.copyNodeWidth(s,e),this._node.setFlagNoBreak(s),e.before(s),this._DOM.insertAtEnd(s,...n),s},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:i}){this._DOM=t,this._selector=n,this._node=o,this._frontpageTemplate=i.frontpageTemplate,this._headerTemplate=i.headerTemplate,this._footerTemplate=i.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),i=this._createPaperFooter(this._footerTemplate);return this._createPaper({header:n,body:o,footer:i,currentPage:e,totalPages:t})}createFrontpage({currentPage:e,totalPages:t}){const o=this._createFrontpageContent(this._frontpageTemplate,this._frontpageFactor),n=this._createPaperBody(this.bodyHeight,o),i=this._createPaperHeader(this._headerTemplate),s=this._createPaperFooter(this._footerTemplate);return this._createPaper({header:i,body:n,footer:s,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:i}){const s=this._node.create(this._virtualPaperSelector);return this._DOM.insertAtEnd(s,this.createVirtualTopMargin(),e,t,o,this.createVirtualBottomMargin()),n&&i&&(this._setPageNumber(e,n,i),this._setPageNumber(o,n,i)),s}_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),i=this._DOM.getElement(this._pageNumberTotalSelector,n);this._DOM.setInnerHTML(e,t),this._DOM.setInnerHTML(i,o)}}_calculatePaperParams(){const e=this._createPaperBody(),t=this._createFrontpageContent(this._frontpageTemplate),o=this._createPaperHeader(this._headerTemplate),n=this._createPaperFooter(this._footerTemplate),i=this._createPaper({header:o,body:e,footer:n}),s=this._node.create("#workbench");this._DOM.setStyles(s,{position:"absolute",left:"-3000px"}),this._DOM.insertAtEnd(s,i),this._DOM.insertAtStart(this._DOM.body,s);const r=this._DOM.getElementBCR(i).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(s),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:i,layout:s,paper:r}){this._config=e,this._debug=e.debugMode?{...e.debugConfig.preview}:{},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=i,this._root=s.root,this._contentFlow=s.contentFlow,this._paperFlow=s.paperFlow,this._paper=r,this._hasFrontPage=!!s.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),i=parseInt(this._config.headerMargin),s=parseInt(this._config.footerMargin),r=this._paper.headerHeight,l=this._paper.footerHeight,a=this._paper.bodyHeight,h=r?Math.ceil(i/2):0,d=l?Math.ceil(s/2):0,g=r-h,c=l-d,p=a+h+d,_=o+g,u=t+e;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:i}){this._debugMode=e.debugMode,this._debug=e.debugMode?{...e.debugConfig.toc}:{},this._DOM=t,this._node=n,this._tocPageNumberSelector=e.tocPageNumberSelector,this._root=i.root,this._contentFlow=i.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,i=this._DOM.getAttribute(t,"[page]");return e[n]=i,e}),{});this._debug._&&console.log("πŸ“‘ dataFromPagesMarkers",t);const o=e.reduce(((e,t)=>{const o=this._DOM.getDataId(t),n=this._DOM.getElementById(o),i=this._node.getTop(n,this._root);return e[i]={box:t,id:o,targetTop:i},e}),{});this._debug._&&console.log("πŸ“‘ dataFromTOC",o);const n={...t,...o};let i=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?i=t:(t.page=i,this._DOM.setInnerHTML(t.box,i))}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:i}){this._config=e,this._selector=o,this._DOM=t,this._node=n,this._layout=i,this._root=i.root}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)],i=o.map((e=>this._node.getTop(e))),s=n.map((e=>this._node.getTop(e,this._root))),r=i.reduce(((e,t,o)=>(t!==s[o]&&e.push(o+1),e)),[]);console.assert(!r.length,"Problems with preview generation on the following pages: ",r)}}const O="border:1px dashed #cccccc;background:#ffffff;color:#cccccc;";class S{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 ",O),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 ",O)}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 ",O)}_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 D{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 N="color:Gray;border:1px solid;";console.info("[HTML2PDF4DOC] Version:","0.2.3");const P=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 S(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 ",N+"color:LightGray"),this.config={...n(this.params),debugConfig:i},this.debugMode&&console.groupEnd(),this.debugMode&&console.info("βš™οΈ Current config with debugConfig:",this.config),this.debugMode&&console.timeEnd("⏱️ Config time"),this.debugMode&&console.time("⏱️ DOM helpers init time");const t=new s({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 ",N);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 ",N),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 ",N),await new D(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 ",N);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 ",N),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")}}(P),T="manual"===P.init;function k(){T&&E.render()}T&&console.info("HTML2PDF4DOC in manual initialization mode"),!T&&E.render(),HTML2PDF4DOC=t})(); \ No newline at end of file +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 diff --git a/submodules/html2pdf b/submodules/html2pdf index 65d94fd..965065a 160000 --- a/submodules/html2pdf +++ b/submodules/html2pdf @@ -1 +1 @@ -Subproject commit 65d94fd18d6d7c48a72e1900c033a2696ae9b4b6 +Subproject commit 965065ac253478d5e1f00729eb57e1e0381ba812