@xiee/utils
Version:
Miscellaneous tools and utilities to manipulate HTML pages
2 lines • 6.85 kB
JavaScript
(e=>{function t(t,n=e){return n?.querySelector(t)}function n(t,n=e){return n?n.querySelectorAll(t):[]}function r(e){return e.childElementCount}const s=e.createElement("div"),i=n("h1").length>1,a=[],o=["TABLE","UL","OL","BLOCKQUOTE"],c="pagesjs-fragmented",l="fragment-first",d=["top","bottom"].map(t=>parseFloat(getComputedStyle(e.documentElement).getPropertyValue(`--paper-margin-${t}`))||0);s.className="pagesjs-page",s.innerHTML='<div class="pagesjs-header"></div>\n<div class="pagesjs-body"></div>\n<div class="pagesjs-footer"></div>';let f,p,g,h,u,m,E=[],L=[];function v(e){return e&&!t(".pagesjs-body",e)&&e.insertAdjacentHTML("afterbegin",s.innerHTML),f=e||s.cloneNode(!0),p=f.children[1],f.classList.add(...E),a.includes(f)||a.push(f),f}function N(e,t){const n=f;n.after(v(e)),t&&t(),T(n)}function T(e){const t=e.scrollHeight;if(t>g&&!e.dataset.pagesOffset){const r=function(e,t){let r=+e.dataset.pagesOffset;if(r)return r;if(r=Math.ceil(t/g),r<=1)return r;const s=d.concat([...n("thead",e)].map(e=>+e.offsetHeight)).reduce((e,t)=>e+t);if(!s)return r;function i(){return Math.ceil((t+(r-1)*s)/g)}let a=i();for(;a>r;)r=a,a=i();return r}(e,t);r>1&&(e.dataset.pagesOffset=r)}e.remove()}function b(e){if(!e||"BODY"===e.tagName)return!1;const t=!("P"===e.tagName?e.innerHTML:e.innerText).trim();return t&&e.remove(),t}function H(e){e.classList.contains("pagesjs-page")?N(e,()=>r(e)>3&&(p.append(...[...e.children].slice(3)),N())):(e.innerText.trim()&&g-f.scrollHeight<h&&N(),p.append(e),f.scrollHeight>g&&(!function(e){L=[];const t=e.tagName,n=e.firstElementChild;if("P"===t||o.includes(t))return!0;if("DIV"===t){const t=e.children;return 1===t.length&&o.includes(n?.tagName)||[...t].filter(e=>"TABLE"===e.tagName).length}if("PRE"!==t)return!1;if("CODE"!==n?.tagName)return!1;L=n.innerHTML.replace(/\n$/,"").split("\n");const r=L.length;return!(r<2)&&(u=n.offsetHeight/r,n.innerHTML="",!0)}(e)?N(0,()=>p.append(e)):("P"!==e.tagName&&e.remove(),S(e))))}function j(e,t){e.innerHTML=L.slice(0,t).join("\n"),m=t}function S(n,s,i){let a=n.classList;const d=n.tagName,h=a.contains(c);i?a.add(c):h?a.remove(l):a.add(c,l);let E=n.cloneNode();(s||p).append(E),"P"===d&&(function(n,r){if(!n.parentNode&&(p.append(n),f.scrollHeight<=g))return;const s=e.createRange(),i=[{node:n,i:0}],a=e.createTreeWalker(n,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT);let o,c;function l(e,t){const n=e.getBoundingClientRect();c&&c.bottom<=n.top&&c.right>n.left&&i.push({node:o,i:t}),c=n}for(;o=a.nextNode();){const e=o.tagName;if(e){if((["DIV","MJX-CONTAINER"].includes(e)||"SPAN"===e&&t(".katex",o))&&(o=a.nextSibling(),!o))break;if(o.firstChild)continue}if(o.tagName)l(o,-1);else{const e=o.textContent;if(e.trim())for(let t=0;t<e.length;t++)s.setStart(o,t),s.setEnd(o,t+1),l(s,t)}}if(i.length<2)return n.remove(),1;r.remove();for(let e=i.length-1;e>=0;e--){const t=i[e];t.i<0?s.setStartBefore(t.node):s.setStart(t.node,t.i),s.setEnd(n,n.childNodes.length),r.prepend(s.extractContents());const a=n.lastChild;if(""===a?.innerHTML&&a.remove(),e>0&&f.scrollHeight<=g){N();break}}}(n,E)||([n,E]=[E,n],a=n.classList));const v=E.previousElementSibling||s?.previousElementSibling;function T(e){for(let t of[...n.children])if(E.append(t),f.scrollHeight>g){e(t);break}}if("DIV"===d)T(e=>{n.prepend(e),o.includes(e.tagName)?S(e,E,n):r(E)&&N()});else if("PRE"===d)S(n.firstElementChild,E,n);else if("CODE"===d){const e=function(e){let t=i1=1,n=L.length,r=n+2;const s=[];for(;r>i1+1;){j(e,t);const i=g-f.offsetHeight;if(0===i)return t;if(i<0){if(t<=1)return 0;r=t}else{if(t>=n)return t;i1=t}s.push(t);const a=t+Math.round(i/u);t=s.includes(a)?t+(i>0?1:-1):a,i>0&&t>=n&&(r=n+2,t=n)}return i1}(E);e===m||j(E,e),L.splice(0,e),e>0&&(""===L.join("").trim()?L=[]:N())}else if("TABLE"===d){const e=function(e,t,n){const r=e.tBodies[0],s=r.cloneNode(),i=[...r.rows],a=e.tHead;t.append(s),[a,e.tFoot].forEach(e=>e&&t.append(e.cloneNode(!0)));for(let e=0;e<i.length;e++){const a=i[e];if(s.append(a),f.offsetHeight>g){(e>0||n)&&r.prepend(a),0===e&&n&&(t.innerHTML="");break}}return r.rows.length}(n,E,v);E.innerHTML&&(e?N():n.innerHTML="")}else o.slice(1).includes(d)&&T(e=>{(v||r(E)>1)&&n.prepend(e),"OL"===d&&(n.start+=r(E)),r(E)&&N()});const H=!L.length&&b(n),C=b(E);if(H){const e=E.classList;return void(i?s.classList.contains(l)&&e.remove(c):e.contains(l)?e.remove(c,l):e.add("fragment-last"))}C&&(a.remove(c,l),i||N()),C&&!v||i||S(n)}function C(e){return e&&(e.dataset.shortTitle||e.innerText)}const O=C(t("h1.title, .frontmatter h1, .title, h1")),y=(i?"h1":"h2")+":not(.frontmatter *)";function M(){if("complete"!==e.readyState)return addEventListener("load",M);const r=e.body.classList;if(r.contains("pagesjs"))return;dispatchEvent(new Event("pagesjs:before")),r.add("pagesjs"),e.body.insertAdjacentElement("afterbegin",v()),g=f.clientHeight||window.innerHeight,n(":is(#TOC, .footnotes, .chapter-before, .chapter-after):is(.side-left, .side-right).side").forEach(e=>{e.classList.remove("side","side-left","side-right")}),r.add("pagesjs-filling");const s=e.createElement("p"),o=f.scrollHeight;s.innerText="A",p.append(s),h=f.scrollHeight-o,s.remove(),n('#TOC a[href^="#"]').forEach(t=>{const n=e.createElement("span");let r;for(n.className="toc-text",t.append(n);(r=n.previousSibling)&&!r.classList?.contains("section-number");)n.prepend(r);t.dataset.pageNumber="000"});const c=[];n(".body").forEach(t=>{const n=[...t.children].filter(t=>!["STYLE","LINK"].includes(t.tagName)||e.body.prepend(t));c.push(n),n.forEach(e=>e.remove())}),n(".frontmatter, .abstract, #TOC:not(.chapter-toc)").forEach(e=>{H(e),i&&N()}),n(".body").forEach((e,t)=>{E=["chapter","appendix"].filter(t=>e.classList.contains(t)),i&&(""===f.innerText?v(f):N()),c[t].forEach(H),b(e.parentNode),b(e)}),T(f),r.remove("pagesjs-filling");let l,d=0;a.forEach(e=>{if(i){if(t(".frontmatter",e))return;t(y,e)&&(l="")}const r=+e.dataset.pagesOffset||1;r>1&&e.classList.add("page-multiple"),d+=r,e.classList.add("page-"+(d%2==0?"even":"odd"));const s={pageNumber:d,mainTitle:O,pageTitle:l};let a;[e.children[0],e.children[2]].forEach(e=>{for(const t in s)s[t]&&(e.dataset[t]=s[t])}),l=C([...n(y,e)].pop())||l,n(".footnotes",e).forEach((t,n)=>{0===n?(a=t,e.children[1].after(t)):(a.append(...t.children),t.remove())})}),e.body.prepend(...a),n('#TOC a[href^="#"]').forEach(e=>{const n=t(`.pagesjs-page:has(#${CSS.escape(e.getAttribute("href").replace(/^#/,""))}) .pagesjs-header`);e.dataset.pageNumber=n?n.dataset.pageNumber:""}),dispatchEvent(new Event("pagesjs:after"))}addEventListener("beforeprint",M);const x=new URLSearchParams(location.search);x.get("paged")&&M(),addEventListener("keypress",e=>{"p"===e.key&&(x.get("paged")?(x.delete("paged"),location.href=location.pathname+(x.size?`?${x}`:"")):(M(),x.set("paged",1),history.replaceState({},"",`${location.pathname}?${x}`)))})})(document);
//# sourceMappingURL=pages.min.js.map