@stonedeck/core 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/emitter.d.ts +6 -0
- package/dist/emitter.d.ts.map +1 -0
- package/dist/emitter.js +107 -0
- package/dist/emitter.js.map +1 -0
- package/dist/emitter.test.d.ts +2 -0
- package/dist/emitter.test.d.ts.map +1 -0
- package/dist/emitter.test.js +70 -0
- package/dist/emitter.test.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/interface/export-plugin.d.ts +5 -0
- package/dist/interface/export-plugin.d.ts.map +1 -0
- package/dist/interface/export-plugin.js +2 -0
- package/dist/interface/export-plugin.js.map +1 -0
- package/dist/layouts/layout-generator.d.ts +14 -0
- package/dist/layouts/layout-generator.d.ts.map +1 -0
- package/dist/layouts/layout-generator.js +110 -0
- package/dist/layouts/layout-generator.js.map +1 -0
- package/dist/layouts/registry.json +290 -0
- package/dist/layouts/validator.d.ts +7 -0
- package/dist/layouts/validator.d.ts.map +1 -0
- package/dist/layouts/validator.js +27 -0
- package/dist/layouts/validator.js.map +1 -0
- package/dist/layouts/validator.test.d.ts +2 -0
- package/dist/layouts/validator.test.d.ts.map +1 -0
- package/dist/layouts/validator.test.js +19 -0
- package/dist/layouts/validator.test.js.map +1 -0
- package/dist/models/ir.d.ts +91 -0
- package/dist/models/ir.d.ts.map +1 -0
- package/dist/models/ir.js +2 -0
- package/dist/models/ir.js.map +1 -0
- package/dist/parser/image-mapper.d.ts +8 -0
- package/dist/parser/image-mapper.d.ts.map +1 -0
- package/dist/parser/image-mapper.js +15 -0
- package/dist/parser/image-mapper.js.map +1 -0
- package/dist/parser/list-mapper.d.ts +3 -0
- package/dist/parser/list-mapper.d.ts.map +1 -0
- package/dist/parser/list-mapper.js +24 -0
- package/dist/parser/list-mapper.js.map +1 -0
- package/dist/parser/list-mapper.test.d.ts +2 -0
- package/dist/parser/list-mapper.test.d.ts.map +1 -0
- package/dist/parser/list-mapper.test.js +26 -0
- package/dist/parser/list-mapper.test.js.map +1 -0
- package/dist/parser/manifesto.d.ts +9 -0
- package/dist/parser/manifesto.d.ts.map +1 -0
- package/dist/parser/manifesto.js +40 -0
- package/dist/parser/manifesto.js.map +1 -0
- package/dist/parser/manifesto.test.d.ts +2 -0
- package/dist/parser/manifesto.test.d.ts.map +1 -0
- package/dist/parser/manifesto.test.js +32 -0
- package/dist/parser/manifesto.test.js.map +1 -0
- package/dist/parser/table-mapper.d.ts +7 -0
- package/dist/parser/table-mapper.d.ts.map +1 -0
- package/dist/parser/table-mapper.js +33 -0
- package/dist/parser/table-mapper.js.map +1 -0
- package/dist/parser/tokenizer.d.ts +4 -0
- package/dist/parser/tokenizer.d.ts.map +1 -0
- package/dist/parser/tokenizer.js +103 -0
- package/dist/parser/tokenizer.js.map +1 -0
- package/dist/parser/tokenizer.test.d.ts +2 -0
- package/dist/parser/tokenizer.test.d.ts.map +1 -0
- package/dist/parser/tokenizer.test.js +31 -0
- package/dist/parser/tokenizer.test.js.map +1 -0
- package/dist/processor.d.ts +3 -0
- package/dist/processor.d.ts.map +1 -0
- package/dist/processor.js +5 -0
- package/dist/processor.js.map +1 -0
- package/dist/resolver/metrics.d.ts +27 -0
- package/dist/resolver/metrics.d.ts.map +1 -0
- package/dist/resolver/metrics.js +43 -0
- package/dist/resolver/metrics.js.map +1 -0
- package/dist/resolver/metrics.test.d.ts +2 -0
- package/dist/resolver/metrics.test.d.ts.map +1 -0
- package/dist/resolver/metrics.test.js +23 -0
- package/dist/resolver/metrics.test.js.map +1 -0
- package/dist/resolver/theme-loader.d.ts +17 -0
- package/dist/resolver/theme-loader.d.ts.map +1 -0
- package/dist/resolver/theme-loader.js +110 -0
- package/dist/resolver/theme-loader.js.map +1 -0
- package/dist/resolver/theme-loader.test.d.ts +2 -0
- package/dist/resolver/theme-loader.test.d.ts.map +1 -0
- package/dist/resolver/theme-loader.test.js +60 -0
- package/dist/resolver/theme-loader.test.js.map +1 -0
- package/package.json +19 -0
- package/src/emitter.ts +118 -0
- package/src/index.ts +7 -0
- package/src/interface/export-plugin.ts +5 -0
- package/src/layouts/layout-generator.ts +116 -0
- package/src/layouts/registry.json +290 -0
- package/src/layouts/validator.ts +31 -0
- package/src/models/ir.ts +98 -0
- package/src/parser/image-mapper.ts +14 -0
- package/src/parser/list-mapper.ts +28 -0
- package/src/parser/manifesto.ts +49 -0
- package/src/parser/table-mapper.ts +38 -0
- package/src/parser/tokenizer.ts +126 -0
- package/src/processor.ts +6 -0
- package/src/resolver/metrics.ts +64 -0
- package/src/resolver/theme-loader.ts +122 -0
- package/src/themes/academico.yaml +25 -0
- package/src/themes/corporativo.yaml +25 -0
- package/src/themes/dark_mode.yaml +26 -0
- package/src/themes/minimalista.yaml +25 -0
- package/src/themes/moderno.yaml +26 -0
- package/test/cycle2_markdown.test.ts +36 -0
- package/test/cycle2_slides.test.ts +52 -0
- package/tsconfig.json +17 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const manifesto_1 = require("./manifesto");
|
|
4
|
+
describe('Manifesto Parser', () => {
|
|
5
|
+
it('should parse a valid manifesto', () => {
|
|
6
|
+
const content = '---\nStoneDeck: true\ntitle: "Test"\ntheme: "dark"\n---\nRemaining content';
|
|
7
|
+
const result = (0, manifesto_1.parseManifesto)(content);
|
|
8
|
+
expect(result.manifesto).toEqual({
|
|
9
|
+
StoneDeck: true,
|
|
10
|
+
title: "Test",
|
|
11
|
+
theme: "dark"
|
|
12
|
+
});
|
|
13
|
+
expect(result.remainingContent).toBe('Remaining content');
|
|
14
|
+
});
|
|
15
|
+
it('should throw error if manifesto block is missing', () => {
|
|
16
|
+
const content = 'Not a manifesto';
|
|
17
|
+
expect(() => (0, manifesto_1.parseManifesto)(content)).toThrow(manifesto_1.ManifestoValidationError);
|
|
18
|
+
});
|
|
19
|
+
it('should throw error if StoneDeck: true is missing', () => {
|
|
20
|
+
const content = '---\ntitle: "Test"\ntheme: "dark"\n---';
|
|
21
|
+
expect(() => (0, manifesto_1.parseManifesto)(content)).toThrow('Manifesto must contain "StoneDeck: true"');
|
|
22
|
+
});
|
|
23
|
+
it('should throw error if title is missing', () => {
|
|
24
|
+
const content = '---\nStoneDeck: true\ntheme: "dark"\n---';
|
|
25
|
+
expect(() => (0, manifesto_1.parseManifesto)(content)).toThrow('Manifesto must contain a "title"');
|
|
26
|
+
});
|
|
27
|
+
it('should throw error if theme is missing', () => {
|
|
28
|
+
const content = '---\nStoneDeck: true\ntitle: "Test"\n---';
|
|
29
|
+
expect(() => (0, manifesto_1.parseManifesto)(content)).toThrow('Manifesto must contain a "theme"');
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=manifesto.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifesto.test.js","sourceRoot":"","sources":["../../src/parser/manifesto.test.ts"],"names":[],"mappings":";;AAAA,2CAAuE;AAEvE,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACtC,MAAM,OAAO,GAAG,4EAA4E,CAAC;QAC7F,MAAM,MAAM,GAAG,IAAA,0BAAc,EAAC,OAAO,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;YAC7B,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,MAAM;SAChB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QACxD,MAAM,OAAO,GAAG,iBAAiB,CAAC;QAClC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,0BAAc,EAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,oCAAwB,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QACxD,MAAM,OAAO,GAAG,wCAAwC,CAAC;QACzD,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,0BAAc,EAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAC9C,MAAM,OAAO,GAAG,0CAA0C,CAAC;QAC3D,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,0BAAc,EAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAC9C,MAAM,OAAO,GAAG,0CAA0C,CAAC;QAC3D,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,0BAAc,EAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TableCell } from '../models/ir.js';
|
|
2
|
+
/**
|
|
3
|
+
* Simple Markdown table parser.
|
|
4
|
+
* It identifies tables and converts them into a 2D array of TableCells.
|
|
5
|
+
*/
|
|
6
|
+
export declare function mapMarkdownTable(markdown: string): TableCell[][] | null;
|
|
7
|
+
//# sourceMappingURL=table-mapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-mapper.d.ts","sourceRoot":"","sources":["../../src/parser/table-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,EAAE,GAAG,IAAI,CA+BvE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple Markdown table parser.
|
|
3
|
+
* It identifies tables and converts them into a 2D array of TableCells.
|
|
4
|
+
*/
|
|
5
|
+
export function mapMarkdownTable(markdown) {
|
|
6
|
+
const lines = markdown.split(/\r?\n/).map(l => l.trim()).filter(l => l.length > 0);
|
|
7
|
+
// Minimum table has 2 lines: header and delimiter
|
|
8
|
+
if (lines.length < 2)
|
|
9
|
+
return null;
|
|
10
|
+
// Check if the first line is a table header
|
|
11
|
+
const firstLine = lines[0];
|
|
12
|
+
if (!firstLine || !firstLine.startsWith('|') || !firstLine.endsWith('|'))
|
|
13
|
+
return null;
|
|
14
|
+
// Check for delimiter line (|---|---|)
|
|
15
|
+
const delimiterLine = lines[1];
|
|
16
|
+
if (!delimiterLine || !delimiterLine.includes('|') || !delimiterLine.includes('-'))
|
|
17
|
+
return null;
|
|
18
|
+
const rows = [];
|
|
19
|
+
// Helper to split row correctly
|
|
20
|
+
const splitRow = (row) => row.replace(/^\||\|$/g, '').split('|').map(c => c.trim());
|
|
21
|
+
const headers = splitRow(firstLine);
|
|
22
|
+
rows.push(headers.map(h => ({ text: h, isHeader: true })));
|
|
23
|
+
// Parse Body
|
|
24
|
+
for (let i = 2; i < lines.length; i++) {
|
|
25
|
+
const line = lines[i];
|
|
26
|
+
if (!line || !line.startsWith('|'))
|
|
27
|
+
break;
|
|
28
|
+
const cells = splitRow(line);
|
|
29
|
+
rows.push(cells.map(c => ({ text: c, isHeader: false })));
|
|
30
|
+
}
|
|
31
|
+
return rows.length > 1 ? rows : null;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=table-mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-mapper.js","sourceRoot":"","sources":["../../src/parser/table-mapper.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEnF,kDAAkD;IAClD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,4CAA4C;IAC5C,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtF,uCAAuC;IACvC,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEhG,MAAM,IAAI,GAAkB,EAAE,CAAC;IAE/B,gCAAgC;IAChC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAE5F,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE3D,aAAa;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,MAAM;QAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/parser/tokenizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAe,MAAM,iBAAiB,CAAC;AAGrD,wBAAgB,cAAc,CAAC,gBAAgB,EAAE,MAAM,GAAG,KAAK,EAAE,CA0ChE;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAGpD"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import * as YAML from 'yaml';
|
|
2
|
+
import { mapMarkdownImage } from './image-mapper.js';
|
|
3
|
+
export function tokenizeSlides(remainingContent) {
|
|
4
|
+
// Slides are separated by ---
|
|
5
|
+
// Note: Since the content starts after the manifesto ---, the first slide delimiter might already be consumed or not exist.
|
|
6
|
+
// The RFC says: "O motor divide o restante do documento por ---."
|
|
7
|
+
const slideBlocks = remainingContent.split(/\r?\n---\r?\n/);
|
|
8
|
+
const slides = [];
|
|
9
|
+
for (const block of slideBlocks) {
|
|
10
|
+
if (!block.trim())
|
|
11
|
+
continue;
|
|
12
|
+
// Each slide block: Toggle between A (Yaml) and B (Markdown)
|
|
13
|
+
// Actually the RFC says:
|
|
14
|
+
// Estado A (Config): YAML define layout e style
|
|
15
|
+
// Estado B (Conteúdo): Markdown injetado nos slots
|
|
16
|
+
// Pattern:
|
|
17
|
+
// layout: ...
|
|
18
|
+
// style: ...
|
|
19
|
+
// ---
|
|
20
|
+
// # Title
|
|
21
|
+
// ***
|
|
22
|
+
// Body
|
|
23
|
+
// In our case, the slide block itself contains BOTH parts separated by --- internally?
|
|
24
|
+
// RFC 8.3: "O motor divide o restante do documento por ---."
|
|
25
|
+
// "Estado A (Config): YAML"
|
|
26
|
+
// "Estado B (Conteúdo): Markdown"
|
|
27
|
+
// Wait, the RFC says "O motor divide o restante do documento por ---"
|
|
28
|
+
// And then says "Alternância de Contexto (Toggle): A (Config) -> B (Conteúdo)"
|
|
29
|
+
// This means Slide 1 Config --- Slide 1 Content --- Slide 2 Config --- Slide 2 Content
|
|
30
|
+
// Let's re-read carefully:
|
|
31
|
+
// 2. Iteração de Slides: O motor divide o restante do documento por ---.
|
|
32
|
+
// 3. Alternância de Contexto (Toggle): A (Config) -> B (Conteùdo)
|
|
33
|
+
// This implies that slide 1 is block 1 (config) and block 2 (content).
|
|
34
|
+
// Slide 2 is block 3 (config) and block 4 (content).
|
|
35
|
+
}
|
|
36
|
+
return slides;
|
|
37
|
+
}
|
|
38
|
+
export function parseSlides(content) {
|
|
39
|
+
// Strict V2 syntax: Content must be inside :::slide blocks
|
|
40
|
+
return parseSlidesV2(content);
|
|
41
|
+
}
|
|
42
|
+
function parseSlidesV2(content) {
|
|
43
|
+
const slides = [];
|
|
44
|
+
const slideRegex = /:::slide([\s\S]*?):::/g;
|
|
45
|
+
let match;
|
|
46
|
+
while ((match = slideRegex.exec(content)) !== null) {
|
|
47
|
+
const slideBlock = match[1]?.trim() || '';
|
|
48
|
+
// Extract Front Matter
|
|
49
|
+
// Pattern: ^--- (yaml) --- (content)$
|
|
50
|
+
const fmRegex = /^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/;
|
|
51
|
+
const fmMatch = slideBlock.match(fmRegex);
|
|
52
|
+
let config = {};
|
|
53
|
+
let rawContent = slideBlock;
|
|
54
|
+
if (fmMatch) {
|
|
55
|
+
const yamlStr = fmMatch[1] || '';
|
|
56
|
+
rawContent = fmMatch[2] || '';
|
|
57
|
+
try {
|
|
58
|
+
config = YAML.parse(yamlStr);
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
console.warn('Invalid YAML in slide:', e);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const layout_id = config.layout || 'blank';
|
|
65
|
+
const title = config.title;
|
|
66
|
+
const style = config.style || {};
|
|
67
|
+
const slots = parseSlots(rawContent);
|
|
68
|
+
slides.push({
|
|
69
|
+
layout_id,
|
|
70
|
+
title,
|
|
71
|
+
style,
|
|
72
|
+
slots
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return slides;
|
|
76
|
+
}
|
|
77
|
+
function parseSlots(content) {
|
|
78
|
+
let processedContent = content.trim();
|
|
79
|
+
// Handle comments inside content (Cycle 2 requirement)
|
|
80
|
+
// Removed here or handled by plugins? Actually comments should be removed BEFORE splitting slots?
|
|
81
|
+
// Let's assume content is pure markdown for now.
|
|
82
|
+
// Remove *-* at start/end
|
|
83
|
+
processedContent = processedContent.replace(/^\*-\*\s*[\r\n]+/, '');
|
|
84
|
+
processedContent = processedContent.replace(/[\r\n]+\s*\*-\*\s*$/, '');
|
|
85
|
+
const slots_content = processedContent
|
|
86
|
+
? processedContent.split(/\r?\n\*-\*\r?\n/).map(s => s.trim()).filter(s => s.length > 0)
|
|
87
|
+
: [];
|
|
88
|
+
// If no delimiters found but content exists, treat as single slot
|
|
89
|
+
if (slots_content.length === 0 && processedContent.length > 0) {
|
|
90
|
+
const img = mapMarkdownImage(processedContent);
|
|
91
|
+
if (img)
|
|
92
|
+
return [{ type: 'image', src: img.src, alt: img.alt }];
|
|
93
|
+
return [{ type: 'markdown', raw: processedContent }];
|
|
94
|
+
}
|
|
95
|
+
return slots_content.map(raw => {
|
|
96
|
+
const img = mapMarkdownImage(raw);
|
|
97
|
+
if (img) {
|
|
98
|
+
return { type: 'image', src: img.src, alt: img.alt };
|
|
99
|
+
}
|
|
100
|
+
return { type: 'markdown', raw };
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=tokenizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/parser/tokenizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.test.d.ts","sourceRoot":"","sources":["../../src/parser/tokenizer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tokenizer_1 = require("./tokenizer");
|
|
4
|
+
describe('Tokenizer', () => {
|
|
5
|
+
it('should parse slides from blocks', () => {
|
|
6
|
+
const blocks = [
|
|
7
|
+
'layout: title-slide',
|
|
8
|
+
'# Title\n## Subtitle',
|
|
9
|
+
'layout: two-columns',
|
|
10
|
+
'Left\n***\nRight'
|
|
11
|
+
];
|
|
12
|
+
const slides = (0, tokenizer_1.parseSlides)(blocks);
|
|
13
|
+
expect(slides.length).toBe(2);
|
|
14
|
+
expect(slides[0]?.layout_id).toBe('title-slide');
|
|
15
|
+
expect(slides[0]?.slots).toEqual([{ type: 'markdown', raw: '# Title\n## Subtitle' }]);
|
|
16
|
+
expect(slides[1]?.layout_id).toBe('two-columns');
|
|
17
|
+
expect(slides[1]?.slots).toEqual([
|
|
18
|
+
{ type: 'markdown', raw: 'Left' },
|
|
19
|
+
{ type: 'markdown', raw: 'Right' }
|
|
20
|
+
]);
|
|
21
|
+
});
|
|
22
|
+
it('should use default layout if not specified', () => {
|
|
23
|
+
const blocks = [
|
|
24
|
+
'style: { color: "primary" }',
|
|
25
|
+
'Content'
|
|
26
|
+
];
|
|
27
|
+
const slides = (0, tokenizer_1.parseSlides)(blocks);
|
|
28
|
+
expect(slides[0]?.layout_id).toBe('blank');
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=tokenizer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.test.js","sourceRoot":"","sources":["../../src/parser/tokenizer.test.ts"],"names":[],"mappings":";;AAAA,2CAA0C;AAE1C,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG;YACX,qBAAqB;YACrB,sBAAsB;YACtB,qBAAqB;YACrB,kBAAkB;SACrB,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,uBAAW,EAAC,MAAM,CAAC,CAAC;QAEnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC;QAEtF,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC;YAC7B,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE;YACjC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE;SACrC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG;YACX,6BAA6B;YAC7B,SAAS;SACZ,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,uBAAW,EAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../src/processor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,WAAW,CAEvG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processor.js","sourceRoot":"","sources":["../src/processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGtC,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,QAAgB,EAAE,aAAsB;IACtF,OAAO,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { SlideStyle } from '../models/ir.js';
|
|
2
|
+
export interface LayoutSlot {
|
|
3
|
+
id: string;
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
}
|
|
9
|
+
export interface LayoutDefinition {
|
|
10
|
+
id: string;
|
|
11
|
+
slots: LayoutSlot[];
|
|
12
|
+
}
|
|
13
|
+
export declare class MetricsCalculator {
|
|
14
|
+
private doc;
|
|
15
|
+
constructor();
|
|
16
|
+
/**
|
|
17
|
+
* Calculates the height of a string given a font and width.
|
|
18
|
+
*/
|
|
19
|
+
calculateTextHeight(text: string, style: SlideStyle, maxWidth: number): number;
|
|
20
|
+
/**
|
|
21
|
+
* Estimates height for Markdown content.
|
|
22
|
+
* For now, this is a simplified version that handles basic text and lists.
|
|
23
|
+
*/
|
|
24
|
+
estimateMarkdownHeight(markdown: string, style: SlideStyle, maxWidth: number): number;
|
|
25
|
+
}
|
|
26
|
+
export declare const metricsCalculator: MetricsCalculator;
|
|
27
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/resolver/metrics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,GAAG,CAAqB;;IAOhC;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAc9E;;;OAGG;IACH,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;CAgBxF;AAED,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import PDFDocument from 'pdfkit';
|
|
2
|
+
export class MetricsCalculator {
|
|
3
|
+
constructor() {
|
|
4
|
+
// Create a headless PDF document for measurements
|
|
5
|
+
this.doc = new PDFDocument({ size: [720, 405] });
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Calculates the height of a string given a font and width.
|
|
9
|
+
*/
|
|
10
|
+
calculateTextHeight(text, style, maxWidth) {
|
|
11
|
+
const fontSize = style.font_size || 18; // Default font size
|
|
12
|
+
const font = style.font_family || 'Helvetica'; // Default font
|
|
13
|
+
try {
|
|
14
|
+
this.doc.font(font).fontSize(fontSize);
|
|
15
|
+
return this.doc.heightOfString(text, { width: maxWidth });
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
// Fallback font if the requested one fails
|
|
19
|
+
this.doc.font('Helvetica').fontSize(fontSize);
|
|
20
|
+
return this.doc.heightOfString(text, { width: maxWidth });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Estimates height for Markdown content.
|
|
25
|
+
* For now, this is a simplified version that handles basic text and lists.
|
|
26
|
+
*/
|
|
27
|
+
estimateMarkdownHeight(markdown, style, maxWidth) {
|
|
28
|
+
// Simple heuristic: split by lines and sum heights
|
|
29
|
+
// In a real implementation, this would handle actual markdown parsing.
|
|
30
|
+
const lines = markdown.split('\n');
|
|
31
|
+
let totalHeight = 0;
|
|
32
|
+
for (const line of lines) {
|
|
33
|
+
if (!line.trim()) {
|
|
34
|
+
totalHeight += (style.font_size || 18) * 0.5; // Half line height for empty lines
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
totalHeight += this.calculateTextHeight(line, style, maxWidth);
|
|
38
|
+
}
|
|
39
|
+
return totalHeight;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export const metricsCalculator = new MetricsCalculator();
|
|
43
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/resolver/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,QAAQ,CAAC;AAgBjC,MAAM,OAAO,iBAAiB;IAG1B;QACI,kDAAkD;QAClD,IAAI,CAAC,GAAG,GAAG,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,IAAY,EAAE,KAAiB,EAAE,QAAgB;QACjE,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,oBAAoB;QAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,IAAI,WAAW,CAAC,CAAC,eAAe;QAE9D,IAAI,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,2CAA2C;YAC3C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9D,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,sBAAsB,CAAC,QAAgB,EAAE,KAAiB,EAAE,QAAgB;QACxE,mDAAmD;QACnD,uEAAuE;QACvE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACf,WAAW,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,mCAAmC;gBACjF,SAAS;YACb,CAAC;YACD,WAAW,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,WAAW,CAAC;IACvB,CAAC;CACJ;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.test.d.ts","sourceRoot":"","sources":["../../src/resolver/metrics.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const metrics_1 = require("./metrics");
|
|
4
|
+
describe('Metrics Calculator', () => {
|
|
5
|
+
it('should calculate basic text height', () => {
|
|
6
|
+
const height = metrics_1.metricsCalculator.calculateTextHeight('Hello World', { font_size: 18 }, 200);
|
|
7
|
+
expect(height).toBeGreaterThan(0);
|
|
8
|
+
expect(typeof height).toBe('number');
|
|
9
|
+
});
|
|
10
|
+
it('should estimate markdown height', () => {
|
|
11
|
+
const markdown = 'Line 1\nLine 2\nLine 3';
|
|
12
|
+
const height = metrics_1.metricsCalculator.estimateMarkdownHeight(markdown, { font_size: 18 }, 200);
|
|
13
|
+
const singleLineHeight = metrics_1.metricsCalculator.calculateTextHeight('Line 1', { font_size: 18 }, 200);
|
|
14
|
+
expect(height).toBeCloseTo(singleLineHeight * 3, -1);
|
|
15
|
+
});
|
|
16
|
+
it('should handle overflow estimation', () => {
|
|
17
|
+
const longText = 'This is a very long line that should definitely wrap and increase the total height of the text block significantly compared to a short line.';
|
|
18
|
+
const heightShort = metrics_1.metricsCalculator.calculateTextHeight('Short', { font_size: 18 }, 50);
|
|
19
|
+
const heightLong = metrics_1.metricsCalculator.calculateTextHeight(longText, { font_size: 18 }, 50);
|
|
20
|
+
expect(heightLong).toBeGreaterThan(heightShort);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=metrics.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.test.js","sourceRoot":"","sources":["../../src/resolver/metrics.test.ts"],"names":[],"mappings":";;AAAA,uCAA8C;AAE9C,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC1C,MAAM,MAAM,GAAG,2BAAiB,CAAC,mBAAmB,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QAC5F,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACvC,MAAM,QAAQ,GAAG,wBAAwB,CAAC;QAC1C,MAAM,MAAM,GAAG,2BAAiB,CAAC,sBAAsB,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1F,MAAM,gBAAgB,GAAG,2BAAiB,CAAC,mBAAmB,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QACjG,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QACzC,MAAM,QAAQ,GAAG,8IAA8I,CAAC;QAChK,MAAM,WAAW,GAAG,2BAAiB,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1F,MAAM,UAAU,GAAG,2BAAiB,CAAC,mBAAmB,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1F,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SlideStyle } from '../models/ir.js';
|
|
2
|
+
export declare class ThemeLoader {
|
|
3
|
+
private static __dirname;
|
|
4
|
+
private static presets;
|
|
5
|
+
static load(themeRef: string, basePath: string): any;
|
|
6
|
+
static resolveStyle(slideStyle: SlideStyle, theme: any): SlideStyle;
|
|
7
|
+
private static deepResolve;
|
|
8
|
+
private static resolveTokenValue;
|
|
9
|
+
/**
|
|
10
|
+
* Converts various units into Points (pt).
|
|
11
|
+
* 1px ≈ 0.75pt
|
|
12
|
+
* 1em ≈ 12pt (assuming 16px base)
|
|
13
|
+
* RFC 4.1: "Todas as unidades finais devem ser em pt (Pontos)."
|
|
14
|
+
*/
|
|
15
|
+
private static convertToPt;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=theme-loader.d.ts.map
|
|
@@ -0,0 +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;IAKnE,OAAO,CAAC,MAAM,CAAC,WAAW;IAsB1B,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAchC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;CAoB7B"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as YAML from 'yaml';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
export class ThemeLoader {
|
|
6
|
+
static load(themeRef, basePath) {
|
|
7
|
+
if (this.presets[themeRef]) {
|
|
8
|
+
return this.presets[themeRef];
|
|
9
|
+
}
|
|
10
|
+
const potentialPaths = [
|
|
11
|
+
path.isAbsolute(themeRef) ? themeRef : path.join(basePath, themeRef),
|
|
12
|
+
path.isAbsolute(themeRef) ? themeRef : path.join(basePath, 'themes', themeRef + '.yaml'),
|
|
13
|
+
path.join(this.__dirname, '../../themes', themeRef + '.yaml'), // When running from built/source
|
|
14
|
+
path.join(this.__dirname, '../../src/themes', themeRef + '.yaml'), // Fallback to src if not copied to dist
|
|
15
|
+
path.join(process.cwd(), 'src/themes', themeRef + '.yaml') // Development fall back
|
|
16
|
+
];
|
|
17
|
+
for (const p of potentialPaths) {
|
|
18
|
+
if (fs.existsSync(p)) {
|
|
19
|
+
try {
|
|
20
|
+
const fileContent = fs.readFileSync(p, 'utf8');
|
|
21
|
+
return YAML.parse(fileContent);
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
console.warn(`Failed to parse theme at ${p}:`, e);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
console.warn(`Theme "${themeRef}" not found. Falling back to standard.`);
|
|
29
|
+
return this.presets.standard;
|
|
30
|
+
}
|
|
31
|
+
static resolveStyle(slideStyle, theme) {
|
|
32
|
+
const tokens = theme.tokens || {};
|
|
33
|
+
return this.deepResolve(slideStyle, tokens);
|
|
34
|
+
}
|
|
35
|
+
static deepResolve(obj, tokens) {
|
|
36
|
+
if (typeof obj !== 'object' || obj === null) {
|
|
37
|
+
// Token resolution for strings
|
|
38
|
+
if (typeof obj === 'string') {
|
|
39
|
+
return this.resolveTokenValue(obj, tokens);
|
|
40
|
+
}
|
|
41
|
+
return obj;
|
|
42
|
+
}
|
|
43
|
+
if (Array.isArray(obj)) {
|
|
44
|
+
return obj.map(item => this.deepResolve(item, tokens));
|
|
45
|
+
}
|
|
46
|
+
const resolved = {};
|
|
47
|
+
for (const key in obj) {
|
|
48
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
49
|
+
resolved[key] = this.deepResolve(obj[key], tokens);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return resolved;
|
|
53
|
+
}
|
|
54
|
+
static resolveTokenValue(value, tokens) {
|
|
55
|
+
// 1. Try resolving as a color token (e.g., "primary")
|
|
56
|
+
if (tokens.colors?.[value])
|
|
57
|
+
return tokens.colors[value];
|
|
58
|
+
// 2. Try resolving as a font token (e.g., "heading")
|
|
59
|
+
if (tokens.fonts?.[value])
|
|
60
|
+
return tokens.fonts[value];
|
|
61
|
+
// 3. Try resolving as a spacing token
|
|
62
|
+
if (tokens.spacing?.[value])
|
|
63
|
+
return this.convertToPt(tokens.spacing[value]);
|
|
64
|
+
// 4. Try converting the string itself if it's a unit (e.g., "20px")
|
|
65
|
+
return this.convertToPt(value);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Converts various units into Points (pt).
|
|
69
|
+
* 1px ≈ 0.75pt
|
|
70
|
+
* 1em ≈ 12pt (assuming 16px base)
|
|
71
|
+
* RFC 4.1: "Todas as unidades finais devem ser em pt (Pontos)."
|
|
72
|
+
*/
|
|
73
|
+
static convertToPt(value) {
|
|
74
|
+
if (typeof value === 'number')
|
|
75
|
+
return value;
|
|
76
|
+
const match = value.match(/^([\d.]+)(px|em|rem|pt|%)?$/);
|
|
77
|
+
if (!match)
|
|
78
|
+
return value;
|
|
79
|
+
const numStr = match[1];
|
|
80
|
+
if (!numStr)
|
|
81
|
+
return value;
|
|
82
|
+
const num = parseFloat(numStr);
|
|
83
|
+
const unit = match[2];
|
|
84
|
+
switch (unit) {
|
|
85
|
+
case 'px': return num * 0.75;
|
|
86
|
+
case 'em':
|
|
87
|
+
case 'rem': return num * 12; // Simple approximation for 1em = 16px
|
|
88
|
+
case 'pt': return num;
|
|
89
|
+
default: return num;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
ThemeLoader.__dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
94
|
+
ThemeLoader.presets = {
|
|
95
|
+
dark: {
|
|
96
|
+
name: "Dark Preset",
|
|
97
|
+
tokens: {
|
|
98
|
+
colors: { primary: "#1A1A2E", secondary: "#16213E", accent: "#E94560", surface: "#0F3460", text: "#FFFFFF" },
|
|
99
|
+
fonts: { heading: "Montserrat", body: "Open Sans", mono: "Fira Code" }
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
standard: {
|
|
103
|
+
name: "Standard Preset",
|
|
104
|
+
tokens: {
|
|
105
|
+
colors: { primary: "#FFFFFF", secondary: "#F0F0F0", accent: "#007BFF", surface: "#FFFFFF", text: "#000000" },
|
|
106
|
+
fonts: { heading: "Inter", body: "Roboto", mono: "Courier New" }
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=theme-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-loader.js","sourceRoot":"","sources":["../../src/resolver/theme-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-loader.test.d.ts","sourceRoot":"","sources":["../../src/resolver/theme-loader.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const theme_loader_1 = require("./theme-loader");
|
|
4
|
+
describe('Theme Loader', () => {
|
|
5
|
+
const theme = {
|
|
6
|
+
tokens: {
|
|
7
|
+
colors: { primary: "#FF0000", accent: "#00FF00" },
|
|
8
|
+
fonts: { heading: "Arial" }
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
it('should resolve color tokens in style', () => {
|
|
12
|
+
const style = {
|
|
13
|
+
background: { type: 'color', value: 'primary' }
|
|
14
|
+
};
|
|
15
|
+
const resolved = theme_loader_1.ThemeLoader.resolveStyle(style, theme);
|
|
16
|
+
expect(resolved.background?.value).toBe('#FF0000');
|
|
17
|
+
});
|
|
18
|
+
it('should leave unknown colors as is', () => {
|
|
19
|
+
const style = {
|
|
20
|
+
background: { type: 'color', value: '#123456' }
|
|
21
|
+
};
|
|
22
|
+
const resolved = theme_loader_1.ThemeLoader.resolveStyle(style, theme);
|
|
23
|
+
expect(resolved.background?.value).toBe('#123456');
|
|
24
|
+
});
|
|
25
|
+
it('should resolve nested tokens', () => {
|
|
26
|
+
const style = {
|
|
27
|
+
card: { bg: 'primary', radius: '10px' }
|
|
28
|
+
};
|
|
29
|
+
const resolved = theme_loader_1.ThemeLoader.resolveStyle(style, theme);
|
|
30
|
+
expect(resolved.card?.bg).toBe('#FF0000');
|
|
31
|
+
expect(resolved.card?.radius).toBe(7.5); // 10px * 0.75
|
|
32
|
+
});
|
|
33
|
+
it('should resolve font tokens', () => {
|
|
34
|
+
const style = {
|
|
35
|
+
['font-family']: 'heading'
|
|
36
|
+
};
|
|
37
|
+
const resolved = theme_loader_1.ThemeLoader.resolveStyle(style, theme);
|
|
38
|
+
expect(resolved['font-family']).toBe('Arial');
|
|
39
|
+
});
|
|
40
|
+
it('should convert various units to pt', () => {
|
|
41
|
+
const style = {
|
|
42
|
+
padding: '20px',
|
|
43
|
+
margin: '1em',
|
|
44
|
+
size: '12pt'
|
|
45
|
+
};
|
|
46
|
+
const resolved = theme_loader_1.ThemeLoader.resolveStyle(style, theme);
|
|
47
|
+
expect(resolved.padding).toBe(15); // 20 * 0.75
|
|
48
|
+
expect(resolved.margin).toBe(12); // 1 * 12
|
|
49
|
+
expect(resolved.size).toBe(12);
|
|
50
|
+
});
|
|
51
|
+
it('should load preset themes', () => {
|
|
52
|
+
const loaded = theme_loader_1.ThemeLoader.load('dark', '');
|
|
53
|
+
expect(loaded.tokens.colors.primary).toBe('#1A1A2E');
|
|
54
|
+
});
|
|
55
|
+
it('should fall back to standard for unknown themes', () => {
|
|
56
|
+
const loaded = theme_loader_1.ThemeLoader.load('unknown', '');
|
|
57
|
+
expect(loaded.tokens.colors.primary).toBe('#FFFFFF');
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=theme-loader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-loader.test.js","sourceRoot":"","sources":["../../src/resolver/theme-loader.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@stonedeck/core",
|
|
3
|
+
"version": "0.7.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc -b"
|
|
9
|
+
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@types/pdfkit": "^0.17.4",
|
|
12
|
+
"pdfkit": "^0.17.2",
|
|
13
|
+
"yaml": "^2.3.4"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@types/node": "^20.0.0",
|
|
17
|
+
"typescript": "^5.0.0"
|
|
18
|
+
}
|
|
19
|
+
}
|