-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathhtml2pdf4doc.min.js
More file actions
2 lines (2 loc) · 97.8 KB
/
html2pdf4doc.min.js
File metadata and controls
2 lines (2 loc) · 97.8 KB
1
2
/*! Version: 0.2.3 */
var HTML2PDF4DOC;(()=>{"use strict";var e={d:(t,n)=>{for(var o in n)e.o(n,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:n[o]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{init:()=>mt});var n={};e.r(n),e.d(n,{isAfterContentFlowStart:()=>F,isComplexTextBlock:()=>C,isContentFlowEnd:()=>v,isContentFlowStart:()=>y,isForcedPageBreak:()=>H,isFullySPlitted:()=>V,isGrid:()=>I,isGridAutoFlowRow:()=>j,isIMG:()=>D,isInline:()=>A,isInlineBlock:()=>$,isLiNode:()=>N,isNeutral:()=>k,isNoBreak:()=>x,isNoHanging:()=>L,isOBJECT:()=>E,isPRE:()=>G,isPageStartElement:()=>B,isSTYLE:()=>O,isSVG:()=>P,isSelectorMatching:()=>b,isSignificantTextNode:()=>M,isSlough:()=>z,isTableLikeNode:()=>R,isTableNode:()=>W,isWrappedTextGroup:()=>T,isWrappedTextLine:()=>w,isWrappedTextNode:()=>S});var o={};e.r(o),e.d(o,{isFirstChildOfFirstChild:()=>U,isLastChildOfLastChild:()=>Y,isLineChanged:()=>q,isLineKept:()=>K});var s={};e.r(s),e.d(s,{getBottom:()=>X,getBottomWithMargin:()=>Q,getEmptyNodeHeight:()=>ne,getHeightWithMargin:()=>Z,getLineHeight:()=>oe,getMaxWidth:()=>te,getTableEntries:()=>ie,getTableRowHeight:()=>se,getTop:()=>J,getTopWithMargin:()=>ee});var i={};e.r(i),e.d(i,{create:()=>re,createComplexTextBlock:()=>pe,createForcedPageBreak:()=>fe,createNeutral:()=>ae,createNeutralBlock:()=>le,createPrintPageBreak:()=>_e,createSignpost:()=>be,createTable:()=>Me,createTestNodeFrom:()=>ue,createTextGroup:()=>ge,createTextLine:()=>de,createTextNodeWrapper:()=>he,createWithFlagNoBreak:()=>ce,createWord:()=>me});var r={};e.r(r),e.d(r,{prepareSplittedNode:()=>Oe,splitByWordsGreedyWithSpacesFilter:()=>Ee,splitTextByLinesGreedy:()=>De,splitTextByWordsGreedy:()=>Pe});var a={};e.r(a),e.d(a,{markPageStartElement:()=>we,markPartNodesWithClass:()=>Be,markProcessed:()=>Ne,setFlagNoBreak:()=>ke,setFlagNoHanging:()=>Se,unmarkPageStartElement:()=>Te});var l={};e.r(l);var h={};e.r(h),e.d(h,{copyNodeWidth:()=>Fe,fitElementWithinBoundaries:()=>ye,lockTableWidths:()=>ve});var d={};e.r(d),e.d(d,{findAllForcedPageBreakInside:()=>Le,findBetterForcedPageStarter:()=>Ce,findBetterPageStart:()=>xe,findFirstChildParent:()=>$e,findFirstChildParentFromPage:()=>He,findLastChildParent:()=>Ie,findPreviousNonHangingsFromPage:()=>Ae,findSuitableNonHangingPageStart:()=>Re});var g={};e.r(g),e.d(g,{getPreparedChildren:()=>We,getProcessedChildren:()=>Ge});const c={init:"[html2pdf]",pageDivider:"html2pdf-page",pageStartMarker:"[html2pdf-page-start]",contentFlowStart:"html2pdf-content-flow-start",contentFlowEnd:"html2pdf-content-flow-end",style:"[html2pdf-style]",footerTemplate:"[html2pdf-footer]",headerTemplate:"[html2pdf-header]",frontpageTemplate:"[html2pdf-frontpage]",frontpageContent:"html2pdf-frontpage",headerContent:"html2pdf-header",footerContent:"html2pdf-footer",pageNumberRoot:"[html2pdf-page-number]",pageNumberCurrent:"[html2pdf-page-number-current]",pageNumberTotal:"[html2pdf-page-number-total]",root:"html2pdf-root",paperFlow:"html2pdf-paper-flow",contentFlow:"html2pdf-content-flow",virtualPaper:"html2pdf-virtual-paper",virtualPaperTopMargin:"html2pdf-virtual-paper-margin-top",virtualPaperBottomMargin:"html2pdf-virtual-paper-margin-bottom",virtualPaperGap:"html2pdf-virtual-paper-gap",paperBody:"html2pdf-paper-body",paperHeader:"html2pdf-paper-header",paperFooter:"html2pdf-paper-footer",runningSafety:"html2pdf-print-running",printPageBreak:"html2pdf-print-page-break",printIgnore:"[html2pdf-print-ignore]",printHide:"[html2pdf-print-hide]",neutral:"html2pdf-neutral",word:"html2pdf-word",textNode:"html2pdf-text-node",textLine:"html2pdf-text-line",textGroup:"html2pdf-text-group",complexTextBlock:"html2pdf-complex-text-block",printForcedPageBreak:"html2pdf-print-forced-page-break",split:"[html2pdf-split]",processed:"[html2pdf-processed]",flagNoBreak:"[html2pdf-flag-no-break]",flagNoHanging:"[html2pdf-flag-no-hanging]",topCutPart:".html2pdf-top-cut",bottomCutPart:".html2pdf-bottom-cut",tocPageNumber:"html2pdf-toc-page-number"};function _(e){let t={debugMode:!1,consoleAssert:!1,preloader:!1,preloaderTarget:"",preloaderBackground:"",mask:!0,noHangingSelectors:"",forcedPageBreakSelectors:"",pageBreakBeforeSelectors:"",pageBreakAfterSelectors:"",noBreakSelectors:"",tocPageNumberSelector:"html2pdf-toc-page-number",printLeftMargin:"21mm",printRightMargin:"21mm",printTopMargin:"12mm",printBottomMargin:"12mm",printFontSize:"12pt",printWidth:"210mm",printHeight:"297mm",headerMargin:"16px",footerMargin:"16px",virtualPagesGap:"16px",splitLabelHeight:"24px"};const n={printWidth:"210mm",printHeight:"297mm"},o={printWidth:"148.5mm",printHeight:"210mm"};switch((e=function(e){const t={...e};for(const e in t){const n=t[e];if("string"==typeof n){const o=n.toLowerCase();"true"===o||"1"===o?t[e]=!0:"false"!==o&&"0"!==o&&""!==o||(t[e]=!1)}}return t}(e)).printPaperSize){case"A5":case"a5":t={...t,...o};break;default:t={...t,...n}}t={...t,initialRoot:c.init,tocPageNumberSelector:c.tocPageNumber,...e},console.info("[HTML2PDF4DOC] Config:",t);const s={printLeftMargin:t.printLeftMargin,printRightMargin:t.printRightMargin,printTopMargin:t.printTopMargin,printBottomMargin:t.printBottomMargin,printFontSize:t.printFontSize,printWidth:t.printWidth,printHeight:t.printHeight,headerMargin:t.headerMargin,footerMargin:t.footerMargin,virtualPagesGap:t.virtualPagesGap},i=document.createElement("div");return i.style="\n position:absolute;\n z-index:1000;\n left: 200%;\n ",document.body.append(i),Object.entries(s).forEach((([e,t])=>{i.style.width=t,s[e]=`${Math.trunc(i.getBoundingClientRect().width)}px`})),i.remove(),t={...t,...s},t.noHangingSelectors=t.noHangingSelectors+" H1 H2 H3 H4 H5 H6",t.forcedPageBreakSelectors=t.forcedPageBreakSelectors+" "+c.printForcedPageBreak,t.debugMode&&console.info("Config with converted units:",t),t}const p={DOM:{_:!1},layout:{_:!0},pages:{_:!0,_parseNode:!1,_parseNodes:!1,_registerPageStart:!1},paper:{_:!1},preview:{_:!1},toc:{_:!1},node:{_:!1},paragraph:{_:!1},grid:{_:!1},pre:{_:!1},table:{_:!1},tableLike:{_:!1}};class u{constructor({DOM:e,config:t}){this.document=e,this.body=e.body,this._debug=t.debugMode?{...t.debugConfig.DOM}:{},this._assert=!!t.consoleAssert}createElement(e){return this.document.createElement(e)}createDocumentFragment(){return this.document.createDocumentFragment()}cloneNode(e){return e?.cloneNode(!0)}cloneNodeWrapper(e){return e?.cloneNode(!1)}insertBefore(e,...t){const n=t.filter((e=>null!=e));e.before(...n)}insertAfter(e,...t){const n=t.filter((e=>null!=e));e.after(...n)}insertAtEnd(e,...t){const n=t.filter((e=>null!=e));e.append(...n)}insertAtStart(e,...t){const n=t.filter((e=>null!=e));e.prepend(...n)}insertInsteadOf(e,...t){this.insertBefore(e,...t),e.remove()}wrap(e,t){return e.before(t),t.append(e),t}moveContent(e,t){for(;e.firstChild;)t.append(e.firstChild);this._assert&&console.assert(""===this.getInnerHTML(e))}replaceNodeContentsWith(e,...t){this.setInnerHTML(e,""),this.insertAtEnd(e,...t)}removeNode(e){e.remove()}getAll(e,t=this.document){return this._assert&&console.assert(e),"string"==typeof e&&(e=e.split(",").filter(Boolean)),this._assert&&console.assert(Array.isArray(e),"Selectors must be provided as an array or string (one selector or multiple selectors, separated by commas). Now the selectors are:",e),this._assert&&console.assert(e.length>0,"getAll(selectors), selectors:",e),1===e.length?[...this.getAllElements(e[0],t)]:[...e].flatMap((e=>[...this.getAllElements(e,t)]))}getElement(e,t=this.document){return this._assert&&console.assert(e),t.querySelector(e)}getAllElements(e,t=this.document){return this._assert&&console.assert(e),t.querySelectorAll(e)}getElementById(e,t=this.document){return t.getElementById(e)}getRightNeighbor(e){return e.nextElementSibling}getLeftNeighbor(e){return e.previousElementSibling}getParentNode(e){return e.parentElement}getNodeValue(e){return e.nodeValue}getLastElementChild(e){return e.lastElementChild}getFirstElementChild(e){return e.firstElementChild}getChildNodes(e){return e.childNodes}getChildren(e){return e.children}getElementOffsetParent(e){return e.offsetParent}getComputedStyle(e){return window.getComputedStyle(e)}getElementBCR(e){return e.getBoundingClientRect()}getElementOffsetLeft(e){return e?.offsetLeft}getElementOffsetHeight(e){return e?.offsetHeight}getElementOffsetWidth(e){return e?.offsetWidth}getElementOffsetTop(e){return e?.offsetTop}getElementOffsetBottom(e){return e?.offsetTop+e?.offsetHeight||void 0}getElementTagName(e){return e.tagName}getDataId(e){return e.dataset.id}getAttribute(e,t){if(!e||!t)return void(this._debug._&&console.warn("getAttribute() must have 2 params"));const n=t.charAt(0);if("."!==n&&"#"!==n||this._debug._&&console.log(`you're really sure ${t} is attribute selector?`),"["===n){this._assert&&console.assert("]"===t.at(-1),`the ${t} selector is not OK.`);const n=t.substring(1,t.length-1);return e.getAttribute(n)}e.getAttribute(t)}setAttribute(e,t,n){if(!e||!t)return void(this._debug._&&console.warn("setAttribute() must have 2 params"));const o=t.charAt(0);if("."!==o)if("#"!==o)if("["!==o)this._debug._&&console.log(`you're really sure ${t} is a selector?`);else{this._assert&&console.assert("]"===t.at(-1),`the ${t} selector is not OK.`);const o=t.substring(1,t.length-1);e.setAttribute(o,n||"")}else{const n=t.substring(1);e.id=n}else{const n=t.substring(1);e.classList.add(n)}}setStyles(e,t){Object.entries(t).forEach((([t,n])=>e.style[t]=n))}addClasses(e,...t){e.classList.add(...t)}removeAttribute(e,t){if(!e||!t)return void(this._debug._&&console.warn("removeAttribute() must have 2 params"));const n=t.charAt(0);if(this._assert&&console.assert(n.match(/[a-zA-Z#\[\.]/),`removeAttribute() expects a valid selector, but received ${t}`),"."!==n)if("#"!==n)if("["!==n)e.removeAttribute(attr);else{this._assert&&console.assert("]"===t.at(-1),`the ${t} selector is not OK.`);const n=t.substring(1,t.length-1);e.removeAttribute(n)}else{const n=t.substring(1);e.removeAttribute(n)}else{const n=t.substring(1);e.classList.remove(n)}}removeAllAttributes(e){for(;e.attributes.length>0;)e.removeAttribute(e.attributes[0].name)}removeClasses(e,...t){e.classList.remove(...t)}removeAllClasses(e){e.classList=""}removeAllStyles(e){e.style=""}getInnerHTML(e){if("string"==typeof e){const t=this.document.querySelector(e);return t?t.innerHTML:void 0}return e.innerHTML}setInnerHTML(e,t){if("string"==typeof e){const n=this.document.querySelector(e);n&&(n.innerHTML=t)}e.innerHTML=t}isDocumentBody(e){return"BODY"===e.tagName}isTextNode(e){return e.nodeType===Node.TEXT_NODE}isElementNode(e){return e.nodeType===Node.ELEMENT_NODE}hasClass(e,t){return e.classList.contains(t)}hasID(e,t){return e.id===t}hasAttribute(e,t){return e.hasAttribute(t)}}class m{constructor(e){this.config=e,this.charWidth="10px"}create(){return this._baseStyle()+this._testStyle()}_baseStyle(){return`\n\n@page {\n size: A4;\n /* 2 values: width then height */\n size: ${this.config.printWidth} ${this.config.printHeight};\n\n margin-left: ${this.config.printLeftMargin};\n margin-right: ${this.config.printRightMargin};\n margin-top: ${this.config.printTopMargin};\n margin-bottom: 0; /* hack */\n}\n\n${c.root} {\n /* reset user styles */\n display: block;\n\n /* for proper printable flow positioning */\n position: relative;\n\n /* to compensate for possible BG in the parent node */\n z-index: 1;\n\n /* set print styles: affects previews */\n margin: 0 auto;\n width: calc(${this.config.printWidth} - ${this.config.printLeftMargin} - ${this.config.printRightMargin});\n font-size: ${this.config.printFontSize};\n\n /* protection against unpredictability of margins */\n padding-top: .1px;\n padding-bottom: calc(2 * ${this.config.virtualPagesGap});\n}\n\n${c.contentFlowStart},\n${c.contentFlowEnd},\n${c.pageDivider} {\n display: block;\n /* to avoid the effect of margins of neighboring elements on the positioning of this marker: */\n overflow: auto;\n}\n\n${c.virtualPaper} {\n display: grid;\n grid-template-columns: 1fr;\n grid-template-rows: minmax(min-content, max-content) minmax(min-content, max-content) 1fr minmax(min-content, max-content) minmax(min-content, max-content);\n place-items: stretch stretch;\n place-content: stretch stretch;\n width: calc(${this.config.printWidth} - ${this.config.printLeftMargin} - ${this.config.printRightMargin});\n height: ${this.config.printHeight};\n font-size: ${this.config.printFontSize};\n}\n\n${c.virtualPaper}::before {\n position: absolute;\n content: '';\n width: ${this.config.printWidth};\n height: ${this.config.printHeight};\n left: -${this.config.printLeftMargin};\n background-color: #fff;\n box-shadow: rgba(0, 0, 0, 0.1) 2px 2px 12px 0px;\n z-index: -1;\n}\n\n${c.paperFooter},\n${c.paperHeader} {\n display: block;\n position: relative;\n}\n\n${c.headerContent},\n${c.footerContent} {\n display: block;\n font-size: small;\n}\n\n${c.headerContent} p,\n${c.footerContent} p {\n margin: 0;\n}\n\n${c.headerContent} {\n padding-bottom: ${this.config.headerMargin};\n /* padding-top: 1px; */\n /* Page numbers: */\n padding-top: 10px;\n}\n\n${c.footerContent} {\n padding-top: ${this.config.footerMargin};\n /* padding-bottom: 1px; */\n /* Page numbers: */\n min-height: 32px;\n}\n\n${c.tocPageNumber} {\n min-width: 3ch;\n display: flex;\n justify-content: flex-end;\n align-items: baseline;\n}\n\n${c.pageNumberRoot} {\n display: flex;\n column-gap: 2px;\n position: absolute;\n /* left: 100%; */\n right: 0;\n text-align: right;\n line-height: 1;\n}\n\n${c.headerContent} ${c.pageNumberRoot} {\n top: 0;\n}\n\n${c.footerContent} ${c.pageNumberRoot} {\n bottom: 0;\n}\n\n${c.paperFlow} {\n display: block;\n position: absolute;\n width: 100%;\n z-index: -1;\n /* affect only screen */\n padding-bottom: 100px;\n}\n\n${c.contentFlow} {\n display: block;\n}\n\n${c.runningSafety} {\n display: block;\n overflow: auto;\n}\n\n${c.virtualPaperTopMargin} {\n display: block;\n height: ${this.config.printTopMargin};\n}\n\n${c.virtualPaperBottomMargin} {\n display: block;\n height: ${this.config.printBottomMargin};\n}\n\n${c.virtualPaperGap} {\n display: block;\n padding-top: ${this.config.virtualPagesGap};\n}\n\n${c.paperBody} {\n display: block;\n}\n\n${c.frontpageContent} {\n display: block;\n transform-origin: top center;\n padding: .1px;\n height: 100%;\n}\n\n.null {\n display: inline;\n padding: 0;\n margin: 0;\n font: 0;\n color: transparent;\n line-height: 0;\n border: none;\n outline: none;\n background: none;\n background-color: transparent;\n}\n\n${c.word},\n${c.textNode},\n${c.textLine},\n${c.textGroup},\n${c.neutral},\n${c.neutral} span {\n display: inline;\n padding: 0;\n margin: 0;\n font: inherit;\n color: inherit;\n line-height: inherit;\n background: none;\n background-color: transparent;\n}\n\n${c.textGroup} {\n display: block;\n}\n\n/*${c.split} ${c.textGroup} {\n display: inline;\n}*/\n\n${c.complexTextBlock} > ${c.textLine} {\n /* Firefox and inconsistent values of offset top for inline element */\n display: inline-block;\n // TODO: it removes spaces between parts of the string, it should leave the text inline after processing.\n}\n\n${c.textGroup} ${c.textLine} {\n display: inline;\n}\n\n${c.complexTextBlock} {\n display: block;\n}\n\n${c.complexTextBlock} ${c.complexTextBlock} {\n display: inline;\n}\n\n${c.printPageBreak} {\n display: block;\n}\n\n${c.printForcedPageBreak} {\n display: block;\n visibility: hidden;\n height: 0;\n overflow: hidden;\n}\n\n@media print {\n ${c.root} {\n /* to prevent a blank last page */\n padding: 0;\n }\n\n ${c.paperFlow} {\n padding-bottom: 0;\n }\n\n ${c.contentFlow} {\n -webkit-mask-image: none !important;\n mask-image: none !important;\n }\n\n ${c.printIgnore} {\n display: contents;\n }\n\n ${c.printHide},\n ${c.virtualPaper}::before,\n ${c.virtualPaperTopMargin},\n ${c.virtualPaperBottomMargin},\n ${c.virtualPaperGap} {\n display: none;\n }\n\n ${c.virtualPaper} {\n break-inside: avoid;\n height: auto;\n }\n\n ${c.paperBody} {\n break-inside: avoid;\n }\n\n ${c.printPageBreak} {\n break-after: page;\n /* padding: .1px; */\n overflow: auto;\n }\n\n ${c.printForcedPageBreak} {\n /* JUST MANUAL! */\n /* break-after: page; */\n }\n\n ${c.flagNoBreak} {\n /*\n TODO: temporary commented!\n When splitting blocks, printPageBreak falls INTO this element,\n and in Firefox it causes a blank page.\n FIX the split of complex blocks and check in Firefox.\n */\n /* break-inside: avoid-page; */\n }\n}\n\n/* arrangement */\n${c.topCutPart} {\n margin-top: 0 !important;\n border-top: none !important;\n}\n${c.bottomCutPart} {\n margin-bottom: 0 !important;\n border-bottom: none !important;\n}\n `}_testStyle(){return this.config.debugMode?`\n/* FOR TEST */\n${c.contentFlow} {\n background:repeating-linear-gradient(\n -45deg,\n rgba(222, 222, 222, .1),\n rgba(222, 222, 222, .1) 10px,\n rgba(222, 222, 222, .2) 10px,\n rgba(222, 222, 222, .2) 20px\n );\n}\n\n${c.virtualPaperGap} {\n background: #ff000020;\n}\n\n${c.paperFooter},\n${c.paperHeader} {\n background: #fa96ff20;\n}\n${c.paperBody} {\n background: #ffee0020;\n}\n${c.runningSafety} {\n background: #f200ff;\n outline: 0.1px solid #f200ff88;\n}\n${c.frontpageContent} {\n background: #00fcff20;\n}\n\n${c.neutral} {\n background: #00ffee10;\n}\n\n${c.textNode} {\n background: #00ff0010;\n}\n\n${c.textGroup},\n${c.textLine} {\n background: #0000ff08;\n}\n\n `:""}}class f{constructor({config:e,DOM:t,node:n,selector:o}){this.success=!1,this.root,this.paperFlow,this.contentFlow,this.frontpageTemplate,this.headerTemplate,this.footerTemplate,this._initialRoot,this._contentRoot,this._config=e,this._debug=e.debugMode?{...e.debugConfig.layout}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._selector=o,this._node=n,this._customInitialRootSelector=e.initialRoot,this._defaultInitialRootSelector=o.init}create(){if(this._getTemplates(),this._insertStyle(),this._DOM.getElement(`style${this._selector.style}`)){if(this._createLayout(),this._DOM.getParentNode(this.root)!==this._initialRoot||this._DOM.getElementOffsetParent(this.paperFlow)!==this.root||this._DOM.getElementOffsetParent(this.contentFlow)!==this.root)return this._assert&&console.assert(this._DOM.getParentNode(this.root)===this._initialRoot,"Failed to insert the layout root into the DOM."),this._assert&&console.assert(this._DOM.getElementOffsetParent(this.paperFlow)===this.root,"Failed to insert the paperFlow element into the DOM."),void(this._assert&&console.assert(this._DOM.getElementOffsetParent(this.contentFlow)===this.root,"Failed to insert the contentFlow element into the DOM."));this.success=!0}else console.error("Failed to add print styles into the DOM.")}_getTemplates(){this._assert&&console.assert(this._selector.frontpageTemplate,"frontpageTemplate selector is missing"),this._assert&&console.assert(this._selector.headerTemplate,"headerTemplate selector is missing"),this._assert&&console.assert(this._selector.footerTemplate,"footerTemplate selector is missing"),this.frontpageTemplate=this._DOM.getInnerHTML(this._selector.frontpageTemplate),this.headerTemplate=this._DOM.getInnerHTML(this._selector.headerTemplate),this.footerTemplate=this._DOM.getInnerHTML(this._selector.footerTemplate)}_insertStyle(){const e=this._DOM.getElement("head"),t=this._DOM.body;if(!e&&!t)return void console.error("Check the structure of your document. We didn`t find HEAD and BODY tags. HTML2PDF4DOC expects valid HTML.");const n=this._node.create("style",new m(this._config).create());n?(this._DOM.setAttribute(n,this._selector.style,""),e?this._DOM.insertAtEnd(e,n):t?this._DOM.insertBefore(t,n):this._assert&&console.assert(!1,"We expected to find the HEAD and BODY tags.")):console.error("Failed to create print styles")}_createLayout(){this._getInitialRoot(),this._initialRoot?(this._debug._&&console.log("initial root:",this._initialRoot),this._createRoot(),this._createPaperFlow(),this._createContentFlow(),this._DOM.moveContent(this._initialRoot,this.contentFlow),this._DOM.insertAtEnd(this._initialRoot,this.root),this._DOM.insertAtEnd(this.root,this.paperFlow,this.contentFlow),this._insertContentFlowStartAndEnd(this.contentFlow),this._ignoreUnprintableEnvironment(this.root)):console.error("Failed to initialize the root element.")}_insertContentFlowStartAndEnd(e){const t=this._node.create(this._selector.contentFlowStart),n=this._node.create(this._selector.contentFlowEnd);return this._DOM.insertAtStart(e,t),this._DOM.insertAtEnd(e,n),{contentFlowStart:t,contentFlowEnd:n}}_getInitialRoot(){let e=this._customInitialRootSelector?this._DOM.getElement(this._customInitialRootSelector):this._DOM.getElement(this._defaultInitialRootSelector);if(!e){if(!this._DOM.body)return void console.error("We expected to find the BODY tag.");e=this._DOM.body,console.warn(`The printable area is currently unspecified and encompasses the entire contents of the BODY tag. To restrict the printed content to a specific area, include ${this._defaultInitialRootSelector} in the root element of the desired printing area.`)}return this._initialRoot=e,e}_createRoot(){const e=this._node.create(this._selector.root);return this.root=e,e}_createPaperFlow(){const e=this._node.create(this._selector.paperFlow);return this.paperFlow=e,e}_createContentFlow(){const e=this._node.create(this._selector.contentFlow);return this.contentFlow=e,e}_ignoreUnprintableEnvironment(e){if(e===this._DOM.body)return void(this._assert&&console.assert(!1,"misshapen root"));let t=this._DOM.getParentNode(e);this._DOM.setAttribute(t,this._selector.printIgnore),this._DOM.getChildNodes(t).forEach((t=>{if(t!==e&&this._DOM.isElementNode(t))this._DOM.setAttribute(t,this._selector.printHide);else{if(!this._node.isSignificantTextNode(t))return;{const e=this._node.createTextNodeWrapper();this._DOM.wrap(t,e),this._DOM.setAttribute(e,this._selector.printHide)}}})),this._DOM.isDocumentBody(t)||this._ignoreUnprintableEnvironment(t)}}function b(e,t){if(!e||!t)return void(this._debug._&&console.warn("isSelectorMatching() must have 2 params","\n element: ",e,"\n selector: ",t));const n=t.charAt(0);if("."===n){const n=t.substring(1);return this._DOM.hasClass(e,n)}if("#"===n){const n=t.substring(1);return this._DOM.hasID(e,n)}if("["===n){this._debug._&&console.assert("]"===t.at(-1),`the ${t} selector is not OK.`);const n=t.substring(1,t.length-1);return this._DOM.hasAttribute(e,n)}return this._DOM.getElementTagName(e)===t.toUpperCase()}function M(e){return!!this._DOM.isTextNode(e)&&this._DOM.getNodeValue(e).trim().length>0}function O(e){return"STYLE"===this._DOM.getElementTagName(e)}function D(e){return"IMG"===this._DOM.getElementTagName(e)}function P(e){return"svg"===this._DOM.getElementTagName(e)}function E(e){return"OBJECT"===this._DOM.getElementTagName(e)}function N(e){return"LI"===this._DOM.getElementTagName(e)}function k(e){return this.isSelectorMatching(e,this._selector.neutral)}function S(e){return this.isSelectorMatching(e,this._selector.textNode)}function w(e){return this.isSelectorMatching(e,this._selector.textLine)}function T(e){return this.isSelectorMatching(e,this._selector.textGroup)}function B(e){return this.isSelectorMatching(e,this._selector.pageStartMarker)}function y(e){return this.isSelectorMatching(e,this._selector.contentFlowStart)}function F(e){const t=this._DOM.getLeftNeighbor(e);return this.isSelectorMatching(t,this._selector.contentFlowStart)}function v(e){return this.isSelectorMatching(e,this._selector.contentFlowEnd)}function C(e){return this.isSelectorMatching(e,this._selector.complexTextBlock)}function x(e,t=this._DOM.getComputedStyle(e)){return this.isSelectorMatching(e,this._selector.flagNoBreak)||this.isWrappedTextLine(e)||this.isWrappedTextGroup(e)||this.isInlineBlock(t)||this.notSolved(e)}function L(e){return this.isSelectorMatching(e,this._selector.flagNoHanging)}function H(e){return this.isSelectorMatching(e,this._selector.printForcedPageBreak)}function A(e){const t=e.display;return"inline"===t||"inline-block"===t||"inline-table"===t||"inline-flex"===t||"inline-grid"===t}function $(e){const t=e.display;return"inline-block"===t||"inline-table"===t||"inline-flex"===t||"inline-grid"===t}function I(e){return"grid"===e.display}function R(e,t=this._DOM.getComputedStyle(e)){return"TABLE"!==this._DOM.getElementTagName(e)&&["table"].includes(t.display)}function W(e,t=this._DOM.getComputedStyle(e)){return"TABLE"===this._DOM.getElementTagName(e)||["table"].includes(t.display)}function G(e,t=this._DOM.getComputedStyle(e)){return["block"].includes(t.display)&&["pre","pre-wrap","pre-line","break-spaces","nowrap"].includes(t.whiteSpace)}function j(e){const t=e.display,n=e.gridAutoFlow;return("grid"===t||"inline-grid"===t)&&"row"===n}function V(e){const t=this._DOM.getComputedStyle(e);return this.isPRE(e,t)||this.isTableNode(e,t)||this.isTableLikeNode(e,t)||this.isGridAutoFlowRow(t)}function z(e){return this._DOM.hasAttribute(e,"slough-node")}function U(e,t){if(!e||!this._DOM.getParentNode(e))return!1;let n=e;for(;this._DOM.getParentNode(n)&&n!==t;){if(this._DOM.getFirstElementChild(this._DOM.getParentNode(n))!==n)return!1;n=this._DOM.getParentNode(n)}return n===t}function Y(e,t){if(!e||!this._DOM.getParentNode(e))return!1;let n=e;for(;this._DOM.getParentNode(n)&&n!==t;){if(this._DOM.getParentNode(n)===t){let e=this._DOM.getRightNeighbor(n);for(;!this._DOM.getElementOffsetHeight(e)&&!this._DOM.getElementOffsetWidth(e);)if(e=this._DOM.getRightNeighbor(e),this.isContentFlowEnd(e))return!0;return this.isContentFlowEnd(e)}if(this._DOM.getLastElementChild(this._DOM.getParentNode(n))!==n)return!1;n=this._DOM.getParentNode(n)}return n===t}function q(e,t){return this._DOM.getElementOffsetTop(t)-this._DOM.getElementOffsetBottom(e)>-2}function K(e,t,n){const o=this._DOM.getElementOffsetBottom(e),s=this._DOM.getElementOffsetTop(t),i=o-s,r=i>=2;return n&&console.group("isLineKept?"),n&&console.log("\n",r,"\n","\n currentBottom",o,[e],"\n nextTop",s,[t],"\n delta",i),n&&console.groupEnd("isLineKept?"),r}function J(e,t=null,n=0){if(!e)return void(this._debug._&&console.warn("element must be provided, but was received:",e,"\nThe function returned:",void 0));if(null===t)return this._DOM.getElementOffsetTop(e);if(!t)return void(this._debug._&&console.warn("root must be provided, but was received:",t,"\nThe function returned:",void 0));const o=this._DOM.getElementOffsetParent(e);if(!o)return void(this._debug._&&console.warn("Element has no offset parent.","\n element:",[e],"\n offsetParent:",o,"\n The function returned:",void 0));const s=this._DOM.getElementOffsetTop(e);return o===t?s+n:this.getTop(o,t,n+s)}function X(e,t=null){if(e){if(null===t)return this._DOM.getElementOffsetBottom(e);if(t)return this.getTop(e,t)+this._DOM.getElementOffsetHeight(e);this._debug._&&console.warn("root must be provided, but was received:",t,"\nThe function returned:",void 0)}else this._debug._&&console.warn("element must be provided, but was received:",e,"\nThe function returned:",void 0)}function Z(e){const t=parseInt(this._DOM.getComputedStyle(e).marginTop),n=parseInt(this._DOM.getComputedStyle(e).marginBottom);return this._DOM.getElementOffsetHeight(e)+t+n}function Q(e,t){if(!e)return;const n=this.getBottom(e,t);let o;const s=this.createNeutralBlock();this._DOM.insertAfter(e,s);const i=this.getTop(s,t);this._DOM.removeNode(s);if(i>=n)o=i;else{o=n+this._DOM.getComputedStyle(e).marginBottom}return o}function ee(e,t){const n=parseInt(this._DOM.getComputedStyle(e).marginTop);return this.getTop(e,t)-n}function te(e){const t=this.create();this._DOM.insertAtEnd(e,t);const n=this._DOM.getElementOffsetWidth(t);return this._DOM.removeNode(t),n}function ne(e,t=!0){const n=this.create();t&&this._DOM.setStyles(n,{padding:"0.1px"});const o=this._DOM.cloneNodeWrapper(e);"TABLE"===this._DOM.getElementTagName(e)&&this._DOM.setInnerHTML(o,"<tr><td></td></tr>"),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="!<br />".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=i<r?i:r,l=Math.trunc(t*a),h=Math.trunc(n*a);this._DOM.setStyles(e,{height:l+"px",width:h+"px"}),this._DOM.setAttribute(e,"height",`${l}px`),this._DOM.setAttribute(e,"width",`${h}px`)}function Fe(e,t){this._DOM.setStyles(e,{width:`${this._DOM.getElementOffsetWidth(t)}px`,"min-width":`${this._DOM.getElementOffsetWidth(t)}px`})}function ve(e){this.copyNodeWidth(e,e),this._DOM.getAll("td",e).forEach((e=>this.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){this._debug._&&console.warn("🫥 findFirstChildParentFromPage // interruptedByPageStart"),i=!0;break}this._debug._&&console.log({parent:e}),o=e,s=e}return this._debug._&&console.groupEnd("⬆ findFirstChildParentFromPage"),i?void 0:o}function Ae(e,t,n){this._debug._&&console.groupCollapsed("⬅ findPreviousNonHangingsFromPage");let o=null,s=e,i=!1;for(;;){const e=this._DOM.getLeftNeighbor(s);if(this._debug._&&console.log({interruptedByPageStart:i,topLimit:t,prev:e,current:s}),!e||!this.isNoHanging(e)||e===s)break;if(this.isPageStartElement(e)||this.getTop(e,n)<t){i=!0;break}o=e,s=e}return this._debug._&&console.groupEnd("⬅ findPreviousNonHangingsFromPage"),i?void 0:o}function $e(e,t){let n=this._DOM.getParentNode(e),o=null;for(;n&&n!==t;){if(e!==this._DOM.getFirstElementChild(n))return o;o=n,e=n,n=this._DOM.getParentNode(e)}return o}function Ie(e,t){let n=this._DOM.getParentNode(e),o=null;for(;n&&n!==t;){if(e!==this._DOM.getLastElementChild(n))return o;o=n,e=n,n=this._DOM.getParentNode(e)}return o}function Re(e,t){let n=e,o=null;for(;;){const e=this._DOM.getLastElementChild(n);if(!e)break;if(this.isNoHanging(e)){o=e;break}n=e}if(o)for(n=o;n&&n!==e;){const t=n.parentElement;if(!t||t===e)break;if(this._DOM.getFirstElementChild(t)!==n)break;o=t,n=t}else o=e;return this.getTop(o)>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)<this._minParagraphBreakableLines)return this._end("few lines - Not to break it up"),[];if(this._node.isSelectorMatching(e,this._selector.split))return this._end(this._selector.split),this._DOM.getChildren(e);const t=this._node.getPreparedChildren(e),n=t.map((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<this._minParagraphBreakableLines)return this._debug._&&console.log("groupedPartiallyLinedChildren.length < this._minParagraphBreakableLines",s.length,"<",this._minParagraphBreakableLines),this._end("NOT _splitComplexTextBlockIntoLines"),[];const i=s.slice(0,this._minParagraphLeftLines).flat(),r=s.slice(-this._minParagraphDanglingLines).flat();this._debug._&&console.log("groupedPartiallyLinedChildren",[...s],"\n","minLeftLines =",this._minParagraphLeftLines,"\n",i,"\n","minDanglingLines =",this._minParagraphDanglingLines,"\n",r),s.splice(0,this._minParagraphLeftLines,i),s.splice(-this._minParagraphDanglingLines,this._minParagraphDanglingLines,r);const a=s.map(((e,t)=>{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,"<tr><td></td></tr>"),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<t;n++){const t=this._DOM.cloneNodeWrapper(a);this._node.setFlagNoBreak(t),this._DOM.setAttribute(t,`.splitted_row_${i}_part_${n}`),[...r].forEach(((o,s)=>{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<e.length;t++){const o=e[t];this._DOM.insertAtEnd(n,o),n=o}return this._debug._&&console.log(" createWrapperFromArray:",t),t},r=(e,t=null)=>{this._debug._&&console.group("processChildren"),this._debug._&&console.log("*start* children",e);for(let t=0;t<e.length;t++)a(e[t]);this._debug._&&console.log("- wrappers BEFORE pop:",[...o]);const n=o.pop();this._debug._&&console.log("- wrappers.pop()",n),this._debug._&&console.log("- parent",t),this._debug._&&console.log("- wrappers AFTER pop:",[...o]),s=o.at(-1),this._debug._&&console.log("🎯🎯 currentTargetInSlice",s),this._debug._&&console.log("🎯 wrappers.at(-1)",o.at(-1)),this._debug._&&console.log("*END* children",e),this._end("processChildren")},a=e=>{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<n.length;t++){const g=n[t-1],p=n[t],u=n[t+1],m=u?this._node.getTop(u,e):void 0,f={id:t,element:n[t]},b={id:t+1,element:n[t+1]};t!==(a.length?a.at(-1).id:void 0)&&a.push(f);const M=0===r.length?s:null===r.at(-1)?i:i+this._node.getTop(r.at(-1),e);if(this._node.isForcedPageBreak(p)&&this._debug._&&console.warn(p,"💟 is isForcedPageBreak"),m<=M)this._node.isNoHanging(p)&&(this._debug._&&console.log("💟💟 currentElement _isNoHanging"),_(p,t));else{this._debug._&&console.log("💟💟",p,`nextElementTop > 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<d.length;t++){const n=d[t];this._node.getBottom(n,e)>_&&(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).start<a.start?(e.at(-1).push(a),this._debug._&&console.log("Add to group:",a,[...e]),e):void(this._debug._&&console.assert(!0,"_splitGridNode: An unexpected case of splitting a grid.","\nOn the element:",t))}),[]);this._debug._&&console.groupEnd("make childrenGroups"),this._debug._&&console.log("%c childrenGroups","font-weight:bold",i);const r=i.length,a=this._DOM.getElementOffsetHeight(e);if(r<this._minBreakableGridRows&&a<n)return this._debug._&&console.log("%c END DONT _splitGridNode",qe),this._debug._&&console.groupEnd(),[];const l=[...i.map((e=>e.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(l<d+h*this._minPreBreakableLines)return this._debug._&&console.log("%c END _splitPreNode (small node)",Je),[];const g=this._DOM.getChildNodes(e);if(this._debug._&&console.log("_children:",g.length),0==g.length)return this._debug._&&console.log("%c END _splitPreNode (not breakable)",Je),[];if(g.length>1)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<this._minPreBreakableLines)return this._debug._&&console.log("%c END _splitPreNode few lines",Je),[];const l=s.splice(0,this._minPreFirstBlockLines).join(""),h=s.splice(-this._minPreLastBlockLines).join("");s.unshift(l),s.push(h);const c=s.map((e=>{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;t<c.length;t++){const n=c[t];this._node.getBottom(n,e)>m&&(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(e<this._referenceHeight)return this._debug._&&console.log(`contentFlow (${e}) fits on the page (${this._referenceHeight})`),void this._node.findAllForcedPageBreakInside(this._contentFlow).forEach((e=>this._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;i<e.length;i++){const r=0==i&&!e[i-1],a=i===e.length-1;this._parseNode({previousElement:e[i-1]||t,currentElement:e[i],nextElement:e[i+1]||n,isCurrentFirst:r,parent:o,parentBottom:a?s:void 0})}}_parseNode({isCurrentFirst:e,previousElement:t,currentElement:n,nextElement:o,parent:s,parentBottom:i}){const r=["%c_parseNode\n","color:white"];if(this._debug._parseNode&&console.group("%c_parseNode",tt,""+(i?"★last★":"regular"),"📄",this.pages.length),this._debug._parseNode&&console.log(...r,"3 nodes: ",{previousElement:t,currentElement:n,nextElement:o},"\n","\ncurrent: ",n,"\nparent: ",s,"\nisCurrentFirst: ",e),this._debug._parseNode&&console.log(...r,"parent:",s,"\n","parentBottom:",i,"\n","isCurrentFirst:",e,"\n","parent:",s,"\n"),!o)return this._node.markProcessed(n,"content-flow-end"),this._debug._parseNode&&console.log("%c END _parseNode (!nextElement)",ot),void(this._debug._parseNode&&console.groupEnd());const a=this.pages.at(-1).pageBottom,l=this._node.getBottomWithMargin(n,this._root),h=i||l;let d=i;const g=this._node.getTop(n,this._root),c=i>g+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;t<e.length;t++)if(this._debug._parseNode&&console.log("🪁 Tile: _parents[i].bottom",e[t].bottom,e[t].element),e[t].bottom>o){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),l<this._referenceWidth&&this._debug._parseNode&&console.warn("%c IMAGE is too wide","color: red"),l<t)return this._node.markProcessed(n,"IMG that fits, and next starts on next"),this._registerPageStart(o),this._debug._parseNode&&console.log("Register next elements; 🖼️🖼️🖼️ IMG fits:",n),this._debug._parseNode&&console.log("%c END _parseNode 🖼️ IMG fits",ot),void(this._debug._parseNode&&console.groupEnd());const g=t/l;return g>this._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<this._pages.length;e++){const t=this._paper.create({currentPage:e+1,totalPages:this._pages.length}),n=this._createVirtualPaperGap();this._insertIntoPaperFlow(t,n),this._insertIntoContentFlow(e,n)}}_insertIntoPaperFlow(e,t){this._insertPaper(this._paperFlow,e,t)}_insertIntoContentFlow(e,t){const n=this._pages[e].pageStart,o=this._createPageBreaker(e,t);this._DOM.insertBefore(n,o),t&&this._insertFooterSpacer(o,this._paper.footerHeight,t),this._insertHeaderSpacer(o,this._paper.headerHeight),this._updatePageStartElementAttrValue(n,e)}_createPageBreaker(e,t){const n=this._node.create(this._pageDivider);return this._DOM.setAttribute(n,"[page]",`${e+1}`),t&&this._paper.footerHeight&&this._DOM.setStyles(n,{marginTop:this._paper.footerHeight-1+"px"}),this._paper.headerHeight&&this._DOM.setStyles(n,{marginBottom:this._paper.headerHeight-1+"px"}),n}_updatePageStartElementAttrValue(e,t){this._hasFrontPage&&this._node.markPageStartElement(e,`${t+1}`)}_insertPaper(e,t,n){n?this._DOM.insertAtEnd(e,n,t):this._DOM.insertAtEnd(e,t)}_createVirtualPaperGap(){return this._node.create(this._virtualPaperGapSelector)}_createVirtualPaperTopMargin(){return this._paper.createVirtualTopMargin()}_createVirtualPaperBottomMargin(){return this._paper.createVirtualBottomMargin()}_insertFrontpageSpacer(e,t){const n=this._node.create();return this._DOM.setStyles(n,{paddingBottom:t+"px"}),this._DOM.setAttribute(n,".printFrontpageSpacer"),this._DOM.insertAtStart(e,n),n}_insertHeaderSpacer(e,t){const n=this._DOM.createDocumentFragment(),o=this._node.create(this._runningSafetySelector);this._DOM.insertAtEnd(n,this._createVirtualPaperTopMargin(),o),this._DOM.insertAtEnd(e,n)}_insertFooterSpacer(e,t,n){const o=this._DOM.createDocumentFragment(),s=this._createVirtualPaperGap(),i=this._node.create(this._runningSafetySelector);this._DOM.insertAtEnd(o,i,this._createVirtualPaperBottomMargin(),this._node.create(this._printPageBreakSelector),s),this._DOM.insertAtStart(e,o),this._balanceFooter(i,s,n)}_balanceFooter(e,t,n){const o=this._node.getTop(n,this._root)-this._node.getTop(t,this._root);this._DOM.setStyles(e,{marginBottom:o+"px"}),this._assert&&console.assert(o>=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})();