@aivorynet/slaide 1.0.0
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/CHANGELOG.md +26 -0
- package/LICENSE +201 -0
- package/README.md +87 -0
- package/bin/slaide.js +25 -0
- package/dist/assets.d.ts +10 -0
- package/dist/assets.js +54 -0
- package/dist/assets.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +433 -0
- package/dist/cli.js.map +1 -0
- package/dist/compare/index.d.ts +24 -0
- package/dist/compare/index.js +246 -0
- package/dist/compare/index.js.map +1 -0
- package/dist/compare/ssim.d.ts +2 -0
- package/dist/compare/ssim.js +46 -0
- package/dist/compare/ssim.js.map +1 -0
- package/dist/compiler/chrome.d.ts +7 -0
- package/dist/compiler/chrome.js +94 -0
- package/dist/compiler/chrome.js.map +1 -0
- package/dist/compiler/compile.d.ts +2 -0
- package/dist/compiler/compile.js +432 -0
- package/dist/compiler/compile.js.map +1 -0
- package/dist/compiler/markdown.d.ts +26 -0
- package/dist/compiler/markdown.js +439 -0
- package/dist/compiler/markdown.js.map +1 -0
- package/dist/compiler/tokens.d.ts +13 -0
- package/dist/compiler/tokens.js +127 -0
- package/dist/compiler/tokens.js.map +1 -0
- package/dist/container.d.ts +47 -0
- package/dist/container.js +309 -0
- package/dist/container.js.map +1 -0
- package/dist/engine-entry.d.ts +1 -0
- package/dist/engine-entry.js +71 -0
- package/dist/engine-entry.js.map +1 -0
- package/dist/export-keynote/keynote.d.ts +10 -0
- package/dist/export-keynote/keynote.js +58 -0
- package/dist/export-keynote/keynote.js.map +1 -0
- package/dist/export-pptx/embed-fonts.d.ts +5 -0
- package/dist/export-pptx/embed-fonts.js +159 -0
- package/dist/export-pptx/embed-fonts.js.map +1 -0
- package/dist/export-pptx/inject-anim.d.ts +28 -0
- package/dist/export-pptx/inject-anim.js +150 -0
- package/dist/export-pptx/inject-anim.js.map +1 -0
- package/dist/export-pptx/pptx.d.ts +10 -0
- package/dist/export-pptx/pptx.js +425 -0
- package/dist/export-pptx/pptx.js.map +1 -0
- package/dist/export-pptx/transitions.d.ts +16 -0
- package/dist/export-pptx/transitions.js +82 -0
- package/dist/export-pptx/transitions.js.map +1 -0
- package/dist/import/emit.d.ts +5 -0
- package/dist/import/emit.js +274 -0
- package/dist/import/emit.js.map +1 -0
- package/dist/import/index.d.ts +21 -0
- package/dist/import/index.js +192 -0
- package/dist/import/index.js.map +1 -0
- package/dist/import/pptx.d.ts +117 -0
- package/dist/import/pptx.js +1043 -0
- package/dist/import/pptx.js.map +1 -0
- package/dist/import/raster-com.d.ts +27 -0
- package/dist/import/raster-com.js +113 -0
- package/dist/import/raster-com.js.map +1 -0
- package/dist/import/raster-extension.d.ts +35 -0
- package/dist/import/raster-extension.js +27 -0
- package/dist/import/raster-extension.js.map +1 -0
- package/dist/index.d.ts +63 -0
- package/dist/index.js +174 -0
- package/dist/index.js.map +1 -0
- package/dist/install/detect.d.ts +17 -0
- package/dist/install/detect.js +82 -0
- package/dist/install/detect.js.map +1 -0
- package/dist/install/index.d.ts +20 -0
- package/dist/install/index.js +126 -0
- package/dist/install/index.js.map +1 -0
- package/dist/install/registry.d.ts +33 -0
- package/dist/install/registry.js +169 -0
- package/dist/install/registry.js.map +1 -0
- package/dist/install/skills.d.ts +17 -0
- package/dist/install/skills.js +72 -0
- package/dist/install/skills.js.map +1 -0
- package/dist/master-io.d.ts +7 -0
- package/dist/master-io.js +55 -0
- package/dist/master-io.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.js +114 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/optimize/export-optimize.d.ts +21 -0
- package/dist/optimize/export-optimize.js +167 -0
- package/dist/optimize/export-optimize.js.map +1 -0
- package/dist/parser/frontmatter.d.ts +8 -0
- package/dist/parser/frontmatter.js +45 -0
- package/dist/parser/frontmatter.js.map +1 -0
- package/dist/parser/parse.d.ts +2 -0
- package/dist/parser/parse.js +184 -0
- package/dist/parser/parse.js.map +1 -0
- package/dist/render/anim.d.ts +50 -0
- package/dist/render/anim.js +213 -0
- package/dist/render/anim.js.map +1 -0
- package/dist/render/charts.d.ts +3 -0
- package/dist/render/charts.js +171 -0
- package/dist/render/charts.js.map +1 -0
- package/dist/render/css.d.ts +3 -0
- package/dist/render/css.js +183 -0
- package/dist/render/css.js.map +1 -0
- package/dist/render/echarts-lib.generated.d.ts +1 -0
- package/dist/render/echarts-lib.generated.js +7 -0
- package/dist/render/echarts-lib.generated.js.map +1 -0
- package/dist/render/html.d.ts +5 -0
- package/dist/render/html.js +186 -0
- package/dist/render/html.js.map +1 -0
- package/dist/render/inject.d.ts +12 -0
- package/dist/render/inject.js +19 -0
- package/dist/render/inject.js.map +1 -0
- package/dist/render/mermaid-lib.generated.d.ts +1 -0
- package/dist/render/mermaid-lib.generated.js +7 -0
- package/dist/render/mermaid-lib.generated.js.map +1 -0
- package/dist/render/runtime.d.ts +1 -0
- package/dist/render/runtime.js +393 -0
- package/dist/render/runtime.js.map +1 -0
- package/dist/render-pdf/pdf.d.ts +9 -0
- package/dist/render-pdf/pdf.js +53 -0
- package/dist/render-pdf/pdf.js.map +1 -0
- package/dist/render-png/montage.d.ts +14 -0
- package/dist/render-png/montage.js +75 -0
- package/dist/render-png/montage.js.map +1 -0
- package/dist/render-png/shoot.d.ts +25 -0
- package/dist/render-png/shoot.js +79 -0
- package/dist/render-png/shoot.js.map +1 -0
- package/dist/scaffold.d.ts +9 -0
- package/dist/scaffold.js +36 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/types.d.ts +212 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +6 -0
- package/dist/util.js +28 -0
- package/dist/util.js.map +1 -0
- package/package.json +66 -0
- package/skills/slaide/SKILL.md +64 -0
- package/skills/slaide/agents/openai.yaml +12 -0
- package/skills/slaide/examples/branded-deck.slaide +198 -0
- package/skills/slaide/examples/branded-theme.slaide.yaml +187 -0
- package/skills/slaide/examples/sample.slaide +98 -0
- package/skills/slaide/reference.md +177 -0
- package/skills/slaide/themes.md +171 -0
- package/themes/aurora.slaide.yaml +136 -0
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
// Copyright 2026 Paul Piper
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
// Markdown -> HTML for a region, including build steps (`>>>`) and image
|
|
4
|
+
// attribute syntax (`{#id anchor:"x y w h"}`).
|
|
5
|
+
import MarkdownIt from 'markdown-it';
|
|
6
|
+
import yaml from 'js-yaml';
|
|
7
|
+
import { expandAnchor } from '../util.js';
|
|
8
|
+
import { ENTRANCE_NAMES } from '../render/anim.js';
|
|
9
|
+
const BUILTIN_ENTRANCES = new Set(ENTRANCE_NAMES);
|
|
10
|
+
// CSS named colours — a `[x]{.tomato}` is a legitimate literal colour, not a typo, so
|
|
11
|
+
// these are NOT flagged as unknown classes.
|
|
12
|
+
const CSS_COLORS = new Set(('aliceblue antiquewhite aqua aquamarine azure beige bisque black blanchedalmond blue blueviolet brown ' +
|
|
13
|
+
'burlywood cadetblue chartreuse chocolate coral cornflowerblue cornsilk crimson cyan darkblue darkcyan ' +
|
|
14
|
+
'darkgoldenrod darkgray darkgreen darkgrey darkkhaki darkmagenta darkolivegreen darkorange darkorchid ' +
|
|
15
|
+
'darkred darksalmon darkseagreen darkslateblue darkslategray darkslategrey darkturquoise darkviolet ' +
|
|
16
|
+
'deeppink deepskyblue dimgray dimgrey dodgerblue firebrick floralwhite forestgreen fuchsia gainsboro ' +
|
|
17
|
+
'ghostwhite gold goldenrod gray green greenyellow grey honeydew hotpink indianred indigo ivory khaki ' +
|
|
18
|
+
'lavender lavenderblush lawngreen lemonchiffon lightblue lightcoral lightcyan lightgoldenrodyellow ' +
|
|
19
|
+
'lightgray lightgreen lightgrey lightpink lightsalmon lightseagreen lightskyblue lightslategray ' +
|
|
20
|
+
'lightslategrey lightsteelblue lightyellow lime limegreen linen magenta maroon mediumaquamarine ' +
|
|
21
|
+
'mediumblue mediumorchid mediumpurple mediumseagreen mediumslateblue mediumspringgreen mediumturquoise ' +
|
|
22
|
+
'mediumvioletred midnightblue mintcream mistyrose moccasin navajowhite navy oldlace olive olivedrab ' +
|
|
23
|
+
'orange orangered orchid palegoldenrod palegreen paleturquoise palevioletred papayawhip peachpuff peru ' +
|
|
24
|
+
'pink plum powderblue purple rebeccapurple red rosybrown royalblue saddlebrown salmon sandybrown ' +
|
|
25
|
+
'seagreen seashell sienna silver skyblue slateblue slategray slategrey snow springgreen steelblue tan ' +
|
|
26
|
+
'teal thistle tomato transparent turquoise violet wheat white whitesmoke yellow yellowgreen ' +
|
|
27
|
+
'currentcolor inherit').split(' '));
|
|
28
|
+
/** A `[text]{.X}` colour class is legitimate if X is a master role/palette token or a
|
|
29
|
+
* CSS colour; otherwise it's almost certainly a typo (e.g. `.xxlarge`, `.gradd`).
|
|
30
|
+
* Exported so slot-style `color:`/`box:` resolution can warn on the same basis. */
|
|
31
|
+
export function isKnownColorClass(c, tokens) {
|
|
32
|
+
return (tokens[`--color-${c}`] !== undefined ||
|
|
33
|
+
tokens[`--palette-${c}`] !== undefined ||
|
|
34
|
+
CSS_COLORS.has(c.toLowerCase()) ||
|
|
35
|
+
/^#[0-9a-f]{3,8}$/i.test(c));
|
|
36
|
+
}
|
|
37
|
+
/** CSS for a colour value used by slot `color:`/`box:` and inline `.colour` spans. A bare
|
|
38
|
+
* role/palette name resolves through the master tokens (with a literal fallback so CSS
|
|
39
|
+
* named colours like `tomato` still work); anything that can't be a custom-property name
|
|
40
|
+
* — a hex (`#0af`), `rgb()/hsl()`, etc. — is emitted directly. Wrapping a hex as
|
|
41
|
+
* `var(--color-#0af, …)` is invalid CSS: the whole declaration is dropped and the text
|
|
42
|
+
* silently reverts to the inherited role (often dark-on-dark). A hex is a supported
|
|
43
|
+
* escape hatch; prefer palette names so the deck stays on-theme. */
|
|
44
|
+
export function colorValue(v) {
|
|
45
|
+
const t = String(v).trim();
|
|
46
|
+
return /^[a-zA-Z][\w-]*$/.test(t) ? `var(--color-${t}, var(--palette-${t}, ${t}))` : t;
|
|
47
|
+
}
|
|
48
|
+
const md = new MarkdownIt({
|
|
49
|
+
html: true,
|
|
50
|
+
linkify: true,
|
|
51
|
+
typographer: true,
|
|
52
|
+
breaks: false,
|
|
53
|
+
});
|
|
54
|
+
const IMG_RE = /!\[([^\]]*)\]\(([^)\s]+)(?:\s+"([^"]*)")?\)(?:\{([^}]*)\})?/g;
|
|
55
|
+
function parseAttrs(spec) {
|
|
56
|
+
const a = { classes: [], style: [] };
|
|
57
|
+
if (!spec)
|
|
58
|
+
return a;
|
|
59
|
+
// split respecting quoted values
|
|
60
|
+
const tokens = spec.match(/(?:[^\s"]+"[^"]*")|[^\s]+/g) ?? [];
|
|
61
|
+
for (const tok of tokens) {
|
|
62
|
+
if (tok.startsWith('#'))
|
|
63
|
+
a.id = tok.slice(1);
|
|
64
|
+
else if (tok.startsWith('.'))
|
|
65
|
+
a.classes.push(tok.slice(1));
|
|
66
|
+
else if (tok.startsWith('anchor:')) {
|
|
67
|
+
const val = tok.slice('anchor:'.length).replace(/^"|"$/g, '');
|
|
68
|
+
for (const [k, v] of Object.entries(expandAnchor(val)))
|
|
69
|
+
a.style.push(`${k}:${v}`);
|
|
70
|
+
}
|
|
71
|
+
else if (tok.includes('=')) {
|
|
72
|
+
const [k, v] = tok.split('=');
|
|
73
|
+
a.style.push(`${k}:${v.replace(/^"|"$/g, '')}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return a;
|
|
77
|
+
}
|
|
78
|
+
const VIDEO_EXT = /\.(mp4|webm|mov|m4v|ogv)$/i;
|
|
79
|
+
const AUDIO_EXT = /\.(mp3|wav|ogg|m4a|aac)$/i;
|
|
80
|
+
// Video/audio via the image syntax: { poster=… .autoplay width=… }
|
|
81
|
+
function mediaTag(alt, url, attrSpec) {
|
|
82
|
+
const spec = attrSpec ?? '';
|
|
83
|
+
const wM = spec.match(/width=("?)([^"\s]+)\1/);
|
|
84
|
+
const hM = spec.match(/height=("?)([^"\s]+)\1/);
|
|
85
|
+
const style = [wM ? `width:${wM[2]}` : '', hM ? `height:${hM[2]}` : ''].filter(Boolean).join(';');
|
|
86
|
+
const styleAttr = style ? ` style="${style}"` : '';
|
|
87
|
+
if (AUDIO_EXT.test(url))
|
|
88
|
+
return `<audio class="sl-audio" controls src="${url}"${styleAttr}></audio>`;
|
|
89
|
+
const posterM = spec.match(/poster=("?)([^"\s]+)\1/);
|
|
90
|
+
const poster = posterM ? ` poster="${posterM[2]}"` : '';
|
|
91
|
+
// `.autoplay` → muted+loop autoplay (no controls); otherwise show controls. Both
|
|
92
|
+
// degrade to the poster frame in PDF/print (which can't play media).
|
|
93
|
+
const auto = /(^|\s|\.)autoplay\b/.test(spec);
|
|
94
|
+
const flags = auto ? ' autoplay muted loop playsinline' : ' controls preload="metadata"';
|
|
95
|
+
return `<video class="sl-video" src="${url}"${poster}${flags}${styleAttr} aria-label="${alt}"></video>`;
|
|
96
|
+
}
|
|
97
|
+
function preprocessImages(src) {
|
|
98
|
+
return src.replace(IMG_RE, (_m, alt, url, _title, attrSpec) => {
|
|
99
|
+
if (VIDEO_EXT.test(url) || AUDIO_EXT.test(url))
|
|
100
|
+
return mediaTag(alt, url, attrSpec);
|
|
101
|
+
const a = parseAttrs(attrSpec);
|
|
102
|
+
// The id enables runtime morph pairing; view-transition-name is assigned
|
|
103
|
+
// transiently by the runtime to avoid duplicate-name aborts.
|
|
104
|
+
const idAttr = a.id ? ` id="${a.id}" data-morph="${a.id}"` : '';
|
|
105
|
+
const cls = ['sl-img', ...a.classes].join(' ');
|
|
106
|
+
const style = a.style.length ? ` style="${a.style.join(';')}"` : '';
|
|
107
|
+
// lazy/async by default; renderSlideWeb upgrades slide 0's images to eager.
|
|
108
|
+
return `<img class="${cls}"${idAttr} src="${url}" alt="${alt}" loading="lazy" decoding="async"${style}>`;
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// Inline styled spans: [text]{.class.class…}
|
|
112
|
+
// .grad / .grad-NAME → gradient text (theme gradient)
|
|
113
|
+
// .COLOR → color role / palette / literal
|
|
114
|
+
// size: .xs .sm .md .lg .xl .xxl .huge .bold .muted
|
|
115
|
+
// Optional leading `\` escapes the whole construct to a literal.
|
|
116
|
+
const SPAN_RE = /(\\?)\[([^\]]+)\]\{((?:\s*\.[\w#-]+)+\s*)\}/g;
|
|
117
|
+
const SIZE_CLASS = {
|
|
118
|
+
xs: 'small', sm: 'caption', md: 'h3', lg: 'h2', xl: 'h1', xxl: 'hero', huge: 'stat',
|
|
119
|
+
};
|
|
120
|
+
function preprocessSpans(src, tokens = {}, warnings, line) {
|
|
121
|
+
return src.replace(SPAN_RE, (_m, esc, text, clsStr) => {
|
|
122
|
+
if (esc)
|
|
123
|
+
return `[${text}]{${clsStr}}`; // \[text]{.cls} → literal
|
|
124
|
+
// tolerate either ".a.b" or ".a .b" between classes
|
|
125
|
+
const classes = clsStr.split('.').map((s) => s.trim()).filter(Boolean);
|
|
126
|
+
const styles = [];
|
|
127
|
+
let grad = false;
|
|
128
|
+
let gradName = 'brand';
|
|
129
|
+
for (const c of classes) {
|
|
130
|
+
if (c === 'grad')
|
|
131
|
+
grad = true;
|
|
132
|
+
else if (c.startsWith('grad-')) {
|
|
133
|
+
grad = true;
|
|
134
|
+
gradName = c.slice(5);
|
|
135
|
+
if (warnings && tokens[`--gradient-${gradName}`] === undefined) {
|
|
136
|
+
warnings.push({ code: 'unknown-gradient', message: `Unknown gradient ".grad-${gradName}" — no such gradient in the master; the text renders with no fill (often invisible).`, line });
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else if (SIZE_CLASS[c])
|
|
140
|
+
styles.push(`font-size:var(--size-${SIZE_CLASS[c]})`);
|
|
141
|
+
else if (c === 'bold')
|
|
142
|
+
styles.push('font-weight:800');
|
|
143
|
+
else if (c === 'muted')
|
|
144
|
+
styles.push('color:var(--color-muted)');
|
|
145
|
+
else {
|
|
146
|
+
// A bare hex (`.#0af`) is emitted literally; a name resolves through the tokens.
|
|
147
|
+
styles.push(`color:${colorValue(c)}`);
|
|
148
|
+
if (warnings && !isKnownColorClass(c, tokens)) {
|
|
149
|
+
warnings.push({ code: 'unknown-class', message: `Unknown inline class ".${c}" — not a size (xs/sm/md/lg/xl/xxl/huge), .bold/.muted/.grad, a master colour/gradient token, or a CSS colour. It has no visible effect.`, line });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const cls = grad ? 'sl-span sl-grad' : 'sl-span';
|
|
154
|
+
if (grad)
|
|
155
|
+
styles.push(`background-image:var(--gradient-${gradName})`);
|
|
156
|
+
return `<span class="${cls}" style="${styles.join(';')}">${text}</span>`;
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
// Raw inline SVG via a fenced ```svg block (themeable: can use currentColor / var()).
|
|
160
|
+
function preprocessSvg(src) {
|
|
161
|
+
return src.replace(/(?:```|~~~)svg\s*\n([\s\S]*?)(?:```|~~~)/g, (_m, svg) => `<div class="sl-svg">${svg}</div>`);
|
|
162
|
+
}
|
|
163
|
+
// Safe dynamic embeds:
|
|
164
|
+
// ```embed → sandboxed <iframe src=URL> (external interactive content)
|
|
165
|
+
// ```widget → inline HTML/JS run in a sandbox="allow-scripts" srcdoc iframe with
|
|
166
|
+
// NO same-origin access (can't touch the parent), theme tokens injected.
|
|
167
|
+
// Both degrade to a static fallback note in PDF/print.
|
|
168
|
+
function preprocessEmbeds(src, tokens) {
|
|
169
|
+
src = src.replace(/(?:```|~~~)embed[^\n]*\n([\s\S]*?)(?:```|~~~)/g, (_m, body) => {
|
|
170
|
+
const url = body.trim().split(/\s+/)[0] ?? '';
|
|
171
|
+
return (`<div class="sl-embed-wrap"><iframe class="sl-embed" src="${url}" ` +
|
|
172
|
+
`sandbox="allow-scripts allow-same-origin allow-popups allow-forms" loading="lazy" ` +
|
|
173
|
+
`referrerpolicy="no-referrer" title="embed"></iframe>` +
|
|
174
|
+
`<div class="sl-embed-fallback">Interactive embed — open the web deck</div></div>`);
|
|
175
|
+
});
|
|
176
|
+
src = src.replace(/(?:```|~~~)widget[^\n]*\n([\s\S]*?)(?:```|~~~)/g, (_m, body) => {
|
|
177
|
+
const vars = Object.entries(tokens).map(([k, v]) => `${k}:${v}`).join(';');
|
|
178
|
+
const doc = `<!doctype html><meta charset="utf8"><style>:root{${vars}}` +
|
|
179
|
+
`html,body{margin:0;height:100%;font-family:var(--font-sans,system-ui);color:var(--color-text,#eee);background:transparent}</style>` +
|
|
180
|
+
body;
|
|
181
|
+
const enc = doc.replace(/&/g, '&').replace(/"/g, '"').replace(/\n/g, ' ');
|
|
182
|
+
return (`<div class="sl-embed-wrap"><iframe class="sl-widget" sandbox="allow-scripts" srcdoc="${enc}" title="widget"></iframe>` +
|
|
183
|
+
`<div class="sl-embed-fallback">Interactive widget — open the web deck</div></div>`);
|
|
184
|
+
});
|
|
185
|
+
return src;
|
|
186
|
+
}
|
|
187
|
+
// Charts — two renderable fences, each lazily rendered to inline SVG in the browser
|
|
188
|
+
// (see render/charts.ts). The body is base64-encoded into a data attribute so it
|
|
189
|
+
// survives the later image/span inline passes (Mermaid labels `A[Start]`, ECharts JSON
|
|
190
|
+
// `[...]`/`{...}` would otherwise be mangled) and dodges all HTML escaping.
|
|
191
|
+
// ```mermaid → diagrams (flow/sequence/arch/…)
|
|
192
|
+
function preprocessMermaid(src) {
|
|
193
|
+
return src.replace(/(?:```|~~~)mermaid\s*\n([\s\S]*?)(?:```|~~~)/g, (_m, body) => {
|
|
194
|
+
const b64 = Buffer.from(body.replace(/\s+$/, ''), 'utf8').toString('base64');
|
|
195
|
+
return `<pre class="sl-chart sl-mermaid" data-graph="${b64}"></pre>`;
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
// ```echart → data viz (Apache ECharts `option`). The body is JSON *or* YAML (YAML is
|
|
199
|
+
// a JSON superset and far more token-friendly); it is validated at compile time, so a
|
|
200
|
+
// malformed option warns and falls back to a plain code block instead of a blank slide.
|
|
201
|
+
function preprocessEchart(src, warnings, line) {
|
|
202
|
+
return src.replace(/(?:```|~~~)echart\s*\n([\s\S]*?)(?:```|~~~)/g, (whole, body) => {
|
|
203
|
+
let option;
|
|
204
|
+
try {
|
|
205
|
+
option = yaml.load(body);
|
|
206
|
+
}
|
|
207
|
+
catch (e) {
|
|
208
|
+
warnings?.push({
|
|
209
|
+
code: 'bad-chart',
|
|
210
|
+
message: `Invalid \`\`\`echart option: ${e.message}. Rendered as a code block instead.`,
|
|
211
|
+
line,
|
|
212
|
+
});
|
|
213
|
+
return whole; // leave the fence → markdown-it renders it as a code block
|
|
214
|
+
}
|
|
215
|
+
if (option === null || typeof option !== 'object') {
|
|
216
|
+
warnings?.push({
|
|
217
|
+
code: 'bad-chart',
|
|
218
|
+
message: `\`\`\`echart body did not parse to an option object (got ${option === null ? 'empty' : typeof option}). Rendered as a code block instead.`,
|
|
219
|
+
line,
|
|
220
|
+
});
|
|
221
|
+
return whole;
|
|
222
|
+
}
|
|
223
|
+
const b64 = Buffer.from(JSON.stringify(option), 'utf8').toString('base64');
|
|
224
|
+
return `<div class="sl-chart sl-echart" data-option="${b64}"></div>`;
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
function isListBlock(block) {
|
|
228
|
+
const lines = block.split('\n').filter((l) => l.trim() !== '');
|
|
229
|
+
return lines.length > 0 && lines.every((l) => /^\s*([-*+]|\d+[.)])\s+/.test(l));
|
|
230
|
+
}
|
|
231
|
+
// Split a region into blocks on blank lines, but keep fenced code blocks atomic —
|
|
232
|
+
// a blank line inside ``` (or ~~~) must NOT shred the fence into separate blocks.
|
|
233
|
+
// (svg/embed/widget fences are already collapsed to <div>s before this runs.)
|
|
234
|
+
function splitBlocks(src) {
|
|
235
|
+
const blocks = [];
|
|
236
|
+
let buf = [];
|
|
237
|
+
let inFence = false;
|
|
238
|
+
let marker = '';
|
|
239
|
+
const flush = () => {
|
|
240
|
+
if (buf.length)
|
|
241
|
+
blocks.push(buf.join('\n'));
|
|
242
|
+
buf = [];
|
|
243
|
+
};
|
|
244
|
+
for (const line of src.split('\n')) {
|
|
245
|
+
const fm = line.match(/^\s*(```|~~~)/);
|
|
246
|
+
if (fm) {
|
|
247
|
+
if (!inFence) {
|
|
248
|
+
inFence = true;
|
|
249
|
+
marker = fm[1];
|
|
250
|
+
}
|
|
251
|
+
else if (line.trimStart().startsWith(marker)) {
|
|
252
|
+
inFence = false;
|
|
253
|
+
}
|
|
254
|
+
buf.push(line);
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
if (!inFence && line.trim() === '') {
|
|
258
|
+
flush();
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
// An ATX heading is its own block (CommonMark). Without this, a heading immediately
|
|
262
|
+
// followed by a list/paragraph (no blank line) fuses into one block — which makes
|
|
263
|
+
// isListBlock() false and silently drops the following list's per-item `>>>` builds.
|
|
264
|
+
if (!inFence && /^\s{0,3}#{1,6}\s/.test(line)) {
|
|
265
|
+
flush();
|
|
266
|
+
blocks.push(line);
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
buf.push(line);
|
|
270
|
+
}
|
|
271
|
+
flush();
|
|
272
|
+
return blocks;
|
|
273
|
+
}
|
|
274
|
+
// Replace plain (untagged) code fences with placeholders so the inline preprocessors
|
|
275
|
+
// (images, styled spans) don't transform a deck's own source shown verbatim inside a
|
|
276
|
+
// ```code``` block. Run AFTER svg/embed/widget fences are consumed; restore after.
|
|
277
|
+
function maskFences(src) {
|
|
278
|
+
const out = [];
|
|
279
|
+
const fences = [];
|
|
280
|
+
let buf = null;
|
|
281
|
+
let fence = '';
|
|
282
|
+
for (const line of src.split('\n')) {
|
|
283
|
+
const m = line.match(/^\s*(```|~~~)/);
|
|
284
|
+
if (buf === null) {
|
|
285
|
+
if (m) {
|
|
286
|
+
buf = [line];
|
|
287
|
+
fence = m[1];
|
|
288
|
+
}
|
|
289
|
+
else
|
|
290
|
+
out.push(line);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
buf.push(line);
|
|
294
|
+
if (line.trimStart().startsWith(fence)) {
|
|
295
|
+
out.push(`slfence${fences.length}`);
|
|
296
|
+
fences.push(buf.join('\n'));
|
|
297
|
+
buf = null;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
if (buf !== null)
|
|
302
|
+
out.push(buf.join('\n')); // unterminated fence — leave as-is
|
|
303
|
+
return { masked: out.join('\n'), fences };
|
|
304
|
+
}
|
|
305
|
+
function unmaskFences(src, fences) {
|
|
306
|
+
return src.replace(/slfence(\d+)/g, (_m, i) => fences[Number(i)] ?? '');
|
|
307
|
+
}
|
|
308
|
+
// A build sigil, optionally naming an entrance effect and options:
|
|
309
|
+
// `>>>` default fade-up
|
|
310
|
+
// `>>> zoom-in` named entrance (see anim.ts ENTRANCES)
|
|
311
|
+
// `>>> slide-in-left delay=150` entrance + per-element delay/dur/ease overrides
|
|
312
|
+
const BUILD_RE = /\s*>>>\s*([\w-]+)?((?:\s+\w+=[^\s]+)*)\s*$/;
|
|
313
|
+
const ESC_BUILD_RE = /\\>>>(\s*)$/; // `\>>>` → literal `>>>`, not a build step
|
|
314
|
+
/** Split a build sigil off a line, honoring the `\>>>` escape. */
|
|
315
|
+
function buildOf(text) {
|
|
316
|
+
if (ESC_BUILD_RE.test(text))
|
|
317
|
+
return { isBuild: false, clean: text.replace(ESC_BUILD_RE, '>>>$1') };
|
|
318
|
+
const m = text.match(BUILD_RE);
|
|
319
|
+
if (m) {
|
|
320
|
+
const opts = {};
|
|
321
|
+
if (m[2]) {
|
|
322
|
+
for (const pair of m[2].trim().split(/\s+/)) {
|
|
323
|
+
const eq = pair.indexOf('=');
|
|
324
|
+
if (eq > 0)
|
|
325
|
+
opts[pair.slice(0, eq)] = pair.slice(eq + 1);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
return { isBuild: true, clean: text.replace(BUILD_RE, ''), effect: m[1], opts };
|
|
329
|
+
}
|
|
330
|
+
return { isBuild: false, clean: text };
|
|
331
|
+
}
|
|
332
|
+
/** A `<duration>` value: a bare number is milliseconds; anything with a unit is verbatim. */
|
|
333
|
+
function cssTime(v) {
|
|
334
|
+
return /^[\d.]+$/.test(v) ? `${v}ms` : v;
|
|
335
|
+
}
|
|
336
|
+
/** Resolve a build's entrance into a class suffix + inline CSS-var overrides.
|
|
337
|
+
* An unknown effect warns and falls back to the default (bare) fade-up. */
|
|
338
|
+
function entranceAttrs(spec, valid, warnings, line) {
|
|
339
|
+
const effect = spec.effect;
|
|
340
|
+
if (!effect)
|
|
341
|
+
return { cls: '', style: '' };
|
|
342
|
+
if (!valid.has(effect)) {
|
|
343
|
+
if (warnings) {
|
|
344
|
+
warnings.push({
|
|
345
|
+
code: 'unknown-entrance',
|
|
346
|
+
message: `Unknown build entrance "${effect}" after ">>>" — not a known entrance effect. Valid: ${[...valid].join(', ')}. Falling back to the default.`,
|
|
347
|
+
line,
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
return { cls: '', style: '' };
|
|
351
|
+
}
|
|
352
|
+
const styles = [];
|
|
353
|
+
const o = spec.opts ?? {};
|
|
354
|
+
if (o.delay)
|
|
355
|
+
styles.push(`--sl-ent-delay:${cssTime(o.delay)}`);
|
|
356
|
+
if (o.dur)
|
|
357
|
+
styles.push(`--sl-ent-dur:${cssTime(o.dur)}`);
|
|
358
|
+
if (o.ease)
|
|
359
|
+
styles.push(`--sl-ent-ease:${o.ease}`);
|
|
360
|
+
return { cls: ` sl-ent-${effect}`, style: styles.length ? ` style="${styles.join(';')}"` : '' };
|
|
361
|
+
}
|
|
362
|
+
/** Render one region's markdown to HTML, assigning absolute build indices.
|
|
363
|
+
* `warnings` (if provided) collects authoring diagnostics (unknown inline classes
|
|
364
|
+
* etc.) with the slide's `line` for self-correction. */
|
|
365
|
+
export function renderRegion(markdown, counter, tokens = {}, warnings, line, validEntrances) {
|
|
366
|
+
const valid = validEntrances ?? BUILTIN_ENTRANCES;
|
|
367
|
+
const srcLine = line;
|
|
368
|
+
// Consume tagged fences (charts, then svg/embed/widget) first, then mask plain code
|
|
369
|
+
// fences so the inline transforms (images, spans) never touch a deck's own source
|
|
370
|
+
// shown verbatim. Charts run first: their base64 payload is inert to every later pass.
|
|
371
|
+
const charted = preprocessEchart(preprocessMermaid(markdown.trim()), warnings, line);
|
|
372
|
+
const tagged = preprocessSvg(preprocessEmbeds(charted, tokens));
|
|
373
|
+
const { masked, fences } = maskFences(tagged);
|
|
374
|
+
const src = unmaskFences(preprocessSpans(preprocessImages(masked), tokens, warnings, line), fences);
|
|
375
|
+
if (src === '')
|
|
376
|
+
return { html: '', builds: 0 };
|
|
377
|
+
const blocks = splitBlocks(src);
|
|
378
|
+
const out = [];
|
|
379
|
+
const startN = counter.n;
|
|
380
|
+
for (const rawBlock of blocks) {
|
|
381
|
+
const block = rawBlock.replace(/\s+$/, '');
|
|
382
|
+
if (block.trim() === '')
|
|
383
|
+
continue;
|
|
384
|
+
if (isListBlock(block)) {
|
|
385
|
+
const lines = block.split('\n').filter((l) => l.trim() !== '');
|
|
386
|
+
const ordered = /^\s*\d+[.)]/.test(lines[0]);
|
|
387
|
+
const items = lines.map((line) => {
|
|
388
|
+
const text = line.replace(/^\s*([-*+]|\d+[.)])\s+/, '');
|
|
389
|
+
const spec = buildOf(text);
|
|
390
|
+
const inline = md.renderInline(spec.clean);
|
|
391
|
+
if (spec.isBuild) {
|
|
392
|
+
const n = ++counter.n;
|
|
393
|
+
const e = entranceAttrs(spec, valid, warnings, srcLine);
|
|
394
|
+
return `<li class="sl-build${e.cls}" data-build="${n}"${e.style}>${inline}</li>`;
|
|
395
|
+
}
|
|
396
|
+
return `<li>${inline}</li>`;
|
|
397
|
+
});
|
|
398
|
+
const tag = ordered ? 'ol' : 'ul';
|
|
399
|
+
out.push(`<${tag}>${items.join('')}</${tag}>`);
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
const spec = buildOf(block);
|
|
403
|
+
// A build sigil only applies at the end of a list item or the end of a block. A `>>>`
|
|
404
|
+
// left on a non-final line of a multi-line paragraph renders literally — warn so
|
|
405
|
+
// `validate --strict` catches it instead of shipping a stray ">>>".
|
|
406
|
+
if (warnings) {
|
|
407
|
+
const blines = block.split('\n');
|
|
408
|
+
let lastIdx = blines.length - 1;
|
|
409
|
+
while (lastIdx >= 0 && blines[lastIdx].trim() === '')
|
|
410
|
+
lastIdx--;
|
|
411
|
+
for (let i = 0; i < lastIdx; i++) {
|
|
412
|
+
const bl = blines[i];
|
|
413
|
+
if (bl.trim() === '' || ESC_BUILD_RE.test(bl))
|
|
414
|
+
continue;
|
|
415
|
+
if (BUILD_RE.test(bl)) {
|
|
416
|
+
warnings.push({
|
|
417
|
+
code: 'stray-build',
|
|
418
|
+
message: 'A ">>>" build on a non-final line has no effect — put it at the end of a list item or block, or separate items with a blank line (a heading + list with no blank line is the usual cause).',
|
|
419
|
+
line,
|
|
420
|
+
});
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
const rendered = md.render(spec.clean).trim();
|
|
426
|
+
if (spec.isBuild) {
|
|
427
|
+
const n = ++counter.n;
|
|
428
|
+
const e = entranceAttrs(spec, valid, warnings, srcLine);
|
|
429
|
+
out.push(`<div class="sl-block sl-build${e.cls}" data-build="${n}"${e.style}>${rendered}</div>`);
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
out.push(rendered);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
return { html: out.join('\n'), builds: counter.n - startN };
|
|
437
|
+
}
|
|
438
|
+
export { md };
|
|
439
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/compiler/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Master, MasterColors, TypeScale, Warning } from '../types.js';
|
|
2
|
+
export declare function resolveColors(colors: MasterColors | undefined, warnings: Warning[]): Record<string, string>;
|
|
3
|
+
export declare function resolveTypeScale(ts: TypeScale | undefined): Record<string, string>;
|
|
4
|
+
export declare function resolveFonts(fonts: Record<string, {
|
|
5
|
+
family: string;
|
|
6
|
+
provider?: string;
|
|
7
|
+
weights?: number[];
|
|
8
|
+
}> | undefined, warnings?: Warning[]): {
|
|
9
|
+
tokens: Record<string, string>;
|
|
10
|
+
imports: string[];
|
|
11
|
+
};
|
|
12
|
+
/** Resolve a variant's role/token overrides into CSS custom properties. */
|
|
13
|
+
export declare function resolveVariant(master: Master, name: string, warnings: Warning[]): Record<string, string>;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
const REF_RE = /\{([\w.-]+)\}/g;
|
|
2
|
+
/** Resolve `{palette.x}` / `{role.x}` references with cycle protection. */
|
|
3
|
+
function resolveRefs(map, lookups, warnings) {
|
|
4
|
+
const out = {};
|
|
5
|
+
const resolveOne = (key, value, stack) => {
|
|
6
|
+
return value.replace(REF_RE, (_m, path) => {
|
|
7
|
+
const [ns, name] = path.split('.');
|
|
8
|
+
const table = ns === path ? map : lookups[ns];
|
|
9
|
+
const raw = table ? table[name ?? ns] : undefined;
|
|
10
|
+
if (raw === undefined) {
|
|
11
|
+
warnings.push({ code: 'unknown-token', message: `Unknown token reference {${path}}` });
|
|
12
|
+
return `var(--missing-${path.replace(/\./g, '-')})`;
|
|
13
|
+
}
|
|
14
|
+
const ref = `${ns}.${name}`;
|
|
15
|
+
if (stack.includes(ref)) {
|
|
16
|
+
warnings.push({ code: 'token-cycle', message: `Token reference cycle at {${path}}` });
|
|
17
|
+
return raw.replace(REF_RE, '');
|
|
18
|
+
}
|
|
19
|
+
return resolveOne(ref, raw, [...stack, ref]);
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
for (const [k, v] of Object.entries(map)) {
|
|
23
|
+
out[k] = resolveOne(k, v, [k]);
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
export function resolveColors(colors, warnings) {
|
|
28
|
+
if (!colors)
|
|
29
|
+
return {};
|
|
30
|
+
const palette = colors.palette ?? {};
|
|
31
|
+
const roles = colors.roles ?? {};
|
|
32
|
+
const resolvedRoles = resolveRefs(roles, { palette }, warnings);
|
|
33
|
+
const tokens = {};
|
|
34
|
+
for (const [k, v] of Object.entries(palette))
|
|
35
|
+
tokens[`--palette-${k}`] = v;
|
|
36
|
+
for (const [k, v] of Object.entries(resolvedRoles))
|
|
37
|
+
tokens[`--color-${k}`] = v;
|
|
38
|
+
return tokens;
|
|
39
|
+
}
|
|
40
|
+
function parseDim(s) {
|
|
41
|
+
const m = String(s).trim().match(/^([\d.]+)\s*([a-z%]*)$/i);
|
|
42
|
+
if (!m)
|
|
43
|
+
return { value: 16, unit: 'px' };
|
|
44
|
+
return { value: parseFloat(m[1]), unit: m[2] || 'px' };
|
|
45
|
+
}
|
|
46
|
+
export function resolveTypeScale(ts) {
|
|
47
|
+
if (!ts)
|
|
48
|
+
return {};
|
|
49
|
+
const { value, unit } = parseDim(ts.base);
|
|
50
|
+
const ratio = ts.ratio || 1.2;
|
|
51
|
+
const tokens = {};
|
|
52
|
+
tokens['--type-base'] = `${value}${unit}`;
|
|
53
|
+
for (const [name, exp] of Object.entries(ts.steps ?? {})) {
|
|
54
|
+
if (typeof exp === 'string') {
|
|
55
|
+
// explicit size, e.g. "72px" — used when matching a precise design.
|
|
56
|
+
tokens[`--size-${name}`] = exp;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const size = value * Math.pow(ratio, exp);
|
|
60
|
+
tokens[`--size-${name}`] = `${Math.round(size * 100) / 100}${unit}`;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return tokens;
|
|
64
|
+
}
|
|
65
|
+
// Fonts that ship with essentially every PowerPoint install (Windows/macOS + the Office
|
|
66
|
+
// bundle), so a `system`/`local` provider is safe — PowerPoint won't substitute and the
|
|
67
|
+
// .pptx renders correctly without embedding. Anything else with a non-Google provider
|
|
68
|
+
// won't be embedded and risks a wrong-font render off the authoring machine.
|
|
69
|
+
const SAFE_SYSTEM_FONTS = new Set([
|
|
70
|
+
'Arial', 'Arial Black', 'Times New Roman', 'Courier New', 'Georgia', 'Verdana', 'Tahoma',
|
|
71
|
+
'Trebuchet MS', 'Comic Sans MS', 'Impact', 'Calibri', 'Cambria', 'Candara', 'Consolas',
|
|
72
|
+
'Constantia', 'Corbel', 'Segoe UI', 'Garamond', 'Palatino Linotype', 'Franklin Gothic',
|
|
73
|
+
].map((f) => f.toLowerCase()));
|
|
74
|
+
export function resolveFonts(fonts, warnings) {
|
|
75
|
+
const tokens = {};
|
|
76
|
+
if (!fonts)
|
|
77
|
+
return { tokens, imports: [] };
|
|
78
|
+
const fallback = {
|
|
79
|
+
display: 'system-ui, sans-serif',
|
|
80
|
+
mono: 'ui-monospace, monospace',
|
|
81
|
+
};
|
|
82
|
+
// Merge requested weights per family so shared families import once.
|
|
83
|
+
const byFamily = new Map();
|
|
84
|
+
for (const [role, def] of Object.entries(fonts)) {
|
|
85
|
+
const stack = `"${def.family}", ${fallback[role] ?? 'system-ui, sans-serif'}`;
|
|
86
|
+
tokens[`--font-${role}`] = stack;
|
|
87
|
+
if (def.provider === 'google' || def.provider === undefined) {
|
|
88
|
+
const set = byFamily.get(def.family) ?? new Set();
|
|
89
|
+
for (const w of def.weights ?? [400, 700])
|
|
90
|
+
set.add(w);
|
|
91
|
+
byFamily.set(def.family, set);
|
|
92
|
+
}
|
|
93
|
+
else if (!SAFE_SYSTEM_FONTS.has(def.family.trim().toLowerCase())) {
|
|
94
|
+
// Non-Google, non-common-system font: not embeddable, so PowerPoint substitutes it
|
|
95
|
+
// on any machine without the font installed (and a PDF/web render needs it present).
|
|
96
|
+
warnings?.push({
|
|
97
|
+
code: 'non-embeddable-font',
|
|
98
|
+
message: `Font role "${role}" uses "${def.family}" (provider: ${def.provider}) — it isn't a Google font (won't be embedded in .pptx) nor a common system font, so PowerPoint will substitute it off this machine. Use a real Google font (provider: google) for portable embedding, or a common system font (Arial, Calibri, Georgia…).`,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const google = [...byFamily.entries()].map(([family, ws]) => `family=${family.replace(/ /g, '+')}:wght@${[...ws].sort((a, b) => a - b).join(';')}`);
|
|
103
|
+
const imports = google.length
|
|
104
|
+
? [`https://fonts.googleapis.com/css2?${google.join('&')}&display=swap`]
|
|
105
|
+
: [];
|
|
106
|
+
return { tokens, imports };
|
|
107
|
+
}
|
|
108
|
+
/** Resolve a variant's role/token overrides into CSS custom properties. */
|
|
109
|
+
export function resolveVariant(master, name, warnings) {
|
|
110
|
+
const v = master.variants?.[name];
|
|
111
|
+
if (!v) {
|
|
112
|
+
warnings.push({ code: 'unknown-variant', message: `Unknown variant "${name}"` });
|
|
113
|
+
return {};
|
|
114
|
+
}
|
|
115
|
+
const palette = master.colors?.palette ?? {};
|
|
116
|
+
const out = {};
|
|
117
|
+
if (v.roles) {
|
|
118
|
+
const resolved = resolveRefs(v.roles, { palette }, warnings);
|
|
119
|
+
for (const [k, val] of Object.entries(resolved))
|
|
120
|
+
out[`--color-${k}`] = val;
|
|
121
|
+
}
|
|
122
|
+
if (v.tokens)
|
|
123
|
+
for (const [k, val] of Object.entries(v.tokens))
|
|
124
|
+
out[k] = val;
|
|
125
|
+
return out;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/compiler/tokens.ts"],"names":[],"mappings":"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"}
|