slotdeck 0.0.0-stage → 0.1.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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +486 -2
  3. package/dist/deck/numbers.d.ts +14 -0
  4. package/dist/deck/numbers.js +48 -0
  5. package/dist/deck/numbers.js.map +1 -0
  6. package/dist/deck/spec.d.ts +73 -0
  7. package/dist/deck/spec.js +21 -0
  8. package/dist/deck/spec.js.map +1 -0
  9. package/dist/deck/validate.d.ts +49 -0
  10. package/dist/deck/validate.js +189 -0
  11. package/dist/deck/validate.js.map +1 -0
  12. package/dist/generate.d.ts +53 -0
  13. package/dist/generate.js +44 -0
  14. package/dist/generate.js.map +1 -0
  15. package/dist/index.d.ts +42 -0
  16. package/dist/index.js +27 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/llm/gemini.d.ts +39 -0
  19. package/dist/llm/gemini.js +147 -0
  20. package/dist/llm/gemini.js.map +1 -0
  21. package/dist/llm/provider.d.ts +38 -0
  22. package/dist/llm/provider.js +2 -0
  23. package/dist/llm/provider.js.map +1 -0
  24. package/dist/node.d.ts +3 -0
  25. package/dist/node.js +31 -0
  26. package/dist/node.js.map +1 -0
  27. package/dist/plan/assets.d.ts +28 -0
  28. package/dist/plan/assets.js +80 -0
  29. package/dist/plan/assets.js.map +1 -0
  30. package/dist/plan/catalog.d.ts +106 -0
  31. package/dist/plan/catalog.js +302 -0
  32. package/dist/plan/catalog.js.map +1 -0
  33. package/dist/plan/edit.d.ts +31 -0
  34. package/dist/plan/edit.js +364 -0
  35. package/dist/plan/edit.js.map +1 -0
  36. package/dist/plan/plan.d.ts +106 -0
  37. package/dist/plan/plan.js +243 -0
  38. package/dist/plan/plan.js.map +1 -0
  39. package/dist/plan/write.d.ts +39 -0
  40. package/dist/plan/write.js +179 -0
  41. package/dist/plan/write.js.map +1 -0
  42. package/dist/pptx/package.d.ts +48 -0
  43. package/dist/pptx/package.js +202 -0
  44. package/dist/pptx/package.js.map +1 -0
  45. package/dist/pptx/presentation.d.ts +20 -0
  46. package/dist/pptx/presentation.js +31 -0
  47. package/dist/pptx/presentation.js.map +1 -0
  48. package/dist/pptx/xml.d.ts +23 -0
  49. package/dist/pptx/xml.js +67 -0
  50. package/dist/pptx/xml.js.map +1 -0
  51. package/dist/render/chart.d.ts +18 -0
  52. package/dist/render/chart.js +158 -0
  53. package/dist/render/chart.js.map +1 -0
  54. package/dist/render/extract.d.ts +11 -0
  55. package/dist/render/extract.js +65 -0
  56. package/dist/render/extract.js.map +1 -0
  57. package/dist/render/picture.d.ts +20 -0
  58. package/dist/render/picture.js +114 -0
  59. package/dist/render/picture.js.map +1 -0
  60. package/dist/render/render.d.ts +32 -0
  61. package/dist/render/render.js +247 -0
  62. package/dist/render/render.js.map +1 -0
  63. package/dist/render/repeat.d.ts +15 -0
  64. package/dist/render/repeat.js +118 -0
  65. package/dist/render/repeat.js.map +1 -0
  66. package/dist/render/table.d.ts +12 -0
  67. package/dist/render/table.js +84 -0
  68. package/dist/render/table.js.map +1 -0
  69. package/dist/render/text.d.ts +31 -0
  70. package/dist/render/text.js +210 -0
  71. package/dist/render/text.js.map +1 -0
  72. package/dist/store.d.ts +18 -0
  73. package/dist/store.js +23 -0
  74. package/dist/store.js.map +1 -0
  75. package/dist/template/change.d.ts +138 -0
  76. package/dist/template/change.js +406 -0
  77. package/dist/template/change.js.map +1 -0
  78. package/dist/template/check.d.ts +15 -0
  79. package/dist/template/check.js +97 -0
  80. package/dist/template/check.js.map +1 -0
  81. package/dist/template/draft.d.ts +47 -0
  82. package/dist/template/draft.js +276 -0
  83. package/dist/template/draft.js.map +1 -0
  84. package/dist/template/inspect.d.ts +53 -0
  85. package/dist/template/inspect.js +157 -0
  86. package/dist/template/inspect.js.map +1 -0
  87. package/dist/template/instruct.d.ts +26 -0
  88. package/dist/template/instruct.js +278 -0
  89. package/dist/template/instruct.js.map +1 -0
  90. package/dist/template/manifest.d.ts +226 -0
  91. package/dist/template/manifest.js +116 -0
  92. package/dist/template/manifest.js.map +1 -0
  93. package/dist/template/measure.d.ts +80 -0
  94. package/dist/template/measure.js +212 -0
  95. package/dist/template/measure.js.map +1 -0
  96. package/dist/template/sample.d.ts +17 -0
  97. package/dist/template/sample.js +96 -0
  98. package/dist/template/sample.js.map +1 -0
  99. package/dist/template/view.d.ts +46 -0
  100. package/dist/template/view.js +38 -0
  101. package/dist/template/view.js.map +1 -0
  102. package/dist/tools.d.ts +68 -0
  103. package/dist/tools.js +266 -0
  104. package/dist/tools.js.map +1 -0
  105. package/dist/util/image.d.ts +11 -0
  106. package/dist/util/image.js +58 -0
  107. package/dist/util/image.js.map +1 -0
  108. package/dist/util/png.d.ts +2 -0
  109. package/dist/util/png.js +50 -0
  110. package/dist/util/png.js.map +1 -0
  111. package/package.json +63 -4
@@ -0,0 +1,138 @@
1
+ import type { Template } from '../render/render.ts';
2
+ import type { ManifestIssue } from './check.ts';
3
+ import type { AlignPolicy, Direction, EmptyPolicy, ImageKind, SlideBox, SlotDef, TableTextStyle, TemplateManifest } from './manifest.ts';
4
+ import type { Role } from './measure.ts';
5
+ /** New values for a slot. `null` clears an optional setting. Each applies to slots of the kind noted. */
6
+ export interface SlotPatch {
7
+ /** A new name for the slot. */
8
+ name?: string;
9
+ description?: string | null;
10
+ /** `error` required, `remove` optional, `keep` leave the template's content, `drop` always remove the shape. */
11
+ empty?: EmptyPolicy;
12
+ /** Text: the character budget. */
13
+ maxChars?: number;
14
+ /** Text: the most paragraphs. */
15
+ maxParagraphs?: number | null;
16
+ /** Text: take the value from this deck-level field (a header that is the same on every slide). */
17
+ deckField?: string | null;
18
+ /** Text: whether alignment flips for a deck that reads the other way. */
19
+ alignOnDirectionChange?: AlignPolicy | null;
20
+ /** Text: which run of a mixed-style paragraph supplies the formatting. */
21
+ styleRun?: 'first' | 'last' | null;
22
+ /** Text: a font size in points other than the template's. The budget follows unless one is given. */
23
+ fontSize?: number | null;
24
+ /** Text: space after each paragraph, in points. */
25
+ paragraphGap?: number | null;
26
+ /** Text: whether a deck's text size applies. */
27
+ scales?: boolean | null;
28
+ /** Text, image, chart: another area for the shape, as fractions of the slide. A text budget follows unless one is given. */
29
+ box?: SlideBox | null;
30
+ /** Image: what kind of picture fills it. */
31
+ imageKind?: ImageKind;
32
+ /** Image: crop to the frame, or shrink the frame to the picture. */
33
+ fit?: 'cover' | 'contain' | null;
34
+ /** Table: the most columns. The cell budget follows unless one is given. */
35
+ maxColumns?: number;
36
+ /** Table: the most body rows. The cell budget follows unless one is given. */
37
+ maxRows?: number;
38
+ /** Table: the character budget of one cell. */
39
+ maxCellChars?: number;
40
+ /** Table: text formatting, merged into what is already set. A new size changes the cell budget unless one is given. */
41
+ headerText?: TableTextStyle | null;
42
+ bodyText?: TableTextStyle | null;
43
+ /** Chart: limits and styling. */
44
+ maxCategories?: number;
45
+ maxSeries?: number;
46
+ colors?: string[] | null;
47
+ text?: TableTextStyle | null;
48
+ lineColor?: string | null;
49
+ }
50
+ export type ManifestChange = {
51
+ op: 'setManifest';
52
+ name?: string;
53
+ language?: string;
54
+ direction?: Direction;
55
+ alignOnDirectionChange?: AlignPolicy;
56
+ }
57
+ /** Makes a slide a pattern, with no content slots yet. Header texts known from other patterns are filled in. */
58
+ | {
59
+ op: 'addPattern';
60
+ slide: number;
61
+ id: string;
62
+ description?: string;
63
+ }
64
+ /** A second pattern from the same slide, to be changed into a variant. */
65
+ | {
66
+ op: 'copyPattern';
67
+ pattern: string;
68
+ id: string;
69
+ description?: string;
70
+ } | {
71
+ op: 'removePattern';
72
+ pattern: string;
73
+ } | {
74
+ op: 'setPattern';
75
+ pattern: string;
76
+ id?: string;
77
+ description?: string;
78
+ figures?: boolean;
79
+ }
80
+ /** Makes a shape a slot, with limits measured from the shape. Replaces the shape's slot when it has one. */
81
+ | {
82
+ op: 'addSlot';
83
+ pattern: string;
84
+ shape: string;
85
+ role: Role;
86
+ name?: string;
87
+ optional?: boolean;
88
+ }
89
+ /** The shape goes back to being part of the design. */
90
+ | {
91
+ op: 'removeSlot';
92
+ pattern: string;
93
+ slot: string;
94
+ } | ({
95
+ op: 'setSlot';
96
+ pattern: string;
97
+ slot: string;
98
+ } & SlotPatch)
99
+ /** Sets how many items a row or grid takes. Finds the row from numbered slot names when the pattern has none. */
100
+ | {
101
+ op: 'setRepeat';
102
+ pattern: string;
103
+ min?: number;
104
+ max?: number;
105
+ item?: string;
106
+ span?: {
107
+ left: number;
108
+ right: number;
109
+ } | null;
110
+ } | {
111
+ op: 'removeRepeat';
112
+ pattern: string;
113
+ };
114
+ export interface ChangeResult {
115
+ manifest: TemplateManifest;
116
+ /** The changes that were made, in order, each with a sentence saying what is now true. */
117
+ applied: Array<{
118
+ index: number;
119
+ change: ManifestChange;
120
+ message: string;
121
+ }>;
122
+ /** The changes that were not made, and why. The manifest is as if they had not been asked for. */
123
+ rejected: Array<{
124
+ index: number;
125
+ change: ManifestChange;
126
+ reason: string;
127
+ }>;
128
+ /** What {@link checkManifest} finds in the result. */
129
+ issues: ManifestIssue[];
130
+ }
131
+ /**
132
+ * Applies changes to a template's manifest and returns the new manifest; the template itself is
133
+ * not touched. Changes are applied in order. One that cannot be made, or that would leave the
134
+ * manifest pointing at something the pptx does not have, is rejected with a reason and skipped.
135
+ */
136
+ export declare function changeManifest(template: Template, changes: ManifestChange[]): ChangeResult;
137
+ /** A slot in a few words: what it holds, how much, and what happens when a deck leaves it empty. */
138
+ export declare function describeSlot(slot: SlotDef): string;
@@ -0,0 +1,406 @@
1
+ import { checkManifest } from './check.js';
2
+ import { detectRepeat } from './draft.js';
3
+ import { inspectTemplate } from './inspect.js';
4
+ import { ROLES, boxCapacity, rolesFor, rowRoom, shapeText, slotFromShape, slotName, tableLimits } from './measure.js';
5
+ class Rejected extends Error {
6
+ }
7
+ const reject = (reason) => {
8
+ throw new Rejected(reason);
9
+ };
10
+ const TEXT_KEYS = ['maxChars', 'maxParagraphs', 'deckField', 'alignOnDirectionChange', 'styleRun', 'fontSize', 'paragraphGap', 'scales'];
11
+ const IMAGE_KEYS = ['imageKind', 'fit'];
12
+ const TABLE_KEYS = ['maxColumns', 'maxRows', 'maxCellChars', 'headerText', 'bodyText'];
13
+ const CHART_KEYS = ['maxCategories', 'maxSeries', 'colors', 'text', 'lineColor'];
14
+ const KEYS_OF = { text: TEXT_KEYS, image: IMAGE_KEYS, table: TABLE_KEYS, chart: CHART_KEYS };
15
+ const STYLE_KEYS = new Set(['headerText', 'bodyText', 'text']);
16
+ const COUNT_KEYS = new Set(['maxChars', 'maxParagraphs', 'maxColumns', 'maxRows', 'maxCellChars', 'maxCategories', 'maxSeries']);
17
+ const kebab = (raw) => raw.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
18
+ const policyWord = (policy) => ({ error: 'required', remove: 'optional', keep: 'kept as designed', drop: 'always removed' })[policy];
19
+ /**
20
+ * Applies changes to a template's manifest and returns the new manifest; the template itself is
21
+ * not touched. Changes are applied in order. One that cannot be made, or that would leave the
22
+ * manifest pointing at something the pptx does not have, is rejected with a reason and skipped.
23
+ */
24
+ export function changeManifest(template, changes) {
25
+ const info = inspectTemplate(template.pkg);
26
+ const errors = (manifest) => checkManifest({ pkg: template.pkg, manifest }, info)
27
+ .filter((issue) => issue.severity === 'error')
28
+ .map((issue) => `${issue.slot ?? issue.pattern ?? 'manifest'} ${issue.message}`);
29
+ let manifest = structuredClone(template.manifest);
30
+ const applied = [];
31
+ const rejected = [];
32
+ changes.forEach((change, index) => {
33
+ const next = structuredClone(manifest);
34
+ try {
35
+ const message = apply(next, change, info);
36
+ const before = new Set(errors(manifest));
37
+ const fresh = errors(next).filter((error) => !before.has(error));
38
+ if (fresh.length > 0)
39
+ reject(fresh.join('; '));
40
+ manifest = next;
41
+ applied.push({ index, change, message });
42
+ }
43
+ catch (error) {
44
+ if (!(error instanceof Rejected))
45
+ throw error;
46
+ rejected.push({ index, change, reason: error.message });
47
+ }
48
+ });
49
+ return { manifest, applied, rejected, issues: checkManifest({ pkg: template.pkg, manifest }, info) };
50
+ }
51
+ function apply(manifest, change, info) {
52
+ const patternOf = (id) => manifest.patterns.find((pattern) => pattern.id === id) ?? reject(`there is no pattern "${id}"`);
53
+ const slideOf = (pattern) => info.slides[pattern.sourceSlide - 1] ?? reject(`pattern "${pattern.id}" points at slide ${pattern.sourceSlide}, which the template does not have`);
54
+ const freeId = (raw) => {
55
+ const id = kebab(raw) || reject('a pattern needs an id made of letters and digits');
56
+ if (manifest.patterns.some((pattern) => pattern.id === id))
57
+ reject(`another pattern is already called "${id}"`);
58
+ return id;
59
+ };
60
+ switch (change.op) {
61
+ case 'setManifest': {
62
+ const done = [];
63
+ if (change.name !== undefined) {
64
+ manifest.name = change.name.trim() || reject('the name is empty');
65
+ done.push(`is named "${manifest.name}"`);
66
+ }
67
+ if (change.language !== undefined) {
68
+ manifest.language = change.language.trim() || reject('the language is empty');
69
+ done.push(`is written in "${manifest.language}"`);
70
+ }
71
+ if (change.direction !== undefined) {
72
+ if (change.direction !== 'rtl' && change.direction !== 'ltr')
73
+ reject('the direction is "rtl" or "ltr"');
74
+ manifest.direction = change.direction;
75
+ done.push(`reads ${change.direction === 'rtl' ? 'right to left' : 'left to right'}`);
76
+ }
77
+ if (change.alignOnDirectionChange !== undefined) {
78
+ if (change.alignOnDirectionChange !== 'flip' && change.alignOnDirectionChange !== 'keep')
79
+ reject('alignment on a direction change is "flip" or "keep"');
80
+ manifest.alignOnDirectionChange = change.alignOnDirectionChange;
81
+ done.push(`${change.alignOnDirectionChange === 'flip' ? 'mirrors' : 'keeps'} its alignment in decks that read the other way`);
82
+ }
83
+ if (done.length === 0)
84
+ reject('nothing to set');
85
+ return `The template ${done.join(', ')}.`;
86
+ }
87
+ case 'addPattern': {
88
+ const slide = info.slides[change.slide - 1] ?? reject(`the template has ${info.slides.length} slides; there is no slide ${change.slide}`);
89
+ const id = freeId(change.id);
90
+ // A header text that other patterns already treat as one value for the deck is the same value here.
91
+ const fields = new Map();
92
+ for (const pattern of manifest.patterns) {
93
+ const shapes = info.slides[pattern.sourceSlide - 1]?.shapes ?? [];
94
+ for (const slot of pattern.slots) {
95
+ const shape = slot.kind === 'text' && slot.deckField ? shapes.find((candidate) => candidate.id === slot.shapeId) : undefined;
96
+ if (shape && slot.kind === 'text' && slot.deckField)
97
+ fields.set(shapeText(shape), slot.deckField);
98
+ }
99
+ }
100
+ const slots = [];
101
+ for (const shape of slide.shapes) {
102
+ const field = shape.kind === 'text' ? fields.get(shapeText(shape)) : undefined;
103
+ if (!field || slots.some((slot) => slot.name === field))
104
+ continue;
105
+ const slot = slotFromShape(shape, info, 'text', field);
106
+ if (slot?.kind === 'text')
107
+ slots.push({ ...slot, deckField: field });
108
+ }
109
+ manifest.patterns.push({ id, sourceSlide: change.slide, description: change.description?.trim() || `Layout of slide ${change.slide}.`, slots });
110
+ return `Slide ${change.slide} is now the pattern "${id}"${slots.length > 0 ? `, with the deck's ${slots.map((slot) => slot.name).join(', ')}` : ''}. It has no content slots yet.`;
111
+ }
112
+ case 'copyPattern': {
113
+ const source = patternOf(change.pattern);
114
+ const copy = structuredClone(source);
115
+ copy.id = freeId(change.id);
116
+ if (change.description?.trim())
117
+ copy.description = change.description.trim();
118
+ manifest.patterns.splice(manifest.patterns.indexOf(source) + 1, 0, copy);
119
+ return `"${copy.id}" is a new pattern, a copy of "${source.id}".`;
120
+ }
121
+ case 'removePattern': {
122
+ const pattern = patternOf(change.pattern);
123
+ if (manifest.patterns.length === 1)
124
+ reject('a template needs at least one pattern');
125
+ manifest.patterns.splice(manifest.patterns.indexOf(pattern), 1);
126
+ return `The pattern "${pattern.id}" is removed. Slide ${pattern.sourceSlide} of the template is no longer used${manifest.patterns.some((other) => other.sourceSlide === pattern.sourceSlide) ? ' by it' : ''}.`;
127
+ }
128
+ case 'setPattern': {
129
+ const pattern = patternOf(change.pattern);
130
+ const done = [];
131
+ if (change.id !== undefined && kebab(change.id) !== pattern.id) {
132
+ const was = pattern.id;
133
+ pattern.id = freeId(change.id);
134
+ done.push(`"${was}" is now called "${pattern.id}"`);
135
+ }
136
+ if (change.description !== undefined) {
137
+ pattern.description = change.description.trim() || reject('the description is empty');
138
+ done.push(`"${pattern.id}" has a new description`);
139
+ }
140
+ if (change.figures !== undefined) {
141
+ if (change.figures)
142
+ pattern.figures = true;
143
+ else
144
+ delete pattern.figures;
145
+ done.push(`"${pattern.id}" is ${change.figures ? 'offered only for briefs with figures' : 'offered for any brief'}`);
146
+ }
147
+ if (done.length === 0)
148
+ reject('nothing to set');
149
+ return `${done.join('; ')}.`.replace(/^./, (first) => first.toUpperCase());
150
+ }
151
+ case 'addSlot': {
152
+ const pattern = patternOf(change.pattern);
153
+ const slide = slideOf(pattern);
154
+ const shape = slide.shapes.find((candidate) => candidate.id === String(change.shape)) ?? reject(`slide ${pattern.sourceSlide} has no shape #${change.shape}`);
155
+ if (!ROLES.includes(change.role))
156
+ reject(`"${change.role}" is not a role; the roles are ${ROLES.join(', ')}`);
157
+ const existing = pattern.slots.find((slot) => slot.shapeId === shape.id);
158
+ if (change.role === 'fixed') {
159
+ if (!existing)
160
+ reject(`shape #${shape.id} is not a slot, so it already stays as designed`);
161
+ return apply(manifest, { op: 'removeSlot', pattern: pattern.id, slot: existing.name }, info);
162
+ }
163
+ if (existing && inRow(pattern, existing.name))
164
+ reject(`"${existing.name}" is part of the row of ${pattern.repeat?.item ?? 'item'}s; remove the row first`);
165
+ const others = new Set(pattern.slots.filter((slot) => slot !== existing).map((slot) => slot.name));
166
+ let name = slotName(change.name ?? existing?.name ?? '', change.role);
167
+ for (let n = 2; others.has(name); n++)
168
+ name = `${slotName(change.name ?? existing?.name ?? '', change.role)}${n}`;
169
+ const slot = slotFromShape(shape, info, change.role, name, change.optional === true, slide) ??
170
+ reject(`shape #${shape.id} is ${describeKind(shape)}; it can be ${rolesFor(shape).join(', ') || 'nothing but part of the design'}${change.role === 'chart' && shape.groupId ? ' (a chart cannot replace a picture inside a group)' : ''}`);
171
+ if (existing)
172
+ pattern.slots.splice(pattern.slots.indexOf(existing), 1, slot);
173
+ else
174
+ pattern.slots.push(slot);
175
+ return `"${pattern.id}": shape #${shape.id} is ${existing ? 'now' : 'a new slot,'} "${name}", ${describeSlot(slot)}.`;
176
+ }
177
+ case 'removeSlot': {
178
+ const pattern = patternOf(change.pattern);
179
+ const slot = pattern.slots.find((candidate) => candidate.name === change.slot) ?? reject(`"${pattern.id}" has no slot "${change.slot}"`);
180
+ if (inRow(pattern, slot.name))
181
+ reject(`"${slot.name}" is part of the row of ${pattern.repeat?.item ?? 'item'}s; remove the row first`);
182
+ pattern.slots.splice(pattern.slots.indexOf(slot), 1);
183
+ return `"${pattern.id}": "${slot.name}" is no longer a slot. Shape #${slot.shapeId} stays as the template shows it.`;
184
+ }
185
+ case 'setSlot': {
186
+ const pattern = patternOf(change.pattern);
187
+ const slide = slideOf(pattern);
188
+ const slot = pattern.slots.find((candidate) => candidate.name === change.slot) ?? reject(`"${pattern.id}" has no slot "${change.slot}"`);
189
+ const { op: _op, pattern: _pattern, slot: _slot, ...patch } = change;
190
+ const keys = Object.keys(patch).filter((key) => patch[key] !== undefined);
191
+ if (keys.length === 0)
192
+ reject('nothing to set');
193
+ // A setting that belongs to another kind of slot is a mistake worth saying, not ignoring.
194
+ const allowed = new Set(['name', 'description', 'empty', ...KEYS_OF[slot.kind], ...(slot.kind === 'table' ? [] : ['box'])]);
195
+ const foreign = keys.filter((key) => !allowed.has(key));
196
+ if (foreign.length > 0)
197
+ reject(`"${slot.name}" is ${slot.kind === 'image' ? 'an image' : `a ${slot.kind}`} slot; ${foreign.join(', ')} ${foreign.length === 1 ? 'does' : 'do'} not apply to it`);
198
+ for (const key of keys) {
199
+ const value = patch[key];
200
+ if (COUNT_KEYS.has(key) && value !== null && !(typeof value === 'number' && Number.isInteger(value) && value >= 1))
201
+ reject(`${key} must be a whole number of 1 or more`);
202
+ }
203
+ if (patch.empty !== undefined && !['error', 'remove', 'keep', 'drop'].includes(patch.empty))
204
+ reject('empty is "error", "remove", "keep" or "drop"');
205
+ if (patch.box)
206
+ checkBox(patch.box);
207
+ if (typeof patch.fontSize === 'number' && !(patch.fontSize >= 4 && patch.fontSize <= 200))
208
+ reject('a font size is between 4 and 200 points');
209
+ const row = inRow(pattern, slot.name);
210
+ if (row && (patch.name !== undefined || patch.deckField !== undefined || patch.box !== undefined)) {
211
+ reject(`"${slot.name}" is part of the row of ${pattern.repeat?.item ?? 'item'}s, so it cannot be renamed, moved or tied to a deck field; remove the row first`);
212
+ }
213
+ // Items of a row must match, so a change to one item's slot is made to that slot of every item.
214
+ const targets = row ? row.names.map((name) => pattern.slots.find((candidate) => candidate.name === name)).filter((candidate) => !!candidate) : [slot];
215
+ const notes = [];
216
+ for (const target of targets) {
217
+ const shape = slide.shapes.find((candidate) => candidate.id === target.shapeId);
218
+ const derived = derive(target, patch, shape, slide, info);
219
+ const record = target;
220
+ for (const [key, value] of Object.entries({ ...patch, ...derived })) {
221
+ if (value === undefined || key === 'name')
222
+ continue;
223
+ if (value === null || (key === 'empty' && value === 'error'))
224
+ delete record[key];
225
+ // A text style is changed setting by setting: a new size keeps the colour already chosen.
226
+ else if (STYLE_KEYS.has(key) && record[key] && typeof record[key] === 'object')
227
+ record[key] = { ...record[key], ...value };
228
+ else
229
+ record[key] = value;
230
+ }
231
+ if (target === slot)
232
+ for (const [key, value] of Object.entries(derived))
233
+ notes.push(`${key} follows at ${value}`);
234
+ }
235
+ if (patch.name !== undefined) {
236
+ const name = slotName(patch.name, '') || reject('a slot name is made of letters and digits and starts with a letter');
237
+ if (pattern.slots.some((candidate) => candidate !== slot && candidate.name === name))
238
+ reject(`"${pattern.id}" already has a slot "${name}"`);
239
+ for (const sequence of pattern.sequences ?? [])
240
+ for (const item of sequence)
241
+ item.forEach((entry, position) => entry === slot.name && (item[position] = name));
242
+ notes.unshift(`renamed from "${slot.name}"`);
243
+ slot.name = name;
244
+ }
245
+ const who = targets.length > 1 ? `${targets.map((target) => `"${target.name}"`).join(', ')} are` : `"${slot.name}" is`;
246
+ return `"${pattern.id}": ${who} now ${describeSlot(slot)}${notes.length > 0 ? ` (${notes.join('; ')})` : ''}.`;
247
+ }
248
+ case 'setRepeat': {
249
+ const pattern = patternOf(change.pattern);
250
+ const slide = slideOf(pattern);
251
+ let found = false;
252
+ if (!pattern.repeat) {
253
+ const detected = detectRepeat(pattern.slots.filter((slot) => !(slot.kind === 'text' && slot.deckField)), slide) ??
254
+ reject(`"${pattern.id}" has no row of like items. Name the slots of each item alike with a number (card1Heading, card1Text, card2Heading, card2Text) and they become a row`);
255
+ pattern.repeat = detected;
256
+ found = true;
257
+ }
258
+ const repeat = pattern.repeat;
259
+ const drawn = repeat.shapes.length;
260
+ if (change.item !== undefined)
261
+ repeat.item = change.item.trim().toLowerCase() || reject('the item needs a name, such as "card"');
262
+ if (change.span === null)
263
+ delete repeat.span;
264
+ else if (change.span !== undefined) {
265
+ if (!(change.span.left >= 0 && change.span.right <= 1 && change.span.left < change.span.right))
266
+ reject('a span runs from left to right, both between 0 and 1');
267
+ repeat.span = { left: change.span.left, right: change.span.right };
268
+ }
269
+ const min = change.min ?? repeat.min ?? drawn;
270
+ const max = change.max ?? repeat.max ?? drawn;
271
+ for (const value of [min, max])
272
+ if (!Number.isInteger(value) || value < 1)
273
+ reject('the fewest and most items are whole numbers of 1 or more');
274
+ if (min > max)
275
+ reject(`the fewest (${min}) cannot be more than the most (${max})`);
276
+ let widened = '';
277
+ if (repeat.columns !== undefined) {
278
+ if (max > drawn)
279
+ reject(`a grid holds at most the ${drawn} ${repeat.item}s it draws; ${max} would need a new line of them`);
280
+ }
281
+ else {
282
+ // A row may hold more than it draws, as long as the items fit side by side in the room there is.
283
+ const room = rowRoom(slide, repeat.shapes);
284
+ const onSlide = repeat.shapes.flat().every((id) => slide.shapes.find((shape) => shape.id === id)?.groupId === undefined);
285
+ const fits = (left, right) => Math.max(1, Math.floor((right - left - room.itemWidth) / (room.itemWidth * 1.03) + 1 + 1e-6));
286
+ const span = repeat.span ?? { left: room.area.x, right: room.area.x + room.area.w };
287
+ if (max > fits(span.left, span.right)) {
288
+ const most = change.span === undefined && onSlide ? fits(room.left, room.right) : fits(span.left, span.right);
289
+ if (max > most) {
290
+ reject(`${max} ${repeat.item}s do not fit side by side: each is ${Math.round(room.itemWidth * 100)}% of the slide wide and the row has ${Math.round(((change.span === undefined && onSlide ? room.right - room.left : span.right - span.left)) * 100)}%. The most is ${most}`);
291
+ }
292
+ repeat.span = { left: round(room.left), right: round(room.right) };
293
+ widened = ` The row may now spread from ${Math.round(room.left * 100)}% to ${Math.round(room.right * 100)}% of the slide's width.`;
294
+ }
295
+ }
296
+ repeat.min = min;
297
+ repeat.max = max;
298
+ return `"${pattern.id}": ${found ? `found a ${repeat.columns ? 'grid' : 'row'} of ${drawn} ${repeat.item}s; it` : `the ${repeat.columns ? 'grid' : 'row'} of ${repeat.item}s`} takes ${min === max ? `exactly ${min}` : `${min} to ${max}`}.${widened}`;
299
+ }
300
+ case 'removeRepeat': {
301
+ const pattern = patternOf(change.pattern);
302
+ if (!pattern.repeat)
303
+ reject(`"${pattern.id}" has no row of items`);
304
+ const repeat = pattern.repeat;
305
+ delete pattern.repeat;
306
+ return `"${pattern.id}": the ${repeat.item}s are no longer a row whose number can change. A deck fills all ${repeat.shapes.length}.`;
307
+ }
308
+ default:
309
+ return reject(`"${String(change.op)}" is not an operation`);
310
+ }
311
+ }
312
+ const round = (value) => Math.round(value * 1000) / 1000;
313
+ function checkBox(box) {
314
+ const numbers = [box.x, box.y, box.w, box.h];
315
+ if (numbers.some((value) => typeof value !== 'number' || Number.isNaN(value)) || box.x < 0 || box.y < 0 || box.w <= 0 || box.h <= 0 || box.x + box.w > 1.001 || box.y + box.h > 1.001) {
316
+ reject('a box is x, y, w and h as fractions of the slide, and must lie on the slide');
317
+ }
318
+ }
319
+ /** The row a slot belongs to, with the names of that slot across all the row's items. */
320
+ function inRow(pattern, name) {
321
+ const repeat = pattern.repeat;
322
+ if (!repeat)
323
+ return undefined;
324
+ for (const template of repeat.slots) {
325
+ const names = repeat.shapes.map((_, index) => template.replace('{n}', String(index + 1)));
326
+ if (names.includes(name))
327
+ return { names };
328
+ }
329
+ return undefined;
330
+ }
331
+ /** Limits that follow from a change when the change does not state them: a budget after a new size or area. */
332
+ function derive(slot, patch, shape, slide, info) {
333
+ const derived = {};
334
+ if (slot.kind === 'text' && patch.maxChars === undefined && slot.maxChars !== undefined && shape) {
335
+ let factor = 1;
336
+ if (patch.fontSize !== undefined) {
337
+ const own = slot.size ?? shape.fontSizes?.[0] ?? 14;
338
+ factor *= ((slot.fontSize ?? own) / (patch.fontSize ?? own)) ** 2;
339
+ }
340
+ if (patch.box !== undefined) {
341
+ const before = slot.box ?? shape.box;
342
+ const after = patch.box ?? shape.box;
343
+ if (before.w * before.h > 0)
344
+ factor *= (after.w * after.h) / (before.w * before.h);
345
+ }
346
+ let budget = Math.max(1, Math.round(slot.maxChars * factor));
347
+ if (patch.box) {
348
+ // A budget scaled up from a small box can promise more than the new area holds, so the area is measured too.
349
+ const size = (patch.fontSize === undefined ? slot.fontSize : patch.fontSize) ?? slot.size ?? shape.fontSizes?.[0] ?? 14;
350
+ const paragraphs = (patch.maxParagraphs === undefined ? slot.maxParagraphs : patch.maxParagraphs) ?? 1;
351
+ const gap = (patch.paragraphGap === undefined ? slot.paragraphGap : patch.paragraphGap) ?? 0;
352
+ budget = Math.min(budget, boxCapacity(patch.box, info, size, paragraphs, gap));
353
+ }
354
+ if (budget !== slot.maxChars)
355
+ derived.maxChars = budget;
356
+ }
357
+ if (slot.kind === 'table' && patch.maxCellChars === undefined && shape && (patch.bodyText !== undefined || patch.maxColumns !== undefined || patch.maxRows !== undefined)) {
358
+ const size = patch.bodyText === null ? undefined : (patch.bodyText?.size ?? slot.bodyText?.size);
359
+ const measured = tableLimits(shape, info, {
360
+ slide,
361
+ columns: patch.maxColumns ?? slot.maxColumns ?? shape.table?.columns ?? 4,
362
+ rows: patch.maxRows ?? slot.maxRows ?? Math.max(1, (shape.table?.rows ?? 4) - 1),
363
+ ...(size !== undefined ? { fontSize: size } : {}),
364
+ });
365
+ if (measured.maxCellChars !== slot.maxCellChars)
366
+ derived.maxCellChars = measured.maxCellChars;
367
+ }
368
+ return derived;
369
+ }
370
+ function describeKind(shape) {
371
+ return shape.kind === 'picture' ? 'a picture' : shape.kind === 'table' ? 'a table' : shape.kind === 'text' ? 'a text box' : `a ${shape.kind}`;
372
+ }
373
+ /** A slot in a few words: what it holds, how much, and what happens when a deck leaves it empty. */
374
+ export function describeSlot(slot) {
375
+ const policy = slot.empty ?? 'error';
376
+ if (policy === 'drop')
377
+ return 'a decoration that is always removed';
378
+ const parts = [];
379
+ if (slot.kind === 'text') {
380
+ parts.push(slot.deckField ? `text from the deck's "${slot.deckField}"` : 'text');
381
+ if (slot.maxChars !== undefined)
382
+ parts.push(`up to ${slot.maxChars} characters`);
383
+ if (slot.maxParagraphs !== undefined)
384
+ parts.push(`${slot.maxParagraphs} paragraphs`);
385
+ if (slot.fontSize !== undefined)
386
+ parts.push(`set at ${slot.fontSize} pt`);
387
+ }
388
+ else if (slot.kind === 'image') {
389
+ parts.push(slot.imageKind === 'icon' ? 'an icon' : slot.imageKind === 'photo' ? 'a photo' : 'a supplied graphic');
390
+ }
391
+ else if (slot.kind === 'table') {
392
+ parts.push(`a table of up to ${slot.maxColumns ?? '?'} columns and ${slot.maxRows ?? '?'} rows`);
393
+ if (slot.maxCellChars !== undefined)
394
+ parts.push(`${slot.maxCellChars} characters a cell`);
395
+ if (slot.bodyText?.size !== undefined)
396
+ parts.push(`text at ${slot.bodyText.size} pt`);
397
+ }
398
+ else {
399
+ parts.push(`a native chart of up to ${slot.maxCategories ?? '?'} categories and ${slot.maxSeries ?? '?'} series`);
400
+ }
401
+ if ('box' in slot && slot.box)
402
+ parts.push('in its own area');
403
+ parts.push(policyWord(policy));
404
+ return parts.join(', ');
405
+ }
406
+ //# sourceMappingURL=change.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change.js","sourceRoot":"","sources":["../../src/template/change.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Template } from '../render/render.ts';
2
+ import type { TemplateInfo } from './inspect.ts';
3
+ export interface ManifestIssue {
4
+ severity: 'error' | 'warning';
5
+ /** Pattern id; absent for manifest-level issues. */
6
+ pattern?: string;
7
+ slot?: string;
8
+ message: string;
9
+ }
10
+ /**
11
+ * Checks a manifest against the pptx it describes: every pattern's slide, every slot's shape
12
+ * and every row item must exist and be of the right kind. Run it when a template or manifest
13
+ * is loaded, so a template that was changed shows up here and not in the middle of a render.
14
+ */
15
+ export declare function checkManifest(template: Template, inspected?: TemplateInfo): ManifestIssue[];