@stonedeck/core 0.7.3 → 0.7.6
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/README.md +51 -0
- package/dist/emitter.d.ts.map +1 -1
- package/dist/emitter.js +3 -36
- package/dist/emitter.js.map +1 -1
- package/dist/layouts/registry.json +1 -1
- package/dist/models/ir.d.ts +2 -3
- package/dist/models/ir.d.ts.map +1 -1
- package/dist/parser/tokenizer.js +2 -0
- package/dist/parser/tokenizer.js.map +1 -1
- package/dist/resolver/theme-loader.d.ts +3 -1
- package/dist/resolver/theme-loader.d.ts.map +1 -1
- package/dist/resolver/theme-loader.js +45 -2
- package/dist/resolver/theme-loader.js.map +1 -1
- package/package.json +1 -3
- package/src/emitter.ts +3 -35
- package/src/layouts/registry.json +1 -1
- package/src/models/ir.ts +2 -3
- package/src/parser/tokenizer.ts +2 -0
- package/src/resolver/theme-loader.ts +51 -2
- package/src/themes/academico_v2.yaml +55 -0
- package/src/themes/corporativo_v2.yaml +55 -0
- package/src/themes/dark_mode_v2.yaml +54 -0
- package/src/themes/default_v2.yaml +58 -0
- package/src/themes/minimalista_v2.yaml +56 -0
- package/src/themes/moderno_v2.yaml +56 -0
- package/src/themes/tech_blue.yaml +56 -0
- package/test/verify_clipping.html +338 -0
- package/test/verify_clipping.md +14 -0
- package/test/verify_theme.ts +24 -0
- package/test/verify_theme_runner.js +34 -0
- package/test/verify_variants.html +348 -0
- package/test/verify_variants.md +40 -0
- package/dist/resolver/metrics.d.ts +0 -27
- package/dist/resolver/metrics.d.ts.map +0 -1
- package/dist/resolver/metrics.js +0 -43
- package/dist/resolver/metrics.js.map +0 -1
- package/src/resolver/metrics.ts +0 -64
package/README.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# @stonedeck/core
|
|
2
|
+
|
|
3
|
+
> The engine that transforms Markdown into beautiful presentations
|
|
4
|
+
|
|
5
|
+
## What is this?
|
|
6
|
+
|
|
7
|
+
This is the core package of StoneDeck. It reads your Markdown files and converts them into a structured format that can be turned into HTML slides.
|
|
8
|
+
|
|
9
|
+
**You probably don't need to use this directly** - use the [@stonedeck/cli](../cli) instead for a better experience.
|
|
10
|
+
|
|
11
|
+
## When to use this
|
|
12
|
+
|
|
13
|
+
Use this package if you're:
|
|
14
|
+
- Building your own presentation tool on top of StoneDeck
|
|
15
|
+
- Creating a custom export format (not HTML)
|
|
16
|
+
- Integrating StoneDeck into another application
|
|
17
|
+
|
|
18
|
+
## Quick Example
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
import { processStoneDeck } from '@stonedeck/core';
|
|
22
|
+
import * as fs from 'fs';
|
|
23
|
+
|
|
24
|
+
// Read your markdown file
|
|
25
|
+
const content = fs.readFileSync('my-slides.md', 'utf-8');
|
|
26
|
+
|
|
27
|
+
// Convert to StoneDeck format
|
|
28
|
+
const presentation = processStoneDeck(content, 'my-slides.md');
|
|
29
|
+
|
|
30
|
+
// Now you have structured data ready to export
|
|
31
|
+
console.log(`Your presentation has ${presentation.slides.length} slides`);
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## What's included
|
|
35
|
+
|
|
36
|
+
- Markdown parser for StoneDeck syntax
|
|
37
|
+
- Theme system (colors, fonts, backgrounds)
|
|
38
|
+
- Layout engine (title, content, cards, etc.)
|
|
39
|
+
- Smart content detection (tables, lists, images, code)
|
|
40
|
+
|
|
41
|
+
## Need help?
|
|
42
|
+
|
|
43
|
+
Check the main [StoneDeck documentation](../../README.md) or use the CLI tool directly.
|
|
44
|
+
|
|
45
|
+
## Repository
|
|
46
|
+
|
|
47
|
+
[https://github.com/matheuspellisoli/StoneDeck](https://github.com/matheuspellisoli/StoneDeck)
|
|
48
|
+
|
|
49
|
+
## License
|
|
50
|
+
|
|
51
|
+
MIT
|
package/dist/emitter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAoC,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAoC,MAAM,gBAAgB,CAAC;AAM/E;;GAEG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,WAAW,CAwE7F"}
|
package/dist/emitter.js
CHANGED
|
@@ -2,7 +2,6 @@ import { parseManifesto } from './parser/manifesto.js';
|
|
|
2
2
|
import { parseSlides } from './parser/tokenizer.js';
|
|
3
3
|
import { ThemeLoader } from './resolver/theme-loader.js';
|
|
4
4
|
import { validateLayout, getLayout } from './layouts/validator.js';
|
|
5
|
-
import { metricsCalculator } from './resolver/metrics.js';
|
|
6
5
|
import { mapMarkdownLists } from './parser/list-mapper.js';
|
|
7
6
|
import { mapMarkdownTable } from './parser/table-mapper.js';
|
|
8
7
|
import { mapMarkdownImage } from './parser/image-mapper.js';
|
|
@@ -28,11 +27,9 @@ export function emitIR(content, filePath, themeOverride) {
|
|
|
28
27
|
warnings.push(validation.error);
|
|
29
28
|
}
|
|
30
29
|
const layout = getLayout(slide.layout_id, slide.slots.length);
|
|
31
|
-
// Merge Theme Defaults
|
|
32
|
-
const defaults = theme.defaults || {};
|
|
33
|
-
const mergedStyle = { ...defaults, ...slide.style };
|
|
34
30
|
// Resolve Style with Theme
|
|
35
|
-
|
|
31
|
+
// Note: We pass slide.style directly. ThemeLoader will handle defaults and variants.
|
|
32
|
+
const resolvedStyle = ThemeLoader.resolveStyle(slide.style, theme, slide.variant, slideIdx);
|
|
36
33
|
// Process Slots (List, Table, Image detection)
|
|
37
34
|
const processedSlots = slide.slots.map(slot => {
|
|
38
35
|
if (slot.type === 'markdown') {
|
|
@@ -60,41 +57,11 @@ export function emitIR(content, filePath, themeOverride) {
|
|
|
60
57
|
}
|
|
61
58
|
return slot;
|
|
62
59
|
});
|
|
63
|
-
// Calculate Metrics and Overflow
|
|
64
|
-
const heights = [];
|
|
65
|
-
if (layout) {
|
|
66
|
-
processedSlots.forEach((slot, slotIdx) => {
|
|
67
|
-
const slotDef = layout.slots[slotIdx];
|
|
68
|
-
if (slotDef) {
|
|
69
|
-
let contentToMeasure = '';
|
|
70
|
-
if (slot.type === 'list') {
|
|
71
|
-
contentToMeasure = slot.items.map((i) => i.text).join('\n');
|
|
72
|
-
}
|
|
73
|
-
else if (slot.type === 'markdown') {
|
|
74
|
-
contentToMeasure = slot.raw;
|
|
75
|
-
}
|
|
76
|
-
else if (slot.type === 'table') {
|
|
77
|
-
contentToMeasure = slot.rows.map((r) => r.map((c) => c.text).join(' ')).join('\n');
|
|
78
|
-
}
|
|
79
|
-
else if (slot.type === 'image') {
|
|
80
|
-
contentToMeasure = slot.alt || slot.src;
|
|
81
|
-
}
|
|
82
|
-
const estimatedHeight = metricsCalculator.estimateMarkdownHeight(contentToMeasure, resolvedStyle, slotDef.width);
|
|
83
|
-
heights.push(estimatedHeight);
|
|
84
|
-
if (estimatedHeight > slotDef.height) {
|
|
85
|
-
warnings.push(`Overflow Warning: Content in slot "${slotDef.id}" (slide ${slideIdx + 1}) exceeds defined height (${estimatedHeight.toFixed(1)}pt > ${slotDef.height}pt)`);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
60
|
return {
|
|
91
61
|
...slide,
|
|
92
62
|
style: resolvedStyle,
|
|
93
63
|
slots: processedSlots,
|
|
94
|
-
warnings: warnings.length > 0 ? warnings : undefined
|
|
95
|
-
metrics: {
|
|
96
|
-
heights
|
|
97
|
-
}
|
|
64
|
+
warnings: warnings.length > 0 ? warnings : undefined
|
|
98
65
|
};
|
|
99
66
|
});
|
|
100
67
|
return {
|
package/dist/emitter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"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"}
|
package/dist/models/ir.d.ts
CHANGED
|
@@ -36,6 +36,7 @@ export interface SlideStyle {
|
|
|
36
36
|
};
|
|
37
37
|
card?: {
|
|
38
38
|
background?: string;
|
|
39
|
+
color?: string;
|
|
39
40
|
radius?: string;
|
|
40
41
|
border?: string;
|
|
41
42
|
shadow?: boolean;
|
|
@@ -69,13 +70,11 @@ export type SlotContent = {
|
|
|
69
70
|
};
|
|
70
71
|
export interface Slide {
|
|
71
72
|
layout_id: string;
|
|
73
|
+
variant?: string;
|
|
72
74
|
title?: string;
|
|
73
75
|
style: SlideStyle;
|
|
74
76
|
slots: SlotContent[];
|
|
75
77
|
warnings?: string[] | undefined;
|
|
76
|
-
metrics?: {
|
|
77
|
-
heights: number[];
|
|
78
|
-
} | undefined;
|
|
79
78
|
}
|
|
80
79
|
export interface StoneDeckIR {
|
|
81
80
|
manifesto: StoneDeckManifesto;
|
package/dist/models/ir.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ir.d.ts","sourceRoot":"","sources":["../../src/models/ir.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ir.d.ts","sourceRoot":"","sources":["../../src/models/ir.ts"],"names":[],"mappings":"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"}
|
package/dist/parser/tokenizer.js
CHANGED
|
@@ -62,11 +62,13 @@ function parseSlidesV2(content) {
|
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
const layout_id = config.layout || 'blank';
|
|
65
|
+
const variant = config.layout_style || undefined;
|
|
65
66
|
const title = config.title;
|
|
66
67
|
const style = config.style || {};
|
|
67
68
|
const slots = parseSlots(rawContent);
|
|
68
69
|
slides.push({
|
|
69
70
|
layout_id,
|
|
71
|
+
variant,
|
|
70
72
|
title,
|
|
71
73
|
style,
|
|
72
74
|
slots
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/parser/tokenizer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/parser/tokenizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,8 @@ export declare class ThemeLoader {
|
|
|
3
3
|
private static __dirname;
|
|
4
4
|
private static presets;
|
|
5
5
|
static load(themeRef: string, basePath: string): any;
|
|
6
|
-
static resolveStyle(slideStyle: SlideStyle, theme: any): SlideStyle;
|
|
6
|
+
static resolveStyle(slideStyle: SlideStyle, theme: any, variantName?: string, seed?: number): SlideStyle;
|
|
7
|
+
private static deepMerge;
|
|
7
8
|
private static deepResolve;
|
|
8
9
|
private static resolveTokenValue;
|
|
9
10
|
/**
|
|
@@ -13,5 +14,6 @@ export declare class ThemeLoader {
|
|
|
13
14
|
* RFC 4.1: "Todas as unidades finais devem ser em pt (Pontos)."
|
|
14
15
|
*/
|
|
15
16
|
private static convertToPt;
|
|
17
|
+
private static isObject;
|
|
16
18
|
}
|
|
17
19
|
//# sourceMappingURL=theme-loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme-loader.d.ts","sourceRoot":"","sources":["../../src/resolver/theme-loader.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAgD;IAExE,OAAO,CAAC,MAAM,CAAC,OAAO,CAepB;IAEF,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG;IA4BpD,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,GAAG,UAAU;
|
|
1
|
+
{"version":3,"file":"theme-loader.d.ts","sourceRoot":"","sources":["../../src/resolver/theme-loader.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAgD;IAExE,OAAO,CAAC,MAAM,CAAC,OAAO,CAepB;IAEF,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG;IA4BpD,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE,MAAU,GAAG,UAAU;IA8B3G,OAAO,CAAC,MAAM,CAAC,SAAS;IAoBxB,OAAO,CAAC,MAAM,CAAC,WAAW;IAsB1B,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAchC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAqB1B,OAAO,CAAC,MAAM,CAAC,QAAQ;CAG1B"}
|
|
@@ -28,9 +28,49 @@ export class ThemeLoader {
|
|
|
28
28
|
console.warn(`Theme "${themeRef}" not found. Falling back to standard.`);
|
|
29
29
|
return this.presets.standard;
|
|
30
30
|
}
|
|
31
|
-
static resolveStyle(slideStyle, theme) {
|
|
31
|
+
static resolveStyle(slideStyle, theme, variantName, seed = 0) {
|
|
32
32
|
const tokens = theme.tokens || {};
|
|
33
|
-
|
|
33
|
+
const defaults = theme.defaults || {};
|
|
34
|
+
let variantStyle = {};
|
|
35
|
+
// 1. Explicit Variant
|
|
36
|
+
if (variantName && theme.variants?.[variantName]) {
|
|
37
|
+
variantStyle = theme.variants[variantName];
|
|
38
|
+
}
|
|
39
|
+
// 2. Dynamic Variant (if available and no explicit variant request or explicit variant not found)
|
|
40
|
+
else if (theme.variants && Object.keys(theme.variants).length > 0) {
|
|
41
|
+
const variantKeys = Object.keys(theme.variants);
|
|
42
|
+
// Use seed to pick a variant deterministically
|
|
43
|
+
const pickedKey = variantKeys[seed % variantKeys.length];
|
|
44
|
+
variantStyle = theme.variants[pickedKey];
|
|
45
|
+
}
|
|
46
|
+
// Merge: Defaults -> Variant -> Slide Style
|
|
47
|
+
// We need to merge carefully.
|
|
48
|
+
// Actually, we should resolve each layer against tokens first?
|
|
49
|
+
// Or merge raw values and then resolve?
|
|
50
|
+
// Let's merge raw values first to allow overrides.
|
|
51
|
+
// Deep merge: Defaults < Variant < SlideStyle
|
|
52
|
+
const mergedRaw = this.deepMerge(defaults, this.deepMerge(variantStyle, slideStyle));
|
|
53
|
+
return this.deepResolve(mergedRaw, tokens);
|
|
54
|
+
}
|
|
55
|
+
static deepMerge(target, source) {
|
|
56
|
+
if (!this.isObject(target) || !this.isObject(source)) {
|
|
57
|
+
return source;
|
|
58
|
+
}
|
|
59
|
+
const output = { ...target };
|
|
60
|
+
Object.keys(source).forEach(key => {
|
|
61
|
+
if (this.isObject(source[key])) {
|
|
62
|
+
if (!(key in target)) {
|
|
63
|
+
Object.assign(output, { [key]: source[key] });
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
output[key] = this.deepMerge(target[key], source[key]);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
Object.assign(output, { [key]: source[key] });
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
return output;
|
|
34
74
|
}
|
|
35
75
|
static deepResolve(obj, tokens) {
|
|
36
76
|
if (typeof obj !== 'object' || obj === null) {
|
|
@@ -89,6 +129,9 @@ export class ThemeLoader {
|
|
|
89
129
|
default: return num;
|
|
90
130
|
}
|
|
91
131
|
}
|
|
132
|
+
static isObject(item) {
|
|
133
|
+
return (item && typeof item === 'object' && !Array.isArray(item));
|
|
134
|
+
}
|
|
92
135
|
}
|
|
93
136
|
ThemeLoader.__dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
94
137
|
ThemeLoader.presets = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme-loader.js","sourceRoot":"","sources":["../../src/resolver/theme-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAGpC,MAAM,OAAO,WAAW;IAoBpB,MAAM,CAAC,IAAI,CAAC,QAAgB,EAAE,QAAgB;QAC1C,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,cAAc,GAAG;YACnB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;YACpE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC;YACxF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,QAAQ,GAAG,OAAO,CAAC,EAAE,iCAAiC;YAChG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,EAAE,QAAQ,GAAG,OAAO,CAAC,EAAE,wCAAwC;YAC3G,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,wBAAwB;SACtF,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;YAC7B,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC;oBACD,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;oBAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBACnC,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACT,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACtD,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,UAAU,QAAQ,wCAAwC,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,UAAsB,EAAE,KAAU;
|
|
1
|
+
{"version":3,"file":"theme-loader.js","sourceRoot":"","sources":["../../src/resolver/theme-loader.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stonedeck/core",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -15,8 +15,6 @@
|
|
|
15
15
|
"build": "tsc -b"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@types/pdfkit": "^0.17.4",
|
|
19
|
-
"pdfkit": "^0.17.2",
|
|
20
18
|
"yaml": "^2.3.4"
|
|
21
19
|
},
|
|
22
20
|
"devDependencies": {
|
package/src/emitter.ts
CHANGED
|
@@ -3,7 +3,6 @@ import { parseSlides } from './parser/tokenizer.js';
|
|
|
3
3
|
import { ThemeLoader } from './resolver/theme-loader.js';
|
|
4
4
|
import { validateLayout, getLayout } from './layouts/validator.js';
|
|
5
5
|
import { StoneDeckIR, SlotContent, ListItem, TableCell } from './models/ir.js';
|
|
6
|
-
import { metricsCalculator } from './resolver/metrics.js';
|
|
7
6
|
import { mapMarkdownLists } from './parser/list-mapper.js';
|
|
8
7
|
import { mapMarkdownTable } from './parser/table-mapper.js';
|
|
9
8
|
import { mapMarkdownImage } from './parser/image-mapper.js';
|
|
@@ -35,12 +34,9 @@ export function emitIR(content: string, filePath: string, themeOverride?: string
|
|
|
35
34
|
}
|
|
36
35
|
|
|
37
36
|
const layout = getLayout(slide.layout_id, slide.slots.length);
|
|
38
|
-
// Merge Theme Defaults
|
|
39
|
-
const defaults = theme.defaults || {};
|
|
40
|
-
const mergedStyle = { ...defaults, ...slide.style };
|
|
41
|
-
|
|
42
37
|
// Resolve Style with Theme
|
|
43
|
-
|
|
38
|
+
// Note: We pass slide.style directly. ThemeLoader will handle defaults and variants.
|
|
39
|
+
const resolvedStyle = ThemeLoader.resolveStyle(slide.style, theme, slide.variant, slideIdx);
|
|
44
40
|
|
|
45
41
|
// Process Slots (List, Table, Image detection)
|
|
46
42
|
const processedSlots: SlotContent[] = slide.slots.map(slot => {
|
|
@@ -71,41 +67,13 @@ export function emitIR(content: string, filePath: string, themeOverride?: string
|
|
|
71
67
|
return slot;
|
|
72
68
|
});
|
|
73
69
|
|
|
74
|
-
// Calculate Metrics and Overflow
|
|
75
|
-
const heights: number[] = [];
|
|
76
|
-
if (layout) {
|
|
77
|
-
processedSlots.forEach((slot, slotIdx) => {
|
|
78
|
-
const slotDef = layout.slots[slotIdx];
|
|
79
|
-
if (slotDef) {
|
|
80
|
-
let contentToMeasure = '';
|
|
81
|
-
if (slot.type === 'list') {
|
|
82
|
-
contentToMeasure = slot.items.map((i: ListItem) => i.text).join('\n');
|
|
83
|
-
} else if (slot.type === 'markdown') {
|
|
84
|
-
contentToMeasure = slot.raw;
|
|
85
|
-
} else if (slot.type === 'table') {
|
|
86
|
-
contentToMeasure = slot.rows.map((r: TableCell[]) => r.map((c: TableCell) => c.text).join(' ')).join('\n');
|
|
87
|
-
} else if (slot.type === 'image') {
|
|
88
|
-
contentToMeasure = slot.alt || slot.src;
|
|
89
|
-
}
|
|
90
70
|
|
|
91
|
-
const estimatedHeight = metricsCalculator.estimateMarkdownHeight(contentToMeasure, resolvedStyle, slotDef.width);
|
|
92
|
-
heights.push(estimatedHeight);
|
|
93
|
-
|
|
94
|
-
if (estimatedHeight > slotDef.height) {
|
|
95
|
-
warnings.push(`Overflow Warning: Content in slot "${slotDef.id}" (slide ${slideIdx + 1}) exceeds defined height (${estimatedHeight.toFixed(1)}pt > ${slotDef.height}pt)`);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
71
|
|
|
101
72
|
return {
|
|
102
73
|
...slide,
|
|
103
74
|
style: resolvedStyle,
|
|
104
75
|
slots: processedSlots,
|
|
105
|
-
warnings: warnings.length > 0 ? warnings : undefined
|
|
106
|
-
metrics: {
|
|
107
|
-
heights
|
|
108
|
-
}
|
|
76
|
+
warnings: warnings.length > 0 ? warnings : undefined
|
|
109
77
|
};
|
|
110
78
|
});
|
|
111
79
|
|
package/src/models/ir.ts
CHANGED
|
@@ -39,6 +39,7 @@ export interface SlideStyle {
|
|
|
39
39
|
};
|
|
40
40
|
card?: {
|
|
41
41
|
background?: string;
|
|
42
|
+
color?: string;
|
|
42
43
|
radius?: string;
|
|
43
44
|
border?: string;
|
|
44
45
|
shadow?: boolean;
|
|
@@ -74,13 +75,11 @@ export type SlotContent = {
|
|
|
74
75
|
|
|
75
76
|
export interface Slide {
|
|
76
77
|
layout_id: string;
|
|
78
|
+
variant?: string; // Optional variant (e.g. "kind_1") from frontmatter layout_style
|
|
77
79
|
title?: string; // Optional slide title
|
|
78
80
|
style: SlideStyle;
|
|
79
81
|
slots: SlotContent[]; // Content of each slot (Structured)
|
|
80
82
|
warnings?: string[] | undefined;
|
|
81
|
-
metrics?: {
|
|
82
|
-
heights: number[]; // Height of each slot in pt
|
|
83
|
-
} | undefined;
|
|
84
83
|
}
|
|
85
84
|
|
|
86
85
|
export interface StoneDeckIR {
|
package/src/parser/tokenizer.ts
CHANGED
|
@@ -78,6 +78,7 @@ function parseSlidesV2(content: string): Slide[] {
|
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
const layout_id = (config.layout as string) || 'blank';
|
|
81
|
+
const variant = (config.layout_style as string) || undefined;
|
|
81
82
|
const title = config.title as string | undefined;
|
|
82
83
|
const style = (config.style as any) || {};
|
|
83
84
|
|
|
@@ -85,6 +86,7 @@ function parseSlidesV2(content: string): Slide[] {
|
|
|
85
86
|
|
|
86
87
|
slides.push({
|
|
87
88
|
layout_id,
|
|
89
|
+
variant,
|
|
88
90
|
title,
|
|
89
91
|
style,
|
|
90
92
|
slots
|
|
@@ -52,9 +52,54 @@ export class ThemeLoader {
|
|
|
52
52
|
return this.presets.standard;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
static resolveStyle(slideStyle: SlideStyle, theme: any): SlideStyle {
|
|
55
|
+
static resolveStyle(slideStyle: SlideStyle, theme: any, variantName?: string, seed: number = 0): SlideStyle {
|
|
56
56
|
const tokens = theme.tokens || {};
|
|
57
|
-
|
|
57
|
+
const defaults = theme.defaults || {};
|
|
58
|
+
|
|
59
|
+
let variantStyle = {};
|
|
60
|
+
|
|
61
|
+
// 1. Explicit Variant
|
|
62
|
+
if (variantName && theme.variants?.[variantName]) {
|
|
63
|
+
variantStyle = theme.variants[variantName];
|
|
64
|
+
}
|
|
65
|
+
// 2. Dynamic Variant (if available and no explicit variant request or explicit variant not found)
|
|
66
|
+
else if (theme.variants && Object.keys(theme.variants).length > 0) {
|
|
67
|
+
const variantKeys = Object.keys(theme.variants);
|
|
68
|
+
// Use seed to pick a variant deterministically
|
|
69
|
+
const pickedKey = variantKeys[seed % variantKeys.length];
|
|
70
|
+
variantStyle = theme.variants[pickedKey];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Merge: Defaults -> Variant -> Slide Style
|
|
74
|
+
// We need to merge carefully.
|
|
75
|
+
// Actually, we should resolve each layer against tokens first?
|
|
76
|
+
// Or merge raw values and then resolve?
|
|
77
|
+
// Let's merge raw values first to allow overrides.
|
|
78
|
+
|
|
79
|
+
// Deep merge: Defaults < Variant < SlideStyle
|
|
80
|
+
const mergedRaw = this.deepMerge(defaults, this.deepMerge(variantStyle, slideStyle));
|
|
81
|
+
|
|
82
|
+
return this.deepResolve(mergedRaw, tokens);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private static deepMerge(target: any, source: any): any {
|
|
86
|
+
if (!this.isObject(target) || !this.isObject(source)) {
|
|
87
|
+
return source;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const output = { ...target };
|
|
91
|
+
Object.keys(source).forEach(key => {
|
|
92
|
+
if (this.isObject(source[key])) {
|
|
93
|
+
if (!(key in target)) {
|
|
94
|
+
Object.assign(output, { [key]: source[key] });
|
|
95
|
+
} else {
|
|
96
|
+
output[key] = this.deepMerge(target[key], source[key]);
|
|
97
|
+
}
|
|
98
|
+
} else {
|
|
99
|
+
Object.assign(output, { [key]: source[key] });
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
return output;
|
|
58
103
|
}
|
|
59
104
|
|
|
60
105
|
private static deepResolve(obj: unknown, tokens: any): any {
|
|
@@ -119,4 +164,8 @@ export class ThemeLoader {
|
|
|
119
164
|
default: return num;
|
|
120
165
|
}
|
|
121
166
|
}
|
|
167
|
+
|
|
168
|
+
private static isObject(item: any): boolean {
|
|
169
|
+
return (item && typeof item === 'object' && !Array.isArray(item));
|
|
170
|
+
}
|
|
122
171
|
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
name: "Academico V2"
|
|
2
|
+
tokens:
|
|
3
|
+
colors:
|
|
4
|
+
primary: "#1a237e"
|
|
5
|
+
secondary: "#f3e5f5"
|
|
6
|
+
accent: "#b71c1c"
|
|
7
|
+
surface: "#fdfbf7"
|
|
8
|
+
text: "#212121"
|
|
9
|
+
heading: "#1a237e"
|
|
10
|
+
table_header: "#e8eaf6"
|
|
11
|
+
|
|
12
|
+
# Variant Specifics
|
|
13
|
+
kind1_bg: "#FFF8E1" # Warm paper-like
|
|
14
|
+
kind2_bg: "#ECEFF1" # Cool grey
|
|
15
|
+
kind2_color: "#263238"
|
|
16
|
+
|
|
17
|
+
fonts:
|
|
18
|
+
heading: "Times-Bold"
|
|
19
|
+
body: "Times-Roman"
|
|
20
|
+
mono: "Courier"
|
|
21
|
+
sans: "Helvetica"
|
|
22
|
+
|
|
23
|
+
defaults:
|
|
24
|
+
background:
|
|
25
|
+
type: "color"
|
|
26
|
+
value: "surface"
|
|
27
|
+
color: "text"
|
|
28
|
+
font_family: "body"
|
|
29
|
+
font_size: 20
|
|
30
|
+
content_align:
|
|
31
|
+
horizontal: "left"
|
|
32
|
+
vertical: "top"
|
|
33
|
+
|
|
34
|
+
variants:
|
|
35
|
+
kind_1:
|
|
36
|
+
background:
|
|
37
|
+
type: "color"
|
|
38
|
+
value: "kind1_bg"
|
|
39
|
+
color: "text"
|
|
40
|
+
font_family: "heading" # More formal headers for body too? logic check.
|
|
41
|
+
|
|
42
|
+
kind_2:
|
|
43
|
+
background:
|
|
44
|
+
type: "color"
|
|
45
|
+
value: "kind2_bg"
|
|
46
|
+
color: "kind2_color"
|
|
47
|
+
font_family: "sans" # Modern academic look
|
|
48
|
+
|
|
49
|
+
kind_3:
|
|
50
|
+
background:
|
|
51
|
+
type: "gradient"
|
|
52
|
+
colors: ["primary", "accent"]
|
|
53
|
+
direction: "45deg"
|
|
54
|
+
color: "surface" # Inverted for dark background
|
|
55
|
+
font_family: "heading"
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
name: "Corporativo V2"
|
|
2
|
+
tokens:
|
|
3
|
+
colors:
|
|
4
|
+
primary: "#2980b9"
|
|
5
|
+
secondary: "#dfe6e9"
|
|
6
|
+
accent: "#3498db"
|
|
7
|
+
surface: "#f0f2f5"
|
|
8
|
+
text: "#2c3e50"
|
|
9
|
+
heading: "#2980b9"
|
|
10
|
+
border: "#34495e"
|
|
11
|
+
|
|
12
|
+
# Variant Colors
|
|
13
|
+
kind1_bg: "#FFFFFF"
|
|
14
|
+
kind2_bg_start: "#2c3e50"
|
|
15
|
+
kind2_bg_end: "#4ca1af"
|
|
16
|
+
|
|
17
|
+
fonts:
|
|
18
|
+
heading: "Helvetica-Bold"
|
|
19
|
+
body: "Helvetica"
|
|
20
|
+
mono: "Courier New"
|
|
21
|
+
serif: "Times-Roman"
|
|
22
|
+
|
|
23
|
+
defaults:
|
|
24
|
+
background:
|
|
25
|
+
type: "color"
|
|
26
|
+
value: "surface"
|
|
27
|
+
color: "text"
|
|
28
|
+
font_family: "body"
|
|
29
|
+
font_size: 20
|
|
30
|
+
content_align:
|
|
31
|
+
horizontal: "left"
|
|
32
|
+
vertical: "top"
|
|
33
|
+
|
|
34
|
+
variants:
|
|
35
|
+
kind_1:
|
|
36
|
+
background:
|
|
37
|
+
type: "color"
|
|
38
|
+
value: "kind1_bg"
|
|
39
|
+
color: "primary" # High contrast brand color
|
|
40
|
+
font_family: "heading"
|
|
41
|
+
|
|
42
|
+
kind_2:
|
|
43
|
+
background:
|
|
44
|
+
type: "gradient"
|
|
45
|
+
colors: ["kind2_bg_start", "kind2_bg_end"]
|
|
46
|
+
direction: "to right"
|
|
47
|
+
color: "secondary" # Light text on dark
|
|
48
|
+
font_family: "body"
|
|
49
|
+
|
|
50
|
+
kind_3:
|
|
51
|
+
background:
|
|
52
|
+
type: "color"
|
|
53
|
+
value: "secondary"
|
|
54
|
+
color: "text"
|
|
55
|
+
font_family: "serif" # Classic corporate report style
|