@xiee/utils
Version:
Miscellaneous tools and utilities to manipulate HTML pages
2 lines • 6.89 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"),a=n("h1").length>1,i=[],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),i.includes(f)||i.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 a(){return Math.ceil((t+(r-1)*s)/g)}let i=a();for(;i>r;)r=i,i=a();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,a){let i=n.classList;const d=n.tagName,h=i.contains(c);a?i.add(c):h?i.remove(l):i.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(),a=[{node:n,i:0}],i=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&&a.push({node:o,i:t}),c=n}for(;o=i.nextNode();){const e=o.tagName;if(e){if((["DIV","MJX-CONTAINER"].includes(e)||"SPAN"===e&&t(".katex",o))&&(o=i.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(a.length<2)return n.remove(),1;r.remove();for(let e=a.length-1;e>=0;e--){const t=a[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 i=n.lastChild;if(""===i?.innerHTML&&i.remove(),e>0&&f.scrollHeight<=g){N();break}}}(n,E)||([n,E]=[E,n],i=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 a=g-f.offsetHeight;if(0===a)return t;if(a<0){if(t<=1)return 0;r=t}else{if(t>=n)return t;i1=t}s.push(t);const i=t+Math.round(a/u);t=s.includes(i)?t+(a>0?1:-1):i,a>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(),a=[...r.rows],i=e.tHead;t.append(s),[i,e.tFoot].forEach((e=>e&&t.append(e.cloneNode(!0))));for(let e=0;e<a.length;e++){const i=a[e];if(s.append(i),f.offsetHeight>g){(e>0||n)&&r.prepend(i),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;a?s.classList.contains(l)&&e.remove(c):e.contains(l)?e.remove(c,l):e.add("fragment-last")}else C&&(i.remove(c,l),a||N()),C&&!v||a||S(n)}function C(e){return e&&(e.dataset.shortTitle||e.innerText)}const O=C(t("h1.title, .frontmatter h1, .title, h1")),y=(a?"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),a&&N()})),n(".body").forEach(((e,t)=>{E=["chapter","appendix"].filter((t=>e.classList.contains(t))),a&&(""===f.innerText?v(f):N()),c[t].forEach(H),b(e.parentNode),b(e)})),T(f),r.remove("pagesjs-filling");let l,d=0;i.forEach((e=>{if(a){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 i;[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?(i=t,e.children[1].after(t)):(i.append(...t.children),t.remove())}))})),e.body.prepend(...i),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