diff --git a/app/src/protyle/export/util.ts b/app/src/protyle/export/util.ts index 80db1c2f683..1aba573669c 100644 --- a/app/src/protyle/export/util.ts +++ b/app/src/protyle/export/util.ts @@ -10,7 +10,7 @@ import {isMobile} from "../../util/functions"; import {Constants} from "../../constants"; import {highlightRender, lineNumberRender} from "../render/highlightRender"; import {processRender} from "../util/processCode"; -import {isIPhone, isSafari, saveExportFile, setStorageVal} from "../util/compatibility"; +import {saveExportFile, setStorageVal} from "../util/compatibility"; import {useShell} from "../../util/pathName"; export const afterExport = (exportPath: string, msgId: string) => { @@ -90,14 +90,13 @@ export const exportImage = (id: string) => { item.textContent = (index + 1).toString(); }); setTimeout(() => { - addScript(`${Constants.PROTYLE_CDN}/js/html-to-image.min.js?v=1.11.13`, "protyleHtml2image").then(async () => { - let blob = await window.htmlToImage.toBlob(exportDialog.element.querySelector(".b3-dialog__content")); - if (isIPhone() || isSafari()) { - await window.htmlToImage.toBlob(contentElement); - await window.htmlToImage.toBlob(contentElement); - await window.htmlToImage.toBlob(contentElement); - blob = await window.htmlToImage.toBlob(contentElement); - } + // modern-screenshot is used instead of html-to-image because the latter clones every + // node and copies its full computed style one property at a time, which is O(nodes) with + // a huge constant on WebKit/WKWebView (~15s for a mid-size doc on iOS vs ~3s on desktop). + // modern-screenshot caches default styles per tag and only writes differing properties, + // and it renders correctly in a single pass, so the old 3x Safari re-render hack is gone. + addScript(`${Constants.PROTYLE_CDN}/js/modern-screenshot.min.js`, "protyleModernScreenshot").then(async () => { + const blob = await window.modernScreenshot.domToBlob(contentElement, {type: "image/png"}); const formData = new FormData(); formData.append("file", blob, btnsElement[1].getAttribute("data-title")); formData.append("type", "image/png"); diff --git a/app/src/types/index.d.ts b/app/src/types/index.d.ts index cbaf70c3927..a7d2c8ce20d 100644 --- a/app/src/types/index.d.ts +++ b/app/src/types/index.d.ts @@ -270,6 +270,9 @@ interface Window { toCanvas: (element: Element, options?: Partial) => Promise toBlob: (element: Element, options?: Partial) => Promise }; + modernScreenshot: { + domToBlob: (element: Element, options?: Partial) => Promise + }; siyuan: ISiyuan; JSAndroid: { returnDesktop(): void diff --git a/app/stage/protyle/js/modern-screenshot.min.js b/app/stage/protyle/js/modern-screenshot.min.js new file mode 100644 index 00000000000..21d9e85c855 --- /dev/null +++ b/app/stage/protyle/js/modern-screenshot.min.js @@ -0,0 +1,8 @@ +/** + * Minified by jsDelivr using Terser v5.39.0. + * Original file: /npm/modern-screenshot@4.6.6/dist/index.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).modernScreenshot={})}(this,(function(e){"use strict";var t,n=Object.defineProperty,r=Object.defineProperties,o=Object.getOwnPropertyDescriptors,l=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable,s=Math.pow,c=(e,t,r)=>t in e?n(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,u=(e,t)=>{for(var n in t||(t={}))i.call(t,n)&&c(e,n,t[n]);if(l)for(var n of l(t))a.call(t,n)&&c(e,n,t[n]);return e},d=(e,t)=>r(e,o(t)),f=(e,t,n)=>new Promise(((r,o)=>{var l=e=>{try{a(n.next(e))}catch(e){o(e)}},i=e=>{try{a(n.throw(e))}catch(e){o(e)}},a=e=>e.done?r(e.value):Promise.resolve(e.value).then(l,i);a((n=n.apply(e,t)).next())}));function g(e,t){return e[13]=1,e[14]=t>>8,e[15]=255&t,e[16]=t>>8,e[17]=255&t,e}let h;function m(e){let t=-1;h||(h=function(){const e=new Int32Array(256);for(let t=0;t<256;t++){let n=t;for(let e=0;e<8;e++)n=1&n?3988292384^n>>>1:n>>>1;e[t]=n}return e}());for(let n=0;n>>8;return~t}function p(e,t,n=!1){const r=new Uint8Array(13);t*=39.3701,r[0]=112,r[1]=72,r[2]=89,r[3]=115,r[4]=t>>>24,r[5]=t>>>16,r[6]=t>>>8,r[7]=255&t,r[8]=r[4],r[9]=r[5],r[10]=r[6],r[11]=r[7],r[12]=1;const o=m(r),l=new Uint8Array(4);if(l[0]=o>>>24,l[1]=o>>>16,l[2]=o>>>8,l[3]=255&o,n){const t=function(e){for(let t=e.length-1;t>=4;t--)if(9===e[t-4]&&112===e[t-3]&&72===e[t-2]&&89===e[t-1]&&115===e[t])return t-3;return 0}(e);return e.set(r,t),e.set(l,t+13),e}{const t=new Uint8Array(4);t[0]=0,t[1]=0,t[2]=0,t[3]=9;const n=new Uint8Array(54);return n.set(e,0),n.set(t,33),n.set(r,37),n.set(l,50),n}}const w="[modern-screenshot]",y="undefined"!=typeof window,v=y&&"Worker"in window,b=y&&"atob"in window,S=y&&"btoa"in window,E=y?null==(t=window.navigator)?void 0:t.userAgent:"",x=E.includes("Chrome"),A=E.includes("AppleWebKit")&&!x,C=E.includes("Firefox"),N=e=>1===e.nodeType,T=e=>"object"==typeof e.className,D=e=>"image"===e.tagName,k=e=>N(e)&&void 0!==e.style&&!T(e),$=e=>8===e.nodeType,P=e=>"IMG"===e.tagName,F=e=>"VIDEO"===e.tagName,I=e=>"SLOT"===e.tagName;function R(e){var t;const n=null==(t=null==e?void 0:e.createElement)?void 0:t.call(e,"canvas");return n&&(n.height=n.width=1),!!n&&"toDataURL"in n&&!!n.toDataURL("image/webp").includes("image/webp")}const U=e=>e.startsWith("data:");function O(e,t){if(e.match(/^[a-z]+:\/\//i))return e;if(y&&e.match(/^\/\//))return window.location.protocol+e;if(e.match(/^[a-z]+:/i)||!y)return e;const n=j().implementation.createHTMLDocument(),r=n.createElement("base"),o=n.createElement("a");return n.head.appendChild(r),n.body.appendChild(o),t&&(r.href=t),o.href=e,o.href}function j(e){var t;return null!=(t=e&&N(e)?null==e?void 0:e.ownerDocument:e)?t:window.document}const M="http://www.w3.org/2000/svg";function _(e,t,n){const r=j(n).createElementNS(M,"svg");return r.setAttributeNS(null,"width",e.toString()),r.setAttributeNS(null,"height",t.toString()),r.setAttributeNS(null,"viewBox",`0 0 ${e} ${t}`),r}function L(e,t){let n=(new XMLSerializer).serializeToString(e);return t&&(n=n.replace(/[\u0000-\u0008\v\f\u000E-\u001F\uD800-\uDFFF\uFFFE\uFFFF]/gu,"")),`data:image/svg+xml;charset=utf-8,${encodeURIComponent(n)}`}function B(e,t="image/png",n=1){return f(this,null,(function*(){try{return yield new Promise(((r,o)=>{e.toBlob((e=>{e?r(e):o(new Error("Blob is null"))}),t,n)}))}catch(r){if(b)return function(e){var t,n;const[r,o]=e.split(","),l=null!=(n=null==(t=r.match(/data:(.+);/))?void 0:t[1])?n:void 0,i=window.atob(o),a=i.length,s=new Uint8Array(a);for(let e=0;e{const o=new FileReader;o.onload=()=>n(o.result),o.onerror=()=>r(o.error),o.onabort=()=>r(new Error(`Failed read blob to ${t}`)),"dataUrl"===t?o.readAsDataURL(e):"arrayBuffer"===t&&o.readAsArrayBuffer(e)}))}const q=e=>W(e,"dataUrl");function z(e,t){const n=j(t).createElement("img");return n.decoding="sync",n.loading="eager",n.src=e,n}function V(e,t){return new Promise((n=>{const{timeout:r,ownerDocument:o,onError:l,onWarn:i}=null!=t?t:{},a="string"==typeof e?z(e,j(o)):e;let s=null,c=null;function u(){n(a),s&&clearTimeout(s),null==c||c()}if(r&&(s=setTimeout(u,r)),F(a)){const e=a.currentSrc||a.src;if(!e)return a.poster?V(a.poster,t).then(n):u();if(a.readyState>=2)return u();const r=u,o=t=>{null==i||i("Failed video load",e,t),null==l||l(t),u()};c=()=>{a.removeEventListener("loadeddata",r),a.removeEventListener("error",o)},a.addEventListener("loadeddata",r,{once:!0}),a.addEventListener("error",o,{once:!0})}else{const e=D(a)?a.href.baseVal:a.currentSrc||a.src;if(!e)return u();const t=()=>f(this,null,(function*(){if(P(a)&&"decode"in a)try{yield a.decode()}catch(t){null==i||i("Failed to decode image, trying to render anyway",a.dataset.originalSrc||e,t)}u()})),n=t=>{null==i||i("Failed image load",a.dataset.originalSrc||e,t),u()};if(P(a)&&a.complete)return t();c=()=>{a.removeEventListener("load",t),a.removeEventListener("error",n)},a.addEventListener("load",t,{once:!0}),a.addEventListener("error",n,{once:!0})}}))}function X(e,t){return f(this,null,(function*(){k(e)&&(P(e)||F(e)?yield V(e,t):yield Promise.all(["img","video"].flatMap((n=>Array.from(e.querySelectorAll(n)).map((e=>V(e,t)))))))}))}const H=function(){let e=0;return()=>(e+=1,`u${`0000${(Math.random()*s(36,4)|0).toString(36)}`.slice(-4)}${e}`)}();function G(e){return null==e?void 0:e.split(",").map((e=>e.trim().replace(/"|'/g,"").toLowerCase())).filter(Boolean)}let J=0;function Y(e){const t=`${w}[#${J}]`;return J++,{time:n=>e&&console.time(`${t} ${n}`),timeEnd:n=>e&&console.timeEnd(`${t} ${n}`),warn:(...t)=>e&&((...e)=>console.warn(w,...e))(...t)}}function K(e){return{cache:e?"no-cache":"force-cache"}}function Q(e,t){return f(this,null,(function*(){return(e=>e&&"__CONTEXT__"in e)(e)?e:Z(e,d(u({},t),{autoDestruct:!0}))}))}function Z(e,t){return f(this,null,(function*(){var n,r,o,l,i;const{scale:a=1,workerUrl:s,workerNumber:c=1}=t||{},g=!(null==t||!t.debug),h=null==(n=null==t?void 0:t.features)||n,m=null!=(r=e.ownerDocument)?r:y?window.document:void 0,p=null!=(l=null==(o=e.ownerDocument)?void 0:o.defaultView)?l:y?window:void 0,w=new Map,b=d(u({width:0,height:0,quality:1,type:"image/png",scale:a,backgroundColor:null,style:null,filter:null,maximumCanvasSize:0,timeout:3e4,progress:null,debug:g,fetch:u({requestInit:K(null==(i=null==t?void 0:t.fetch)?void 0:i.bypassingCache),placeholderImage:"data:image/png;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",bypassingCache:!1},null==t?void 0:t.fetch),fetchFn:null,font:{},drawImageInterval:100,workerUrl:null,workerNumber:c,onCloneEachNode:null,onCloneNode:null,onEmbedNode:null,onCreateForeignObjectSvg:null,includeStyleProperties:null,autoDestruct:!1},t),{__CONTEXT__:!0,log:Y(g),node:e,ownerDocument:m,ownerWindow:p,dpi:1===a?null:96*a,svgStyleElement:ee(m),svgDefsElement:null==m?void 0:m.createElementNS(M,"defs"),svgStyles:new Map,defaultComputedStyles:new Map,workers:[...Array.from({length:v&&s&&c?c:0})].map((()=>{try{const e=new Worker(s);return e.onmessage=e=>f(this,null,(function*(){var t,n,r,o;const{url:l,result:i}=e.data;i?null==(n=null==(t=w.get(l))?void 0:t.resolve)||n.call(t,i):null==(o=null==(r=w.get(l))?void 0:r.reject)||o.call(r,new Error(`Error receiving message from worker: ${l}`))})),e.onmessageerror=e=>{var t,n;const{url:r}=e.data;null==(n=null==(t=w.get(r))?void 0:t.reject)||n.call(t,new Error(`Error receiving message from worker: ${r}`))},e}catch(e){return b.log.warn("Failed to new Worker",e),null}})).filter(Boolean),fontFamilies:new Map,fontCssTexts:new Map,acceptOfImage:`${[R(m)&&"image/webp","image/svg+xml","image/*","*/*"].filter(Boolean).join(",")};q=0.8`,requests:w,drawImageCount:0,tasks:[],features:h,isEnable:e=>{var t,n;return"restoreScrollPosition"===e?"boolean"!=typeof h&&(null!=(t=h[e])&&t):"boolean"==typeof h?h:null==(n=h[e])||n},shadowRoots:[]});b.log.time("wait until load"),yield X(e,{timeout:b.timeout,onWarn:b.log.warn}),b.log.timeEnd("wait until load");const{width:S,height:E}=function(e,t){let{width:n,height:r}=t;if(N(e)&&(!n||!r)){const t=e.getBoundingClientRect();n=n||t.width||Number(e.getAttribute("width"))||0,r=r||t.height||Number(e.getAttribute("height"))||0}return{width:n,height:r}}(e,b);return b.width=S,b.height=E,b}))}function ee(e){if(!e)return;const t=e.createElement("style"),n=t.ownerDocument.createTextNode("\n.______background-clip--text {\n background-clip: text;\n -webkit-background-clip: text;\n}\n");return t.appendChild(n),t}function te(e,t){return f(this,null,(function*(){const{log:n,timeout:r,drawImageCount:o,drawImageInterval:l}=t;n.time("image to canvas");const i=yield V(e,{timeout:r,onWarn:t.log.warn}),{canvas:a,context2d:s}=function(e,t){const{width:n,height:r,scale:o,backgroundColor:l,maximumCanvasSize:i}=t,a=e.createElement("canvas");a.width=Math.floor(n*o),a.height=Math.floor(r*o),a.style.width=`${n}px`,a.style.height=`${r}px`,i&&(a.width>i||a.height>i)&&(a.width>i&&a.height>i?a.width>a.height?(a.height*=i/a.width,a.width=i):(a.width*=i/a.height,a.height=i):a.width>i?(a.height*=i/a.width,a.width=i):(a.width*=i/a.height,a.height=i));const s=a.getContext("2d");return s&&l&&(s.fillStyle=l,s.fillRect(0,0,a.width,a.height)),{canvas:a,context2d:s}}(e.ownerDocument,t),c=()=>{try{null==s||s.drawImage(i,0,0,a.width,a.height)}catch(e){t.log.warn("Failed to drawImage",e)}};if(c(),t.isEnable("fixSvgXmlDecode"))for(let e=0;e{setTimeout((()=>{null==s||s.clearRect(0,0,a.width,a.height),c(),t()}),e+l)}));return t.drawImageCount=0,n.timeEnd("image to canvas"),a}))}function ne(e,t){if(e.ownerDocument)try{const t=e.toDataURL();if("data:,"!==t)return z(t,e.ownerDocument)}catch(e){t.log.warn("Failed to clone canvas",e)}const n=e.cloneNode(!1),r=e.getContext("2d"),o=n.getContext("2d");try{return r&&o&&o.putImageData(r.getImageData(0,0,e.width,e.height),0,0),n}catch(e){t.log.warn("Failed to clone canvas",e)}return n}function re(e,t){return(e=>"CANVAS"===e.tagName)(e)?ne(e,t):(e=>"IFRAME"===e.tagName)(e)?function(e,t){var n;try{if(null!=(n=null==e?void 0:e.contentDocument)&&n.body)return he(e.contentDocument.body,t)}catch(e){t.log.warn("Failed to clone iframe",e)}return e.cloneNode(!1)}(e,t):P(e)?function(e){const t=e.cloneNode(!1);return e.currentSrc&&e.currentSrc!==e.src&&(t.src=e.currentSrc,t.srcset=""),"lazy"===t.loading&&(t.loading="eager"),t}(e):F(e)?function(e,t){return f(this,null,(function*(){if(e.ownerDocument&&!e.currentSrc&&e.poster)return z(e.poster,e.ownerDocument);const n=e.cloneNode(!1);n.crossOrigin="anonymous",e.currentSrc&&e.currentSrc!==e.src&&(n.src=e.currentSrc);const r=n.ownerDocument;if(r){let o=!0;if(yield V(n,{onError:()=>o=!1,onWarn:t.log.warn}),!o)return e.poster?z(e.poster,e.ownerDocument):n;n.currentTime=e.currentTime,yield new Promise((e=>{n.addEventListener("seeked",e,{once:!0})}));const l=r.createElement("canvas");l.width=e.offsetWidth,l.height=e.offsetHeight;try{const e=l.getContext("2d");e&&e.drawImage(n,0,0,l.width,l.height)}catch(r){return t.log.warn("Failed to clone video",r),e.poster?z(e.poster,e.ownerDocument):n}return ne(l,t)}return n}))}(e,t):e.cloneNode(!1)}const oe=["width","height","-webkit-text-fill-color"],le=["stroke","fill"];function ie(e,t,n){const{defaultComputedStyles:r}=n,o=e.nodeName.toLowerCase(),l=T(e)&&"svg"!==o,i=l?le.map((t=>[t,e.getAttribute(t)])).filter((([,e])=>null!==e)):[],a=[l&&"svg",o,i.map(((e,t)=>`${e}=${t}`)).join(","),t].filter(Boolean).join(":");if(r.has(a))return r.get(a);const s=function(e){let t=e.sandbox;if(!t){const{ownerDocument:n}=e;try{n&&(t=n.createElement("iframe"),t.id=`__SANDBOX__${H()}`,t.width="0",t.height="0",t.style.visibility="hidden",t.style.position="fixed",n.body.appendChild(t),t.srcdoc='',e.sandbox=t)}catch(t){e.log.warn("Failed to getSandBox",t)}}return t}(n),c=null==s?void 0:s.contentWindow;if(!c)return new Map;const u=null==c?void 0:c.document;let d,f;l?(d=u.createElementNS(M,"svg"),f=d.ownerDocument.createElementNS(d.namespaceURI,o),i.forEach((([e,t])=>{f.setAttributeNS(null,e,t)})),d.appendChild(f)):d=f=u.createElement(o),f.textContent=" ",u.body.appendChild(d);const g=c.getComputedStyle(f,t),h=new Map;for(let e=g.length,t=0;to.set(t,e)));function a(n){const r=e.getPropertyValue(n),a=e.getPropertyPriority(n),s=n.lastIndexOf("-"),c=s>-1?n.substring(0,s):void 0;if(c){let e=i.get(c);e||(e=new Map,i.set(c,e)),e.set(n,[r,a])}t.get(n)===r&&!a||(c?l.push(c):o.set(n,[r,a]))}return o}const se=[":before",":after"],ce=[":-webkit-scrollbar",":-webkit-scrollbar-button",":-webkit-scrollbar-thumb",":-webkit-scrollbar-track",":-webkit-scrollbar-track-piece",":-webkit-scrollbar-corner",":-webkit-resizer"];const ue=new Set(["symbol"]);function de(e,t,n,r,o){return f(this,null,(function*(){if(N(n)&&((e=>"STYLE"===e.tagName)(n)||(e=>"SCRIPT"===e.tagName)(n))||r.filter&&!r.filter(n))return;ue.has(t.nodeName)||ue.has(n.nodeName)?r.currentParentNodeStyle=void 0:r.currentParentNodeStyle=r.currentNodeStyle;const l=yield he(n,r,!1,o);r.isEnable("restoreScrollPosition")&&function(e,t){if(!k(e)||!k(t))return;const{scrollTop:n,scrollLeft:r}=e;if(!n&&!r)return;const{transform:o}=t.style,l=new DOMMatrix(o),{a:i,b:a,c:s,d:c}=l;l.a=1,l.b=0,l.c=0,l.d=1,l.translateSelf(-r,-n),l.a=i,l.b=a,l.c=s,l.d=c,t.style.transform=l.toString()}(e,l),t.appendChild(l)}))}function fe(e,t,n,r){return f(this,null,(function*(){var o;let l=e.firstChild;N(e)&&e.shadowRoot&&(l=null==(o=e.shadowRoot)?void 0:o.firstChild,n.shadowRoots.push(e.shadowRoot));for(let o=l;o;o=o.nextSibling)if(!$(o))if(N(o)&&I(o)&&"function"==typeof o.assignedNodes){const l=o.assignedNodes();for(let o=0;o3===e.nodeType)(e))return r&&/\S/.test(e.data)&&r(e.data),s.createTextNode(e.data);if(s&&c&&N(e)&&(k(e)||T(e))){const r=yield re(e,t);if(t.isEnable("removeAbnormalAttributes")){const e=r.getAttributeNames();for(let t=e.length,n=0;n{g.delete(t)}));const h=ae(f,g,c);h.delete("transition-property"),h.delete("all"),h.delete("d"),h.delete("content"),n&&(h.delete("margin-top"),h.delete("margin-right"),h.delete("margin-bottom"),h.delete("margin-left"),h.delete("margin-block-start"),h.delete("margin-block-end"),h.delete("margin-inline-start"),h.delete("margin-inline-end"),h.set("box-sizing",["border-box",""])),"text"===(null==(o=h.get("background-clip"))?void 0:o[0])&&t.classList.add("______background-clip--text"),x&&(h.has("font-kerning")||h.set("font-kerning",["normal",""]),("hidden"===(null==(l=h.get("overflow-x"))?void 0:l[0])||"hidden"===(null==(i=h.get("overflow-y"))?void 0:i[0]))&&"ellipsis"===(null==(a=h.get("text-overflow"))?void 0:a[0])&&e.scrollWidth===e.clientWidth&&h.set("text-overflow",["clip",""]));for(let e=d.length,t=0;t{d.setProperty(n,e,t)})),h}(e,r,n,t);n&&function(e,t){const{backgroundColor:n,width:r,height:o,style:l}=t,i=e.style;if(n&&i.setProperty("background-color",n,"important"),r&&i.setProperty("width",`${r}px`,"important"),o&&i.setProperty("height",`${o}px`,"important"),l)for(const e in l)i[e]=l[e]}(r,t);let c=!1;if(t.isEnable("copyScrollbar")){const t=[null==(o=s.get("overflow-x"))?void 0:o[0],null==(l=s.get("overflow-y"))?void 0:l[0]];c=t.includes("scroll")||(t.includes("auto")||t.includes("overlay"))&&(e.scrollHeight>e.clientHeight||e.scrollWidth>e.clientWidth)}const f=null==(i=s.get("text-transform"))?void 0:i[0],g=G(null==(a=s.get("font-family"))?void 0:a[0]),h=g?e=>{"uppercase"===f?e=e.toUpperCase():"lowercase"===f?e=e.toLowerCase():"capitalize"===f&&(e=e[0].toUpperCase()+e.substring(1)),g.forEach((t=>{let n=u.get(t);n||u.set(t,n=new Set),e.split("").forEach((e=>n.add(e)))}))}:void 0;return function(e,t,n,r,o){const{ownerWindow:l,svgStyleElement:i,svgStyles:a,currentNodeStyle:s}=r;function c(n){var i;const c=l.getComputedStyle(e,n);let u=c.getPropertyValue("content");if(!u||"none"===u)return;null==o||o(u),u=u.replace(/(')|(")|(counter\(.+\))/g,"");const d=[H()],f=ie(e,n,r);null==s||s.forEach(((e,t)=>{f.delete(t)}));const g=ae(c,f,r.includeStyleProperties);g.delete("content"),g.delete("-webkit-locale"),"text"===(null==(i=g.get("background-clip"))?void 0:i[0])&&t.classList.add("______background-clip--text");const h=[`content: '${u}';`];if(g.forEach((([e,t],n)=>{h.push(`${n}: ${e}${t?" !important":""};`)})),1===h.length)return;try{t.className=[t.className,...d].join(" ")}catch(e){return void r.log.warn("Failed to copyPseudoClass",e)}const m=h.join("\n ");let p=a.get(m);p||(p=[],a.set(m,p)),p.push(`.${d[0]}:${n}`)}i&&l&&(se.forEach(c),n&&ce.forEach(c))}(e,r,c,t,h),function(e,t){((e=>"TEXTAREA"===e.tagName)(e)||(e=>"INPUT"===e.tagName)(e)||(e=>"SELECT"===e.tagName)(e))&&t.setAttribute("value",e.value)}(e,r),F(e)||(yield fe(e,r,t,h)),yield null==d?void 0:d(r),r}const f=e.cloneNode(!1);return yield fe(e,f,t),yield null==d?void 0:d(f),f}))}function me(e){if(e.ownerDocument=void 0,e.ownerWindow=void 0,e.svgStyleElement=void 0,e.svgDefsElement=void 0,e.svgStyles.clear(),e.defaultComputedStyles.clear(),e.sandbox){try{e.sandbox.remove()}catch(t){e.log.warn("Failed to destroyContext",t)}e.sandbox=void 0}e.workers=[],e.fontFamilies.clear(),e.fontCssTexts.clear(),e.requests.clear(),e.tasks=[],e.shadowRoots=[]}function pe(e){const t=e,{url:n,timeout:r,responseType:o}=t,s=((e,t)=>{var n={};for(var r in e)i.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&l)for(var r of l(e))t.indexOf(r)<0&&a.call(e,r)&&(n[r]=e[r]);return n})(t,["url","timeout","responseType"]),c=new AbortController,d=r?setTimeout((()=>c.abort()),r):void 0;return fetch(n,u({signal:c.signal},s)).then((e=>{if(!e.ok)throw new Error("Failed fetch, not 2xx response",{cause:e});switch(o){case"arrayBuffer":return e.arrayBuffer();case"dataUrl":return e.blob().then(q);default:return e.text()}})).finally((()=>clearTimeout(d)))}function we(e,t){const{url:n,requestType:r="text",responseType:o="text",imageDom:l}=t;let i=n;const{timeout:a,acceptOfImage:s,requests:c,fetchFn:d,fetch:{requestInit:g,bypassingCache:h,placeholderImage:m},font:p,workers:w,fontFamilies:y}=e;"image"===r&&(A||C)&&e.drawImageCount++;let v=c.get(n);if(!v){h&&h instanceof RegExp&&h.test(i)&&(i+=(/\?/.test(i)?"&":"?")+(new Date).getTime());const t=r.startsWith("font")&&p&&p.minify,b=new Set;t&&r.split(";")[1].split(",").forEach((e=>{y.has(e)&&y.get(e).forEach((e=>b.add(e)))}));const S=t&&b.size,E=u({url:i,timeout:a,responseType:S?"arrayBuffer":o,headers:"image"===r?{accept:s}:void 0},g);v={type:r,resolve:void 0,reject:void 0,response:null},v.response=f(this,null,(function*(){if(d&&"image"===r){const e=yield d(n);if(e)return e}return!A&&n.startsWith("http")&&w.length?new Promise(((e,t)=>{w[c.size&w.length-1].postMessage(u({rawUrl:n},E)),v.resolve=e,v.reject=t})):pe(E)})).catch((t=>{if(c.delete(n),"image"===r&&m)return e.log.warn("Failed to fetch image base64, trying to use placeholder image",i),"string"==typeof m?m:m(l);throw t})),c.set(n,v)}return v.response}function ye(e,t,n,r){return f(this,null,(function*(){if(!ve(e))return e;for(const[o,l]of function(e,t){const n=[];return e.replace(be,((e,r,o)=>(n.push([o,O(o,t)]),e))),n.filter((([e])=>!U(e)))}(e,t))try{const t=yield we(n,{url:l,requestType:r?"image":"text",responseType:"dataUrl"});e=e.replace(Se(o),`$1${t}$3`)}catch(e){n.log.warn("Failed to fetch css data url",o,e)}return e}))}function ve(e){return/url\((['"]?)([^'"]+?)\1\)/.test(e)}const be=/url\((['"]?)([^'"]+?)\1\)/g;function Se(e){const t=e.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${t})(['"]?\\))`,"g")}const Ee=["background-image","border-image-source","-webkit-border-image","-webkit-mask-image","list-style-image"];function xe(e,t){const{tasks:n}=t;N(e)&&((P(e)||D(e))&&n.push(...function(e,t){if(P(e)){const n=e.currentSrc||e.src;if(!U(n))return[we(t,{url:n,imageDom:e,requestType:"image",responseType:"dataUrl"}).then((t=>{t&&(e.srcset="",e.dataset.originalSrc=n,e.src=t||"")}))];(A||C)&&t.drawImageCount++}else if(T(e)&&!U(e.href.baseVal)){const n=e.href.baseVal;return[we(t,{url:n,imageDom:e,requestType:"image",responseType:"dataUrl"}).then((t=>{t&&(e.dataset.originalSrc=n,e.href.baseVal=t||"")}))]}return[]}(e,t)),(e=>"use"===e.tagName)(e)&&n.push(...function(e,t){var n;const{ownerDocument:r,svgDefsElement:o}=t,l=null!=(n=e.getAttribute("href"))?n:e.getAttribute("xlink:href");if(!l)return[];const[i,a]=l.split("#");if(a){const n=`#${a}`,l=t.shadowRoots.reduce(((e,t)=>null!=e?e:t.querySelector(`svg ${n}`)),null==r?void 0:r.querySelector(`svg ${n}`));if(i&&e.setAttribute("href",n),null!=o&&o.querySelector(n))return[];if(l)return null==o||o.appendChild(l.cloneNode(!0)),[];if(i)return[we(t,{url:i,responseType:"text"}).then((e=>{null==o||o.insertAdjacentHTML("beforeend",e)}))]}return[]}(e,t))),k(e)&&n.push(...function(e,t){return Ee.map((n=>{const r=e.getPropertyValue(n);return r&&"none"!==r?((A||C)&&t.drawImageCount++,ye(r,null,t,!0).then((t=>{!t||r===t||e.setProperty(n,t,e.getPropertyPriority(n))}))):null})).filter(Boolean)}(e.style,t)),e.childNodes.forEach((e=>{xe(e,t)}))}function Ae(e,t){return f(this,null,(function*(){const{ownerDocument:e,svgStyleElement:n,fontFamilies:r,fontCssTexts:o,tasks:l,font:i}=t;if(e&&n&&r.size)if(i&&i.cssText){const r=ke(i.cssText,t);n.appendChild(e.createTextNode(`${r}\n`))}else{const i=Array.from(e.styleSheets).filter((e=>{try{return"cssRules"in e&&!!e.cssRules.length}catch(n){return t.log.warn(`Error while reading CSS rules from ${e.href}`,n),!1}}));yield Promise.all(i.flatMap((e=>Array.from(e.cssRules).map(((n,r)=>f(this,null,(function*(){if((e=>"CSSImportRule"===e.constructor.name)(n)){let o=r+1;const l=n.href;let i="";try{i=yield we(t,{url:l,requestType:"text",responseType:"text"})}catch(e){t.log.warn(`Error fetch remote css import from ${l}`,e)}const a=i.replace(be,((e,t,n)=>e.replace(n,O(n,l))));for(const n of function(e){if(null==e)return[];const t=[];let n=e.replace(Ce,"");for(;;){const e=Ne.exec(n);if(!e)break;t.push(e[0])}n=n.replace(Ne,"");const r=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,o=new RegExp("((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})","gi");for(;;){let e=r.exec(n);if(e)o.lastIndex=r.lastIndex;else{if(e=o.exec(n),!e)break;r.lastIndex=o.lastIndex}t.push(e[0])}return t}(a))try{e.insertRule(n,n.startsWith("@import")?o+=1:e.cssRules.length)}catch(e){t.log.warn("Error inserting rule from remote css import",{rule:n,error:e})}}}))))))),i.flatMap((e=>Array.from(e.cssRules))).filter((e=>{var t;return(e=>"CSSFontFaceRule"===e.constructor.name)(e)&&ve(e.style.getPropertyValue("src"))&&(null==(t=G(e.style.getPropertyValue("font-family")))?void 0:t.some((e=>r.has(e))))})).forEach((r=>{const i=r,a=o.get(i.cssText);a?n.appendChild(e.createTextNode(`${a}\n`)):l.push(ye(i.cssText,i.parentStyleSheet?i.parentStyleSheet.href:null,t).then((r=>{r=ke(r,t),o.set(i.cssText,r),n.appendChild(e.createTextNode(`${r}\n`))})))}))}}))}const Ce=/(\/\*[\s\S]*?\*\/)/g,Ne=/((@.*?keyframes [\s\S]*?){([\s\S]*?}\s*?)})/gi;const Te=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,De=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function ke(e,t){const{font:n}=t,r=n?null==n?void 0:n.preferredFormat:void 0;return r?e.replace(De,(e=>{for(;;){const[t,,n]=Te.exec(e)||[];if(!n)return"";if(n===r)return`src: ${t};`}})):e}function $e(e,t){return f(this,null,(function*(){const n=yield Q(e,t);if(N(n.node)&&T(n.node))return n.node;const{ownerDocument:r,log:o,tasks:l,svgStyleElement:i,svgDefsElement:a,svgStyles:s,font:c,progress:u,autoDestruct:d,onCloneNode:g,onEmbedNode:h,onCreateForeignObjectSvg:m}=n;o.time("clone node");const p=yield he(n.node,n,!0);if(i&&r){let e="";s.forEach(((t,n)=>{e+=`${t.join(",\n")} {\n ${n}\n}\n`})),i.appendChild(r.createTextNode(e))}o.timeEnd("clone node"),yield null==g?void 0:g(p),!1!==c&&N(p)&&(o.time("embed web font"),yield Ae(0,n),o.timeEnd("embed web font")),o.time("embed node"),xe(p,n);const w=l.length;let y=0;null==u||u(y,w),yield Promise.all([...Array.from({length:4})].map((()=>f(this,null,(function*(){for(;;){const e=l.pop();if(!e)break;try{yield e}catch(e){n.log.warn("Failed to run task",e)}null==u||u(++y,w)}}))))),o.timeEnd("embed node"),yield null==h?void 0:h(p);const v=function(e,t){const{width:n,height:r}=t,o=_(n,r,e.ownerDocument),l=o.ownerDocument.createElementNS(o.namespaceURI,"foreignObject");return l.setAttributeNS(null,"x","0%"),l.setAttributeNS(null,"y","0%"),l.setAttributeNS(null,"width","100%"),l.setAttributeNS(null,"height","100%"),l.append(e),o.appendChild(l),o}(p,n);return a&&v.insertBefore(a,v.children[0]),i&&v.insertBefore(i,v.children[0]),d&&me(n),yield null==m?void 0:m(v),v}))}function Pe(e,t){return f(this,null,(function*(){var n;const r=yield Q(e,t),o=yield $e(r),l=L(o,r.isEnable("removeControlCharacter"));r.autoDestruct||(r.svgStyleElement=ee(r.ownerDocument),r.svgDefsElement=null==(n=r.ownerDocument)?void 0:n.createElementNS(M,"defs"),r.svgStyles.clear());const i=z(l,o.ownerDocument);return yield te(i,r)}))}function Fe(e,t){return f(this,null,(function*(){const n=yield Q(e,t),{log:r,quality:o,type:l,dpi:i}=n,a=yield Pe(n);r.time("canvas to data url");let s=a.toDataURL(l,o);if(["image/png","image/jpeg"].includes(l)&&i&&b&&S){const[e,t]=s.split(",");let n=0,r=!1;if("image/png"===l){const e=function(e){let t=e.indexOf("AAlwSFlz");return-1===t&&(t=e.indexOf("AAAJcEhZ")),-1===t&&(t=e.indexOf("AAAACXBI")),t}(t);e>=0?(n=4*Math.ceil((e+28)/3),r=!0):n=44}else"image/jpeg"===l&&(n=24);const o=t.substring(0,n),a=t.substring(n),c=window.atob(o),u=new Uint8Array(c.length);for(let e=0;eW(e,"arrayBuffer"))(s.slice(0,33));let t=new Uint8Array(e);return"image/png"===o?t=p(t,i):"image/jpeg"===o&&(t=g(t,i)),r.timeEnd("canvas to blob"),new Blob([t,s.slice(33)],{type:o})}return r.timeEnd("canvas to blob"),s}))},e.domToCanvas=Pe,e.domToDataUrl=Fe,e.domToForeignObjectSvg=$e,e.domToImage=function(e,t){return f(this,null,(function*(){const n=yield Q(e,t),{ownerDocument:r,width:o,height:l,scale:i,type:a}=n,s=z("image/svg+xml"===a?yield Ie(n):yield Fe(n),r);return s.width=Math.floor(o*i),s.height=Math.floor(l*i),s.style.width=`${o}px`,s.style.height=`${l}px`,s}))},e.domToJpeg=function(e,t){return f(this,null,(function*(){return Fe(yield Q(e,d(u({},t),{type:"image/jpeg"})))}))},e.domToPixel=function(e,t){return f(this,null,(function*(){const n=yield Q(e,t),r=yield Pe(n);return r.getContext("2d").getImageData(0,0,r.width,r.height).data}))},e.domToPng=function(e,t){return f(this,null,(function*(){return Fe(yield Q(e,d(u({},t),{type:"image/png"})))}))},e.domToSvg=Ie,e.domToWebp=function(e,t){return f(this,null,(function*(){return Fe(yield Q(e,d(u({},t),{type:"image/webp"})))}))},e.loadMedia=V,e.waitUntilLoad=X,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})})); +//# sourceMappingURL=/sm/02fb748778a9dc97fc0c8b05885f2753525c71cf1eee5519e0c6e8e6ea0a0264.map \ No newline at end of file