@pptkit/svg-renderer 0.1.2

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 PPTKit Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,17 @@
1
+ # `@pptkit/svg-renderer`
2
+
3
+ Browser-oriented SVG preview rendering for PPTKit presentations. The renderer consumes
4
+ the public Core and Layout contracts and returns one standalone SVG string per slide.
5
+
6
+ ```ts
7
+ import { renderPresentationToSvg } from "@pptkit/svg-renderer";
8
+
9
+ const result = await renderPresentationToSvg(presentation);
10
+ preview.innerHTML = result.slides[0]?.svg ?? "";
11
+ ```
12
+
13
+ The output uses SVG geometry, images, and native `<text>/<tspan>` layout for simple
14
+ text. XHTML `foreignObject` remains a fallback for mixed-run rich text and tables. It
15
+ targets modern browsers and is intended for QA previews, not as a
16
+ pixel-identical PowerPoint renderer or a portable SVG interchange format. URL assets
17
+ work by default; local path assets require a custom `SvgAssetResolver`.
@@ -0,0 +1 @@
1
+ !function(t,e,i){"use strict";function n(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function o(t){const e=t.replace(/[^A-Za-z0-9_.:-]/g,"-");let i=2166136261;for(let e=0;e<t.length;e+=1)i^=t.charCodeAt(e),i=Math.imul(i,16777619);return`${/^[A-Za-z_]/.test(e)?e:`id-${e}`}-${(i>>>0).toString(36)}`}function r(t){try{const e=new URL(t,"https://pptkit.invalid");if(["http:","https:","mailto:"].includes(e.protocol))return t}catch{return}}function s(t,e){const i="string"==typeof t?t:e.colors[t.theme];return i.startsWith("#")?i:`#${i}`}function a(t,e,i){return"none"===t.type?`${i}="none"`:`${i}="${s(t.color,e)}" ${i}-opacity="${t.opacity}"`}function l(t,e){const i=function(t){const e=Math.max(t.width,1);return"dash"===t.dash?`${4*e} ${3*e}`:"dot"===t.dash?`${e} ${2*e}`:"dashDot"===t.dash?`${4*e} ${2*e} ${e} ${2*e}`:void 0}(t);return`${a(t.paint,e,"stroke")} stroke-width="${t.width}"${void 0===i?"":` stroke-dasharray="${i}"`} stroke-linecap="round" stroke-linejoin="round"`}function d(t,e){if(0===e.rotation&&!e.flipH&&!e.flipV)return"";const i=t.x+t.width/2,n=t.y+t.height/2;return` transform="translate(${i} ${n}) rotate(${e.rotation}) scale(${e.flipH?-1:1} ${e.flipV?-1:1}) translate(${-i} ${-n})"`}function c(t){const e=t.codePointAt(0)??0;return e>=4352&&e<=4607||e>=11904&&e<=40959||e>=44032&&e<=55215||e>=63744&&e<=64255||e>=127744&&e<=129791}function h(t,e){return t.style.fontSize*e}function p(t){return Math.round(1e3*t)/1e3}function $(t,e,i){return h(e,i)*(/\s/u.test(t)?.28:c(t)?1:/[,.;:!?()[\]{}'"`-]/u.test(t)?.32:/[fijltIr|]/u.test(t)?.3:/[mMwWOQ%@]/u.test(t)?.72:/\d/u.test(t)?.55:/[A-Z]/u.test(t)?.6:.52)*1.06*(e.style.bold&&!c(t)?1.03:1)*(e.style.italic?1.02:1)}function u(t,e,i){let n=0;for(const o of t)n+=$(o,e,i);return n}function g(t,e,i){if(""===i)return;const n=t.at(-1);n?.run===e?n.text+=i:t.push({run:e,text:i})}function f(t,e,i){const n=t.runs[0];if(void 0===n)return[];const o=w(t),r=Math.max(1,e+t.style.hanging),s=Math.max(1,e),a=[];let l,d=!0,c=[],p=0;const f=()=>{c=[],p=0,d&&""!==o&&(g(c,n,o),p=u(o,n,i))},m=()=>{const e=c.reduce((t,e)=>Math.max(t,h(e.run,i)),h(n,i));a.push({first:d,fontSize:e,lineHeight:e*t.style.lineSpacing,paragraph:t,segments:c}),d=!1,l=void 0,f()},y=(t,e)=>{const n=void 0===l||0===c.length?"":" ",a=d?r:s,h=p+u(n,l??e,i)+u(t,e,i);c.length>(d&&""!==o?1:0)&&h>a&&m(),void 0!==l&&c.length>0&&(g(c,l," "),p+=u(" ",l,i));for(const n of t){const t=$(n,e,i),a=d?r:s;c.length>(d&&""!==o?1:0)&&p+t>a&&m(),g(c,e,n),p+=t}l=void 0};f();for(const e of t.runs)for(const t of e.text.split(/(\s+)/u))""!==t&&(/\s/u.test(t)?t.includes("\n")?m():l=e:y(t,e));return(c.length>0||0===a.length)&&m(),a}function m(t,e,i,o){"resize"===e.autoFit.mode&&o.warnings.push({code:"text-autofit-resize-unsupported",message:"Text autoFit resize cannot change SVG element geometry and was rendered inside the authored box.",slideId:o.slideId,elementId:o.elementId});const r="shrink"===e.autoFit.mode?e.autoFit.fontScale:1,a=Math.max(1,i.width-e.margin.left-e.margin.right),l=[];let d=0;for(const e of t){d+=e.style.spaceBefore;const t=Math.max(1,a-e.style.indent);for(const i of f(e,t,r))l.push({...i,y:d}),d+=i.lineHeight;d+=e.style.spaceAfter}const c=Math.max(0,i.height-e.margin.top-e.margin.bottom),$="middle"===e.verticalAlign?Math.max(0,(c-d)/2):"bottom"===e.verticalAlign?Math.max(0,c-d):0;return l.map((t,a)=>{const l=t.paragraph.style,d=i.x+e.margin.left+l.indent-(t.first?l.hanging:0),c=i.x+i.width-e.margin.right,u="center"===(g=l.align)?"middle":"right"===g?"end":"start";var g;const f="middle"===u?(d+c)/2:"end"===u?c:d,m=i.y+e.margin.top+$+t.y+.8*t.fontSize,w=t.segments.map(t=>`<tspan ${function(t,e,i){const o=[t.style.underline?"underline":"",t.style.strike?"line-through":""].filter(Boolean).join(" ");return[`font-family="${n(y(t.style.fontFamily,i))}"`,`font-size="${p(h(t,e))}"`,`font-weight="${t.style.bold?700:400}"`,`font-style="${t.style.italic?"italic":"normal"}"`,`text-decoration="${o||"none"}"`,`fill="${s(t.style.color,i)}"`,`lang="${n(t.style.language)}"`].join(" ")}(t.run,r,o.theme)}>${n(t.text)}</tspan>`).join("");return`<text x="${f}" y="${m}" text-anchor="${u}" data-pptkit-text-line="${a}">${w}</text>`}).join("")}function y(t,e){return"string"==typeof t?t:e.fonts[t.theme]}function w(t){const e=t.style.bullet;if("none"===e.type)return"";if("bullet"===e.type)return`${e.character} `;const i=e.startAt;return"arabicParen"===e.style?`${i}) `:"alphaLowerPeriod"===e.style?`${String.fromCharCode(96+Math.min(26,i))}. `:"alphaUpperPeriod"===e.style?`${String.fromCharCode(64+Math.min(26,i))}. `:`${i}. `}function x(t,e,i){"resize"===e.autoFit.mode&&i.warnings.push({code:"text-autofit-resize-unsupported",message:"Text autoFit resize cannot change SVG element geometry and was rendered inside the authored box.",slideId:i.slideId,elementId:i.elementId});const o="shrink"===e.autoFit.mode?e.autoFit.fontScale:1,a=["width:100%","height:100%","box-sizing:border-box","display:flex","flex-direction:column",`justify-content:${"middle"===e.verticalAlign?"center":"bottom"===e.verticalAlign?"flex-end":"flex-start"}`,`padding:${e.margin.top}px ${e.margin.right}px ${e.margin.bottom}px ${e.margin.left}px`,"overflow:visible",e.wrap?"overflow-wrap:anywhere":"white-space:pre"].join(";"),l=t.map(t=>{const a=t.style,l=["margin:0",`padding-left:${a.indent}px`,`text-indent:${-a.hanging}px`,`line-height:${a.lineSpacing}`,`padding-top:${a.spaceBefore}px`,`padding-bottom:${a.spaceAfter}px`,`text-align:${a.align}`,e.wrap?"white-space:pre-wrap":"white-space:pre"].join(";"),d=t.runs.map(t=>{const e=[t.style.underline?"underline":"",t.style.strike?"line-through":""].filter(Boolean).join(" "),a=["font-family:"+(l=y(t.style.fontFamily,i.theme),`&quot;${n(l.replace(/\\/g,"\\\\").replace(/"/g,'\\"'))}&quot;`),`font-size:${p(t.style.fontSize*o)}px`,"font-weight:"+(t.style.bold?700:400),"font-style:"+(t.style.italic?"italic":"normal"),`text-decoration:${e||"none"}`,`color:${s(t.style.color,i.theme)}`].join(";");var l;const d=function(t,e){if(void 0===t)return{open:"",close:""};if("slide"===t.type)return e.warnings.push({code:"slide-action-not-linked",message:`Slide action targeting ${t.slideId} is metadata-only in standalone SVG output.`,slideId:e.slideId,elementId:e.elementId}),{open:`<span data-pptkit-slide-target="${n(t.slideId)}">`,close:"</span>"};const i=r(t.url);return void 0===i?(e.warnings.push({code:"unsafe-action-url",message:"An action URL with an unsupported protocol was omitted.",slideId:e.slideId,elementId:e.elementId}),{open:"",close:""}):{open:`<a href="${n(i)}" rel="noopener noreferrer"${void 0===t.tooltip?"":` title="${n(t.tooltip)}"`}>`,close:"</a>"}}(t.action,i);return`${d.open}<span lang="${n(t.style.language)}" style="${a}">${n(t.text)}</span>${d.close}`}).join(""),c=w(t);return`<div style="${l}">${""===c?"":`<span aria-hidden="true">${n(c)}</span>`}${d}</div>`}).join("");return`<div xmlns="http://www.w3.org/1999/xhtml" style="${a}">${l}</div>`}function v(t){const e=` data-pptkit-element-id="${n(t.id)}"`;return t.accessibility.decorative?`${e} aria-hidden="true"`:`${e} role="img" aria-label="${n(t.accessibility.description??t.name)}"`}function I(t,e,i){const o=t.action;if(void 0===o)return e;if("slide"===o.type)return i.warnings.push({code:"slide-action-not-linked",message:`Slide action targeting ${o.slideId} is metadata-only in standalone SVG output.`,slideId:i.slideId,elementId:t.id}),`<g data-pptkit-slide-target="${n(o.slideId)}">${e}</g>`;const s=r(o.url);return void 0===s?(i.warnings.push({code:"unsafe-action-url",message:"An action URL with an unsupported protocol was omitted.",slideId:i.slideId,elementId:t.id}),e):`<a href="${n(s)}" rel="noopener noreferrer"${void 0===o.tooltip?"":` aria-label="${n(o.tooltip)}"`}>${e}</a>`}function b(t,e,i,n,o,r=!1){return`<foreignObject x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}"${r?' overflow="visible"':""}${i} opacity="${n}"${o}>${e}</foreignObject>`}function k(t,e,i,n,r){if("none"===t||"none"===n.paint.type)return;const s=o(`${r.slideId}-${i}-${e}-${t}`),a="solid"===n.paint.type?"string"==typeof n.paint.color?n.paint.color:r.theme.colors[n.paint.color.theme]:"000000",l=a.startsWith("#")?a:`#${a}`;return r.defs.push(`<marker id="${s}" markerWidth="10" markerHeight="10" refX="${"end"===e?9:1}" refY="5" orient="auto-start-reverse" markerUnits="strokeWidth" viewBox="0 0 10 10">${function(t,e){return"oval"===t?`<circle cx="5" cy="5" r="3.5" fill="${e}"/>`:"diamond"===t?`<path d="M1 5 L5 1 L9 5 L5 9 Z" fill="${e}"/>`:"stealth"===t?`<path d="M1 1 L9 5 L1 9 L4 5 Z" fill="${e}"/>`:"arrow"===t?`<path d="M1 1 L9 5 L1 9" fill="none" stroke="${e}" stroke-width="1.5"/>`:`<path d="M1 1 L9 5 L1 9 Z" fill="${e}"/>`}(t,l)}</marker>`),s}function A(t,e){const{x:i,y:n,width:o,height:r}=t.box;return`<g${d(t.box,t.transform)} opacity="${t.opacity}"${v(t)}><rect x="${i}" y="${n}" width="${o}" height="${r}" fill="#F3F4F6" stroke="#9CA3AF" stroke-dasharray="6 4"/><path d="M${i+.15*o} ${n+.75*r} L${i+.42*o} ${n+.45*r} L${i+.6*o} ${n+.62*r} L${i+.78*o} ${n+.35*r} L${i+.9*o} ${n+.75*r}" fill="none" stroke="#9CA3AF" stroke-width="2"/></g>`}async function z(t,e){const i=e.assets.get(t.assetId);if(void 0===i)return e.warnings.push({code:"asset-missing",message:`Image asset ${t.assetId} was not found.`,slideId:e.slideId,elementId:t.id,assetId:t.assetId}),A(t);const r=await async function(t,e){let i=e.assetCache.get(t.id);return void 0===i&&(i=(async()=>{if(void 0!==e.resolveAsset)try{const i=await e.resolveAsset(t);return void 0===i&&e.warnings.push({code:"asset-unresolved",message:"The asset resolver did not return an image URL.",slideId:e.slideId,assetId:t.id}),i}catch(i){return void e.warnings.push({code:"asset-resolver-failed",message:`The asset resolver failed: ${i instanceof Error?i.message:String(i)}`,slideId:e.slideId,assetId:t.id})}if("url"===t.source.type)return t.source.value;e.warnings.push({code:"asset-path-unsupported",message:"Local path assets require a custom SvgAssetResolver.",slideId:e.slideId,assetId:t.id})})(),e.assetCache.set(t.id,i)),i}(i,e);if(void 0===r||void 0===function(t){try{const e=new URL(t,"https://pptkit.invalid");if(["http:","https:","blob:"].includes(e.protocol))return t;if("data:"===e.protocol&&/^data:image\//i.test(t))return t}catch{return}}(r))return void 0!==r&&e.warnings.push({code:"unsafe-asset-url",message:"An image URL with an unsupported protocol was omitted.",slideId:e.slideId,elementId:t.id,assetId:i.id}),A(t);const s=o(`${e.slideId}-${t.id}-clip`),a=t.box;let l;if(e.defs.push(`<clipPath id="${s}"><rect x="${a.x}" y="${a.y}" width="${a.width}" height="${a.height}"/></clipPath>`),"crop"===t.fit&&void 0!==i.width&&void 0!==i.height){const e=Math.max(1e-4,1-t.crop.left-t.crop.right),i=Math.max(1e-4,1-t.crop.top-t.crop.bottom),o=a.width/e,s=a.height/i;l=`<image href="${n(r)}" x="${a.x-o*t.crop.left}" y="${a.y-s*t.crop.top}" width="${o}" height="${s}" preserveAspectRatio="none"/>`}else"crop"===t.fit&&e.warnings.push({code:"image-crop-degraded",message:"Image crop requires intrinsic asset dimensions; preview fell back to centered cover.",slideId:e.slideId,elementId:t.id,assetId:i.id}),l=`<image href="${n(r)}" x="${a.x}" y="${a.y}" width="${a.width}" height="${a.height}" preserveAspectRatio="${"stretch"===t.fit?"none":"xMidYMid slice"}"/>`;return I(t,`<g${d(a,t.transform)} opacity="${t.opacity}" clip-path="url(#${s})"${v(t)}>${l}</g>`,e)}async function M(t,e){if(t.hidden)return"";if("image"===t.type)return z(t,e);if("group"===t.type)return function(t,e){return(async()=>{const i=[];for(const n of t.children)i.push(await M(n,e));const n=i.join(""),o=t.box,r=o.x+o.width/2,s=o.y+o.height/2,a=`translate(${r} ${s}) rotate(${t.transform.rotation}) scale(${t.transform.flipH?-1:1} ${t.transform.flipV?-1:1}) translate(${-r} ${-s}) translate(${o.x} ${o.y}) scale(${o.width/t.coordinateSize.width} ${o.height/t.coordinateSize.height})`;return I(t,`<g transform="${a}" opacity="${t.opacity}"${v(t)}>${n}</g>`,e)})()}(t,e);if("text"===t.type){const i={theme:e.theme,warnings:e.warnings,slideId:e.slideId,elementId:t.id};if(t.content.every(t=>1===t.runs.length&&void 0===t.runs[0]?.action)){const n=m(t.content,t.frame,t.box,i);return I(t,`<g${d(t.box,t.transform)} opacity="${t.opacity}"${v(t)}>${n}</g>`,e)}const n=x(t.content,t.frame,i);return I(t,b(t.box,n,d(t.box,t.transform),t.opacity,v(t),!0),e)}if("shape"===t.type){const i=d(t.box,t.transform),n=function(t,e){const{x:i,y:n,width:o,height:r}=t.box,s=`${a(t.style.fill,e.theme,"fill")} ${l(t.style.stroke,e.theme)}`;return"rect"===t.shape?`<rect x="${i}" y="${n}" width="${o}" height="${r}" ${s}/>`:"roundRect"===t.shape?`<rect x="${i}" y="${n}" width="${o}" height="${r}" rx="${.08*Math.min(o,r)}" ${s}/>`:"ellipse"===t.shape?`<ellipse cx="${i+o/2}" cy="${n+r/2}" rx="${o/2}" ry="${r/2}" ${s}/>`:`<polygon points="${("triangle"===t.shape?[[i+o/2,n],[i+o,n+r],[i,n+r]]:"diamond"===t.shape?[[i+o/2,n],[i+o,n+r/2],[i+o/2,n+r],[i,n+r/2]]:"arrow"===t.shape?[[i,n+.25*r],[i+.62*o,n+.25*r],[i+.62*o,n],[i+o,n+r/2],[i+.62*o,n+r],[i+.62*o,n+.75*r],[i,n+.75*r]]:[[i,n],[i+.65*o,n],[i+o,n+r/2],[i+.65*o,n+r],[i,n+r],[i+.35*o,n+r/2]]).map(t=>t.join(",")).join(" ")}" ${s}/>`}(t,e),o=void 0===t.text?"":b(t.box,x(t.text.content,t.text.frame,{theme:e.theme,warnings:e.warnings,slideId:e.slideId,elementId:t.id}),"",1,"",!0);return I(t,`<g${i} opacity="${t.opacity}"${v(t)}>${n}${o}</g>`,e)}if("connector"===t.type){const i=[t.start,...t.route,t.end],n=k(t.style.beginArrow,"start",t.id,t.style,e),o=k(t.style.endArrow,"end",t.id,t.style,e),r=`${void 0===n?"":` marker-start="url(#${n})"`}${void 0===o?"":` marker-end="url(#${o})"`}`,s=`<polyline points="${i.map(t=>`${t.x},${t.y}`).join(" ")}" fill="none" ${l(t.style,e.theme)}${r}/>`;return I(t,`<g${d(t.box,t.transform)} opacity="${t.opacity}"${v(t)}>${s}</g>`,e)}return"table"===t.type?I(t,b(t.box,function(t,e){return`<div xmlns="http://www.w3.org/1999/xhtml" style="width:100%;height:100%;overflow:hidden"><table style="width:100%;height:100%;table-layout:fixed;border-collapse:collapse;border-spacing:0"><colgroup>${t.columns.map(t=>`<col style="width:${t}px"/>`).join("")}</colgroup><tbody>${t.rows.map(i=>{const n=i.cells.map(i=>{const n="none"===i.style.fill.type?"transparent":"string"==typeof i.style.fill.color?i.style.fill.color:e.theme.colors[i.style.fill.color.theme],o="transparent"===n||n.startsWith("#")?n:`#${n}`,r="none"===i.style.stroke.paint.type?"transparent":"string"==typeof i.style.stroke.paint.color?i.style.stroke.paint.color:e.theme.colors[i.style.stroke.paint.color.theme],s="transparent"===r||r.startsWith("#")?r:`#${r}`,a=`box-sizing:border-box;background:${o};border:${i.style.stroke.width}px solid ${s};padding:${i.style.margin.top}px ${i.style.margin.right}px ${i.style.margin.bottom}px ${i.style.margin.left}px;vertical-align:${i.style.verticalAlign};overflow:hidden`,l={margin:{top:0,right:0,bottom:0,left:0},verticalAlign:i.style.verticalAlign,wrap:!0,autoFit:{mode:"none"}};return`<td rowspan="${i.rowSpan}" colspan="${i.colSpan}" style="${a}">${x(i.content,l,{theme:e.theme,warnings:e.warnings,slideId:e.slideId,elementId:t.id})}</td>`}).join("");return`<tr style="height:${i.height}px">${n}</tr>`}).join("")}</tbody></table></div>`}(t,e),d(t.box,t.transform),t.opacity,v(t)),e):""}function S(t,e,i){return`<rect x="0" y="0" width="${t.width}" height="${t.height}" ${a(e,i,"fill")}/>`}async function j(t,e={}){const i=[],r=new Map(t.assets.map(t=>[t.id,t])),s=new Map(t.layouts.map(t=>[t.id,t])),a=[];for(let l=0;l<t.slides.length;l+=1){const d=t.slides[l],c=[],h={slideId:d.id,theme:t.theme,assets:r,...void 0===e.resolveAsset?{}:{resolveAsset:e.resolveAsset},assetCache:new Map,warnings:i,defs:c},p=s.get(d.layoutId),$=[...p?.elements??[],...d.elements],u=[];for(const t of $)u.push(await M(t,h));const g=u.join(""),f=`${t.metadata.title||"PPTKit presentation"} — slide ${l+1}`,m=o(`pptkit-slide-${d.id}`),y=`<svg id="${m}" xmlns="http://www.w3.org/2000/svg" xmlns:xhtml="http://www.w3.org/1999/xhtml" viewBox="0 0 ${t.size.width} ${t.size.height}" width="${t.size.width}" height="${t.size.height}" role="img" aria-labelledby="${m}-title" data-pptkit-slide-id="${n(d.id)}"><title id="${m}-title">${n(f)}</title><defs>${c.join("")}</defs>${S({width:t.size.width,height:t.size.height},d.background,t.theme)}${g}</svg>`;a.push({slideId:d.id,index:l,hidden:d.hidden,svg:y})}return{width:t.size.width,height:t.size.height,slides:a,warnings:i,status:0===i.length?"rendered":"rendered-with-warnings"}}t.renderLayoutToSvg=async function(t,e){return j(t,e)},t.renderPresentationToSvg=async function(t,n){return j(i.resolveNormalizedLayout(e.normalizePresentation(t)),n)}}(this.PPTKit=this.PPTKit||{},PPTKit,PPTKit);
@@ -0,0 +1 @@
1
+ import{normalizePresentation as t}from"@pptkit/core";import{resolveNormalizedLayout as e}from"@pptkit/layout";function i(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function n(t){const e=t.replace(/[^A-Za-z0-9_.:-]/g,"-");let i=2166136261;for(let e=0;e<t.length;e+=1)i^=t.charCodeAt(e),i=Math.imul(i,16777619);return`${/^[A-Za-z_]/.test(e)?e:`id-${e}`}-${(i>>>0).toString(36)}`}function o(t){try{const e=new URL(t,"https://pptkit.invalid");if(["http:","https:","mailto:"].includes(e.protocol))return t}catch{return}}function r(t,e){const i="string"==typeof t?t:e.colors[t.theme];return i.startsWith("#")?i:`#${i}`}function s(t,e,i){return"none"===t.type?`${i}="none"`:`${i}="${r(t.color,e)}" ${i}-opacity="${t.opacity}"`}function a(t,e){const i=function(t){const e=Math.max(t.width,1);return"dash"===t.dash?`${4*e} ${3*e}`:"dot"===t.dash?`${e} ${2*e}`:"dashDot"===t.dash?`${4*e} ${2*e} ${e} ${2*e}`:void 0}(t);return`${s(t.paint,e,"stroke")} stroke-width="${t.width}"${void 0===i?"":` stroke-dasharray="${i}"`} stroke-linecap="round" stroke-linejoin="round"`}function l(t,e){if(0===e.rotation&&!e.flipH&&!e.flipV)return"";const i=t.x+t.width/2,n=t.y+t.height/2;return` transform="translate(${i} ${n}) rotate(${e.rotation}) scale(${e.flipH?-1:1} ${e.flipV?-1:1}) translate(${-i} ${-n})"`}function d(t){const e=t.codePointAt(0)??0;return e>=4352&&e<=4607||e>=11904&&e<=40959||e>=44032&&e<=55215||e>=63744&&e<=64255||e>=127744&&e<=129791}function c(t,e){return t.style.fontSize*e}function h(t){return Math.round(1e3*t)/1e3}function p(t,e,i){return c(e,i)*(/\s/u.test(t)?.28:d(t)?1:/[,.;:!?()[\]{}'"`-]/u.test(t)?.32:/[fijltIr|]/u.test(t)?.3:/[mMwWOQ%@]/u.test(t)?.72:/\d/u.test(t)?.55:/[A-Z]/u.test(t)?.6:.52)*1.06*(e.style.bold&&!d(t)?1.03:1)*(e.style.italic?1.02:1)}function $(t,e,i){let n=0;for(const o of t)n+=p(o,e,i);return n}function u(t,e,i){if(""===i)return;const n=t.at(-1);n?.run===e?n.text+=i:t.push({run:e,text:i})}function g(t,e,i){const n=t.runs[0];if(void 0===n)return[];const o=y(t),r=Math.max(1,e+t.style.hanging),s=Math.max(1,e),a=[];let l,d=!0,h=[],g=0;const f=()=>{h=[],g=0,d&&""!==o&&(u(h,n,o),g=$(o,n,i))},m=()=>{const e=h.reduce((t,e)=>Math.max(t,c(e.run,i)),c(n,i));a.push({first:d,fontSize:e,lineHeight:e*t.style.lineSpacing,paragraph:t,segments:h}),d=!1,l=void 0,f()},w=(t,e)=>{const n=void 0===l||0===h.length?"":" ",a=d?r:s,c=g+$(n,l??e,i)+$(t,e,i);h.length>(d&&""!==o?1:0)&&c>a&&m(),void 0!==l&&h.length>0&&(u(h,l," "),g+=$(" ",l,i));for(const n of t){const t=p(n,e,i),a=d?r:s;h.length>(d&&""!==o?1:0)&&g+t>a&&m(),u(h,e,n),g+=t}l=void 0};f();for(const e of t.runs)for(const t of e.text.split(/(\s+)/u))""!==t&&(/\s/u.test(t)?t.includes("\n")?m():l=e:w(t,e));return(h.length>0||0===a.length)&&m(),a}function f(t,e,n,o){"resize"===e.autoFit.mode&&o.warnings.push({code:"text-autofit-resize-unsupported",message:"Text autoFit resize cannot change SVG element geometry and was rendered inside the authored box.",slideId:o.slideId,elementId:o.elementId});const s="shrink"===e.autoFit.mode?e.autoFit.fontScale:1,a=Math.max(1,n.width-e.margin.left-e.margin.right),l=[];let d=0;for(const e of t){d+=e.style.spaceBefore;const t=Math.max(1,a-e.style.indent);for(const i of g(e,t,s))l.push({...i,y:d}),d+=i.lineHeight;d+=e.style.spaceAfter}const p=Math.max(0,n.height-e.margin.top-e.margin.bottom),$="middle"===e.verticalAlign?Math.max(0,(p-d)/2):"bottom"===e.verticalAlign?Math.max(0,p-d):0;return l.map((t,a)=>{const l=t.paragraph.style,d=n.x+e.margin.left+l.indent-(t.first?l.hanging:0),p=n.x+n.width-e.margin.right,u="center"===(g=l.align)?"middle":"right"===g?"end":"start";var g;const f="middle"===u?(d+p)/2:"end"===u?p:d,y=n.y+e.margin.top+$+t.y+.8*t.fontSize,w=t.segments.map(t=>`<tspan ${function(t,e,n){const o=[t.style.underline?"underline":"",t.style.strike?"line-through":""].filter(Boolean).join(" ");return[`font-family="${i(m(t.style.fontFamily,n))}"`,`font-size="${h(c(t,e))}"`,`font-weight="${t.style.bold?700:400}"`,`font-style="${t.style.italic?"italic":"normal"}"`,`text-decoration="${o||"none"}"`,`fill="${r(t.style.color,n)}"`,`lang="${i(t.style.language)}"`].join(" ")}(t.run,s,o.theme)}>${i(t.text)}</tspan>`).join("");return`<text x="${f}" y="${y}" text-anchor="${u}" data-pptkit-text-line="${a}">${w}</text>`}).join("")}function m(t,e){return"string"==typeof t?t:e.fonts[t.theme]}function y(t){const e=t.style.bullet;if("none"===e.type)return"";if("bullet"===e.type)return`${e.character} `;const i=e.startAt;return"arabicParen"===e.style?`${i}) `:"alphaLowerPeriod"===e.style?`${String.fromCharCode(96+Math.min(26,i))}. `:"alphaUpperPeriod"===e.style?`${String.fromCharCode(64+Math.min(26,i))}. `:`${i}. `}function w(t,e,n){"resize"===e.autoFit.mode&&n.warnings.push({code:"text-autofit-resize-unsupported",message:"Text autoFit resize cannot change SVG element geometry and was rendered inside the authored box.",slideId:n.slideId,elementId:n.elementId});const s="shrink"===e.autoFit.mode?e.autoFit.fontScale:1,a=["width:100%","height:100%","box-sizing:border-box","display:flex","flex-direction:column",`justify-content:${"middle"===e.verticalAlign?"center":"bottom"===e.verticalAlign?"flex-end":"flex-start"}`,`padding:${e.margin.top}px ${e.margin.right}px ${e.margin.bottom}px ${e.margin.left}px`,"overflow:visible",e.wrap?"overflow-wrap:anywhere":"white-space:pre"].join(";"),l=t.map(t=>{const a=t.style,l=["margin:0",`padding-left:${a.indent}px`,`text-indent:${-a.hanging}px`,`line-height:${a.lineSpacing}`,`padding-top:${a.spaceBefore}px`,`padding-bottom:${a.spaceAfter}px`,`text-align:${a.align}`,e.wrap?"white-space:pre-wrap":"white-space:pre"].join(";"),d=t.runs.map(t=>{const e=[t.style.underline?"underline":"",t.style.strike?"line-through":""].filter(Boolean).join(" "),a=["font-family:"+(l=m(t.style.fontFamily,n.theme),`&quot;${i(l.replace(/\\/g,"\\\\").replace(/"/g,'\\"'))}&quot;`),`font-size:${h(t.style.fontSize*s)}px`,"font-weight:"+(t.style.bold?700:400),"font-style:"+(t.style.italic?"italic":"normal"),`text-decoration:${e||"none"}`,`color:${r(t.style.color,n.theme)}`].join(";");var l;const d=function(t,e){if(void 0===t)return{open:"",close:""};if("slide"===t.type)return e.warnings.push({code:"slide-action-not-linked",message:`Slide action targeting ${t.slideId} is metadata-only in standalone SVG output.`,slideId:e.slideId,elementId:e.elementId}),{open:`<span data-pptkit-slide-target="${i(t.slideId)}">`,close:"</span>"};const n=o(t.url);return void 0===n?(e.warnings.push({code:"unsafe-action-url",message:"An action URL with an unsupported protocol was omitted.",slideId:e.slideId,elementId:e.elementId}),{open:"",close:""}):{open:`<a href="${i(n)}" rel="noopener noreferrer"${void 0===t.tooltip?"":` title="${i(t.tooltip)}"`}>`,close:"</a>"}}(t.action,n);return`${d.open}<span lang="${i(t.style.language)}" style="${a}">${i(t.text)}</span>${d.close}`}).join(""),c=y(t);return`<div style="${l}">${""===c?"":`<span aria-hidden="true">${i(c)}</span>`}${d}</div>`}).join("");return`<div xmlns="http://www.w3.org/1999/xhtml" style="${a}">${l}</div>`}function x(t){const e=` data-pptkit-element-id="${i(t.id)}"`;return t.accessibility.decorative?`${e} aria-hidden="true"`:`${e} role="img" aria-label="${i(t.accessibility.description??t.name)}"`}function v(t,e,n){const r=t.action;if(void 0===r)return e;if("slide"===r.type)return n.warnings.push({code:"slide-action-not-linked",message:`Slide action targeting ${r.slideId} is metadata-only in standalone SVG output.`,slideId:n.slideId,elementId:t.id}),`<g data-pptkit-slide-target="${i(r.slideId)}">${e}</g>`;const s=o(r.url);return void 0===s?(n.warnings.push({code:"unsafe-action-url",message:"An action URL with an unsupported protocol was omitted.",slideId:n.slideId,elementId:t.id}),e):`<a href="${i(s)}" rel="noopener noreferrer"${void 0===r.tooltip?"":` aria-label="${i(r.tooltip)}"`}>${e}</a>`}function I(t,e,i,n,o,r=!1){return`<foreignObject x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}"${r?' overflow="visible"':""}${i} opacity="${n}"${o}>${e}</foreignObject>`}function b(t,e,i,o,r){if("none"===t||"none"===o.paint.type)return;const s=n(`${r.slideId}-${i}-${e}-${t}`),a="solid"===o.paint.type?"string"==typeof o.paint.color?o.paint.color:r.theme.colors[o.paint.color.theme]:"000000",l=a.startsWith("#")?a:`#${a}`;return r.defs.push(`<marker id="${s}" markerWidth="10" markerHeight="10" refX="${"end"===e?9:1}" refY="5" orient="auto-start-reverse" markerUnits="strokeWidth" viewBox="0 0 10 10">${function(t,e){return"oval"===t?`<circle cx="5" cy="5" r="3.5" fill="${e}"/>`:"diamond"===t?`<path d="M1 5 L5 1 L9 5 L5 9 Z" fill="${e}"/>`:"stealth"===t?`<path d="M1 1 L9 5 L1 9 L4 5 Z" fill="${e}"/>`:"arrow"===t?`<path d="M1 1 L9 5 L1 9" fill="none" stroke="${e}" stroke-width="1.5"/>`:`<path d="M1 1 L9 5 L1 9 Z" fill="${e}"/>`}(t,l)}</marker>`),s}function k(t,e){const{x:i,y:n,width:o,height:r}=t.box;return`<g${l(t.box,t.transform)} opacity="${t.opacity}"${x(t)}><rect x="${i}" y="${n}" width="${o}" height="${r}" fill="#F3F4F6" stroke="#9CA3AF" stroke-dasharray="6 4"/><path d="M${i+.15*o} ${n+.75*r} L${i+.42*o} ${n+.45*r} L${i+.6*o} ${n+.62*r} L${i+.78*o} ${n+.35*r} L${i+.9*o} ${n+.75*r}" fill="none" stroke="#9CA3AF" stroke-width="2"/></g>`}async function A(t,e){const o=e.assets.get(t.assetId);if(void 0===o)return e.warnings.push({code:"asset-missing",message:`Image asset ${t.assetId} was not found.`,slideId:e.slideId,elementId:t.id,assetId:t.assetId}),k(t);const r=await async function(t,e){let i=e.assetCache.get(t.id);return void 0===i&&(i=(async()=>{if(void 0!==e.resolveAsset)try{const i=await e.resolveAsset(t);return void 0===i&&e.warnings.push({code:"asset-unresolved",message:"The asset resolver did not return an image URL.",slideId:e.slideId,assetId:t.id}),i}catch(i){return void e.warnings.push({code:"asset-resolver-failed",message:`The asset resolver failed: ${i instanceof Error?i.message:String(i)}`,slideId:e.slideId,assetId:t.id})}if("url"===t.source.type)return t.source.value;e.warnings.push({code:"asset-path-unsupported",message:"Local path assets require a custom SvgAssetResolver.",slideId:e.slideId,assetId:t.id})})(),e.assetCache.set(t.id,i)),i}(o,e);if(void 0===r||void 0===function(t){try{const e=new URL(t,"https://pptkit.invalid");if(["http:","https:","blob:"].includes(e.protocol))return t;if("data:"===e.protocol&&/^data:image\//i.test(t))return t}catch{return}}(r))return void 0!==r&&e.warnings.push({code:"unsafe-asset-url",message:"An image URL with an unsupported protocol was omitted.",slideId:e.slideId,elementId:t.id,assetId:o.id}),k(t);const s=n(`${e.slideId}-${t.id}-clip`),a=t.box;let d;if(e.defs.push(`<clipPath id="${s}"><rect x="${a.x}" y="${a.y}" width="${a.width}" height="${a.height}"/></clipPath>`),"crop"===t.fit&&void 0!==o.width&&void 0!==o.height){const e=Math.max(1e-4,1-t.crop.left-t.crop.right),n=Math.max(1e-4,1-t.crop.top-t.crop.bottom),o=a.width/e,s=a.height/n;d=`<image href="${i(r)}" x="${a.x-o*t.crop.left}" y="${a.y-s*t.crop.top}" width="${o}" height="${s}" preserveAspectRatio="none"/>`}else"crop"===t.fit&&e.warnings.push({code:"image-crop-degraded",message:"Image crop requires intrinsic asset dimensions; preview fell back to centered cover.",slideId:e.slideId,elementId:t.id,assetId:o.id}),d=`<image href="${i(r)}" x="${a.x}" y="${a.y}" width="${a.width}" height="${a.height}" preserveAspectRatio="${"stretch"===t.fit?"none":"xMidYMid slice"}"/>`;return v(t,`<g${l(a,t.transform)} opacity="${t.opacity}" clip-path="url(#${s})"${x(t)}>${d}</g>`,e)}async function M(t,e){if(t.hidden)return"";if("image"===t.type)return A(t,e);if("group"===t.type)return function(t,e){return(async()=>{const i=[];for(const n of t.children)i.push(await M(n,e));const n=i.join(""),o=t.box,r=o.x+o.width/2,s=o.y+o.height/2,a=`translate(${r} ${s}) rotate(${t.transform.rotation}) scale(${t.transform.flipH?-1:1} ${t.transform.flipV?-1:1}) translate(${-r} ${-s}) translate(${o.x} ${o.y}) scale(${o.width/t.coordinateSize.width} ${o.height/t.coordinateSize.height})`;return v(t,`<g transform="${a}" opacity="${t.opacity}"${x(t)}>${n}</g>`,e)})()}(t,e);if("text"===t.type){const i={theme:e.theme,warnings:e.warnings,slideId:e.slideId,elementId:t.id};if(t.content.every(t=>1===t.runs.length&&void 0===t.runs[0]?.action)){const n=f(t.content,t.frame,t.box,i);return v(t,`<g${l(t.box,t.transform)} opacity="${t.opacity}"${x(t)}>${n}</g>`,e)}const n=w(t.content,t.frame,i);return v(t,I(t.box,n,l(t.box,t.transform),t.opacity,x(t),!0),e)}if("shape"===t.type){const i=l(t.box,t.transform),n=function(t,e){const{x:i,y:n,width:o,height:r}=t.box,l=`${s(t.style.fill,e.theme,"fill")} ${a(t.style.stroke,e.theme)}`;return"rect"===t.shape?`<rect x="${i}" y="${n}" width="${o}" height="${r}" ${l}/>`:"roundRect"===t.shape?`<rect x="${i}" y="${n}" width="${o}" height="${r}" rx="${.08*Math.min(o,r)}" ${l}/>`:"ellipse"===t.shape?`<ellipse cx="${i+o/2}" cy="${n+r/2}" rx="${o/2}" ry="${r/2}" ${l}/>`:`<polygon points="${("triangle"===t.shape?[[i+o/2,n],[i+o,n+r],[i,n+r]]:"diamond"===t.shape?[[i+o/2,n],[i+o,n+r/2],[i+o/2,n+r],[i,n+r/2]]:"arrow"===t.shape?[[i,n+.25*r],[i+.62*o,n+.25*r],[i+.62*o,n],[i+o,n+r/2],[i+.62*o,n+r],[i+.62*o,n+.75*r],[i,n+.75*r]]:[[i,n],[i+.65*o,n],[i+o,n+r/2],[i+.65*o,n+r],[i,n+r],[i+.35*o,n+r/2]]).map(t=>t.join(",")).join(" ")}" ${l}/>`}(t,e),o=void 0===t.text?"":I(t.box,w(t.text.content,t.text.frame,{theme:e.theme,warnings:e.warnings,slideId:e.slideId,elementId:t.id}),"",1,"",!0);return v(t,`<g${i} opacity="${t.opacity}"${x(t)}>${n}${o}</g>`,e)}if("connector"===t.type){const i=[t.start,...t.route,t.end],n=b(t.style.beginArrow,"start",t.id,t.style,e),o=b(t.style.endArrow,"end",t.id,t.style,e),r=`${void 0===n?"":` marker-start="url(#${n})"`}${void 0===o?"":` marker-end="url(#${o})"`}`,s=`<polyline points="${i.map(t=>`${t.x},${t.y}`).join(" ")}" fill="none" ${a(t.style,e.theme)}${r}/>`;return v(t,`<g${l(t.box,t.transform)} opacity="${t.opacity}"${x(t)}>${s}</g>`,e)}return"table"===t.type?v(t,I(t.box,function(t,e){return`<div xmlns="http://www.w3.org/1999/xhtml" style="width:100%;height:100%;overflow:hidden"><table style="width:100%;height:100%;table-layout:fixed;border-collapse:collapse;border-spacing:0"><colgroup>${t.columns.map(t=>`<col style="width:${t}px"/>`).join("")}</colgroup><tbody>${t.rows.map(i=>{const n=i.cells.map(i=>{const n="none"===i.style.fill.type?"transparent":"string"==typeof i.style.fill.color?i.style.fill.color:e.theme.colors[i.style.fill.color.theme],o="transparent"===n||n.startsWith("#")?n:`#${n}`,r="none"===i.style.stroke.paint.type?"transparent":"string"==typeof i.style.stroke.paint.color?i.style.stroke.paint.color:e.theme.colors[i.style.stroke.paint.color.theme],s="transparent"===r||r.startsWith("#")?r:`#${r}`,a=`box-sizing:border-box;background:${o};border:${i.style.stroke.width}px solid ${s};padding:${i.style.margin.top}px ${i.style.margin.right}px ${i.style.margin.bottom}px ${i.style.margin.left}px;vertical-align:${i.style.verticalAlign};overflow:hidden`,l={margin:{top:0,right:0,bottom:0,left:0},verticalAlign:i.style.verticalAlign,wrap:!0,autoFit:{mode:"none"}};return`<td rowspan="${i.rowSpan}" colspan="${i.colSpan}" style="${a}">${w(i.content,l,{theme:e.theme,warnings:e.warnings,slideId:e.slideId,elementId:t.id})}</td>`}).join("");return`<tr style="height:${i.height}px">${n}</tr>`}).join("")}</tbody></table></div>`}(t,e),l(t.box,t.transform),t.opacity,x(t)),e):""}function z(t,e,i){return`<rect x="0" y="0" width="${t.width}" height="${t.height}" ${s(e,i,"fill")}/>`}async function j(t,e={}){const o=[],r=new Map(t.assets.map(t=>[t.id,t])),s=new Map(t.layouts.map(t=>[t.id,t])),a=[];for(let l=0;l<t.slides.length;l+=1){const d=t.slides[l],c=[],h={slideId:d.id,theme:t.theme,assets:r,...void 0===e.resolveAsset?{}:{resolveAsset:e.resolveAsset},assetCache:new Map,warnings:o,defs:c},p=s.get(d.layoutId),$=[...p?.elements??[],...d.elements],u=[];for(const t of $)u.push(await M(t,h));const g=u.join(""),f=`${t.metadata.title||"PPTKit presentation"} — slide ${l+1}`,m=n(`pptkit-slide-${d.id}`),y=`<svg id="${m}" xmlns="http://www.w3.org/2000/svg" xmlns:xhtml="http://www.w3.org/1999/xhtml" viewBox="0 0 ${t.size.width} ${t.size.height}" width="${t.size.width}" height="${t.size.height}" role="img" aria-labelledby="${m}-title" data-pptkit-slide-id="${i(d.id)}"><title id="${m}-title">${i(f)}</title><defs>${c.join("")}</defs>${z({width:t.size.width,height:t.size.height},d.background,t.theme)}${g}</svg>`;a.push({slideId:d.id,index:l,hidden:d.hidden,svg:y})}return{width:t.size.width,height:t.size.height,slides:a,warnings:o,status:0===o.length?"rendered":"rendered-with-warnings"}}async function S(i,n){return j(e(t(i)),n)}async function L(t,e){return j(t,e)}export{L as renderLayoutToSvg,S as renderPresentationToSvg};
@@ -0,0 +1,7 @@
1
+ import { type PresentationDocument } from "@pptkit/core";
2
+ import { type LayoutResult } from "@pptkit/layout";
3
+ import type { SvgRenderOptions, SvgRenderResult } from "./types/public.js";
4
+ export type { SvgAssetResolver, SvgRenderedSlide, SvgRenderOptions, SvgRenderResult, SvgRenderWarning, } from "./types/public.js";
5
+ export declare function renderPresentationToSvg(document: PresentationDocument, options?: SvgRenderOptions): Promise<SvgRenderResult>;
6
+ export declare function renderLayoutToSvg(layout: LayoutResult, options?: SvgRenderOptions): Promise<SvgRenderResult>;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE3E,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAE1B"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ import { normalizePresentation } from "@pptkit/core";
2
+ import { resolveNormalizedLayout } from "@pptkit/layout";
3
+ import { renderResolvedLayout } from "./rendering/render.js";
4
+ export async function renderPresentationToSvg(document, options) {
5
+ return renderResolvedLayout(resolveNormalizedLayout(normalizePresentation(document)), options);
6
+ }
7
+ export async function renderLayoutToSvg(layout, options) {
8
+ return renderResolvedLayout(layout, options);
9
+ }
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAA6B,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,uBAAuB,EAAqB,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAW7D,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,QAA8B,EAC9B,OAA0B;IAE1B,OAAO,oBAAoB,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAoB,EACpB,OAA0B;IAE1B,OAAO,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { Box, NormalizedAsset, NormalizedPaint, NormalizedPresentationTheme } from "@pptkit/core";
2
+ import type { LayoutElement } from "@pptkit/layout";
3
+ import type { SvgAssetResolver, SvgRenderWarning } from "../types/public.js";
4
+ export interface RenderContext {
5
+ slideId: string;
6
+ theme: NormalizedPresentationTheme;
7
+ assets: ReadonlyMap<string, NormalizedAsset>;
8
+ resolveAsset?: SvgAssetResolver;
9
+ assetCache: Map<string, Promise<string | undefined>>;
10
+ warnings: SvgRenderWarning[];
11
+ defs: string[];
12
+ }
13
+ export declare function renderElement(element: LayoutElement, context: RenderContext): Promise<string>;
14
+ export declare function backgroundRect(box: Box, paint: NormalizedPaint, theme: NormalizedPresentationTheme): string;
15
+ //# sourceMappingURL=element.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../src/rendering/element.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,GAAG,EAEH,eAAe,EACf,eAAe,EACf,2BAA2B,EAE5B,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAK7E,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,2BAA2B,CAAC;IACnC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC7C,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IACrD,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAuJD,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BnG;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,2BAA2B,GAAG,MAAM,CAE3G"}
@@ -0,0 +1,197 @@
1
+ import { escapeXml, safeActionUrl, safeId, safeUrl } from "./escape.js";
2
+ import { paintAttributes, strokeAttributes, transformAttribute } from "./style.js";
3
+ import { canRenderTextNatively, textHtml, textSvg } from "./text.js";
4
+ function accessibility(element) {
5
+ const identity = ` data-pptkit-element-id="${escapeXml(element.id)}"`;
6
+ if (element.accessibility.decorative)
7
+ return `${identity} aria-hidden="true"`;
8
+ return `${identity} role="img" aria-label="${escapeXml(element.accessibility.description ?? element.name)}"`;
9
+ }
10
+ function actionWrapper(element, body, context) {
11
+ const action = element.action;
12
+ if (action === undefined)
13
+ return body;
14
+ if (action.type === "slide") {
15
+ context.warnings.push({
16
+ code: "slide-action-not-linked",
17
+ message: `Slide action targeting ${action.slideId} is metadata-only in standalone SVG output.`,
18
+ slideId: context.slideId,
19
+ elementId: element.id,
20
+ });
21
+ return `<g data-pptkit-slide-target="${escapeXml(action.slideId)}">${body}</g>`;
22
+ }
23
+ const url = safeActionUrl(action.url);
24
+ if (url === undefined) {
25
+ context.warnings.push({ code: "unsafe-action-url", message: "An action URL with an unsupported protocol was omitted.", slideId: context.slideId, elementId: element.id });
26
+ return body;
27
+ }
28
+ return `<a href="${escapeXml(url)}" rel="noopener noreferrer"${action.tooltip === undefined ? "" : ` aria-label="${escapeXml(action.tooltip)}"`}>${body}</a>`;
29
+ }
30
+ function geometry(element, context) {
31
+ const { x, y, width, height } = element.box;
32
+ const attrs = `${paintAttributes(element.style.fill, context.theme, "fill")} ${strokeAttributes(element.style.stroke, context.theme)}`;
33
+ if (element.shape === "rect")
34
+ return `<rect x="${x}" y="${y}" width="${width}" height="${height}" ${attrs}/>`;
35
+ if (element.shape === "roundRect")
36
+ return `<rect x="${x}" y="${y}" width="${width}" height="${height}" rx="${Math.min(width, height) * 0.08}" ${attrs}/>`;
37
+ if (element.shape === "ellipse")
38
+ return `<ellipse cx="${x + width / 2}" cy="${y + height / 2}" rx="${width / 2}" ry="${height / 2}" ${attrs}/>`;
39
+ const points = element.shape === "triangle"
40
+ ? [[x + width / 2, y], [x + width, y + height], [x, y + height]]
41
+ : element.shape === "diamond"
42
+ ? [[x + width / 2, y], [x + width, y + height / 2], [x + width / 2, y + height], [x, y + height / 2]]
43
+ : element.shape === "arrow"
44
+ ? [[x, y + height * 0.25], [x + width * 0.62, y + height * 0.25], [x + width * 0.62, y], [x + width, y + height / 2], [x + width * 0.62, y + height], [x + width * 0.62, y + height * 0.75], [x, y + height * 0.75]]
45
+ : [[x, y], [x + width * 0.65, y], [x + width, y + height / 2], [x + width * 0.65, y + height], [x, y + height], [x + width * 0.35, y + height / 2]];
46
+ return `<polygon points="${points.map((point) => point.join(",")).join(" ")}" ${attrs}/>`;
47
+ }
48
+ function foreignObject(box, html, transform, opacity, accessibilityValue, overflowVisible = false) {
49
+ return `<foreignObject x="${box.x}" y="${box.y}" width="${box.width}" height="${box.height}"${overflowVisible ? ' overflow="visible"' : ""}${transform} opacity="${opacity}"${accessibilityValue}>${html}</foreignObject>`;
50
+ }
51
+ function markerShape(type, color) {
52
+ if (type === "oval")
53
+ return `<circle cx="5" cy="5" r="3.5" fill="${color}"/>`;
54
+ if (type === "diamond")
55
+ return `<path d="M1 5 L5 1 L9 5 L5 9 Z" fill="${color}"/>`;
56
+ if (type === "stealth")
57
+ return `<path d="M1 1 L9 5 L1 9 L4 5 Z" fill="${color}"/>`;
58
+ if (type === "arrow")
59
+ return `<path d="M1 1 L9 5 L1 9" fill="none" stroke="${color}" stroke-width="1.5"/>`;
60
+ return `<path d="M1 1 L9 5 L1 9 Z" fill="${color}"/>`;
61
+ }
62
+ function marker(type, end, elementId, style, context) {
63
+ if (type === "none" || style.paint.type === "none")
64
+ return undefined;
65
+ const id = safeId(`${context.slideId}-${elementId}-${end}-${type}`);
66
+ const color = style.paint.type === "solid" ? (typeof style.paint.color === "string" ? style.paint.color : context.theme.colors[style.paint.color.theme]) : "000000";
67
+ const cssColor = color.startsWith("#") ? color : `#${color}`;
68
+ context.defs.push(`<marker id="${id}" markerWidth="10" markerHeight="10" refX="${end === "end" ? 9 : 1}" refY="5" orient="auto-start-reverse" markerUnits="strokeWidth" viewBox="0 0 10 10">${markerShape(type, cssColor)}</marker>`);
69
+ return id;
70
+ }
71
+ async function resolveImage(asset, context) {
72
+ let pending = context.assetCache.get(asset.id);
73
+ if (pending === undefined) {
74
+ pending = (async () => {
75
+ if (context.resolveAsset !== undefined) {
76
+ try {
77
+ const resolved = await context.resolveAsset(asset);
78
+ if (resolved === undefined)
79
+ context.warnings.push({ code: "asset-unresolved", message: "The asset resolver did not return an image URL.", slideId: context.slideId, assetId: asset.id });
80
+ return resolved;
81
+ }
82
+ catch (error) {
83
+ context.warnings.push({ code: "asset-resolver-failed", message: `The asset resolver failed: ${error instanceof Error ? error.message : String(error)}`, slideId: context.slideId, assetId: asset.id });
84
+ return undefined;
85
+ }
86
+ }
87
+ if (asset.source.type === "url")
88
+ return asset.source.value;
89
+ context.warnings.push({ code: "asset-path-unsupported", message: "Local path assets require a custom SvgAssetResolver.", slideId: context.slideId, assetId: asset.id });
90
+ return undefined;
91
+ })();
92
+ context.assetCache.set(asset.id, pending);
93
+ }
94
+ return pending;
95
+ }
96
+ function missingImage(element, context) {
97
+ const { x, y, width, height } = element.box;
98
+ return `<g${transformAttribute(element.box, element.transform)} opacity="${element.opacity}"${accessibility(element)}><rect x="${x}" y="${y}" width="${width}" height="${height}" fill="#F3F4F6" stroke="#9CA3AF" stroke-dasharray="6 4"/><path d="M${x + width * 0.15} ${y + height * 0.75} L${x + width * 0.42} ${y + height * 0.45} L${x + width * 0.6} ${y + height * 0.62} L${x + width * 0.78} ${y + height * 0.35} L${x + width * 0.9} ${y + height * 0.75}" fill="none" stroke="#9CA3AF" stroke-width="2"/></g>`;
99
+ }
100
+ async function imageElement(element, context) {
101
+ const asset = context.assets.get(element.assetId);
102
+ if (asset === undefined) {
103
+ context.warnings.push({ code: "asset-missing", message: `Image asset ${element.assetId} was not found.`, slideId: context.slideId, elementId: element.id, assetId: element.assetId });
104
+ return missingImage(element, context);
105
+ }
106
+ const href = await resolveImage(asset, context);
107
+ if (href === undefined || safeUrl(href) === undefined) {
108
+ if (href !== undefined)
109
+ context.warnings.push({ code: "unsafe-asset-url", message: "An image URL with an unsupported protocol was omitted.", slideId: context.slideId, elementId: element.id, assetId: asset.id });
110
+ return missingImage(element, context);
111
+ }
112
+ const clipId = safeId(`${context.slideId}-${element.id}-clip`);
113
+ const box = element.box;
114
+ context.defs.push(`<clipPath id="${clipId}"><rect x="${box.x}" y="${box.y}" width="${box.width}" height="${box.height}"/></clipPath>`);
115
+ let image;
116
+ if (element.fit === "crop" && asset.width !== undefined && asset.height !== undefined) {
117
+ const visibleWidth = Math.max(0.0001, 1 - element.crop.left - element.crop.right);
118
+ const visibleHeight = Math.max(0.0001, 1 - element.crop.top - element.crop.bottom);
119
+ const width = box.width / visibleWidth;
120
+ const height = box.height / visibleHeight;
121
+ image = `<image href="${escapeXml(href)}" x="${box.x - width * element.crop.left}" y="${box.y - height * element.crop.top}" width="${width}" height="${height}" preserveAspectRatio="none"/>`;
122
+ }
123
+ else {
124
+ if (element.fit === "crop")
125
+ context.warnings.push({ code: "image-crop-degraded", message: "Image crop requires intrinsic asset dimensions; preview fell back to centered cover.", slideId: context.slideId, elementId: element.id, assetId: asset.id });
126
+ image = `<image href="${escapeXml(href)}" x="${box.x}" y="${box.y}" width="${box.width}" height="${box.height}" preserveAspectRatio="${element.fit === "stretch" ? "none" : "xMidYMid slice"}"/>`;
127
+ }
128
+ return actionWrapper(element, `<g${transformAttribute(box, element.transform)} opacity="${element.opacity}" clip-path="url(#${clipId})"${accessibility(element)}>${image}</g>`, context);
129
+ }
130
+ function tableHtml(element, context) {
131
+ const columns = element.columns.map((width) => `<col style="width:${width}px"/>`).join("");
132
+ const rows = element.rows.map((row) => {
133
+ const cells = row.cells.map((cell) => {
134
+ const fill = cell.style.fill.type === "none" ? "transparent" : (typeof cell.style.fill.color === "string" ? cell.style.fill.color : context.theme.colors[cell.style.fill.color.theme]);
135
+ const fillColor = fill === "transparent" || fill.startsWith("#") ? fill : `#${fill}`;
136
+ const stroke = cell.style.stroke.paint.type === "none" ? "transparent" : (typeof cell.style.stroke.paint.color === "string" ? cell.style.stroke.paint.color : context.theme.colors[cell.style.stroke.paint.color.theme]);
137
+ const strokeColor = stroke === "transparent" || stroke.startsWith("#") ? stroke : `#${stroke}`;
138
+ const style = `box-sizing:border-box;background:${fillColor};border:${cell.style.stroke.width}px solid ${strokeColor};padding:${cell.style.margin.top}px ${cell.style.margin.right}px ${cell.style.margin.bottom}px ${cell.style.margin.left}px;vertical-align:${cell.style.verticalAlign};overflow:hidden`;
139
+ const frame = { margin: { top: 0, right: 0, bottom: 0, left: 0 }, verticalAlign: cell.style.verticalAlign, wrap: true, autoFit: { mode: "none" } };
140
+ return `<td rowspan="${cell.rowSpan}" colspan="${cell.colSpan}" style="${style}">${textHtml(cell.content, frame, { theme: context.theme, warnings: context.warnings, slideId: context.slideId, elementId: element.id })}</td>`;
141
+ }).join("");
142
+ return `<tr style="height:${row.height}px">${cells}</tr>`;
143
+ }).join("");
144
+ return `<div xmlns="http://www.w3.org/1999/xhtml" style="width:100%;height:100%;overflow:hidden"><table style="width:100%;height:100%;table-layout:fixed;border-collapse:collapse;border-spacing:0"><colgroup>${columns}</colgroup><tbody>${rows}</tbody></table></div>`;
145
+ }
146
+ function groupElement(element, context) {
147
+ return (async () => {
148
+ const renderedChildren = [];
149
+ for (const child of element.children)
150
+ renderedChildren.push(await renderElement(child, context));
151
+ const children = renderedChildren.join("");
152
+ const box = element.box;
153
+ const cx = box.x + box.width / 2;
154
+ const cy = box.y + box.height / 2;
155
+ const outer = `translate(${cx} ${cy}) rotate(${element.transform.rotation}) scale(${element.transform.flipH ? -1 : 1} ${element.transform.flipV ? -1 : 1}) translate(${-cx} ${-cy}) translate(${box.x} ${box.y}) scale(${box.width / element.coordinateSize.width} ${box.height / element.coordinateSize.height})`;
156
+ return actionWrapper(element, `<g transform="${outer}" opacity="${element.opacity}"${accessibility(element)}>${children}</g>`, context);
157
+ })();
158
+ }
159
+ export async function renderElement(element, context) {
160
+ if (element.hidden)
161
+ return "";
162
+ if (element.type === "image")
163
+ return imageElement(element, context);
164
+ if (element.type === "group")
165
+ return groupElement(element, context);
166
+ if (element.type === "text") {
167
+ const textContext = { theme: context.theme, warnings: context.warnings, slideId: context.slideId, elementId: element.id };
168
+ if (canRenderTextNatively(element.content)) {
169
+ const content = textSvg(element.content, element.frame, element.box, textContext);
170
+ return actionWrapper(element, `<g${transformAttribute(element.box, element.transform)} opacity="${element.opacity}"${accessibility(element)}>${content}</g>`, context);
171
+ }
172
+ const html = textHtml(element.content, element.frame, textContext);
173
+ return actionWrapper(element, foreignObject(element.box, html, transformAttribute(element.box, element.transform), element.opacity, accessibility(element), true), context);
174
+ }
175
+ if (element.type === "shape") {
176
+ const transform = transformAttribute(element.box, element.transform);
177
+ const shape = geometry(element, context);
178
+ const text = element.text === undefined ? "" : foreignObject(element.box, textHtml(element.text.content, element.text.frame, { theme: context.theme, warnings: context.warnings, slideId: context.slideId, elementId: element.id }), "", 1, "", true);
179
+ return actionWrapper(element, `<g${transform} opacity="${element.opacity}"${accessibility(element)}>${shape}${text}</g>`, context);
180
+ }
181
+ if (element.type === "connector") {
182
+ const points = [element.start, ...element.route, element.end];
183
+ const start = marker(element.style.beginArrow, "start", element.id, element.style, context);
184
+ const end = marker(element.style.endArrow, "end", element.id, element.style, context);
185
+ const markers = `${start === undefined ? "" : ` marker-start="url(#${start})"`}${end === undefined ? "" : ` marker-end="url(#${end})"`}`;
186
+ const path = `<polyline points="${points.map((point) => `${point.x},${point.y}`).join(" ")}" fill="none" ${strokeAttributes(element.style, context.theme)}${markers}/>`;
187
+ return actionWrapper(element, `<g${transformAttribute(element.box, element.transform)} opacity="${element.opacity}"${accessibility(element)}>${path}</g>`, context);
188
+ }
189
+ if (element.type === "table") {
190
+ return actionWrapper(element, foreignObject(element.box, tableHtml(element, context), transformAttribute(element.box, element.transform), element.opacity, accessibility(element)), context);
191
+ }
192
+ return "";
193
+ }
194
+ export function backgroundRect(box, paint, theme) {
195
+ return `<rect x="0" y="0" width="${box.width}" height="${box.height}" ${paintAttributes(paint, theme, "fill")}/>`;
196
+ }
197
+ //# sourceMappingURL=element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element.js","sourceRoot":"","sources":["../../src/rendering/element.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function escapeXml(value: string): string;
2
+ export declare function safeId(value: string): string;
3
+ export declare function safeUrl(value: string): string | undefined;
4
+ export declare function safeActionUrl(value: string): string | undefined;
5
+ //# sourceMappingURL=escape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/rendering/escape.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAS5C;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASzD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQ/D"}
@@ -0,0 +1,43 @@
1
+ export function escapeXml(value) {
2
+ return value
3
+ .replace(/&/g, "&amp;")
4
+ .replace(/</g, "&lt;")
5
+ .replace(/>/g, "&gt;")
6
+ .replace(/"/g, "&quot;")
7
+ .replace(/'/g, "&#39;");
8
+ }
9
+ export function safeId(value) {
10
+ const normalized = value.replace(/[^A-Za-z0-9_.:-]/g, "-");
11
+ let hash = 2166136261;
12
+ for (let index = 0; index < value.length; index += 1) {
13
+ hash ^= value.charCodeAt(index);
14
+ hash = Math.imul(hash, 16777619);
15
+ }
16
+ const base = /^[A-Za-z_]/.test(normalized) ? normalized : `id-${normalized}`;
17
+ return `${base}-${(hash >>> 0).toString(36)}`;
18
+ }
19
+ export function safeUrl(value) {
20
+ try {
21
+ const url = new URL(value, "https://pptkit.invalid");
22
+ if (["http:", "https:", "blob:"].includes(url.protocol))
23
+ return value;
24
+ if (url.protocol === "data:" && /^data:image\//i.test(value))
25
+ return value;
26
+ }
27
+ catch {
28
+ return undefined;
29
+ }
30
+ return undefined;
31
+ }
32
+ export function safeActionUrl(value) {
33
+ try {
34
+ const url = new URL(value, "https://pptkit.invalid");
35
+ if (["http:", "https:", "mailto:"].includes(url.protocol))
36
+ return value;
37
+ }
38
+ catch {
39
+ return undefined;
40
+ }
41
+ return undefined;
42
+ }
43
+ //# sourceMappingURL=escape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/rendering/escape.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IAC3D,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,UAAU,EAAE,CAAC;IAC7E,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QACtE,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { LayoutResult } from "@pptkit/layout";
2
+ import type { SvgRenderOptions, SvgRenderResult } from "../types/public.js";
3
+ export declare function renderResolvedLayout(layout: LayoutResult, options?: SvgRenderOptions): Promise<SvgRenderResult>;
4
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/rendering/render.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAI5E,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAoCzH"}
@@ -0,0 +1,39 @@
1
+ import { escapeXml, safeId } from "./escape.js";
2
+ import { backgroundRect, renderElement } from "./element.js";
3
+ export async function renderResolvedLayout(layout, options = {}) {
4
+ const warnings = [];
5
+ const assets = new Map(layout.assets.map((asset) => [asset.id, asset]));
6
+ const layouts = new Map(layout.layouts.map((item) => [item.id, item]));
7
+ const slides = [];
8
+ for (let index = 0; index < layout.slides.length; index += 1) {
9
+ const slide = layout.slides[index];
10
+ const defs = [];
11
+ const context = {
12
+ slideId: slide.id,
13
+ theme: layout.theme,
14
+ assets,
15
+ ...(options.resolveAsset === undefined ? {} : { resolveAsset: options.resolveAsset }),
16
+ assetCache: new Map(),
17
+ warnings,
18
+ defs,
19
+ };
20
+ const slideLayout = layouts.get(slide.layoutId);
21
+ const elements = [...(slideLayout?.elements ?? []), ...slide.elements];
22
+ const renderedElements = [];
23
+ for (const element of elements)
24
+ renderedElements.push(await renderElement(element, context));
25
+ const body = renderedElements.join("");
26
+ const title = `${layout.metadata.title || "PPTKit presentation"} — slide ${index + 1}`;
27
+ const rootId = safeId(`pptkit-slide-${slide.id}`);
28
+ const svg = `<svg id="${rootId}" xmlns="http://www.w3.org/2000/svg" xmlns:xhtml="http://www.w3.org/1999/xhtml" viewBox="0 0 ${layout.size.width} ${layout.size.height}" width="${layout.size.width}" height="${layout.size.height}" role="img" aria-labelledby="${rootId}-title" data-pptkit-slide-id="${escapeXml(slide.id)}"><title id="${rootId}-title">${escapeXml(title)}</title><defs>${defs.join("")}</defs>${backgroundRect({ x: 0, y: 0, width: layout.size.width, height: layout.size.height }, slide.background, layout.theme)}${body}</svg>`;
29
+ slides.push({ slideId: slide.id, index, hidden: slide.hidden, svg });
30
+ }
31
+ return {
32
+ width: layout.size.width,
33
+ height: layout.size.height,
34
+ slides,
35
+ warnings,
36
+ status: warnings.length === 0 ? "rendered" : "rendered-with-warnings",
37
+ };
38
+ }
39
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/rendering/render.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAsB,MAAM,cAAc,CAAC;AAEjF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAoB,EAAE,UAA4B,EAAE;IAC7F,MAAM,QAAQ,GAAgC,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,GAAG,CAA0B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACjG,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,MAAM,GAA8B,EAAE,CAAC;IAE7C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAE,CAAC;QACpC,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAkB;YAC7B,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM;YACN,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;YACrF,UAAU,EAAE,IAAI,GAAG,EAAE;YACrB,QAAQ;YACR,IAAI;SACL,CAAC;QACF,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvE,MAAM,gBAAgB,GAAa,EAAE,CAAC;QACtC,KAAK,MAAM,OAAO,IAAI,QAAQ;YAAE,gBAAgB,CAAC,IAAI,CAAC,MAAM,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7F,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,IAAI,qBAAqB,YAAY,KAAK,GAAG,CAAC,EAAE,CAAC;QACvF,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,YAAY,MAAM,gGAAgG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,YAAY,MAAM,CAAC,IAAI,CAAC,KAAK,aAAa,MAAM,CAAC,IAAI,CAAC,MAAM,iCAAiC,MAAM,iCAAiC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,gBAAgB,MAAM,WAAW,SAAS,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,QAAQ,CAAC;QACzhB,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;QACxB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;QAC1B,MAAM;QACN,QAAQ;QACR,MAAM,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,wBAAwB;KACtE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ColorValue, NormalizedPaint, NormalizedPresentationTheme, NormalizedStrokeStyle, NormalizedTransform, Box } from "@pptkit/core";
2
+ export declare function colorValue(value: ColorValue, theme: NormalizedPresentationTheme): string;
3
+ export declare function paintAttributes(paint: NormalizedPaint, theme: NormalizedPresentationTheme, kind: "fill" | "stroke"): string;
4
+ export declare function dashArray(style: NormalizedStrokeStyle): string | undefined;
5
+ export declare function strokeAttributes(style: NormalizedStrokeStyle, theme: NormalizedPresentationTheme): string;
6
+ export declare function transformAttribute(box: Box, transform: NormalizedTransform): string;
7
+ //# sourceMappingURL=style.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/rendering/style.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,2BAA2B,EAC3B,qBAAqB,EACrB,mBAAmB,EACnB,GAAG,EACJ,MAAM,cAAc,CAAC;AAEtB,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,2BAA2B,GAAG,MAAM,CAGxF;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,2BAA2B,EAClC,IAAI,EAAE,MAAM,GAAG,QAAQ,GACtB,MAAM,CAGR;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,GAAG,SAAS,CAM1E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,2BAA2B,GAAG,MAAM,CAGzG;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,mBAAmB,GAAG,MAAM,CAKnF"}
@@ -0,0 +1,31 @@
1
+ export function colorValue(value, theme) {
2
+ const raw = typeof value === "string" ? value : theme.colors[value.theme];
3
+ return raw.startsWith("#") ? raw : `#${raw}`;
4
+ }
5
+ export function paintAttributes(paint, theme, kind) {
6
+ if (paint.type === "none")
7
+ return `${kind}="none"`;
8
+ return `${kind}="${colorValue(paint.color, theme)}" ${kind}-opacity="${paint.opacity}"`;
9
+ }
10
+ export function dashArray(style) {
11
+ const width = Math.max(style.width, 1);
12
+ if (style.dash === "dash")
13
+ return `${4 * width} ${3 * width}`;
14
+ if (style.dash === "dot")
15
+ return `${width} ${2 * width}`;
16
+ if (style.dash === "dashDot")
17
+ return `${4 * width} ${2 * width} ${width} ${2 * width}`;
18
+ return undefined;
19
+ }
20
+ export function strokeAttributes(style, theme) {
21
+ const dash = dashArray(style);
22
+ return `${paintAttributes(style.paint, theme, "stroke")} stroke-width="${style.width}"${dash === undefined ? "" : ` stroke-dasharray="${dash}"`} stroke-linecap="round" stroke-linejoin="round"`;
23
+ }
24
+ export function transformAttribute(box, transform) {
25
+ if (transform.rotation === 0 && !transform.flipH && !transform.flipV)
26
+ return "";
27
+ const cx = box.x + box.width / 2;
28
+ const cy = box.y + box.height / 2;
29
+ return ` transform="translate(${cx} ${cy}) rotate(${transform.rotation}) scale(${transform.flipH ? -1 : 1} ${transform.flipV ? -1 : 1}) translate(${-cx} ${-cy})"`;
30
+ }
31
+ //# sourceMappingURL=style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/rendering/style.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,UAAU,CAAC,KAAiB,EAAE,KAAkC;IAC9E,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1E,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAsB,EACtB,KAAkC,EAClC,IAAuB;IAEvB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,GAAG,IAAI,SAAS,CAAC;IACnD,OAAO,GAAG,IAAI,KAAK,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,aAAa,KAAK,CAAC,OAAO,GAAG,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAA4B;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,GAAG,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;IAC9D,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;IACzD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;IACvF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAA4B,EAAE,KAAkC;IAC/F,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,kBAAkB,KAAK,CAAC,KAAK,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,sBAAsB,IAAI,GAAG,iDAAiD,CAAC;AACnM,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAQ,EAAE,SAA8B;IACzE,IAAI,SAAS,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAChF,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,OAAO,yBAAyB,EAAE,IAAI,EAAE,YAAY,SAAS,CAAC,QAAQ,WAAW,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AACrK,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Box, NormalizedPresentationTheme, NormalizedTextFrameStyle, NormalizedTextParagraph } from "@pptkit/core";
2
+ import type { SvgRenderWarning } from "../types/public.js";
3
+ interface TextContext {
4
+ theme: NormalizedPresentationTheme;
5
+ warnings: SvgRenderWarning[];
6
+ slideId: string;
7
+ elementId: string;
8
+ }
9
+ export declare function canRenderTextNatively(paragraphs: NormalizedTextParagraph[]): boolean;
10
+ export declare function textSvg(paragraphs: NormalizedTextParagraph[], frame: NormalizedTextFrameStyle, box: Box, context: TextContext): string;
11
+ export declare function textHtml(paragraphs: NormalizedTextParagraph[], frame: NormalizedTextFrameStyle, context: TextContext): string;
12
+ export {};
13
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/rendering/text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,GAAG,EAEH,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,cAAc,CAAC;AAGtB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,UAAU,WAAW;IACnB,KAAK,EAAE,2BAA2B,CAAC;IACnC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAqJD,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAIpF;AAqBD,wBAAgB,OAAO,CACrB,UAAU,EAAE,uBAAuB,EAAE,EACrC,KAAK,EAAE,wBAAwB,EAC/B,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,WAAW,GACnB,MAAM,CAuCR;AAgDD,wBAAgB,QAAQ,CACtB,UAAU,EAAE,uBAAuB,EAAE,EACrC,KAAK,EAAE,wBAAwB,EAC/B,OAAO,EAAE,WAAW,GACnB,MAAM,CAmDR"}
@@ -0,0 +1,298 @@
1
+ import { escapeXml, safeActionUrl } from "./escape.js";
2
+ import { colorValue } from "./style.js";
3
+ // Keep wrapping deterministic without depending on browser canvas metrics or
4
+ // hidden host fonts. Latin glyph advances vary too much for one average width:
5
+ // treating "i" like "m" makes compact bold headings wrap substantially earlier
6
+ // than they do in PowerPoint.
7
+ const NORMAL_CHARACTER_WIDTH = 0.52;
8
+ const NARROW_CHARACTER_WIDTH = 0.3;
9
+ const WIDE_CHARACTER_WIDTH = 0.72;
10
+ const UPPERCASE_CHARACTER_WIDTH = 0.6;
11
+ const DIGIT_CHARACTER_WIDTH = 0.55;
12
+ const SPACE_WIDTH = 0.28;
13
+ const PUNCTUATION_WIDTH = 0.32;
14
+ const POWERPOINT_WIDTH_HEADROOM = 1.06;
15
+ const BOLD_WIDTH_MULTIPLIER = 1.03;
16
+ // An alphabetic baseline at 0.8em removes the lower HTML line-box offset while
17
+ // retaining the authored top inset used by the DrawingML exporter.
18
+ const TEXT_BASELINE_RATIO = 0.8;
19
+ function isWideCharacter(character) {
20
+ const codePoint = character.codePointAt(0) ?? 0;
21
+ return ((codePoint >= 0x1100 && codePoint <= 0x11ff) ||
22
+ (codePoint >= 0x2e80 && codePoint <= 0x9fff) ||
23
+ (codePoint >= 0xac00 && codePoint <= 0xd7af) ||
24
+ (codePoint >= 0xf900 && codePoint <= 0xfaff) ||
25
+ (codePoint >= 0x1f300 && codePoint <= 0x1faff));
26
+ }
27
+ function scaledFontSize(run, scale) {
28
+ return run.style.fontSize * scale;
29
+ }
30
+ function formatNumber(value) {
31
+ return Math.round(value * 1000) / 1000;
32
+ }
33
+ function characterWidth(character, run, scale) {
34
+ const fontSize = scaledFontSize(run, scale);
35
+ const base = /\s/u.test(character)
36
+ ? SPACE_WIDTH
37
+ : isWideCharacter(character)
38
+ ? 1
39
+ : /[,.;:!?()[\]{}'"`-]/u.test(character)
40
+ ? PUNCTUATION_WIDTH
41
+ : /[fijltIr|]/u.test(character)
42
+ ? NARROW_CHARACTER_WIDTH
43
+ : /[mMwWOQ%@]/u.test(character)
44
+ ? WIDE_CHARACTER_WIDTH
45
+ : /\d/u.test(character)
46
+ ? DIGIT_CHARACTER_WIDTH
47
+ : /[A-Z]/u.test(character)
48
+ ? UPPERCASE_CHARACTER_WIDTH
49
+ : NORMAL_CHARACTER_WIDTH;
50
+ return fontSize * base * POWERPOINT_WIDTH_HEADROOM * (run.style.bold && !isWideCharacter(character) ? BOLD_WIDTH_MULTIPLIER : 1) * (run.style.italic ? 1.02 : 1);
51
+ }
52
+ function textWidth(text, run, scale) {
53
+ let width = 0;
54
+ for (const character of text)
55
+ width += characterWidth(character, run, scale);
56
+ return width;
57
+ }
58
+ function appendSegment(segments, run, text) {
59
+ if (text === "")
60
+ return;
61
+ const previous = segments.at(-1);
62
+ if (previous?.run === run)
63
+ previous.text += text;
64
+ else
65
+ segments.push({ run, text });
66
+ }
67
+ function paragraphLines(paragraph, availableWidth, scale) {
68
+ const firstRun = paragraph.runs[0];
69
+ if (firstRun === undefined)
70
+ return [];
71
+ const bullet = bulletText(paragraph);
72
+ const firstWidth = Math.max(1, availableWidth + paragraph.style.hanging);
73
+ const laterWidth = Math.max(1, availableWidth);
74
+ const lines = [];
75
+ let first = true;
76
+ let segments = [];
77
+ let width = 0;
78
+ let pendingSpace;
79
+ const startLine = () => {
80
+ segments = [];
81
+ width = 0;
82
+ if (first && bullet !== "") {
83
+ appendSegment(segments, firstRun, bullet);
84
+ width = textWidth(bullet, firstRun, scale);
85
+ }
86
+ };
87
+ const finishLine = () => {
88
+ const lineFontSize = segments.reduce((largest, segment) => Math.max(largest, scaledFontSize(segment.run, scale)), scaledFontSize(firstRun, scale));
89
+ lines.push({ first, fontSize: lineFontSize, lineHeight: lineFontSize * paragraph.style.lineSpacing, paragraph, segments });
90
+ first = false;
91
+ pendingSpace = undefined;
92
+ startLine();
93
+ };
94
+ const appendWord = (word, run) => {
95
+ const space = pendingSpace === undefined || segments.length === 0 ? "" : " ";
96
+ const maximum = first ? firstWidth : laterWidth;
97
+ const candidateWidth = width + textWidth(space, pendingSpace ?? run, scale) + textWidth(word, run, scale);
98
+ const hasText = segments.length > (first && bullet !== "" ? 1 : 0);
99
+ if (hasText && candidateWidth > maximum)
100
+ finishLine();
101
+ if (pendingSpace !== undefined && segments.length > 0) {
102
+ appendSegment(segments, pendingSpace, " ");
103
+ width += textWidth(" ", pendingSpace, scale);
104
+ }
105
+ for (const character of word) {
106
+ const characterMeasure = characterWidth(character, run, scale);
107
+ const activeMaximum = first ? firstWidth : laterWidth;
108
+ const activeHasText = segments.length > (first && bullet !== "" ? 1 : 0);
109
+ if (activeHasText && width + characterMeasure > activeMaximum)
110
+ finishLine();
111
+ appendSegment(segments, run, character);
112
+ width += characterMeasure;
113
+ }
114
+ pendingSpace = undefined;
115
+ };
116
+ startLine();
117
+ for (const run of paragraph.runs) {
118
+ for (const token of run.text.split(/(\s+)/u)) {
119
+ if (token === "")
120
+ continue;
121
+ if (/\s/u.test(token)) {
122
+ if (token.includes("\n"))
123
+ finishLine();
124
+ else
125
+ pendingSpace = run;
126
+ }
127
+ else
128
+ appendWord(token, run);
129
+ }
130
+ }
131
+ if (segments.length > 0 || lines.length === 0)
132
+ finishLine();
133
+ return lines;
134
+ }
135
+ export function canRenderTextNatively(paragraphs) {
136
+ // Mixed runs with independent actions stay on the XHTML path until Layout
137
+ // owns resolved cross-run line fragments as a stable contract.
138
+ return paragraphs.every((paragraph) => paragraph.runs.length === 1 && paragraph.runs[0]?.action === undefined);
139
+ }
140
+ function textAnchor(align) {
141
+ if (align === "center")
142
+ return "middle";
143
+ if (align === "right")
144
+ return "end";
145
+ return "start";
146
+ }
147
+ function nativeRunAttributes(run, scale, theme) {
148
+ const decorations = [run.style.underline ? "underline" : "", run.style.strike ? "line-through" : ""].filter(Boolean).join(" ");
149
+ return [
150
+ `font-family="${escapeXml(fontFamily(run.style.fontFamily, theme))}"`,
151
+ `font-size="${formatNumber(scaledFontSize(run, scale))}"`,
152
+ `font-weight="${run.style.bold ? 700 : 400}"`,
153
+ `font-style="${run.style.italic ? "italic" : "normal"}"`,
154
+ `text-decoration="${decorations || "none"}"`,
155
+ `fill="${colorValue(run.style.color, theme)}"`,
156
+ `lang="${escapeXml(run.style.language)}"`,
157
+ ].join(" ");
158
+ }
159
+ export function textSvg(paragraphs, frame, box, context) {
160
+ if (frame.autoFit.mode === "resize") {
161
+ context.warnings.push({
162
+ code: "text-autofit-resize-unsupported",
163
+ message: "Text autoFit resize cannot change SVG element geometry and was rendered inside the authored box.",
164
+ slideId: context.slideId,
165
+ elementId: context.elementId,
166
+ });
167
+ }
168
+ const scale = frame.autoFit.mode === "shrink" ? frame.autoFit.fontScale : 1;
169
+ const contentWidth = Math.max(1, box.width - frame.margin.left - frame.margin.right);
170
+ const lines = [];
171
+ let cursor = 0;
172
+ for (const paragraph of paragraphs) {
173
+ cursor += paragraph.style.spaceBefore;
174
+ const availableWidth = Math.max(1, contentWidth - paragraph.style.indent);
175
+ for (const line of paragraphLines(paragraph, availableWidth, scale)) {
176
+ lines.push({ ...line, y: cursor });
177
+ cursor += line.lineHeight;
178
+ }
179
+ cursor += paragraph.style.spaceAfter;
180
+ }
181
+ const availableHeight = Math.max(0, box.height - frame.margin.top - frame.margin.bottom);
182
+ const verticalOffset = frame.verticalAlign === "middle"
183
+ ? Math.max(0, (availableHeight - cursor) / 2)
184
+ : frame.verticalAlign === "bottom"
185
+ ? Math.max(0, availableHeight - cursor)
186
+ : 0;
187
+ return lines.map((line, lineIndex) => {
188
+ const style = line.paragraph.style;
189
+ const left = box.x + frame.margin.left + style.indent - (line.first ? style.hanging : 0);
190
+ const right = box.x + box.width - frame.margin.right;
191
+ const anchor = textAnchor(style.align);
192
+ const x = anchor === "middle" ? (left + right) / 2 : anchor === "end" ? right : left;
193
+ const y = box.y + frame.margin.top + verticalOffset + line.y + line.fontSize * TEXT_BASELINE_RATIO;
194
+ const content = line.segments.map((segment) => `<tspan ${nativeRunAttributes(segment.run, scale, context.theme)}>${escapeXml(segment.text)}</tspan>`).join("");
195
+ return `<text x="${x}" y="${y}" text-anchor="${anchor}" data-pptkit-text-line="${lineIndex}">${content}</text>`;
196
+ }).join("");
197
+ }
198
+ function actionAttributes(action, context) {
199
+ if (action === undefined)
200
+ return { open: "", close: "" };
201
+ if (action.type === "slide") {
202
+ context.warnings.push({
203
+ code: "slide-action-not-linked",
204
+ message: `Slide action targeting ${action.slideId} is metadata-only in standalone SVG output.`,
205
+ slideId: context.slideId,
206
+ elementId: context.elementId,
207
+ });
208
+ return { open: `<span data-pptkit-slide-target="${escapeXml(action.slideId)}">`, close: "</span>" };
209
+ }
210
+ const url = safeActionUrl(action.url);
211
+ if (url === undefined) {
212
+ context.warnings.push({
213
+ code: "unsafe-action-url",
214
+ message: "An action URL with an unsupported protocol was omitted.",
215
+ slideId: context.slideId,
216
+ elementId: context.elementId,
217
+ });
218
+ return { open: "", close: "" };
219
+ }
220
+ return {
221
+ open: `<a href="${escapeXml(url)}" rel="noopener noreferrer"${action.tooltip === undefined ? "" : ` title="${escapeXml(action.tooltip)}"`}>`,
222
+ close: "</a>",
223
+ };
224
+ }
225
+ function fontFamily(value, theme) {
226
+ return typeof value === "string" ? value : theme.fonts[value.theme];
227
+ }
228
+ function cssFontFamily(value) {
229
+ return `&quot;${escapeXml(value.replace(/\\/g, "\\\\").replace(/"/g, '\\"'))}&quot;`;
230
+ }
231
+ function bulletText(paragraph) {
232
+ const bullet = paragraph.style.bullet;
233
+ if (bullet.type === "none")
234
+ return "";
235
+ if (bullet.type === "bullet")
236
+ return `${bullet.character} `;
237
+ const value = bullet.startAt;
238
+ if (bullet.style === "arabicParen")
239
+ return `${value}) `;
240
+ if (bullet.style === "alphaLowerPeriod")
241
+ return `${String.fromCharCode(96 + Math.min(26, value))}. `;
242
+ if (bullet.style === "alphaUpperPeriod")
243
+ return `${String.fromCharCode(64 + Math.min(26, value))}. `;
244
+ return `${value}. `;
245
+ }
246
+ export function textHtml(paragraphs, frame, context) {
247
+ if (frame.autoFit.mode === "resize") {
248
+ context.warnings.push({
249
+ code: "text-autofit-resize-unsupported",
250
+ message: "Text autoFit resize cannot change SVG element geometry and was rendered inside the authored box.",
251
+ slideId: context.slideId,
252
+ elementId: context.elementId,
253
+ });
254
+ }
255
+ const scale = frame.autoFit.mode === "shrink" ? frame.autoFit.fontScale : 1;
256
+ const justify = frame.verticalAlign === "middle" ? "center" : frame.verticalAlign === "bottom" ? "flex-end" : "flex-start";
257
+ const rootStyle = [
258
+ "width:100%",
259
+ "height:100%",
260
+ "box-sizing:border-box",
261
+ "display:flex",
262
+ "flex-direction:column",
263
+ `justify-content:${justify}`,
264
+ `padding:${frame.margin.top}px ${frame.margin.right}px ${frame.margin.bottom}px ${frame.margin.left}px`,
265
+ "overflow:visible",
266
+ frame.wrap ? "overflow-wrap:anywhere" : "white-space:pre",
267
+ ].join(";");
268
+ const content = paragraphs.map((paragraph) => {
269
+ const style = paragraph.style;
270
+ const paragraphStyle = [
271
+ "margin:0",
272
+ `padding-left:${style.indent}px`,
273
+ `text-indent:${-style.hanging}px`,
274
+ `line-height:${style.lineSpacing}`,
275
+ `padding-top:${style.spaceBefore}px`,
276
+ `padding-bottom:${style.spaceAfter}px`,
277
+ `text-align:${style.align}`,
278
+ frame.wrap ? "white-space:pre-wrap" : "white-space:pre",
279
+ ].join(";");
280
+ const runs = paragraph.runs.map((run) => {
281
+ const decorations = [run.style.underline ? "underline" : "", run.style.strike ? "line-through" : ""].filter(Boolean).join(" ");
282
+ const runStyle = [
283
+ `font-family:${cssFontFamily(fontFamily(run.style.fontFamily, context.theme))}`,
284
+ `font-size:${formatNumber(run.style.fontSize * scale)}px`,
285
+ `font-weight:${run.style.bold ? 700 : 400}`,
286
+ `font-style:${run.style.italic ? "italic" : "normal"}`,
287
+ `text-decoration:${decorations || "none"}`,
288
+ `color:${colorValue(run.style.color, context.theme)}`,
289
+ ].join(";");
290
+ const action = actionAttributes(run.action, context);
291
+ return `${action.open}<span lang="${escapeXml(run.style.language)}" style="${runStyle}">${escapeXml(run.text)}</span>${action.close}`;
292
+ }).join("");
293
+ const bullet = bulletText(paragraph);
294
+ return `<div style="${paragraphStyle}">${bullet === "" ? "" : `<span aria-hidden="true">${escapeXml(bullet)}</span>`}${runs}</div>`;
295
+ }).join("");
296
+ return `<div xmlns="http://www.w3.org/1999/xhtml" style="${rootStyle}">${content}</div>`;
297
+ }
298
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/rendering/text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { NormalizedAsset } from "@pptkit/core";
2
+ export interface SvgRenderedSlide {
3
+ slideId: string;
4
+ index: number;
5
+ hidden: boolean;
6
+ svg: string;
7
+ }
8
+ export interface SvgRenderWarning {
9
+ code: string;
10
+ message: string;
11
+ slideId?: string;
12
+ elementId?: string;
13
+ assetId?: string;
14
+ }
15
+ export type SvgAssetResolver = (asset: NormalizedAsset) => string | undefined | Promise<string | undefined>;
16
+ export interface SvgRenderOptions {
17
+ resolveAsset?: SvgAssetResolver;
18
+ }
19
+ export interface SvgRenderResult {
20
+ width: number;
21
+ height: number;
22
+ slides: SvgRenderedSlide[];
23
+ warnings: SvgRenderWarning[];
24
+ status: "rendered" | "rendered-with-warnings";
25
+ }
26
+ //# sourceMappingURL=public.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/types/public.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC7B,KAAK,EAAE,eAAe,KACnB,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,gBAAgB,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,MAAM,EAAE,UAAU,GAAG,wBAAwB,CAAC;CAC/C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=public.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public.js","sourceRoot":"","sources":["../../src/types/public.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@pptkit/svg-renderer",
3
+ "version": "0.1.2",
4
+ "private": false,
5
+ "type": "module",
6
+ "description": "Browser-oriented SVG preview rendering for PPTKit presentations.",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "./browser": {
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/browser/index.js"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
25
+ "dependencies": {
26
+ "@pptkit/layout": "0.1.2",
27
+ "@pptkit/core": "0.1.2"
28
+ },
29
+ "scripts": {
30
+ "build": "tsc -p tsconfig.json && node ../../scripts/build-browser-bundle.mjs @pptkit/svg-renderer",
31
+ "test": "pnpm run build && node --test test/*.test.mjs"
32
+ }
33
+ }