@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 +21 -0
- package/README.md +17 -0
- package/dist/browser/global.js +1 -0
- package/dist/browser/index.js +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/rendering/element.d.ts +15 -0
- package/dist/rendering/element.d.ts.map +1 -0
- package/dist/rendering/element.js +197 -0
- package/dist/rendering/element.js.map +1 -0
- package/dist/rendering/escape.d.ts +5 -0
- package/dist/rendering/escape.d.ts.map +1 -0
- package/dist/rendering/escape.js +43 -0
- package/dist/rendering/escape.js.map +1 -0
- package/dist/rendering/render.d.ts +4 -0
- package/dist/rendering/render.d.ts.map +1 -0
- package/dist/rendering/render.js +39 -0
- package/dist/rendering/render.js.map +1 -0
- package/dist/rendering/style.d.ts +7 -0
- package/dist/rendering/style.d.ts.map +1 -0
- package/dist/rendering/style.js +31 -0
- package/dist/rendering/style.js.map +1 -0
- package/dist/rendering/text.d.ts +13 -0
- package/dist/rendering/text.d.ts.map +1 -0
- package/dist/rendering/text.js +298 -0
- package/dist/rendering/text.js.map +1 -0
- package/dist/types/public.d.ts +26 -0
- package/dist/types/public.d.ts.map +1 -0
- package/dist/types/public.js +2 -0
- package/dist/types/public.js.map +1 -0
- package/package.json +33 -0
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,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}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),`"${n(l.replace(/\\/g,"\\\\").replace(/"/g,'\\"'))}"`),`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,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}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),`"${i(l.replace(/\\/g,"\\\\").replace(/"/g,'\\"'))}"`),`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};
|
package/dist/index.d.ts
ADDED
|
@@ -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, "&")
|
|
4
|
+
.replace(/</g, "<")
|
|
5
|
+
.replace(/>/g, ">")
|
|
6
|
+
.replace(/"/g, """)
|
|
7
|
+
.replace(/'/g, "'");
|
|
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":"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"}
|
|
@@ -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 `"${escapeXml(value.replace(/\\/g, "\\\\").replace(/"/g, '\\"'))}"`;
|
|
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 @@
|
|
|
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
|
+
}
|