presenter 0.9.3 → 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/export.js +1 -1
- package/dist/export.js.map +1 -1
- package/dist/export.mjs +18 -24
- package/dist/export.mjs.map +1 -1
- package/dist/presenter.js +4 -4
- package/dist/presenter.js.map +1 -1
- package/dist/presenter.mjs +1107 -1114
- package/dist/presenter.mjs.map +1 -1
- package/dist/renderer/browser-canvas/utils/text/getTextLayout.d.ts +4 -11
- package/dist/renderer/browser-canvas/utils/text/getTextUnitMeasurements.d.ts +9 -0
- package/package.json +2 -2
package/dist/export.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(Ft,St){typeof exports=="object"&&typeof module<"u"?St(exports,require("path"),require("skia-canvas"),require("fs")):typeof define=="function"&&define.amd?define(["exports","path","skia-canvas","fs"],St):(Ft=typeof globalThis<"u"?globalThis:Ft||self,St(Ft.PresenterExport={},Ft.path,Ft["skia-canvas"],Ft.fs))})(this,(function(Ft,St,xe,ze){"use strict";const Ct={Browser:"browser",Node:"node"},vt={ARROW:"Arrow",CIRCLE:"Circle",GROUP:"Group",IMAGE:"Image",LINE:"Line",MASK:"Mask",PATH:"Path",POLYGON:"Polygon",RECTANGLE:"Rectangle",SLIDE_OBJECT:"SlideObject",SPOTLIGHT:"Spotlight",SVG:"SVG",TEXT:"Text"};function tr(t){const{drawn:n,startX:e,startY:A,endX:a,endY:i,arrowheadSize:s,isArrowheadFilled:c,isDrawnFromCenter:l}=t,r={x:e,y:A},o={x:a,y:i},f=Math.atan2(o.y-r.y,o.x-r.x),g={x:r.x+(o.x-r.x)/2,y:r.y+(o.y-r.y)/2},d=o.x-r.x,m=o.y-r.y,y=Math.hypot(d,m)*n,v=Math.cos(f),b=Math.sin(f),x=l?{x:g.x-v*y/2,y:g.y-b*y/2}:r,k=l?{x:g.x+v*y/2,y:g.y+b*y/2}:{x:r.x+v*y,y:r.y+b*y},L=c?Math.PI/6:Math.PI/4.5,S=y<s*2?y/2:s,T={x:k.x-S*Math.cos(f-L),y:k.y-S*Math.sin(f-L)},U={x:k.x-S*Math.cos(f+L),y:k.y-S*Math.sin(f+L)},P={x:x.x+S*Math.cos(f-L),y:x.y+S*Math.sin(f-L)},_={x:x.x+S*Math.cos(f+L),y:x.y+S*Math.sin(f+L)};return{arrowPoints:[x,k],arrowheadPoints:[T,k,U],doubledArrowheadPoints:[P,x,_]}}function Ue(t,n=null){return t.alpha*(n??1)}function Oe(t,n=null){const{red:e,green:A,blue:a}=t,i=e<<16|A<<8|a,s=Math.round(Ue(t,n)*255);return`#${i.toString(16).padStart(6,"0")}${s!==255?s.toString(16).padStart(2,"0"):""}`}function zt(t,n){throw new Error("Unexpected value: "+t)}const Wt={Browser:"browser",Node:"node"};function Ut({ctx:t,color:n,drawn:e=null,isDrawnFromCenter:A=!1,isRounded:a=!1,opacity:i=null,path:s,pathLength:c=null,width:l}){if(!(l===0||e===0)){if(e!==null&&c!==null&&e!==1){const r=c+(a?l:0),o=c*e;if(!A)t.context.setLineDash([o,r-o]),t.context.lineDashOffset=0;else{const f=r-o;t.context.setLineDash([o,f]),t.context.lineDashOffset=-f/2}}else t.context.setLineDash([]),t.context.lineDashOffset=0;if(t.context.lineWidth=l,t.context.strokeStyle=Oe(n,i),t.context.lineCap=a?"round":"butt",s===void 0){t.context.stroke();return}switch(t.type){case Ct.Browser:s.type===Wt.Browser?t.context.stroke(s.path):console.warn("Attempted to use Node Path2D in Browser Canvas context");break;case Ct.Node:s.type===Wt.Node?t.context.stroke(s.path):console.warn("Attempted to use Browser Path2D in Node Canvas context");break;default:zt(t)}}}function Ce(t,n=null){const{red:e,green:A,blue:a}=t,i=Ue(t,n);return`rgba(${e}, ${A}, ${a}, ${i})`}function Et({ctx:t,path:n,color:e,opacity:A=null}){if(t.context.fillStyle=Ce(e,A),n===void 0){t.context.fill();return}switch(t.type){case Ct.Browser:n.type===Wt.Browser?t.context.fill(n.path):console.warn("Attempted to use Node Path2D in Browser Canvas context");break;case Ct.Node:n.type===Wt.Node?t.context.fill(n.path):console.warn("Attempted to use Browser Path2D in Node Canvas context");break;default:zt(t)}}function Xe(t,n){const e=n(),A=t[0];if(A===void 0)return{path:e,length:0};e.path.moveTo(A.x,A.y);let a=0;for(let i=1;i<t.length;i++){const s=t[i],c=t[i-1];if(s===void 0||c===void 0)continue;const l=s.x-c.x,r=s.y-c.y;a+=Math.hypot(l,r),e.path.lineTo(s.x,s.y)}return{path:e,length:a}}const er=({ctx:t,object:n,opacity:e,createPath2D:A})=>{const a=n.opacity*e;if(a===0||n.drawn===0)return;const{arrowPoints:i,arrowheadPoints:s,doubledArrowheadPoints:c}=tr(n),{path:l}=Xe(i,A),{path:r}=Xe(s,A);if(Ut({color:n.color,ctx:t,path:l,opacity:a,width:n.width}),n.isArrowheadFilled&&(r.path.closePath(),Et({ctx:t,path:r,color:n.color,opacity:a})),Ut({color:n.color,ctx:t,path:r,opacity:a,width:n.width}),n.isArrowheadDoubled){const{path:o}=Xe(c,A);n.isArrowheadFilled&&(o.path.closePath(),Et({ctx:t,path:o,color:n.color,opacity:a})),Ut({color:n.color,ctx:t,path:o,opacity:a,width:n.width})}};function ar(t,n){const e=t.radius-t.strokeWidth/2;if(e<=0)return;const A=n(),a=-Math.PI/2;return A.path.arc(t.x,t.y,e,a,a+2*Math.PI),A}function rr(t,n){const e=n(),A=-Math.PI/2;e.path.arc(t.x,t.y,t.radius,A,A+2*Math.PI);const a=2*Math.PI*t.radius;return{path:e,length:a}}function ha(t,n){switch(t.type){case Ct.Browser:n.type===Wt.Browser?t.context.clip(n.path):console.warn("Attempted to use Node Path2D in Browser Canvas context");break;case Ct.Node:n.type===Wt.Node?t.context.clip(n.path):console.warn("Attempted to use Browser Path2D in Node Canvas context");break;default:zt(t)}}const nr=({ctx:t,object:n,opacity:e,createPath2D:A})=>{const a=n.opacity*e;if(a===0||n.drawn===0&&n.fillColor.alpha===0)return;const{path:i,length:s}=rr(n,A);if(a<1&&n.strokeWidth>0){const c=ar(n,A);c!==void 0&&(t.context.save(),ha(t,c),Et({ctx:t,path:i,color:n.fillColor,opacity:a}),t.context.restore())}else Et({ctx:t,path:i,color:n.fillColor,opacity:a});Ut({color:n.strokeColor,ctx:t,drawn:n.drawn,path:i,pathLength:s,opacity:a,width:n.strokeWidth})};function mt(t=null){return{x:0,y:0,...t}}const or=mt();function wt(t=null){return{height:0,width:0,...t}}const ir=wt({width:0,height:0}),Ot={TOP_LEFT:"TopLeft",TOP:"Top",TOP_RIGHT:"TopRight",LEFT:"Left",CENTER:"Center",RIGHT:"Right",BOTTOM_LEFT:"BottomLeft",BOTTOM:"Bottom",BOTTOM_RIGHT:"BottomRight"};function _t(t=null){return{origin:or,size:ir,...t}}_t();function Xt(t,n,e){const{x:A,y:a}=t,{width:i,height:s}=e;switch(n){case Ot.TOP_LEFT:return _t({origin:mt({x:A,y:a}),size:e});case Ot.TOP:return _t({origin:mt({x:A-i/2,y:a}),size:e});case Ot.TOP_RIGHT:return _t({origin:mt({x:A-i,y:a}),size:e});case Ot.LEFT:return _t({origin:mt({x:A,y:a-s/2}),size:e});case Ot.CENTER:return _t({origin:mt({x:A-i/2,y:a-s/2}),size:e});case Ot.RIGHT:return _t({origin:mt({x:A-i,y:a-s/2}),size:e});case Ot.BOTTOM_LEFT:return _t({origin:mt({x:A,y:a-s}),size:e});case Ot.BOTTOM:return _t({origin:mt({x:A-i/2,y:a-s}),size:e});case Ot.BOTTOM_RIGHT:return _t({origin:mt({x:A-i,y:a-s}),size:e});default:zt(n)}}const Ar=({ctx:t,object:n,renderObject:e,opacity:A})=>{const a=n.scale*n.scaleX,i=n.scale*n.scaleY,s=Xt(mt({x:n.x,y:n.y}),n.anchor,wt({width:n.width*Math.abs(a),height:n.height*Math.abs(i)})),{rotation:c,rotateOriginX:l,rotateOriginY:r,skewOriginX:o,skewOriginY:f,skewX:g,skewY:d}=n;if(!(a===0||i===0)){t.context.save(),t.context.translate(s.origin.x,s.origin.y),t.context.scale(a,i),t.context.translate(l,r),t.context.rotate(c*Math.PI/180),t.context.translate(-l,-r),t.context.translate(o,f),t.context.transform(1,Math.tan(d*Math.PI/180),Math.tan(g*Math.PI/180),1,0,0),t.context.translate(-o,-f);for(const m of n.objects)e(m,A*n.opacity);n.previewColor!==null&&(t.context.fillStyle=Oe(n.previewColor),t.context.fillRect(0,0,n.width,n.height)),n.rotateOriginPreviewSize>0&&(t.context.fillStyle="red",t.context.beginPath(),t.context.arc(l,r,n.rotateOriginPreviewSize,0,2*Math.PI),t.context.fill()),n.skewOriginPreviewSize>0&&(t.context.fillStyle="blue",t.context.beginPath(),t.context.arc(o,f,n.skewOriginPreviewSize,0,2*Math.PI),t.context.fill()),t.context.restore()}};function Ge(t,n,e,A,a=0){const i=A();i.path.moveTo(t.x+e,t.y),i.path.lineTo(t.x+n.width-e,t.y),i.path.arcTo(t.x+n.width,t.y,t.x+n.width,t.y+e,e),i.path.lineTo(t.x+n.width,t.y+n.height-e),i.path.arcTo(t.x+n.width,t.y+n.height,t.x+n.width-e,t.y+n.height,e),i.path.lineTo(t.x+e,t.y+n.height),i.path.arcTo(t.x,t.y+n.height,t.x,t.y+n.height-e,e),i.path.lineTo(t.x,t.y+e),i.path.arcTo(t.x,t.y,t.x+e,t.y,e),a>0&&i.path.lineTo(t.x+e+a,t.y);const s=2*(n.width+n.height-4*e)+2*Math.PI*e+a;return{path:i,length:s}}const de={Browser:"browser",Node:"node"},sr=({ctx:t,imageById:n,object:e,opacity:A,createPath2D:a})=>{const i=Xt(mt({x:e.x,y:e.y}),e.anchor,wt({width:e.width,height:e.height})),s=n[e.imageId];if(s!==void 0){if(t.context.save(),e.cornerRadius>0){const c=Ge(i.origin,i.size,e.cornerRadius,a);switch(t.type){case Ct.Browser:c.path.type===Wt.Browser?t.context.clip(c.path.path):console.warn("Attempted to use Node Path2D in Browser Canvas context");break;case Ct.Node:c.path.type===Wt.Node?t.context.clip(c.path.path):console.warn("Attempted to use Browser Path2D in Node Canvas context");break;default:zt(t)}}switch(t.context.globalAlpha=A*e.opacity,t.context.imageSmoothingEnabled=e.smooth,t.type){case Ct.Browser:s.type===de.Browser?t.context.drawImage(s.image,i.origin.x,i.origin.y,i.size.width,i.size.height):console.warn("Attempted to use Node Image in Browser Canvas context");break;case Ct.Node:s.type===de.Node?t.context.drawImage(s.image,i.origin.x,i.origin.y,i.size.width,i.size.height):console.warn("Attempted to use Browser Image in Node Canvas context");break;default:zt(t)}t.context.restore()}};function lr(t,n){const e=n();e.path.moveTo(t.startX,t.startY),e.path.lineTo(t.endX,t.endY);const A=Math.hypot(t.endX-t.startX,t.endY-t.startY);return{path:e,length:A}}const cr=({ctx:t,object:n,opacity:e,createPath2D:A})=>{const a=n.opacity*e;if(a===0||n.drawn===0)return;const{path:i,length:s}=lr(n,A);Ut({color:n.color,ctx:t,drawn:n.drawn,isDrawnFromCenter:n.isDrawnFromCenter,isRounded:n.isRounded,path:i,pathLength:s,opacity:a,width:n.width})};function kt(t,n=0,e=0,A=1){if(typeof t=="string"){const a=t.replace("#",""),i=parseInt(a,16);return isNaN(i)?(console.warn("Invalid hex color format:",t),pa):a.length===6?{red:i>>16&255,green:i>>8&255,blue:i&255,alpha:1}:a.length===8?{red:i>>24&255,green:i>>16&255,blue:i>>8&255,alpha:(i&255)/255}:(console.warn("Invalid hex color format:",t),pa)}else if(typeof t=="number")return{red:t,green:n??0,blue:e??0,alpha:A??1};return{red:0,green:0,blue:0,alpha:1,...t}}kt.BLACK=kt(0,0,0),kt.BLUE=kt(0,0,255),kt.GREEN=kt(0,255,0),kt.RED=kt(255,0,0),kt.TRANSPARENT=kt(0,0,0,0),kt.WHITE=kt(255,255,255);const pa={red:0,green:0,blue:0,alpha:1},dr=({ctx:t,object:n,opacity:e,renderObject:A})=>{t.context.save();const a=Xt(mt({x:n.x,y:n.y}),n.anchor,wt({width:n.width,height:n.height}));n.preview&&(t.context.lineWidth=4,t.context.strokeStyle=Oe(kt.RED),t.context.rect(a.origin.x,a.origin.y,a.size.width,a.size.height),t.context.stroke()),t.context.beginPath(),t.context.rect(a.origin.x,a.origin.y,a.size.width,a.size.height),t.context.closePath(),t.context.clip();for(const i of n.objects)A(i,e*n.opacity);t.context.restore()},fr=({ctx:t,object:n,opacity:e,createPath2D:A})=>{const a=n.opacity*e;if(a===0||n.drawn===0&&n.fillColor.alpha===0)return;const{origin:i}=Xt(mt({x:n.x,y:n.y}),n.anchor,wt({width:n.width,height:n.height})),s=A(n.path);t.context.save(),t.context.translate(i.x,i.y),t.context.scale(n.width/n.viewboxWidth,n.height/n.viewboxHeight),Et({ctx:t,path:s,color:n.fillColor,opacity:a}),Ut({color:n.strokeColor,ctx:t,drawn:n.drawn,isRounded:n.isRounded,path:s,pathLength:n.pathLength,opacity:a,width:n.strokeWidth}),t.context.restore()};function ua(t,n){const e=n(),A=t.points,a=A[0];if(a===void 0)return{path:e,length:0};e.path.moveTo(a.x,a.y);let i=0,s=a;for(let l=1;l<A.length;l++){const r=A[l];if(r===void 0)continue;e.path.lineTo(r.x,r.y);const o=Math.hypot(r.x-s.x,r.y-s.y);i+=o,s=r}e.path.closePath();const c=Math.hypot(a.x-s.x,a.y-s.y);return i+=c,{path:e,length:i}}const hr=({ctx:t,object:n,opacity:e,createPath2D:A})=>{const a=n.opacity*e;if(a===0||n.drawn===0&&n.fillColor.alpha===0)return;const{path:i,length:s}=ua(n,A);Et({ctx:t,path:i,color:n.fillColor,opacity:a}),Ut({color:n.strokeColor,ctx:t,drawn:n.drawn,path:i,pathLength:s,opacity:a,width:n.strokeWidth})};function pr(t,n){const e=t.strokeWidth/2,{origin:A,size:a}=Xt(mt({x:t.x,y:t.y}),t.anchor,wt({width:t.width,height:t.height})),i=a.width-t.strokeWidth,s=a.height-t.strokeWidth;if(i<=0||s<=0)return;const c=mt({x:A.x+e,y:A.y+e}),l=wt({width:i,height:s}),r=Math.max(0,Math.min(t.cornerRadius-e,Math.min(i,s)/2));if(r>0)return Ge(c,l,r,n).path;const o=n();return o.path.moveTo(c.x,c.y),o.path.lineTo(c.x+i,c.y),o.path.lineTo(c.x+i,c.y+s),o.path.lineTo(c.x,c.y+s),o.path.closePath(),o}function ur(t,n){const{origin:e,size:A}=Xt(mt({x:t.x,y:t.y}),t.anchor,wt({width:t.width,height:t.height})),a=Math.max(0,Math.min(t.cornerRadius,Math.min(A.width,A.height)/2)),i=Math.min(t.strokeWidth*2,A.width-a);if(a>0)return Ge(e,A,a,n,i);{const s=n();s.path.moveTo(e.x,e.y),s.path.lineTo(e.x+A.width,e.y),s.path.lineTo(e.x+A.width,e.y+A.height),s.path.lineTo(e.x,e.y+A.height),s.path.lineTo(e.x,e.y),s.path.lineTo(e.x+i,e.y);const c=2*(A.width+A.height)+i;return{path:s,length:c}}}const gr=({ctx:t,object:n,opacity:e,createPath2D:A})=>{const a=n.opacity*e;if(a===0||n.drawn===0&&n.fillColor.alpha===0)return;const{path:i,length:s}=ur(n,A);if(a<1&&n.strokeWidth>0){const c=pr(n,A);c!==void 0&&(t.context.save(),ha(t,c),Et({ctx:t,path:i,color:n.fillColor,opacity:a}),t.context.restore())}else Et({ctx:t,path:i,color:n.fillColor,opacity:a});Ut({color:n.strokeColor,ctx:t,drawn:n.drawn,path:i,pathLength:s,opacity:a,width:n.strokeWidth})};function ga(t){const{origin:n,size:e}=Xt(mt({x:t.x,y:t.y}),t.anchor,wt({width:t.width,height:t.height}));return{origin:n,size:e,cornerRadius:Math.max(0,Math.min(t.cornerRadius,Math.min(e.width,e.height)/2))}}function mr(t,n,e,A={origin:mt({x:0,y:0}),size:n}){const a=e(),{origin:i,size:s,cornerRadius:c}=ga(t),{origin:l,size:r}=A;return a.path.moveTo(l.x,l.y),a.path.lineTo(l.x+r.width,l.y),a.path.lineTo(l.x+r.width,l.y+r.height),a.path.lineTo(l.x,l.y+r.height),a.path.lineTo(l.x,l.y),c===0?(a.path.moveTo(i.x,i.y),a.path.lineTo(i.x,i.y+s.height),a.path.lineTo(i.x+s.width,i.y+s.height),a.path.lineTo(i.x+s.width,i.y),a.path.lineTo(i.x,i.y),a):(a.path.moveTo(i.x+c,i.y),a.path.arcTo(i.x,i.y,i.x,i.y+c,c),a.path.lineTo(i.x,i.y+s.height-c),a.path.arcTo(i.x,i.y+s.height,i.x+c,i.y+s.height,c),a.path.lineTo(i.x+s.width-c,i.y+s.height),a.path.arcTo(i.x+s.width,i.y+s.height,i.x+s.width,i.y+s.height-c,c),a.path.lineTo(i.x+s.width,i.y+c),a.path.arcTo(i.x+s.width,i.y,i.x+s.width-c,i.y,c),a.path.lineTo(i.x+c,i.y),a)}const vr=({createPath2D:t,ctx:n,object:e,opacity:A,renderScale:a,slideSize:i})=>{const s=e.opacity*A;if(s===0||e.color.alpha===0)return;const c=wt({width:i.width/a,height:i.height/a}),l=mt({x:(i.width-c.width)/2,y:(i.height-c.height)/2}),r=mr(e,i,t,{origin:l,size:c});Et({ctx:n,path:r,color:e.color,opacity:s})},yr=({ctx:t,imageById:n,object:e,opacity:A})=>{const a=e.opacity*A;if(a===0||!e.svg)return;const i=n[e.svg];if(i===void 0)return;const s=Xt(mt({x:e.x,y:e.y}),e.anchor,wt({width:e.width,height:e.height}));switch(t.context.save(),t.context.globalAlpha=a,t.type){case Ct.Browser:i.type===de.Browser&&t.context.drawImage(i.image,s.origin.x,s.origin.y,s.size.width,s.size.height);break;case Ct.Node:i.type===de.Node&&t.context.drawImage(i.image,s.origin.x,s.origin.y,s.size.width,s.size.height);break;default:zt(t)}t.context.restore()},We={LEFT:"left",CENTER:"center",RIGHT:"right"};function ma(t){return{color:t.color,fontFamily:t.fontFamily,fontSize:t.fontSize,fontStyle:t.fontStyle,fontWeight:t.fontWeight,ligatures:t.ligatures,subscript:t.subscript,superscript:t.superscript}}function va(t){return typeof t=="string"?[[{text:t}]]:t.map(n=>n.map(e=>typeof e=="string"?{text:e}:e))}function br(t){return{bottom:Math.max(...t.map(n=>n.bottom),0),height:Math.max(...t.map(n=>n.height),0),lineAdvance:Math.max(...t.map(n=>n.lineAdvance),0),top:Math.max(...t.map(n=>n.top),0),width:t.reduce((n,e)=>n+e.width,0)}}function ya(t,n=1){const e=t.map(br);if(e.length===0)return{lines:[],size:wt()};let A=e[0]?.top??0,a=0;const i=[];for(let r=0;r<e.length;r++){const o=e[r];o!==void 0&&(r>0&&(A+=a*n),i.push({...o,baselineY:A}),a=o.lineAdvance)}const s=Math.min(...i.map(r=>r.baselineY-r.top),0),c=Math.max(...i.map(r=>r.baselineY+r.bottom),0),l=-s;return{lines:i.map(r=>({...r,baselineY:r.baselineY+l})),size:wt({height:c-s,width:Math.max(...i.map(r=>r.width),0)})}}const wr=.7,xr=.3;function Qe(t){const n=t.superscript,e=t.subscript&&!n;return!n&&!e?{baselineShift:0,fontSize:t.fontSize,isSubscript:!1,isSuperscript:!1}:{baselineShift:t.fontSize*xr*(n?-1:1),fontSize:t.fontSize*wr,isSubscript:e,isSuperscript:n}}function ba(t,n=0){return t??n}function Cr(t){const n=ba(t.fontBoundingBoxAscent,t.actualBoundingBoxAscent),e=ba(t.fontBoundingBoxDescent,t.actualBoundingBoxDescent);return{bottom:e,height:n+e,top:n,width:t.width}}function wa(t,n,e=1){const A=Qe(n);t.context.fillStyle=Ce(n.color,e),t.context.font=`${n.fontStyle} ${n.fontWeight} ${A.fontSize}px ${n.fontFamily}`,t.type===Ct.Browser?t.context.textRendering=n.ligatures?"optimizeLegibility":"optimizeSpeed":t.context.fontVariant=n.ligatures?"common-ligatures":"no-common-ligatures"}function xa(t,n,e){const A=[];for(const a of t){const i=[],s=a.length===0?[{text:""}]:a;for(const c of s){const{text:l,...r}=c,o={...n,...r};wa(e,o);const f=e.context.measureText(l),g=Cr(f),{baselineShift:d}=Qe(o),m=Math.max(0,g.top-d),u=Math.max(0,g.bottom+d);i.push({...g,baselineShift:d,bottom:u,height:m+u,lineAdvance:o.fontSize,top:m})}A.push(i)}return A}const Br=({ctx:t,object:n,opacity:e})=>{const A=n.opacity*e;if(A===0)return;const{length:a}=n,i=va(n.text),s=ma(n),c=xa(i,s,t),l=ya(c,n.lineSpacing),r=Xt(mt({x:n.x,y:n.y}),n.anchor,l.size);let o=r.origin.x,f=0;for(let g=0;g<i.length;g++){const d=i[g],m=c[g],u=l.lines[g];if(d==null||m==null||u==null){console.error("Could not determine text units or sizes for line");continue}const y=m.reduce((b,x)=>b+x.width,0);switch(n.alignment){case We.LEFT:o=r.origin.x;break;case We.CENTER:o=r.origin.x+(r.size.width-y)/2;break;case We.RIGHT:o=r.origin.x+(r.size.width-y);break;default:zt(n.alignment);break}const v=r.origin.y+u.baselineY;for(let b=0;b<d.length&&!(a!==null&&f>=a);b++){const x=d[b],k=m[b];if(x==null||k==null){console.error("Could not determine text unit or size for unit");continue}const{text:L,...S}=x;let T;if(a!==null&&f+L.length>a){const _=a-f;T=L.slice(0,_)}const U=T??L;f+=U.length;const P={...s,...S};wa(t,P,A),t.context.fillText(U,o,v+k.baselineShift),o+=k.width}}},Ca={[vt.ARROW]:er,[vt.CIRCLE]:nr,[vt.GROUP]:Ar,[vt.IMAGE]:sr,[vt.LINE]:cr,[vt.MASK]:dr,[vt.PATH]:fr,[vt.POLYGON]:hr,[vt.RECTANGLE]:gr,[vt.SLIDE_OBJECT]:()=>{},[vt.SPOTLIGHT]:vr,[vt.SVG]:yr,[vt.TEXT]:Br};function Ve(t=null){return{backgroundColor:kt.WHITE,slides:[],title:"Presentation",size:wt({width:3840,height:2160}),resources:{images:{}},...t}}const ae={ANIMATE:"Animate",PAUSE:"Pause",UPDATE:"Update"};function Lr(t){const n=Array.isArray(t)?t:[t];let e=0,A=0;for(const a of n)switch(a.type){case ae.PAUSE:e+=a.duration;break;case ae.ANIMATE:A=Math.max(A,e+a.delay+a.duration),a.block&&(e+=a.delay+a.duration);break;case ae.UPDATE:break;default:zt(a)}return A}const Ba=[{check:t=>typeof t=="number",interpolate:(t,n,e)=>t+(n-t)*e},{check:t=>typeof t=="object"&&t!==null&&typeof t.red=="number"&&typeof t.green=="number"&&typeof t.blue=="number"&&typeof t.alpha=="number",interpolate:(t,n,e)=>({red:Math.round(t.red+(n.red-t.red)*e),green:Math.round(t.green+(n.green-t.green)*e),blue:Math.round(t.blue+(n.blue-t.blue)*e),alpha:t.alpha+(n.alpha-t.alpha)*e})},{check:t=>!0,interpolate:(t,n)=>n}];function kr(t,n,e,A=null){if(e===0)return t;if(e===1)return{...t,...n};const a=A!=null?[...A,...Ba]:Ba,i={};for(const s in n){const c=t[s],l=n[s];for(const r of a)if(r.check(c,s)&&r.check(l,s)){i[s]=r.interpolate(c,l,e);break}}return{...t,...i}}function La(t,n,e=null){if(n===null)return;const A=Array.isArray(n)?n:[n];let a=0;for(const i of A){if(e!==null&&a>e)break;switch(i.type){case ae.ANIMATE:{const s=t.get(i.object);if(s===void 0)break;const c=e!==null?e-a:null,l=Math.max(Math.min(c!==null?(c-i.delay)/i.duration:1,1),0);t.set(i.object,{...s,...kr(s,i.props,i.easing(l),i.interpolators)}),i.block&&(a+=i.delay+i.duration);break}case ae.UPDATE:{const s=t.get(i.object);if(s===void 0)break;t.set(i.object,{...s,...i.props});break}case ae.PAUSE:a+=i.duration;break;default:zt(i)}}}function ka(t){return"objects"in t?t.objects.filter(n=>"objectType"in n):[]}function Ye({slide:t,buildIndex:n,buildTime:e}){const A=new Map;function a(s){A.set(s,s);for(const c of ka(s))a(c)}for(const s of t.objects)a(s);const i=e===null?n:n-1;for(let s=0;s<i;s++){const c=t.animations[s]??null;La(A,c)}if(e!==null&&n>0){const s=t.animations[n-1]??null;La(A,s,e)}return A}function Da(t){const n={};function e(A){if(A.objectType===vt.SVG){const i=A.svg;i!==void 0&&i.length>0&&(n[i]=i)}const a=ka(A);for(const i of a)e(i)}for(const A of t.slides)for(const a of A.objects)e(a);return n}function Be(t){const n=[];if(t.isAllKey){for(let e=0;e<=t.animations.length;e++)n.push(e);return n}return t.isStartKey&&n.push(0),t.animations.forEach((e,A)=>{Array.isArray(e)?e.some(a=>a.isKey)&&n.push(A+1):e.isKey&&n.push(A+1)}),t.isEndKey&&n[n.length-1]!==t.animations.length&&n.push(t.animations.length),n}function fe(t){return new xe.Canvas(t.width,t.height)}function Le(t){const n=new xe.Path2D(t);return{type:Wt.Node,path:n}}async function Pa(t,n){if(Object.keys(t).length===0)return{};const e={},A=i=>i.includes("</svg>")?new Promise(c=>{const l=i.replace(/<\?xml[^?]*\?>\s*/g,""),r=new xe.Image;r.src=Buffer.from(l),c(r)}):new Promise((c,l)=>{ze.readFile(St.join(n,i),(r,o)=>{if(r){l(r);return}const f=new xe.Image;f.src=o,c(f)})}),a=Object.entries(t).map(async([i,s])=>{const c=await A(s);e[i]={type:de.Node,image:c}});return await Promise.all(a),e}const Ra=Object.freeze({directoryName:"",imageIndex:0,imageById:{},startImageIndex:0});class Na{constructor(n){const{objectRenderers:e,imageFormat:A="png",...a}=n;this.props={presentation:Ve(),imageFormat:A,animationHoldFrames:1,framesPerSecond:30,isAnimatedExport:!1,getFilenameForImage:i=>`${i.toString().padStart(4,"0")}.${A}`,logFrequency:0,objectRenderers:{...Ca,...e},resourcePathPrefix:"",...a},this.state={...Ra}}async save(n,e=0){const{presentation:A,animationHoldFrames:a,isAnimatedExport:i}=this.props;this.state={...Ra,imageById:await Pa({...A.resources.images,...Da(A)},this.props.resourcePathPrefix),directoryName:n,startImageIndex:e};for(let s=0;s<A.slides.length;s++){const c=A.slides[s];if(c!==void 0)if(i){for(let l=0;l<a;l++)await this.renderImage(s,0);for(let l=0;l<c.animations.length;l++){const r=c.animations[l];if(r===void 0)continue;const o=Lr(r),f=Math.ceil(o/1e3*this.props.framesPerSecond);for(let g=0;g<f;g++)await this.renderImage(s,l+1,g*(o/f));for(let g=0;g<a;g++)await this.renderImage(s,l+1)}}else{const l=Be(c);for(const r of l)await this.renderImage(s,r)}}}async renderImage(n,e,A=null){const{getFilenameForImage:a,objectRenderers:i,logFrequency:s,presentation:c}=this.props,{directoryName:l,imageById:r,imageIndex:o,startImageIndex:f}=this.state;if(this.state.imageIndex+=1,o<f)return;const g=St.join(l,a(o)),d=c.slides[n];if(d===void 0)return;const m=fe(c.size),u={type:Ct.Node,context:m.getContext("2d")},y=Ye({slide:d,buildIndex:e,buildTime:A});u.context.fillStyle=Ce(c.backgroundColor),u.context.fillRect(0,0,m.width,m.height);function v(b,x){const k=i[b.objectType],L=y.get(b);k===void 0||L===void 0||k({ctx:u,imageById:r,object:L,opacity:x,renderScale:1,renderObject:v,createPath2D:Le,slideSize:c.size})}for(const b of d.objects)v(b,1);await m.toFile(g,{format:this.props.imageFormat}),s>0&&o%s===0&&console.log(`Rendered image ${o}: ${g}`)}}function Dr(t,n){if(n===0)return t.notes;const e=t.animations[n-1];return e===void 0?null:Rr(e)}function Pr(t,n,e){const A=[];for(let a=Math.max(n,0);a<=Math.min(e,t.animations.length);a++){const i=Dr(t,a);i!==null&&A.push(i)}return A.length===0?null:A.join(`
|
|
1
|
+
(function(Ft,St){typeof exports=="object"&&typeof module<"u"?St(exports,require("path"),require("skia-canvas"),require("fs")):typeof define=="function"&&define.amd?define(["exports","path","skia-canvas","fs"],St):(Ft=typeof globalThis<"u"?globalThis:Ft||self,St(Ft.PresenterExport={},Ft.path,Ft["skia-canvas"],Ft.fs))})(this,(function(Ft,St,xe,ze){"use strict";const Ct={Browser:"browser",Node:"node"},vt={ARROW:"Arrow",CIRCLE:"Circle",GROUP:"Group",IMAGE:"Image",LINE:"Line",MASK:"Mask",PATH:"Path",POLYGON:"Polygon",RECTANGLE:"Rectangle",SLIDE_OBJECT:"SlideObject",SPOTLIGHT:"Spotlight",SVG:"SVG",TEXT:"Text"};function tr(t){const{drawn:n,startX:e,startY:A,endX:a,endY:i,arrowheadSize:s,isArrowheadFilled:c,isDrawnFromCenter:l}=t,r={x:e,y:A},o={x:a,y:i},f=Math.atan2(o.y-r.y,o.x-r.x),g={x:r.x+(o.x-r.x)/2,y:r.y+(o.y-r.y)/2},d=o.x-r.x,m=o.y-r.y,y=Math.hypot(d,m)*n,v=Math.cos(f),b=Math.sin(f),x=l?{x:g.x-v*y/2,y:g.y-b*y/2}:r,k=l?{x:g.x+v*y/2,y:g.y+b*y/2}:{x:r.x+v*y,y:r.y+b*y},L=c?Math.PI/6:Math.PI/4.5,S=y<s*2?y/2:s,T={x:k.x-S*Math.cos(f-L),y:k.y-S*Math.sin(f-L)},U={x:k.x-S*Math.cos(f+L),y:k.y-S*Math.sin(f+L)},P={x:x.x+S*Math.cos(f-L),y:x.y+S*Math.sin(f-L)},_={x:x.x+S*Math.cos(f+L),y:x.y+S*Math.sin(f+L)};return{arrowPoints:[x,k],arrowheadPoints:[T,k,U],doubledArrowheadPoints:[P,x,_]}}function Ue(t,n=null){return t.alpha*(n??1)}function Oe(t,n=null){const{red:e,green:A,blue:a}=t,i=e<<16|A<<8|a,s=Math.round(Ue(t,n)*255);return`#${i.toString(16).padStart(6,"0")}${s!==255?s.toString(16).padStart(2,"0"):""}`}function zt(t,n){throw new Error("Unexpected value: "+t)}const Wt={Browser:"browser",Node:"node"};function Ut({ctx:t,color:n,drawn:e=null,isDrawnFromCenter:A=!1,isRounded:a=!1,opacity:i=null,path:s,pathLength:c=null,width:l}){if(!(l===0||e===0)){if(e!==null&&c!==null&&e!==1){const r=c+(a?l:0),o=c*e;if(!A)t.context.setLineDash([o,r-o]),t.context.lineDashOffset=0;else{const f=r-o;t.context.setLineDash([o,f]),t.context.lineDashOffset=-f/2}}else t.context.setLineDash([]),t.context.lineDashOffset=0;if(t.context.lineWidth=l,t.context.strokeStyle=Oe(n,i),t.context.lineCap=a?"round":"butt",s===void 0){t.context.stroke();return}switch(t.type){case Ct.Browser:s.type===Wt.Browser?t.context.stroke(s.path):console.warn("Attempted to use Node Path2D in Browser Canvas context");break;case Ct.Node:s.type===Wt.Node?t.context.stroke(s.path):console.warn("Attempted to use Browser Path2D in Node Canvas context");break;default:zt(t)}}}function Ce(t,n=null){const{red:e,green:A,blue:a}=t,i=Ue(t,n);return`rgba(${e}, ${A}, ${a}, ${i})`}function Et({ctx:t,path:n,color:e,opacity:A=null}){if(t.context.fillStyle=Ce(e,A),n===void 0){t.context.fill();return}switch(t.type){case Ct.Browser:n.type===Wt.Browser?t.context.fill(n.path):console.warn("Attempted to use Node Path2D in Browser Canvas context");break;case Ct.Node:n.type===Wt.Node?t.context.fill(n.path):console.warn("Attempted to use Browser Path2D in Node Canvas context");break;default:zt(t)}}function Xe(t,n){const e=n(),A=t[0];if(A===void 0)return{path:e,length:0};e.path.moveTo(A.x,A.y);let a=0;for(let i=1;i<t.length;i++){const s=t[i],c=t[i-1];if(s===void 0||c===void 0)continue;const l=s.x-c.x,r=s.y-c.y;a+=Math.hypot(l,r),e.path.lineTo(s.x,s.y)}return{path:e,length:a}}const er=({ctx:t,object:n,opacity:e,createPath2D:A})=>{const a=n.opacity*e;if(a===0||n.drawn===0)return;const{arrowPoints:i,arrowheadPoints:s,doubledArrowheadPoints:c}=tr(n),{path:l}=Xe(i,A),{path:r}=Xe(s,A);if(Ut({color:n.color,ctx:t,path:l,opacity:a,width:n.width}),n.isArrowheadFilled&&(r.path.closePath(),Et({ctx:t,path:r,color:n.color,opacity:a})),Ut({color:n.color,ctx:t,path:r,opacity:a,width:n.width}),n.isArrowheadDoubled){const{path:o}=Xe(c,A);n.isArrowheadFilled&&(o.path.closePath(),Et({ctx:t,path:o,color:n.color,opacity:a})),Ut({color:n.color,ctx:t,path:o,opacity:a,width:n.width})}};function ar(t,n){const e=t.radius-t.strokeWidth/2;if(e<=0)return;const A=n(),a=-Math.PI/2;return A.path.arc(t.x,t.y,e,a,a+2*Math.PI),A}function rr(t,n){const e=n(),A=-Math.PI/2;e.path.arc(t.x,t.y,t.radius,A,A+2*Math.PI);const a=2*Math.PI*t.radius;return{path:e,length:a}}function ha(t,n){switch(t.type){case Ct.Browser:n.type===Wt.Browser?t.context.clip(n.path):console.warn("Attempted to use Node Path2D in Browser Canvas context");break;case Ct.Node:n.type===Wt.Node?t.context.clip(n.path):console.warn("Attempted to use Browser Path2D in Node Canvas context");break;default:zt(t)}}const nr=({ctx:t,object:n,opacity:e,createPath2D:A})=>{const a=n.opacity*e;if(a===0||n.drawn===0&&n.fillColor.alpha===0)return;const{path:i,length:s}=rr(n,A);if(a<1&&n.strokeWidth>0){const c=ar(n,A);c!==void 0&&(t.context.save(),ha(t,c),Et({ctx:t,path:i,color:n.fillColor,opacity:a}),t.context.restore())}else Et({ctx:t,path:i,color:n.fillColor,opacity:a});Ut({color:n.strokeColor,ctx:t,drawn:n.drawn,path:i,pathLength:s,opacity:a,width:n.strokeWidth})};function mt(t=null){return{x:0,y:0,...t}}const or=mt();function wt(t=null){return{height:0,width:0,...t}}const ir=wt({width:0,height:0}),Ot={TOP_LEFT:"TopLeft",TOP:"Top",TOP_RIGHT:"TopRight",LEFT:"Left",CENTER:"Center",RIGHT:"Right",BOTTOM_LEFT:"BottomLeft",BOTTOM:"Bottom",BOTTOM_RIGHT:"BottomRight"};function _t(t=null){return{origin:or,size:ir,...t}}_t();function Xt(t,n,e){const{x:A,y:a}=t,{width:i,height:s}=e;switch(n){case Ot.TOP_LEFT:return _t({origin:mt({x:A,y:a}),size:e});case Ot.TOP:return _t({origin:mt({x:A-i/2,y:a}),size:e});case Ot.TOP_RIGHT:return _t({origin:mt({x:A-i,y:a}),size:e});case Ot.LEFT:return _t({origin:mt({x:A,y:a-s/2}),size:e});case Ot.CENTER:return _t({origin:mt({x:A-i/2,y:a-s/2}),size:e});case Ot.RIGHT:return _t({origin:mt({x:A-i,y:a-s/2}),size:e});case Ot.BOTTOM_LEFT:return _t({origin:mt({x:A,y:a-s}),size:e});case Ot.BOTTOM:return _t({origin:mt({x:A-i/2,y:a-s}),size:e});case Ot.BOTTOM_RIGHT:return _t({origin:mt({x:A-i,y:a-s}),size:e});default:zt(n)}}const Ar=({ctx:t,object:n,renderObject:e,opacity:A})=>{const a=n.scale*n.scaleX,i=n.scale*n.scaleY,s=Xt(mt({x:n.x,y:n.y}),n.anchor,wt({width:n.width*Math.abs(a),height:n.height*Math.abs(i)})),{rotation:c,rotateOriginX:l,rotateOriginY:r,skewOriginX:o,skewOriginY:f,skewX:g,skewY:d}=n;if(!(a===0||i===0)){t.context.save(),t.context.translate(s.origin.x,s.origin.y),t.context.scale(a,i),t.context.translate(l,r),t.context.rotate(c*Math.PI/180),t.context.translate(-l,-r),t.context.translate(o,f),t.context.transform(1,Math.tan(d*Math.PI/180),Math.tan(g*Math.PI/180),1,0,0),t.context.translate(-o,-f);for(const m of n.objects)e(m,A*n.opacity);n.previewColor!==null&&(t.context.fillStyle=Oe(n.previewColor),t.context.fillRect(0,0,n.width,n.height)),n.rotateOriginPreviewSize>0&&(t.context.fillStyle="red",t.context.beginPath(),t.context.arc(l,r,n.rotateOriginPreviewSize,0,2*Math.PI),t.context.fill()),n.skewOriginPreviewSize>0&&(t.context.fillStyle="blue",t.context.beginPath(),t.context.arc(o,f,n.skewOriginPreviewSize,0,2*Math.PI),t.context.fill()),t.context.restore()}};function Ge(t,n,e,A,a=0){const i=A();i.path.moveTo(t.x+e,t.y),i.path.lineTo(t.x+n.width-e,t.y),i.path.arcTo(t.x+n.width,t.y,t.x+n.width,t.y+e,e),i.path.lineTo(t.x+n.width,t.y+n.height-e),i.path.arcTo(t.x+n.width,t.y+n.height,t.x+n.width-e,t.y+n.height,e),i.path.lineTo(t.x+e,t.y+n.height),i.path.arcTo(t.x,t.y+n.height,t.x,t.y+n.height-e,e),i.path.lineTo(t.x,t.y+e),i.path.arcTo(t.x,t.y,t.x+e,t.y,e),a>0&&i.path.lineTo(t.x+e+a,t.y);const s=2*(n.width+n.height-4*e)+2*Math.PI*e+a;return{path:i,length:s}}const de={Browser:"browser",Node:"node"},sr=({ctx:t,imageById:n,object:e,opacity:A,createPath2D:a})=>{const i=Xt(mt({x:e.x,y:e.y}),e.anchor,wt({width:e.width,height:e.height})),s=n[e.imageId];if(s!==void 0){if(t.context.save(),e.cornerRadius>0){const c=Ge(i.origin,i.size,e.cornerRadius,a);switch(t.type){case Ct.Browser:c.path.type===Wt.Browser?t.context.clip(c.path.path):console.warn("Attempted to use Node Path2D in Browser Canvas context");break;case Ct.Node:c.path.type===Wt.Node?t.context.clip(c.path.path):console.warn("Attempted to use Browser Path2D in Node Canvas context");break;default:zt(t)}}switch(t.context.globalAlpha=A*e.opacity,t.context.imageSmoothingEnabled=e.smooth,t.type){case Ct.Browser:s.type===de.Browser?t.context.drawImage(s.image,i.origin.x,i.origin.y,i.size.width,i.size.height):console.warn("Attempted to use Node Image in Browser Canvas context");break;case Ct.Node:s.type===de.Node?t.context.drawImage(s.image,i.origin.x,i.origin.y,i.size.width,i.size.height):console.warn("Attempted to use Browser Image in Node Canvas context");break;default:zt(t)}t.context.restore()}};function lr(t,n){const e=n();e.path.moveTo(t.startX,t.startY),e.path.lineTo(t.endX,t.endY);const A=Math.hypot(t.endX-t.startX,t.endY-t.startY);return{path:e,length:A}}const cr=({ctx:t,object:n,opacity:e,createPath2D:A})=>{const a=n.opacity*e;if(a===0||n.drawn===0)return;const{path:i,length:s}=lr(n,A);Ut({color:n.color,ctx:t,drawn:n.drawn,isDrawnFromCenter:n.isDrawnFromCenter,isRounded:n.isRounded,path:i,pathLength:s,opacity:a,width:n.width})};function kt(t,n=0,e=0,A=1){if(typeof t=="string"){const a=t.replace("#",""),i=parseInt(a,16);return isNaN(i)?(console.warn("Invalid hex color format:",t),pa):a.length===6?{red:i>>16&255,green:i>>8&255,blue:i&255,alpha:1}:a.length===8?{red:i>>24&255,green:i>>16&255,blue:i>>8&255,alpha:(i&255)/255}:(console.warn("Invalid hex color format:",t),pa)}else if(typeof t=="number")return{red:t,green:n??0,blue:e??0,alpha:A??1};return{red:0,green:0,blue:0,alpha:1,...t}}kt.BLACK=kt(0,0,0),kt.BLUE=kt(0,0,255),kt.GREEN=kt(0,255,0),kt.RED=kt(255,0,0),kt.TRANSPARENT=kt(0,0,0,0),kt.WHITE=kt(255,255,255);const pa={red:0,green:0,blue:0,alpha:1},dr=({ctx:t,object:n,opacity:e,renderObject:A})=>{t.context.save();const a=Xt(mt({x:n.x,y:n.y}),n.anchor,wt({width:n.width,height:n.height}));n.preview&&(t.context.lineWidth=4,t.context.strokeStyle=Oe(kt.RED),t.context.rect(a.origin.x,a.origin.y,a.size.width,a.size.height),t.context.stroke()),t.context.beginPath(),t.context.rect(a.origin.x,a.origin.y,a.size.width,a.size.height),t.context.closePath(),t.context.clip();for(const i of n.objects)A(i,e*n.opacity);t.context.restore()},fr=({ctx:t,object:n,opacity:e,createPath2D:A})=>{const a=n.opacity*e;if(a===0||n.drawn===0&&n.fillColor.alpha===0)return;const{origin:i}=Xt(mt({x:n.x,y:n.y}),n.anchor,wt({width:n.width,height:n.height})),s=A(n.path);t.context.save(),t.context.translate(i.x,i.y),t.context.scale(n.width/n.viewboxWidth,n.height/n.viewboxHeight),Et({ctx:t,path:s,color:n.fillColor,opacity:a}),Ut({color:n.strokeColor,ctx:t,drawn:n.drawn,isRounded:n.isRounded,path:s,pathLength:n.pathLength,opacity:a,width:n.strokeWidth}),t.context.restore()};function ua(t,n){const e=n(),A=t.points,a=A[0];if(a===void 0)return{path:e,length:0};e.path.moveTo(a.x,a.y);let i=0,s=a;for(let l=1;l<A.length;l++){const r=A[l];if(r===void 0)continue;e.path.lineTo(r.x,r.y);const o=Math.hypot(r.x-s.x,r.y-s.y);i+=o,s=r}e.path.closePath();const c=Math.hypot(a.x-s.x,a.y-s.y);return i+=c,{path:e,length:i}}const hr=({ctx:t,object:n,opacity:e,createPath2D:A})=>{const a=n.opacity*e;if(a===0||n.drawn===0&&n.fillColor.alpha===0)return;const{path:i,length:s}=ua(n,A);Et({ctx:t,path:i,color:n.fillColor,opacity:a}),Ut({color:n.strokeColor,ctx:t,drawn:n.drawn,path:i,pathLength:s,opacity:a,width:n.strokeWidth})};function pr(t,n){const e=t.strokeWidth/2,{origin:A,size:a}=Xt(mt({x:t.x,y:t.y}),t.anchor,wt({width:t.width,height:t.height})),i=a.width-t.strokeWidth,s=a.height-t.strokeWidth;if(i<=0||s<=0)return;const c=mt({x:A.x+e,y:A.y+e}),l=wt({width:i,height:s}),r=Math.max(0,Math.min(t.cornerRadius-e,Math.min(i,s)/2));if(r>0)return Ge(c,l,r,n).path;const o=n();return o.path.moveTo(c.x,c.y),o.path.lineTo(c.x+i,c.y),o.path.lineTo(c.x+i,c.y+s),o.path.lineTo(c.x,c.y+s),o.path.closePath(),o}function ur(t,n){const{origin:e,size:A}=Xt(mt({x:t.x,y:t.y}),t.anchor,wt({width:t.width,height:t.height})),a=Math.max(0,Math.min(t.cornerRadius,Math.min(A.width,A.height)/2)),i=Math.min(t.strokeWidth*2,A.width-a);if(a>0)return Ge(e,A,a,n,i);{const s=n();s.path.moveTo(e.x,e.y),s.path.lineTo(e.x+A.width,e.y),s.path.lineTo(e.x+A.width,e.y+A.height),s.path.lineTo(e.x,e.y+A.height),s.path.lineTo(e.x,e.y),s.path.lineTo(e.x+i,e.y);const c=2*(A.width+A.height)+i;return{path:s,length:c}}}const gr=({ctx:t,object:n,opacity:e,createPath2D:A})=>{const a=n.opacity*e;if(a===0||n.drawn===0&&n.fillColor.alpha===0)return;const{path:i,length:s}=ur(n,A);if(a<1&&n.strokeWidth>0){const c=pr(n,A);c!==void 0&&(t.context.save(),ha(t,c),Et({ctx:t,path:i,color:n.fillColor,opacity:a}),t.context.restore())}else Et({ctx:t,path:i,color:n.fillColor,opacity:a});Ut({color:n.strokeColor,ctx:t,drawn:n.drawn,path:i,pathLength:s,opacity:a,width:n.strokeWidth})};function ga(t){const{origin:n,size:e}=Xt(mt({x:t.x,y:t.y}),t.anchor,wt({width:t.width,height:t.height}));return{origin:n,size:e,cornerRadius:Math.max(0,Math.min(t.cornerRadius,Math.min(e.width,e.height)/2))}}function mr(t,n,e,A={origin:mt({x:0,y:0}),size:n}){const a=e(),{origin:i,size:s,cornerRadius:c}=ga(t),{origin:l,size:r}=A;return a.path.moveTo(l.x,l.y),a.path.lineTo(l.x+r.width,l.y),a.path.lineTo(l.x+r.width,l.y+r.height),a.path.lineTo(l.x,l.y+r.height),a.path.lineTo(l.x,l.y),c===0?(a.path.moveTo(i.x,i.y),a.path.lineTo(i.x,i.y+s.height),a.path.lineTo(i.x+s.width,i.y+s.height),a.path.lineTo(i.x+s.width,i.y),a.path.lineTo(i.x,i.y),a):(a.path.moveTo(i.x+c,i.y),a.path.arcTo(i.x,i.y,i.x,i.y+c,c),a.path.lineTo(i.x,i.y+s.height-c),a.path.arcTo(i.x,i.y+s.height,i.x+c,i.y+s.height,c),a.path.lineTo(i.x+s.width-c,i.y+s.height),a.path.arcTo(i.x+s.width,i.y+s.height,i.x+s.width,i.y+s.height-c,c),a.path.lineTo(i.x+s.width,i.y+c),a.path.arcTo(i.x+s.width,i.y,i.x+s.width-c,i.y,c),a.path.lineTo(i.x+c,i.y),a)}const vr=({createPath2D:t,ctx:n,object:e,opacity:A,renderScale:a,slideSize:i})=>{const s=e.opacity*A;if(s===0||e.color.alpha===0)return;const c=wt({width:i.width/a,height:i.height/a}),l=mt({x:(i.width-c.width)/2,y:(i.height-c.height)/2}),r=mr(e,i,t,{origin:l,size:c});Et({ctx:n,path:r,color:e.color,opacity:s})},yr=({ctx:t,imageById:n,object:e,opacity:A})=>{const a=e.opacity*A;if(a===0||!e.svg)return;const i=n[e.svg];if(i===void 0)return;const s=Xt(mt({x:e.x,y:e.y}),e.anchor,wt({width:e.width,height:e.height}));switch(t.context.save(),t.context.globalAlpha=a,t.type){case Ct.Browser:i.type===de.Browser&&t.context.drawImage(i.image,s.origin.x,s.origin.y,s.size.width,s.size.height);break;case Ct.Node:i.type===de.Node&&t.context.drawImage(i.image,s.origin.x,s.origin.y,s.size.width,s.size.height);break;default:zt(t)}t.context.restore()},We={LEFT:"left",CENTER:"center",RIGHT:"right"};function ma(t){return{color:t.color,fontFamily:t.fontFamily,fontSize:t.fontSize,fontStyle:t.fontStyle,fontWeight:t.fontWeight,ligatures:t.ligatures,subscript:t.subscript,superscript:t.superscript}}function va(t){return typeof t=="string"?[[{text:t}]]:t.map(n=>n.map(e=>typeof e=="string"?{text:e}:e))}function br(t){const n=Math.max(...t.map(A=>A.bottom),0),e=Math.max(...t.map(A=>A.top),0);return{bottom:n,height:e+n,lineAdvance:Math.max(...t.map(A=>A.lineAdvance),0),top:e,width:t.reduce((A,a)=>A+a.width,0)}}function ya(t,n=1){const e=t.map(br);if(e.length===0)return{baselines:[],size:wt()};let A=0,a,i=0,s=0;const c=[];for(const r of e){const f=(r.lineAdvance*n-r.height)/2,g=r.top+f;a===void 0?A=g:A+=a+g,c.push(A),i=Math.min(i,A-r.top),s=Math.max(s,A+r.bottom),a=r.bottom+f}const l=-i;return{baselines:c.map(r=>r+l),size:wt({height:s-i,width:Math.max(...e.map(r=>r.width),0)})}}const wr=.7,xr=.3;function Qe(t){const n=t.superscript,e=t.subscript&&!n;return!n&&!e?{baselineShift:0,fontSize:t.fontSize,isSubscript:!1,isSuperscript:!1}:{baselineShift:t.fontSize*xr*(n?-1:1),fontSize:t.fontSize*wr,isSubscript:e,isSuperscript:n}}function ba(t,n=0){return t??n}function Cr(t){const n=ba(t.fontBoundingBoxAscent,t.actualBoundingBoxAscent),e=ba(t.fontBoundingBoxDescent,t.actualBoundingBoxDescent);return{bottom:e,height:n+e,top:n,width:t.width}}function wa(t,n,e=1){const A=Qe(n);t.context.fillStyle=Ce(n.color,e),t.context.font=`${n.fontStyle} ${n.fontWeight} ${A.fontSize}px ${n.fontFamily}`,t.type===Ct.Browser?t.context.textRendering=n.ligatures?"optimizeLegibility":"optimizeSpeed":t.context.fontVariant=n.ligatures?"common-ligatures":"no-common-ligatures"}function xa(t,n,e){const A=[];for(const a of t){const i=[],s=a.length===0?[{text:""}]:a;for(const c of s){const{text:l,...r}=c,o={...n,...r};wa(e,o);const f=e.context.measureText(l),g=Cr(f),{baselineShift:d}=Qe(o),m=Math.max(0,g.top-d),u=Math.max(0,g.bottom+d);i.push({...g,baselineShift:d,bottom:u,height:m+u,lineAdvance:o.fontSize,top:m})}A.push(i)}return A}const Br=({ctx:t,object:n,opacity:e})=>{const A=n.opacity*e;if(A===0)return;const{length:a}=n,i=va(n.text),s=ma(n),c=xa(i,s,t),l=ya(c,n.lineSpacing),r=Xt(mt({x:n.x,y:n.y}),n.anchor,l.size);let o=r.origin.x,f=0;for(let g=0;g<i.length;g++){const d=i[g],m=c[g],u=l.baselines[g];if(d==null||m==null||u==null){console.error("Could not determine text units or sizes for line");continue}const y=m.reduce((b,x)=>b+x.width,0);switch(n.alignment){case We.LEFT:o=r.origin.x;break;case We.CENTER:o=r.origin.x+(r.size.width-y)/2;break;case We.RIGHT:o=r.origin.x+(r.size.width-y);break;default:zt(n.alignment);break}const v=r.origin.y+u;for(let b=0;b<d.length&&!(a!==null&&f>=a);b++){const x=d[b],k=m[b];if(x==null||k==null){console.error("Could not determine text unit or size for unit");continue}const{text:L,...S}=x;let T;if(a!==null&&f+L.length>a){const _=a-f;T=L.slice(0,_)}const U=T??L;f+=U.length;const P={...s,...S};wa(t,P,A),t.context.fillText(U,o,v+k.baselineShift),o+=k.width}}},Ca={[vt.ARROW]:er,[vt.CIRCLE]:nr,[vt.GROUP]:Ar,[vt.IMAGE]:sr,[vt.LINE]:cr,[vt.MASK]:dr,[vt.PATH]:fr,[vt.POLYGON]:hr,[vt.RECTANGLE]:gr,[vt.SLIDE_OBJECT]:()=>{},[vt.SPOTLIGHT]:vr,[vt.SVG]:yr,[vt.TEXT]:Br};function Ve(t=null){return{backgroundColor:kt.WHITE,slides:[],title:"Presentation",size:wt({width:3840,height:2160}),resources:{images:{}},...t}}const ae={ANIMATE:"Animate",PAUSE:"Pause",UPDATE:"Update"};function Lr(t){const n=Array.isArray(t)?t:[t];let e=0,A=0;for(const a of n)switch(a.type){case ae.PAUSE:e+=a.duration;break;case ae.ANIMATE:A=Math.max(A,e+a.delay+a.duration),a.block&&(e+=a.delay+a.duration);break;case ae.UPDATE:break;default:zt(a)}return A}const Ba=[{check:t=>typeof t=="number",interpolate:(t,n,e)=>t+(n-t)*e},{check:t=>typeof t=="object"&&t!==null&&typeof t.red=="number"&&typeof t.green=="number"&&typeof t.blue=="number"&&typeof t.alpha=="number",interpolate:(t,n,e)=>({red:Math.round(t.red+(n.red-t.red)*e),green:Math.round(t.green+(n.green-t.green)*e),blue:Math.round(t.blue+(n.blue-t.blue)*e),alpha:t.alpha+(n.alpha-t.alpha)*e})},{check:t=>!0,interpolate:(t,n)=>n}];function kr(t,n,e,A=null){if(e===0)return t;if(e===1)return{...t,...n};const a=A!=null?[...A,...Ba]:Ba,i={};for(const s in n){const c=t[s],l=n[s];for(const r of a)if(r.check(c,s)&&r.check(l,s)){i[s]=r.interpolate(c,l,e);break}}return{...t,...i}}function La(t,n,e=null){if(n===null)return;const A=Array.isArray(n)?n:[n];let a=0;for(const i of A){if(e!==null&&a>e)break;switch(i.type){case ae.ANIMATE:{const s=t.get(i.object);if(s===void 0)break;const c=e!==null?e-a:null,l=Math.max(Math.min(c!==null?(c-i.delay)/i.duration:1,1),0);t.set(i.object,{...s,...kr(s,i.props,i.easing(l),i.interpolators)}),i.block&&(a+=i.delay+i.duration);break}case ae.UPDATE:{const s=t.get(i.object);if(s===void 0)break;t.set(i.object,{...s,...i.props});break}case ae.PAUSE:a+=i.duration;break;default:zt(i)}}}function ka(t){return"objects"in t?t.objects.filter(n=>"objectType"in n):[]}function Ye({slide:t,buildIndex:n,buildTime:e}){const A=new Map;function a(s){A.set(s,s);for(const c of ka(s))a(c)}for(const s of t.objects)a(s);const i=e===null?n:n-1;for(let s=0;s<i;s++){const c=t.animations[s]??null;La(A,c)}if(e!==null&&n>0){const s=t.animations[n-1]??null;La(A,s,e)}return A}function Da(t){const n={};function e(A){if(A.objectType===vt.SVG){const i=A.svg;i!==void 0&&i.length>0&&(n[i]=i)}const a=ka(A);for(const i of a)e(i)}for(const A of t.slides)for(const a of A.objects)e(a);return n}function Be(t){const n=[];if(t.isAllKey){for(let e=0;e<=t.animations.length;e++)n.push(e);return n}return t.isStartKey&&n.push(0),t.animations.forEach((e,A)=>{Array.isArray(e)?e.some(a=>a.isKey)&&n.push(A+1):e.isKey&&n.push(A+1)}),t.isEndKey&&n[n.length-1]!==t.animations.length&&n.push(t.animations.length),n}function fe(t){return new xe.Canvas(t.width,t.height)}function Le(t){const n=new xe.Path2D(t);return{type:Wt.Node,path:n}}async function Pa(t,n){if(Object.keys(t).length===0)return{};const e={},A=i=>i.includes("</svg>")?new Promise(c=>{const l=i.replace(/<\?xml[^?]*\?>\s*/g,""),r=new xe.Image;r.src=Buffer.from(l),c(r)}):new Promise((c,l)=>{ze.readFile(St.join(n,i),(r,o)=>{if(r){l(r);return}const f=new xe.Image;f.src=o,c(f)})}),a=Object.entries(t).map(async([i,s])=>{const c=await A(s);e[i]={type:de.Node,image:c}});return await Promise.all(a),e}const Ra=Object.freeze({directoryName:"",imageIndex:0,imageById:{},startImageIndex:0});class Na{constructor(n){const{objectRenderers:e,imageFormat:A="png",...a}=n;this.props={presentation:Ve(),imageFormat:A,animationHoldFrames:1,framesPerSecond:30,isAnimatedExport:!1,getFilenameForImage:i=>`${i.toString().padStart(4,"0")}.${A}`,logFrequency:0,objectRenderers:{...Ca,...e},resourcePathPrefix:"",...a},this.state={...Ra}}async save(n,e=0){const{presentation:A,animationHoldFrames:a,isAnimatedExport:i}=this.props;this.state={...Ra,imageById:await Pa({...A.resources.images,...Da(A)},this.props.resourcePathPrefix),directoryName:n,startImageIndex:e};for(let s=0;s<A.slides.length;s++){const c=A.slides[s];if(c!==void 0)if(i){for(let l=0;l<a;l++)await this.renderImage(s,0);for(let l=0;l<c.animations.length;l++){const r=c.animations[l];if(r===void 0)continue;const o=Lr(r),f=Math.ceil(o/1e3*this.props.framesPerSecond);for(let g=0;g<f;g++)await this.renderImage(s,l+1,g*(o/f));for(let g=0;g<a;g++)await this.renderImage(s,l+1)}}else{const l=Be(c);for(const r of l)await this.renderImage(s,r)}}}async renderImage(n,e,A=null){const{getFilenameForImage:a,objectRenderers:i,logFrequency:s,presentation:c}=this.props,{directoryName:l,imageById:r,imageIndex:o,startImageIndex:f}=this.state;if(this.state.imageIndex+=1,o<f)return;const g=St.join(l,a(o)),d=c.slides[n];if(d===void 0)return;const m=fe(c.size),u={type:Ct.Node,context:m.getContext("2d")},y=Ye({slide:d,buildIndex:e,buildTime:A});u.context.fillStyle=Ce(c.backgroundColor),u.context.fillRect(0,0,m.width,m.height);function v(b,x){const k=i[b.objectType],L=y.get(b);k===void 0||L===void 0||k({ctx:u,imageById:r,object:L,opacity:x,renderScale:1,renderObject:v,createPath2D:Le,slideSize:c.size})}for(const b of d.objects)v(b,1);await m.toFile(g,{format:this.props.imageFormat}),s>0&&o%s===0&&console.log(`Rendered image ${o}: ${g}`)}}function Dr(t,n){if(n===0)return t.notes;const e=t.animations[n-1];return e===void 0?null:Rr(e)}function Pr(t,n,e){const A=[];for(let a=Math.max(n,0);a<=Math.min(e,t.animations.length);a++){const i=Dr(t,a);i!==null&&A.push(i)}return A.length===0?null:A.join(`
|
|
2
2
|
|
|
3
3
|
`)}function Rr(t){if(!Array.isArray(t))return t.notes;const n=t.map(({notes:e})=>e).filter(e=>e!==null);return n.length>0?n.join(`
|
|
4
4
|
|