@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.
Files changed (145) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/LICENSE +201 -0
  3. package/README.md +87 -0
  4. package/bin/slaide.js +25 -0
  5. package/dist/assets.d.ts +10 -0
  6. package/dist/assets.js +54 -0
  7. package/dist/assets.js.map +1 -0
  8. package/dist/cli.d.ts +2 -0
  9. package/dist/cli.js +433 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/compare/index.d.ts +24 -0
  12. package/dist/compare/index.js +246 -0
  13. package/dist/compare/index.js.map +1 -0
  14. package/dist/compare/ssim.d.ts +2 -0
  15. package/dist/compare/ssim.js +46 -0
  16. package/dist/compare/ssim.js.map +1 -0
  17. package/dist/compiler/chrome.d.ts +7 -0
  18. package/dist/compiler/chrome.js +94 -0
  19. package/dist/compiler/chrome.js.map +1 -0
  20. package/dist/compiler/compile.d.ts +2 -0
  21. package/dist/compiler/compile.js +432 -0
  22. package/dist/compiler/compile.js.map +1 -0
  23. package/dist/compiler/markdown.d.ts +26 -0
  24. package/dist/compiler/markdown.js +439 -0
  25. package/dist/compiler/markdown.js.map +1 -0
  26. package/dist/compiler/tokens.d.ts +13 -0
  27. package/dist/compiler/tokens.js +127 -0
  28. package/dist/compiler/tokens.js.map +1 -0
  29. package/dist/container.d.ts +47 -0
  30. package/dist/container.js +309 -0
  31. package/dist/container.js.map +1 -0
  32. package/dist/engine-entry.d.ts +1 -0
  33. package/dist/engine-entry.js +71 -0
  34. package/dist/engine-entry.js.map +1 -0
  35. package/dist/export-keynote/keynote.d.ts +10 -0
  36. package/dist/export-keynote/keynote.js +58 -0
  37. package/dist/export-keynote/keynote.js.map +1 -0
  38. package/dist/export-pptx/embed-fonts.d.ts +5 -0
  39. package/dist/export-pptx/embed-fonts.js +159 -0
  40. package/dist/export-pptx/embed-fonts.js.map +1 -0
  41. package/dist/export-pptx/inject-anim.d.ts +28 -0
  42. package/dist/export-pptx/inject-anim.js +150 -0
  43. package/dist/export-pptx/inject-anim.js.map +1 -0
  44. package/dist/export-pptx/pptx.d.ts +10 -0
  45. package/dist/export-pptx/pptx.js +425 -0
  46. package/dist/export-pptx/pptx.js.map +1 -0
  47. package/dist/export-pptx/transitions.d.ts +16 -0
  48. package/dist/export-pptx/transitions.js +82 -0
  49. package/dist/export-pptx/transitions.js.map +1 -0
  50. package/dist/import/emit.d.ts +5 -0
  51. package/dist/import/emit.js +274 -0
  52. package/dist/import/emit.js.map +1 -0
  53. package/dist/import/index.d.ts +21 -0
  54. package/dist/import/index.js +192 -0
  55. package/dist/import/index.js.map +1 -0
  56. package/dist/import/pptx.d.ts +117 -0
  57. package/dist/import/pptx.js +1043 -0
  58. package/dist/import/pptx.js.map +1 -0
  59. package/dist/import/raster-com.d.ts +27 -0
  60. package/dist/import/raster-com.js +113 -0
  61. package/dist/import/raster-com.js.map +1 -0
  62. package/dist/import/raster-extension.d.ts +35 -0
  63. package/dist/import/raster-extension.js +27 -0
  64. package/dist/import/raster-extension.js.map +1 -0
  65. package/dist/index.d.ts +63 -0
  66. package/dist/index.js +174 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/install/detect.d.ts +17 -0
  69. package/dist/install/detect.js +82 -0
  70. package/dist/install/detect.js.map +1 -0
  71. package/dist/install/index.d.ts +20 -0
  72. package/dist/install/index.js +126 -0
  73. package/dist/install/index.js.map +1 -0
  74. package/dist/install/registry.d.ts +33 -0
  75. package/dist/install/registry.js +169 -0
  76. package/dist/install/registry.js.map +1 -0
  77. package/dist/install/skills.d.ts +17 -0
  78. package/dist/install/skills.js +72 -0
  79. package/dist/install/skills.js.map +1 -0
  80. package/dist/master-io.d.ts +7 -0
  81. package/dist/master-io.js +55 -0
  82. package/dist/master-io.js.map +1 -0
  83. package/dist/mcp/server.d.ts +3 -0
  84. package/dist/mcp/server.js +114 -0
  85. package/dist/mcp/server.js.map +1 -0
  86. package/dist/optimize/export-optimize.d.ts +21 -0
  87. package/dist/optimize/export-optimize.js +167 -0
  88. package/dist/optimize/export-optimize.js.map +1 -0
  89. package/dist/parser/frontmatter.d.ts +8 -0
  90. package/dist/parser/frontmatter.js +45 -0
  91. package/dist/parser/frontmatter.js.map +1 -0
  92. package/dist/parser/parse.d.ts +2 -0
  93. package/dist/parser/parse.js +184 -0
  94. package/dist/parser/parse.js.map +1 -0
  95. package/dist/render/anim.d.ts +50 -0
  96. package/dist/render/anim.js +213 -0
  97. package/dist/render/anim.js.map +1 -0
  98. package/dist/render/charts.d.ts +3 -0
  99. package/dist/render/charts.js +171 -0
  100. package/dist/render/charts.js.map +1 -0
  101. package/dist/render/css.d.ts +3 -0
  102. package/dist/render/css.js +183 -0
  103. package/dist/render/css.js.map +1 -0
  104. package/dist/render/echarts-lib.generated.d.ts +1 -0
  105. package/dist/render/echarts-lib.generated.js +7 -0
  106. package/dist/render/echarts-lib.generated.js.map +1 -0
  107. package/dist/render/html.d.ts +5 -0
  108. package/dist/render/html.js +186 -0
  109. package/dist/render/html.js.map +1 -0
  110. package/dist/render/inject.d.ts +12 -0
  111. package/dist/render/inject.js +19 -0
  112. package/dist/render/inject.js.map +1 -0
  113. package/dist/render/mermaid-lib.generated.d.ts +1 -0
  114. package/dist/render/mermaid-lib.generated.js +7 -0
  115. package/dist/render/mermaid-lib.generated.js.map +1 -0
  116. package/dist/render/runtime.d.ts +1 -0
  117. package/dist/render/runtime.js +393 -0
  118. package/dist/render/runtime.js.map +1 -0
  119. package/dist/render-pdf/pdf.d.ts +9 -0
  120. package/dist/render-pdf/pdf.js +53 -0
  121. package/dist/render-pdf/pdf.js.map +1 -0
  122. package/dist/render-png/montage.d.ts +14 -0
  123. package/dist/render-png/montage.js +75 -0
  124. package/dist/render-png/montage.js.map +1 -0
  125. package/dist/render-png/shoot.d.ts +25 -0
  126. package/dist/render-png/shoot.js +79 -0
  127. package/dist/render-png/shoot.js.map +1 -0
  128. package/dist/scaffold.d.ts +9 -0
  129. package/dist/scaffold.js +36 -0
  130. package/dist/scaffold.js.map +1 -0
  131. package/dist/types.d.ts +212 -0
  132. package/dist/types.js +7 -0
  133. package/dist/types.js.map +1 -0
  134. package/dist/util.d.ts +6 -0
  135. package/dist/util.js +28 -0
  136. package/dist/util.js.map +1 -0
  137. package/package.json +66 -0
  138. package/skills/slaide/SKILL.md +64 -0
  139. package/skills/slaide/agents/openai.yaml +12 -0
  140. package/skills/slaide/examples/branded-deck.slaide +198 -0
  141. package/skills/slaide/examples/branded-theme.slaide.yaml +187 -0
  142. package/skills/slaide/examples/sample.slaide +98 -0
  143. package/skills/slaide/reference.md +177 -0
  144. package/skills/slaide/themes.md +171 -0
  145. package/themes/aurora.slaide.yaml +136 -0
@@ -0,0 +1,274 @@
1
+ // Copyright 2026 AIVory, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // ImportIR -> slaide source (deck + master). Exact fidelity: every shape becomes
4
+ // an absolutely-anchored slot; runs keep size/color/weight/font via inline spans.
5
+ import { escapeHtml as esc } from '../util.js';
6
+ import { serializeMaster } from '../master-io.js';
7
+ import { isGoogleFont, normalizeFont } from './pptx.js';
8
+ function fontSlug(family) {
9
+ return 'f_' + family.toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_|_$/g, '');
10
+ }
11
+ // Metric-aware generic fallback so a missing family degrades to the right shape.
12
+ const SERIF_RE = /serif|times|georgia|garamond|playfair|merriweather|lora|baskerville|bitter|crimson|roman|cambria|book antiqua/i;
13
+ const MONO_RE = /mono|consol|courier|code|menlo|inconsolata/i;
14
+ function fallbackStack(family) {
15
+ if (MONO_RE.test(family))
16
+ return 'ui-monospace, monospace';
17
+ if (SERIF_RE.test(family))
18
+ return 'Georgia, serif';
19
+ return 'system-ui, sans-serif';
20
+ }
21
+ function fontFamilyCss(family) {
22
+ const f = family.replace(/'/g, '');
23
+ return `font-family:'${f}', ${fallbackStack(f)}`;
24
+ }
25
+ function runHtml(run) {
26
+ if (run.br)
27
+ return '<br>';
28
+ const st = [];
29
+ let cls = '';
30
+ if (run.font)
31
+ st.push(fontFamilyCss(run.font));
32
+ if (run.size)
33
+ st.push(`font-size:${run.size}px`);
34
+ if (run.gradient) {
35
+ cls = 'sl-grad'; // .sl-grad supplies background-clip:text; inline image overrides the brand default
36
+ st.push(`background-image:${run.gradient}`);
37
+ }
38
+ else if (run.color)
39
+ st.push(`color:${run.color}`);
40
+ // Numeric weight peeled from the family name ("…Extrabold" -> 800) takes precedence
41
+ // over the plain bold flag so the right Google weight is selected.
42
+ const weight = run.weight ?? (run.bold ? 700 : undefined);
43
+ if (weight)
44
+ st.push(`font-weight:${weight}`);
45
+ if (run.italic)
46
+ st.push('font-style:italic');
47
+ const deco = [];
48
+ if (run.underline)
49
+ deco.push('underline');
50
+ if (run.strike)
51
+ deco.push('line-through');
52
+ if (deco.length)
53
+ st.push(`text-decoration:${deco.join(' ')}`);
54
+ if (run.spacing)
55
+ st.push(`letter-spacing:${run.spacing}px`);
56
+ if (run.caps === 'all')
57
+ st.push('text-transform:uppercase');
58
+ else if (run.caps === 'small')
59
+ st.push('font-variant:small-caps');
60
+ if (run.baseline === 'sup')
61
+ st.push('vertical-align:super;font-size:0.7em');
62
+ else if (run.baseline === 'sub')
63
+ st.push('vertical-align:sub;font-size:0.7em');
64
+ const t = esc(run.text);
65
+ if (!cls && !st.length)
66
+ return t;
67
+ return `<span${cls ? ` class="${cls}"` : ''}${st.length ? ` style="${st.join(';')}"` : ''}>${t}</span>`;
68
+ }
69
+ function paraHtml(p) {
70
+ return p.runs.map(runHtml).join('');
71
+ }
72
+ function tableMd(shape) {
73
+ const t = shape.table;
74
+ const cellText = (cell) => cell.paras.map((p) => p.runs.map((r) => (r.br ? ' ' : r.text)).join('')).join(' ').replace(/\|/g, '\\|').trim() || ' ';
75
+ const lines = [];
76
+ t.rows.forEach((row, ri) => {
77
+ lines.push('| ' + row.map(cellText).join(' | ') + ' |');
78
+ if (ri === 0)
79
+ lines.push('| ' + row.map(() => '---').join(' | ') + ' |');
80
+ });
81
+ return lines.join('\n');
82
+ }
83
+ function shapeContent(shape) {
84
+ if (shape.kind === 'image' || (shape.kind === 'raster' && shape.src))
85
+ return `![](assets/${shape.src})`;
86
+ if (shape.kind === 'table' && shape.table)
87
+ return tableMd(shape);
88
+ if (shape.kind === 'rect' || shape.kind === 'raster')
89
+ return '<!--bg-->';
90
+ const paras = shape.paras ?? [];
91
+ let out = '';
92
+ paras.forEach((p, i) => {
93
+ const prefix = p.bullet ? (p.ordered ? '1. ' : '- ') : '';
94
+ const indent = ' '.repeat(p.level ?? 0);
95
+ const line = indent + prefix + paraHtml(p);
96
+ if (i === 0)
97
+ out = line;
98
+ else if (p.bullet && paras[i - 1].bullet)
99
+ out += '\n' + line; // contiguous list
100
+ else
101
+ out += '\n\n' + line;
102
+ });
103
+ return out || '<!--empty-->';
104
+ }
105
+ const ALIGN = { l: 'left', ctr: 'center', r: 'right', just: 'justify' };
106
+ function lum(hex) {
107
+ const m = hex.replace('#', '');
108
+ if (m.length < 6)
109
+ return 1;
110
+ const r = parseInt(m.slice(0, 2), 16), g = parseInt(m.slice(2, 4), 16), b = parseInt(m.slice(4, 6), 16);
111
+ return (0.299 * r + 0.587 * g + 0.114 * b) / 255;
112
+ }
113
+ function bgDef(bg) {
114
+ if (bg.kind === 'solid')
115
+ return { type: 'solid', color: bg.color };
116
+ if (bg.kind === 'gradient') {
117
+ const m = bg.gradient.match(/linear-gradient\(\s*([-\d.]+)deg\s*,\s*(.+)\)\s*$/);
118
+ if (m)
119
+ return { type: 'gradient', angle: Number(m[1]), stops: m[2].split(',').map((s) => s.trim()) };
120
+ return { type: 'solid', color: '#111111' };
121
+ }
122
+ return { type: 'image', src: `assets/${bg.src}`, fit: 'cover' };
123
+ }
124
+ export function emit(ir) {
125
+ const { canvas, theme } = ir;
126
+ // High-precision anchors: 0.1% rounding = ~2px drift at 1920px. Keep 3 decimals.
127
+ const pct = (v, total) => `${Math.round((v / total) * 100000) / 1000}%`;
128
+ const layouts = {};
129
+ const backgrounds = {};
130
+ const deckParts = [];
131
+ // family -> set of weights actually used (so Google imports exactly what's needed).
132
+ const famWeights = new Map();
133
+ const addFam = (family, weight) => {
134
+ if (!family)
135
+ return;
136
+ const set = famWeights.get(family) ?? new Set();
137
+ set.add(weight ?? 400);
138
+ famWeights.set(family, set);
139
+ };
140
+ ir.slides.forEach((slide, si) => {
141
+ const layoutName = `slide${si + 1}`;
142
+ const slots = {};
143
+ const regions = [];
144
+ slide.shapes.forEach((shape, sj) => {
145
+ const name = `s${sj}`;
146
+ const anchor = `${pct(shape.x, canvas.w)} ${pct(shape.y, canvas.h)} ${pct(shape.w, canvas.w)} ${pct(shape.h, canvas.h)}`;
147
+ const style = { anchor, valign: shape.valign ?? 'top' };
148
+ if (shape.insets)
149
+ style.pad = `${shape.insets.t}px ${shape.insets.r}px ${shape.insets.b}px ${shape.insets.l}px`;
150
+ if (shape.rotation) {
151
+ const parts = [`rotate(${Math.round(shape.rotation)}deg)`];
152
+ if (shape.flipH)
153
+ parts.push('scaleX(-1)');
154
+ if (shape.flipV)
155
+ parts.push('scaleY(-1)');
156
+ style.rotate = parts.join(' ');
157
+ }
158
+ if (shape.opacity !== undefined && shape.opacity < 1)
159
+ style.opacity = String(shape.opacity);
160
+ if (shape.ellipse)
161
+ style.radius = '50%';
162
+ else if (shape.radius)
163
+ style.radius = `${shape.radius}px`;
164
+ if (shape.fill)
165
+ style.bg = shape.fill;
166
+ if (shape.stroke)
167
+ style.border = `${shape.stroke.width}px solid ${shape.stroke.color}`;
168
+ // collect fonts + the exact weights used by this shape's runs
169
+ for (const p of shape.paras ?? [])
170
+ for (const r of p.runs)
171
+ addFam(r.font, r.weight ?? (r.bold ? 700 : undefined));
172
+ let type = 'body';
173
+ if (shape.kind === 'image' || (shape.kind === 'raster' && shape.src))
174
+ type = 'image';
175
+ else if (shape.kind === 'text') {
176
+ const a = shape.paras?.[0]?.align;
177
+ if (a && ALIGN[a])
178
+ style.align = ALIGN[a];
179
+ // PowerPoint single-spacing (~1.2) is tighter than the slaide CSS default (1.5).
180
+ const lh = shape.paras?.[0]?.lineHeight ?? 1.2;
181
+ style.leading = String(Math.round(lh * 100) / 100);
182
+ type = shape.ph === 'title' || shape.ph === 'ctrTitle' ? 'title' : 'body';
183
+ }
184
+ slots[name] = { type, style };
185
+ regions.push(`:: ${name} ::\n${shapeContent(shape)}`);
186
+ });
187
+ layouts[layoutName] = { areas: ['main'], rows: '1fr', cols: '1fr', slots };
188
+ // background
189
+ let frontmatter = `layout: ${layoutName}`;
190
+ if (slide.background) {
191
+ const bgName = `bg${si + 1}`;
192
+ backgrounds[bgName] = bgDef(slide.background);
193
+ frontmatter += `\nbackground: ${bgName}`;
194
+ }
195
+ deckParts.push(`${frontmatter}\n---\n${regions.join('\n\n')}`);
196
+ });
197
+ // Dark-deck detection from slide backgrounds (and full-slide rects as fallback).
198
+ const bgLums = [];
199
+ for (const slide of ir.slides) {
200
+ if (slide.background?.kind === 'solid')
201
+ bgLums.push(lum(slide.background.color));
202
+ for (const s of slide.shapes)
203
+ if (s.kind === 'rect' && s.fill?.startsWith('#') && s.w >= canvas.w * 0.85 && s.h >= canvas.h * 0.85)
204
+ bgLums.push(lum(s.fill));
205
+ }
206
+ const dark = bgLums.length > 0 && bgLums.reduce((a, b) => a + b, 0) / bgLums.length < 0.45;
207
+ // Fonts: roles + one entry per distinct family so inline font-family resolves/imports.
208
+ // Theme major/minor are weight-named in the source ("Open Sans Extrabold"); peel to the
209
+ // real base family so the role tokens reference a font the web can actually serve.
210
+ const major = normalizeFont(theme.fontMajor);
211
+ const minor = normalizeFont(theme.fontMinor);
212
+ addFam(major.family, major.weight ?? 700);
213
+ addFam(minor.family, minor.weight ?? 400);
214
+ const fonts = {
215
+ display: fontEntry(major.family, famWeights.get(major.family)),
216
+ sans: fontEntry(minor.family, famWeights.get(minor.family)),
217
+ mono: { family: 'JetBrains Mono', provider: 'google', weights: [400] },
218
+ };
219
+ const seen = new Set([major.family, minor.family]);
220
+ for (const [fam, ws] of famWeights) {
221
+ if (seen.has(fam))
222
+ continue;
223
+ seen.add(fam);
224
+ fonts[fontSlug(fam)] = fontEntry(fam, ws);
225
+ }
226
+ const pal = theme.palette;
227
+ const ref = (k, fallback) => (pal[k] ? `{palette.${k}}` : fallback);
228
+ const master = {
229
+ schema: 'slaide/1',
230
+ name: 'imported',
231
+ description: 'Imported from PowerPoint/Keynote.',
232
+ canvas: { aspect: aspectOf(canvas.w, canvas.h), width: canvas.w, height: canvas.h },
233
+ fonts,
234
+ typeScale: { base: '24px', ratio: 1.2, steps: { h1: 4, h2: 3, h3: 2, h4: 1, body: 0, caption: -1 } },
235
+ colors: {
236
+ palette: pal,
237
+ roles: {
238
+ background: dark ? ref('dk1', '#0B1220') : ref('lt1', '#FFFFFF'),
239
+ text: dark ? ref('lt1', '#F8FAFC') : ref('dk1', '#111111'),
240
+ heading: dark ? ref('lt1', '#F8FAFC') : ref('dk1', '#111111'),
241
+ accent: ref('accent1', '#3366FF'),
242
+ muted: dark ? ref('lt2', '#AAB2C5') : ref('dk2', '#666666'),
243
+ },
244
+ },
245
+ ...(Object.keys(backgrounds).length ? { backgrounds } : {}),
246
+ layouts,
247
+ };
248
+ // Canonical theme serialization (schema header + stable key order) — shared with the
249
+ // editor's master write-back so imported and hand-edited masters emit identically.
250
+ const masterYaml = serializeMaster(master);
251
+ const deck = `---\nmaster: ./master.slaide.yaml\ntitle: Imported deck\n---\n` + deckParts.join('\n\n---\n');
252
+ return { master: masterYaml, deck };
253
+ }
254
+ function fontEntry(family, weights) {
255
+ if (!isGoogleFont(family))
256
+ return { family, provider: 'system' };
257
+ const ws = new Set(weights ?? []);
258
+ ws.add(400); // a regular weight is almost always needed (body text, fallbacks)
259
+ return { family, provider: 'google', weights: [...ws].sort((a, b) => a - b) };
260
+ }
261
+ function aspectOf(w, h) {
262
+ const g = gcd(w, h);
263
+ const a = w / g, b = h / g;
264
+ // snap common ratios
265
+ if (Math.abs(a / b - 16 / 9) < 0.02)
266
+ return '16:9';
267
+ if (Math.abs(a / b - 4 / 3) < 0.02)
268
+ return '4:3';
269
+ return `${a}:${b}`;
270
+ }
271
+ function gcd(a, b) {
272
+ return b ? gcd(b, a % b) : a;
273
+ }
274
+ //# sourceMappingURL=emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/import/emit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export type Fidelity = 'reconstruct' | 'hybrid' | 'exact-raster';
2
+ export interface ImportOptions {
3
+ fidelity?: Fidelity;
4
+ /** Hybrid auto mode: slides reconstructing below this match (0..1) are kept as images.
5
+ * Higher = more pixel-faithful but fewer editable slides. Default 0.9. */
6
+ rasterThreshold?: number;
7
+ /** Bundle the result into a single self-contained `.slaidec` (and drop the folder). */
8
+ slaidec?: boolean;
9
+ }
10
+ export interface ImportResult {
11
+ outDir: string;
12
+ deckPath: string;
13
+ masterPath: string;
14
+ slides: number;
15
+ assets: number;
16
+ fidelity: Fidelity;
17
+ warnings: string[];
18
+ /** Set when `slaidec` was requested: the single bundled output file. */
19
+ slaidecPath?: string;
20
+ }
21
+ export declare function importDeck(path: string, outDir?: string, opts?: ImportOptions): Promise<ImportResult>;
@@ -0,0 +1,192 @@
1
+ // Copyright 2026 AIVory, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // @slaide/import — convert .pptx / .key into a slaide deck + generated master.
4
+ import { writeFileSync, mkdirSync, existsSync, copyFileSync, rmSync } from 'node:fs';
5
+ import { join, extname, basename, dirname } from 'node:path';
6
+ import { spawnSync } from 'node:child_process';
7
+ import { tmpdir } from 'node:os';
8
+ import { parsePptx } from './pptx.js';
9
+ import { emit } from './emit.js';
10
+ import { getRasterizer } from './raster-extension.js';
11
+ async function importPptxFile(path, outDir, opts) {
12
+ const ir = await parsePptx(path);
13
+ const assetsDir = join(outDir, 'assets');
14
+ mkdirSync(outDir, { recursive: true });
15
+ mkdirSync(assetsDir, { recursive: true });
16
+ // High-fidelity rasterization is a Slaide Pro capability: the OSS build registers no
17
+ // rasterizer, so hybrid/exact-raster degrade to reconstruct (with a clear reason).
18
+ const rz = getRasterizer();
19
+ const ppt = rz?.available() ?? false;
20
+ let fidelity = opts.fidelity ?? (ppt ? 'hybrid' : 'reconstruct');
21
+ if (fidelity === 'hybrid' || fidelity === 'exact-raster') {
22
+ if (!rz) {
23
+ ir.warnings.push(`Fidelity "${fidelity}" (high-fidelity import) requires Slaide Pro; falling back to "reconstruct".`);
24
+ fidelity = 'reconstruct';
25
+ }
26
+ else if (!ppt) {
27
+ ir.warnings.push(`Fidelity "${fidelity}" needs PowerPoint (Windows); falling back to "reconstruct".`);
28
+ fidelity = 'reconstruct';
29
+ }
30
+ }
31
+ if (fidelity === 'exact-raster') {
32
+ // Each slide becomes a single pixel-perfect PNG exported from PowerPoint.
33
+ const files = rz.rasterizeSlides(path, assetsDir, ir.canvas.w * 2, ir.canvas.h * 2);
34
+ ir.slides.forEach((slide, i) => {
35
+ const src = files[i];
36
+ if (src) {
37
+ slide.shapes = [{ kind: 'image', x: 0, y: 0, w: ir.canvas.w, h: ir.canvas.h, src }];
38
+ slide.background = undefined;
39
+ }
40
+ });
41
+ }
42
+ else if (fidelity === 'hybrid') {
43
+ // Rasterize only the shapes slaide can't faithfully reconstruct.
44
+ const items = [];
45
+ const targets = [];
46
+ ir.slides.forEach((slide, i) => {
47
+ slide.shapes.forEach((shape, k) => {
48
+ if (shape.kind === 'raster' && shape.rasterReq) {
49
+ const file = `raster-${i + 1}-${k}.png`;
50
+ items.push({ slide: i + 1, name: shape.rasterReq.name, id: shape.rasterReq.id, file, w: Math.max(2, shape.w * 2), h: Math.max(2, shape.h * 2) });
51
+ shape.src = file; // tentative; cleared below if export failed
52
+ targets.push(shape);
53
+ }
54
+ });
55
+ });
56
+ if (items.length) {
57
+ const done = await rz.rasterizeShapes(path, assetsDir, items, { w: ir.canvas.w, h: ir.canvas.h });
58
+ for (const shape of targets) {
59
+ if (shape.src && done.has(shape.src)) {
60
+ shape.kind = 'image';
61
+ // Anchor exactly where PowerPoint draws the shape (its reported bbox),
62
+ // overriding our OOXML estimate — eliminates diagram drift.
63
+ const pos = done.get(shape.src);
64
+ if (pos && pos.w > 0 && pos.h > 0) {
65
+ shape.x = pos.x;
66
+ shape.y = pos.y;
67
+ shape.w = pos.w;
68
+ shape.h = pos.h;
69
+ }
70
+ }
71
+ else {
72
+ shape.src = undefined;
73
+ ir.warnings.push(`Could not rasterize a ${shape.rasterReq?.reason ?? 'complex'} shape; left as a gap.`);
74
+ }
75
+ }
76
+ }
77
+ }
78
+ const deckPath = join(outDir, 'deck.slaide');
79
+ const masterPath = join(outDir, 'master.slaide.yaml');
80
+ const writeAll = () => {
81
+ const { master, deck } = emit(ir);
82
+ writeFileSync(masterPath, master, 'utf8');
83
+ writeFileSync(deckPath, deck, 'utf8');
84
+ };
85
+ writeAll();
86
+ for (const a of ir.assets)
87
+ writeFileSync(join(assetsDir, a.name), a.data);
88
+ // Auto per-slide verification (hybrid): render each reconstructed slide, compare to
89
+ // PowerPoint, and replace any slide that reconstructs below the bar with a faithful
90
+ // full-slide image. Editable where it works; pixel-accurate where it doesn't.
91
+ let rasterizedSlides = 0;
92
+ if (fidelity === 'hybrid' && ppt) {
93
+ try {
94
+ const { compareDecks } = await import('../compare/index.js');
95
+ const verifyDir = join(outDir, '_verify');
96
+ const cmp = await compareDecks(path, deckPath, { outDir: verifyDir, threshold: 0 });
97
+ const refDir = join(verifyDir, 'ref');
98
+ const pad = (n) => String(n).padStart(2, '0');
99
+ const gate = opts.rasterThreshold ?? AUTO_RASTER_THRESHOLD;
100
+ let changed = false;
101
+ for (const s of cmp.slides) {
102
+ // Gate on the strict measure: only slides that genuinely reconstruct poorly
103
+ // become images. Most slides should pass once reconstruction is correct.
104
+ if (s.matchStrict >= gate)
105
+ continue;
106
+ const ref = join(refDir, `slide-${pad(s.index)}.png`);
107
+ if (!existsSync(ref))
108
+ continue;
109
+ const dest = `slide-${pad(s.index)}.png`;
110
+ copyFileSync(ref, join(assetsDir, dest));
111
+ ir.slides[s.index - 1].shapes = [{ kind: 'image', x: 0, y: 0, w: ir.canvas.w, h: ir.canvas.h, src: dest }];
112
+ ir.slides[s.index - 1].background = undefined;
113
+ ir.warnings.push(`Slide ${s.index} reconstructed at ${Math.round(s.match * 100)}% — kept as a faithful image (not editable).`);
114
+ rasterizedSlides++;
115
+ changed = true;
116
+ }
117
+ if (changed)
118
+ writeAll();
119
+ rmSync(verifyDir, { recursive: true, force: true });
120
+ }
121
+ catch (e) {
122
+ ir.warnings.push(`Auto per-slide verification skipped (needs Playwright + PowerPoint): ${e.message}`);
123
+ }
124
+ }
125
+ writeReport(outDir, ir, fidelity, rasterizedSlides);
126
+ return { outDir, deckPath, masterPath, slides: ir.slides.length, assets: ir.assets.length, fidelity, warnings: ir.warnings };
127
+ }
128
+ /** Below this per-slide visual match, a hybrid import keeps the slide as an image.
129
+ * Kept deliberately low: editability is the point of a reconstruction import, and the
130
+ * reported match metric is bounded by Chromium-vs-PowerPoint text antialiasing (a
131
+ * visually-faithful text slide tops out ~95–97%), so only genuinely-unreconstructable
132
+ * slides should fall back to a flat image. Raise via `--raster-threshold` for archival
133
+ * pixel-fidelity, or use `--fidelity exact-raster` for an all-image (~99%) import. */
134
+ const AUTO_RASTER_THRESHOLD = 0.85;
135
+ function writeReport(outDir, ir, fidelity, rasterizedSlides = 0) {
136
+ const editable = ir.slides.length - rasterizedSlides;
137
+ const lines = [
138
+ `# Import report\n`,
139
+ `- Fidelity mode: **${fidelity}**`,
140
+ `- Slides: ${ir.slides.length} (${editable} editable, ${rasterizedSlides} kept as faithful images)`,
141
+ `- Assets: ${ir.assets.length}`,
142
+ ];
143
+ if (ir.theme.nonGoogleFonts.length)
144
+ lines.push(`- Non-Google fonts (system provider): ${ir.theme.nonGoogleFonts.join(', ')}`);
145
+ let rasterCount = 0;
146
+ ir.slides.forEach((s, i) => {
147
+ const r = s.shapes.filter((sh) => sh.kind === 'raster').length;
148
+ if (r) {
149
+ rasterCount += r;
150
+ lines.push(`- Slide ${i + 1}: ${r} shape(s) left as gaps (raster unavailable)`);
151
+ }
152
+ });
153
+ if (ir.warnings.length) {
154
+ lines.push(`\n## Warnings`);
155
+ for (const w of ir.warnings)
156
+ lines.push(`- ${w}`);
157
+ }
158
+ writeFileSync(join(outDir, 'import-report.md'), lines.join('\n'));
159
+ }
160
+ /** Convert a .key to .pptx via LibreOffice (legacy Keynote) or macOS Keynote. */
161
+ function keynoteToPptx(path) {
162
+ const out = join(tmpdir(), basename(path).replace(/\.key$/i, '') + '.pptx');
163
+ // Try LibreOffice headless (works for legacy Keynote 5.x).
164
+ const soffice = process.platform === 'darwin' ? '/Applications/LibreOffice.app/Contents/MacOS/soffice' : 'soffice';
165
+ const r = spawnSync(soffice, ['--headless', '--convert-to', 'pptx', '--outdir', tmpdir(), path], { encoding: 'utf8' });
166
+ if (r.status === 0 && existsSync(out))
167
+ return out;
168
+ throw new Error('Could not convert Keynote (.key). Modern .key needs macOS Keynote — export to PowerPoint manually ' +
169
+ '(File → Export To → PowerPoint) and import the .pptx. (LibreOffice only opens legacy Keynote.)');
170
+ }
171
+ export async function importDeck(path, outDir, opts = {}) {
172
+ const ext = extname(path).toLowerCase();
173
+ const dir = outDir ?? join(dirname(path), basename(path, ext) + '.slaide.d');
174
+ let result;
175
+ if (ext === '.pptx')
176
+ result = await importPptxFile(path, dir, opts);
177
+ else if (ext === '.key')
178
+ result = await importPptxFile(keynoteToPptx(path), dir, opts);
179
+ else
180
+ throw new Error(`Unsupported input "${ext}". Supported: .pptx, .key`);
181
+ if (opts.slaidec) {
182
+ // Bundle the freshly-written folder into one shareable .slaidec, then drop the folder.
183
+ const { packDeck } = await import('../container.js');
184
+ const base = dir.endsWith('.slaide.d') ? dir.slice(0, -'.slaide.d'.length) : dir;
185
+ const slaidecPath = base + '.slaidec';
186
+ await packDeck(dir, slaidecPath, { force: true });
187
+ rmSync(dir, { recursive: true, force: true });
188
+ result.slaidecPath = slaidecPath;
189
+ }
190
+ return result;
191
+ }
192
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/import/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ export interface ImpRun {
2
+ text: string;
3
+ bold?: boolean;
4
+ italic?: boolean;
5
+ underline?: boolean;
6
+ strike?: boolean;
7
+ size?: number;
8
+ color?: string;
9
+ gradient?: string;
10
+ font?: string;
11
+ weight?: number;
12
+ spacing?: number;
13
+ caps?: 'all' | 'small';
14
+ baseline?: 'sup' | 'sub';
15
+ href?: string;
16
+ br?: boolean;
17
+ }
18
+ export interface ImpPara {
19
+ runs: ImpRun[];
20
+ bullet?: boolean;
21
+ bulletChar?: string;
22
+ ordered?: boolean;
23
+ level?: number;
24
+ align?: string;
25
+ lineHeight?: number;
26
+ spaceBefore?: number;
27
+ spaceAfter?: number;
28
+ }
29
+ export interface ImpTableCell {
30
+ paras: ImpPara[];
31
+ fill?: string;
32
+ }
33
+ export interface ImpTable {
34
+ rows: ImpTableCell[][];
35
+ widths: number[];
36
+ heights: number[];
37
+ }
38
+ export interface ImpShape {
39
+ kind: 'text' | 'image' | 'rect' | 'raster' | 'table';
40
+ x: number;
41
+ y: number;
42
+ w: number;
43
+ h: number;
44
+ ph?: string;
45
+ name?: string;
46
+ id?: string;
47
+ paras?: ImpPara[];
48
+ src?: string;
49
+ fill?: string;
50
+ stroke?: {
51
+ color: string;
52
+ width: number;
53
+ };
54
+ valign?: 'top' | 'center' | 'bottom';
55
+ insets?: {
56
+ l: number;
57
+ t: number;
58
+ r: number;
59
+ b: number;
60
+ };
61
+ rotation?: number;
62
+ flipH?: boolean;
63
+ flipV?: boolean;
64
+ opacity?: number;
65
+ radius?: number;
66
+ ellipse?: boolean;
67
+ table?: ImpTable;
68
+ /** Present on kind:'raster' shapes that still need a PNG exported via PowerPoint COM. */
69
+ rasterReq?: {
70
+ name?: string;
71
+ id?: string;
72
+ reason: string;
73
+ };
74
+ }
75
+ export type ImpBackground = {
76
+ kind: 'solid';
77
+ color: string;
78
+ } | {
79
+ kind: 'gradient';
80
+ gradient: string;
81
+ } | {
82
+ kind: 'image';
83
+ src: string;
84
+ };
85
+ export interface ImpSlide {
86
+ shapes: ImpShape[];
87
+ notes?: string;
88
+ background?: ImpBackground;
89
+ }
90
+ export interface ImportIR {
91
+ canvas: {
92
+ w: number;
93
+ h: number;
94
+ };
95
+ theme: {
96
+ palette: Record<string, string>;
97
+ fontMajor: string;
98
+ fontMinor: string;
99
+ nonGoogleFonts: string[];
100
+ };
101
+ slides: ImpSlide[];
102
+ assets: {
103
+ name: string;
104
+ data: Buffer;
105
+ }[];
106
+ warnings: string[];
107
+ }
108
+ declare function mergeRuns(runs: ImpRun[]): void;
109
+ declare function isGoogleFont(family: string): boolean;
110
+ export interface NormFont {
111
+ family: string;
112
+ weight?: number;
113
+ italic?: boolean;
114
+ }
115
+ export declare function normalizeFont(raw: string): NormFont;
116
+ export declare function parsePptx(path: string): Promise<ImportIR>;
117
+ export { isGoogleFont, mergeRuns };