@gannochenko/staticstripes 0.0.18 → 0.0.20
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/app-renderer.d.ts +29 -0
- package/dist/app-renderer.d.ts.map +1 -0
- package/dist/app-renderer.js +151 -0
- package/dist/app-renderer.js.map +1 -0
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +2 -1
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/html-parser.d.ts +5 -0
- package/dist/html-parser.d.ts.map +1 -1
- package/dist/html-parser.js +33 -1
- package/dist/html-parser.js.map +1 -1
- package/dist/html-project-parser.d.ts +11 -0
- package/dist/html-project-parser.d.ts.map +1 -1
- package/dist/html-project-parser.js +56 -6
- package/dist/html-project-parser.js.map +1 -1
- package/dist/project.d.ts +9 -1
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +46 -1
- package/dist/project.js.map +1 -1
- package/dist/type.d.ts +6 -0
- package/dist/type.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/app-renderer.ts +229 -0
- package/src/cli/commands/generate.ts +2 -1
- package/src/duration-trim.test.ts +276 -0
- package/src/html-parser.ts +37 -1
- package/src/html-project-parser.ts +69 -3
- package/src/project.ts +72 -0
- package/src/type.ts +8 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Browser } from 'puppeteer';
|
|
2
|
+
import { App } from './type';
|
|
3
|
+
export interface RenderAppOptions {
|
|
4
|
+
app: App;
|
|
5
|
+
width: number;
|
|
6
|
+
height: number;
|
|
7
|
+
projectDir: string;
|
|
8
|
+
outputName: string;
|
|
9
|
+
title: string;
|
|
10
|
+
date?: string;
|
|
11
|
+
tags: string[];
|
|
12
|
+
browser?: Browser;
|
|
13
|
+
}
|
|
14
|
+
export interface AppRenderResult {
|
|
15
|
+
app: App;
|
|
16
|
+
screenshotPath: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Renders a React (or any SPA) app to a PNG screenshot using Puppeteer.
|
|
20
|
+
* The app must dispatch a "sts-render-complete" custom event on document
|
|
21
|
+
* when it is fully rendered. If the event is not received within
|
|
22
|
+
* RENDER_TIMEOUT_MS, an error is thrown.
|
|
23
|
+
*/
|
|
24
|
+
export declare function renderApp(options: RenderAppOptions): Promise<AppRenderResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Renders multiple apps in sequence, reusing a single browser instance.
|
|
27
|
+
*/
|
|
28
|
+
export declare function renderApps(apps: App[], width: number, height: number, projectDir: string, outputName: string, title: string, date: string | undefined, tags: string[], activeCacheKeys?: Set<string>): Promise<AppRenderResult[]>;
|
|
29
|
+
//# sourceMappingURL=app-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-renderer.d.ts","sourceRoot":"","sources":["../src/app-renderer.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAK/C,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAI7B,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,GAAG,CAAC;IACT,cAAc,EAAE,MAAM,CAAC;CACxB;AAoBD;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAkHnF;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,GAAG,EAAE,EACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,IAAI,EAAE,MAAM,EAAE,EACd,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAC5B,OAAO,CAAC,eAAe,EAAE,CAAC,CAiD5B"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.renderApp = renderApp;
|
|
7
|
+
exports.renderApps = renderApps;
|
|
8
|
+
const puppeteer_1 = __importDefault(require("puppeteer"));
|
|
9
|
+
const promises_1 = require("fs/promises");
|
|
10
|
+
const path_1 = require("path");
|
|
11
|
+
const fs_1 = require("fs");
|
|
12
|
+
const crypto_1 = require("crypto");
|
|
13
|
+
const RENDER_TIMEOUT_MS = 5000;
|
|
14
|
+
function generateAppCacheKey(src, parameters, title, date, tags, outputName) {
|
|
15
|
+
const hash = (0, crypto_1.createHash)('sha256');
|
|
16
|
+
hash.update(src);
|
|
17
|
+
hash.update(JSON.stringify(parameters));
|
|
18
|
+
hash.update(title);
|
|
19
|
+
hash.update(date ?? '');
|
|
20
|
+
hash.update(tags.join(','));
|
|
21
|
+
hash.update(outputName);
|
|
22
|
+
return hash.digest('hex').substring(0, 16);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Renders a React (or any SPA) app to a PNG screenshot using Puppeteer.
|
|
26
|
+
* The app must dispatch a "sts-render-complete" custom event on document
|
|
27
|
+
* when it is fully rendered. If the event is not received within
|
|
28
|
+
* RENDER_TIMEOUT_MS, an error is thrown.
|
|
29
|
+
*/
|
|
30
|
+
async function renderApp(options) {
|
|
31
|
+
const { app, width, height, projectDir, outputName, title, date, tags, browser: sharedBrowser } = options;
|
|
32
|
+
// Create cache directory
|
|
33
|
+
const cacheDir = (0, path_1.resolve)(projectDir, 'cache', 'apps');
|
|
34
|
+
if (!(0, fs_1.existsSync)(cacheDir)) {
|
|
35
|
+
await (0, promises_1.mkdir)(cacheDir, { recursive: true });
|
|
36
|
+
}
|
|
37
|
+
// Generate cache key from all inputs that affect output
|
|
38
|
+
const cacheKey = generateAppCacheKey(app.src, app.parameters, title, date, tags, outputName);
|
|
39
|
+
const screenshotPath = (0, path_1.resolve)(cacheDir, `${cacheKey}.png`);
|
|
40
|
+
// Return cached result if available
|
|
41
|
+
if ((0, fs_1.existsSync)(screenshotPath)) {
|
|
42
|
+
console.log(`Using cached app "${app.id}" (hash: ${cacheKey}) from ${screenshotPath}`);
|
|
43
|
+
return { app, screenshotPath };
|
|
44
|
+
}
|
|
45
|
+
// Resolve index.html
|
|
46
|
+
const appDir = (0, path_1.isAbsolute)(app.src)
|
|
47
|
+
? app.src
|
|
48
|
+
: (0, path_1.resolve)(projectDir, app.src);
|
|
49
|
+
const indexPath = (0, path_1.resolve)(appDir, 'index.html');
|
|
50
|
+
if (!(0, fs_1.existsSync)(indexPath)) {
|
|
51
|
+
throw new Error(`App "${app.id}": index.html not found at ${indexPath}`);
|
|
52
|
+
}
|
|
53
|
+
// Build URL with query parameters.
|
|
54
|
+
// Metadata (title, date, tags) is always injected; extra parameters from
|
|
55
|
+
// data-parameters are merged in afterwards and can override metadata keys.
|
|
56
|
+
const searchParams = new URLSearchParams({ rendering: '' });
|
|
57
|
+
searchParams.set('title', title);
|
|
58
|
+
if (date)
|
|
59
|
+
searchParams.set('date', date);
|
|
60
|
+
if (tags.length > 0)
|
|
61
|
+
searchParams.set('tags', tags.join(','));
|
|
62
|
+
for (const [key, value] of Object.entries(app.parameters)) {
|
|
63
|
+
searchParams.set(key, value);
|
|
64
|
+
}
|
|
65
|
+
const url = `file://${indexPath}?${searchParams.toString()}`;
|
|
66
|
+
console.log(`\nRendering app "${app.id}" from ${url}`);
|
|
67
|
+
const ownBrowser = sharedBrowser
|
|
68
|
+
? null
|
|
69
|
+
: await puppeteer_1.default.launch({
|
|
70
|
+
headless: true,
|
|
71
|
+
args: ['--no-sandbox', '--disable-setuid-sandbox'],
|
|
72
|
+
});
|
|
73
|
+
const browser = sharedBrowser ?? ownBrowser;
|
|
74
|
+
const page = await browser.newPage();
|
|
75
|
+
try {
|
|
76
|
+
await page.setViewport({ width, height });
|
|
77
|
+
page.on('console', (msg) => console.log(`[app:${app.id}] console.${msg.type()}: ${msg.text()}`));
|
|
78
|
+
page.on('pageerror', (err) => console.error(`[app:${app.id}] page error: ${String(err)}`));
|
|
79
|
+
page.on('requestfailed', (req) => console.error(`[app:${app.id}] request failed: ${req.url()} — ${req.failure()?.errorText}`));
|
|
80
|
+
// Initialise the flag before navigation. The app sets it to true directly
|
|
81
|
+
// via window.__stsRenderComplete = true inside its useEffect, so no event
|
|
82
|
+
// listener is needed on this side.
|
|
83
|
+
await page.evaluateOnNewDocument(`window.__stsRenderComplete = false;`);
|
|
84
|
+
await page.goto(url, { waitUntil: 'networkidle0' });
|
|
85
|
+
// Wait for the app to signal it is done rendering
|
|
86
|
+
await page
|
|
87
|
+
.waitForFunction('window.__stsRenderComplete === true', {
|
|
88
|
+
timeout: RENDER_TIMEOUT_MS,
|
|
89
|
+
})
|
|
90
|
+
.catch(() => {
|
|
91
|
+
throw new Error(`App "${app.id}" did not set window.__stsRenderComplete within ${RENDER_TIMEOUT_MS}ms`);
|
|
92
|
+
});
|
|
93
|
+
// Screenshot with transparent background
|
|
94
|
+
const screenshot = await page.screenshot({
|
|
95
|
+
type: 'png',
|
|
96
|
+
omitBackground: true,
|
|
97
|
+
clip: { x: 0, y: 0, width, height },
|
|
98
|
+
});
|
|
99
|
+
await (0, promises_1.writeFile)(screenshotPath, screenshot);
|
|
100
|
+
console.log(`Rendered app "${app.id}" (hash: ${cacheKey}) to ${screenshotPath}`);
|
|
101
|
+
return { app, screenshotPath };
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
await page.close();
|
|
105
|
+
if (ownBrowser)
|
|
106
|
+
await ownBrowser.close();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Renders multiple apps in sequence, reusing a single browser instance.
|
|
111
|
+
*/
|
|
112
|
+
async function renderApps(apps, width, height, projectDir, outputName, title, date, tags, activeCacheKeys) {
|
|
113
|
+
const results = [];
|
|
114
|
+
// Launch once and reuse across all apps.
|
|
115
|
+
// --allow-file-access-from-files is required so Chromium allows
|
|
116
|
+
// <script type="module"> and <link> tags to load sibling files
|
|
117
|
+
// when the page itself is served via file://.
|
|
118
|
+
const browser = await puppeteer_1.default.launch({
|
|
119
|
+
headless: true,
|
|
120
|
+
args: [
|
|
121
|
+
'--no-sandbox',
|
|
122
|
+
'--disable-setuid-sandbox',
|
|
123
|
+
'--allow-file-access-from-files',
|
|
124
|
+
],
|
|
125
|
+
});
|
|
126
|
+
try {
|
|
127
|
+
for (const app of apps) {
|
|
128
|
+
const cacheKey = generateAppCacheKey(app.src, app.parameters, title, date, tags, outputName);
|
|
129
|
+
if (activeCacheKeys) {
|
|
130
|
+
activeCacheKeys.add(cacheKey);
|
|
131
|
+
}
|
|
132
|
+
const result = await renderApp({
|
|
133
|
+
app,
|
|
134
|
+
width,
|
|
135
|
+
height,
|
|
136
|
+
projectDir,
|
|
137
|
+
outputName,
|
|
138
|
+
title,
|
|
139
|
+
date,
|
|
140
|
+
tags,
|
|
141
|
+
browser,
|
|
142
|
+
});
|
|
143
|
+
results.push(result);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
finally {
|
|
147
|
+
await browser.close();
|
|
148
|
+
}
|
|
149
|
+
return results;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=app-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-renderer.js","sourceRoot":"","sources":["../src/app-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,MAAM,OAAO,EAC1B,WAAW,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,GACnD,IAAI,
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,MAAM,OAAO,EAC1B,WAAW,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,GACnD,IAAI,CAwON"}
|
|
@@ -137,8 +137,9 @@ function registerGenerateCommand(program, isDebugMode, handleError) {
|
|
|
137
137
|
console.log(`📂 Creating output directory: ${outputDir}`);
|
|
138
138
|
(0, fs_1.mkdirSync)(outputDir, { recursive: true });
|
|
139
139
|
}
|
|
140
|
-
// Render containers for this output (accumulate cache keys)
|
|
140
|
+
// Render containers and apps for this output (accumulate cache keys)
|
|
141
141
|
await project.renderContainers(outputName, activeCacheKeys);
|
|
142
|
+
await project.renderApps(outputName, activeCacheKeys);
|
|
142
143
|
// Print project statistics
|
|
143
144
|
project.printStats();
|
|
144
145
|
// Build filter graph
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"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"}
|
package/dist/html-parser.d.ts
CHANGED
|
@@ -38,6 +38,11 @@ export declare class HTMLParser {
|
|
|
38
38
|
* Applies CSS rules to all elements in the AST
|
|
39
39
|
*/
|
|
40
40
|
private traverseAndApplyStyles;
|
|
41
|
+
/**
|
|
42
|
+
* Parses inline style attribute into CSS properties
|
|
43
|
+
* Example: "color: red; font-size: 16px;" => { color: "red", "font-size": "16px" }
|
|
44
|
+
*/
|
|
45
|
+
private parseInlineStyle;
|
|
41
46
|
}
|
|
42
47
|
/**
|
|
43
48
|
* Helper to find elements by tag name in the AST
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-parser.d.ts","sourceRoot":"","sources":["../src/html-parser.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,MAAM,OAAO,GAAG,OAAO,CAAC;AAC9B,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAElC,MAAM,WAAW,eAAgB,SAAQ,OAAO;IAC9C,cAAc,CAAC,EAAE,aAAa,CAAC;CAChC;AAOD,qBAAa,UAAU;IACrB;;;;OAIG;IACU,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAK7D;;;;OAIG;IACI,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAmBtC;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;OAEG;IACH,OAAO,CAAC,eAAe;IA2BvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAKrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,sBAAsB;
|
|
1
|
+
{"version":3,"file":"html-parser.d.ts","sourceRoot":"","sources":["../src/html-parser.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,MAAM,OAAO,GAAG,OAAO,CAAC;AAC9B,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAElC,MAAM,WAAW,eAAgB,SAAQ,OAAO;IAC9C,cAAc,CAAC,EAAE,aAAa,CAAC;CAChC;AAOD,qBAAa,UAAU;IACrB;;;;OAIG;IACU,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAK7D;;;;OAIG;IACI,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAmBtC;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;OAEG;IACH,OAAO,CAAC,eAAe;IA2BvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAKrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqC9B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CAwBzB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,GACd,OAAO,EAAE,CAiBX;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAiBpD"}
|
package/dist/html-parser.js
CHANGED
|
@@ -137,12 +137,18 @@ class HTMLParser {
|
|
|
137
137
|
if (currentNode.type === 'tag') {
|
|
138
138
|
const element = currentNode;
|
|
139
139
|
const computedStyles = {};
|
|
140
|
-
// Apply matching rules
|
|
140
|
+
// Apply matching rules (CSS classes)
|
|
141
141
|
for (const rule of styleRules) {
|
|
142
142
|
if (this.matchesSelector(element, rule.selector)) {
|
|
143
143
|
Object.assign(computedStyles, rule.properties);
|
|
144
144
|
}
|
|
145
145
|
}
|
|
146
|
+
// Apply inline style attribute (highest priority)
|
|
147
|
+
const inlineStyle = element.attribs?.style;
|
|
148
|
+
if (inlineStyle) {
|
|
149
|
+
const inlineProperties = this.parseInlineStyle(inlineStyle);
|
|
150
|
+
Object.assign(computedStyles, inlineProperties);
|
|
151
|
+
}
|
|
146
152
|
elementsMap.set(element, computedStyles);
|
|
147
153
|
}
|
|
148
154
|
if ('children' in currentNode && currentNode.children) {
|
|
@@ -153,6 +159,32 @@ class HTMLParser {
|
|
|
153
159
|
};
|
|
154
160
|
traverse(node);
|
|
155
161
|
}
|
|
162
|
+
/**
|
|
163
|
+
* Parses inline style attribute into CSS properties
|
|
164
|
+
* Example: "color: red; font-size: 16px;" => { color: "red", "font-size": "16px" }
|
|
165
|
+
*/
|
|
166
|
+
parseInlineStyle(styleText) {
|
|
167
|
+
const properties = {};
|
|
168
|
+
try {
|
|
169
|
+
// Wrap in a dummy rule for CSS parsing
|
|
170
|
+
const css = `.dummy { ${styleText} }`;
|
|
171
|
+
const ast = csstree.parse(css);
|
|
172
|
+
csstree.walk(ast, {
|
|
173
|
+
visit: 'Declaration',
|
|
174
|
+
enter: (node) => {
|
|
175
|
+
const decl = node;
|
|
176
|
+
const property = decl.property;
|
|
177
|
+
const value = csstree.generate(decl.value);
|
|
178
|
+
properties[property] = value;
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
// If parsing fails, log and continue without inline styles
|
|
184
|
+
console.warn(`Failed to parse inline style: "${styleText}"`, error);
|
|
185
|
+
}
|
|
186
|
+
return properties;
|
|
187
|
+
}
|
|
156
188
|
}
|
|
157
189
|
exports.HTMLParser = HTMLParser;
|
|
158
190
|
/**
|
package/dist/html-parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-parser.js","sourceRoot":"","sources":["../src/html-parser.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"html-parser.js","sourceRoot":"","sources":["../src/html-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -182,6 +182,12 @@ export declare class HTMLProjectParser {
|
|
|
182
182
|
* Extracts the first <container> child from a fragment element
|
|
183
183
|
*/
|
|
184
184
|
private extractFragmentContainer;
|
|
185
|
+
/**
|
|
186
|
+
* Extracts the first <app> child from a fragment element.
|
|
187
|
+
* The src attribute points to the app's dst directory (relative to project).
|
|
188
|
+
* The data-parameters attribute is parsed as JSON and merged into query params.
|
|
189
|
+
*/
|
|
190
|
+
private extractFragmentApp;
|
|
185
191
|
/**
|
|
186
192
|
* Serializes an element's children to HTML string
|
|
187
193
|
*/
|
|
@@ -202,6 +208,11 @@ export declare class HTMLProjectParser {
|
|
|
202
208
|
* Cannot be negative
|
|
203
209
|
*/
|
|
204
210
|
private parseTrimStart;
|
|
211
|
+
/**
|
|
212
|
+
* Parses -trim-end property into trimRight
|
|
213
|
+
* Cannot be negative
|
|
214
|
+
*/
|
|
215
|
+
private parseTrimEnd;
|
|
205
216
|
/**
|
|
206
217
|
* Parses the -duration CSS property
|
|
207
218
|
* Can be: "auto", percentage (e.g. "100%", "50%"), or time value (e.g. "5000ms", "5s")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-project-parser.d.ts","sourceRoot":"","sources":["../src/html-project-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,
|
|
1
|
+
{"version":3,"file":"html-project-parser.d.ts","sourceRoot":"","sources":["../src/html-project-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -72,7 +72,7 @@ class HTMLProjectParser {
|
|
|
72
72
|
const uploads = this.processUploads(title, globalTags);
|
|
73
73
|
const sequences = this.processSequences(assets);
|
|
74
74
|
const cssText = this.html.cssText;
|
|
75
|
-
return new project_1.Project(sequences, assets, outputs, ffmpegOptions, uploads, aiProviders, title, date, cssText, this.projectPath);
|
|
75
|
+
return new project_1.Project(sequences, assets, outputs, ffmpegOptions, uploads, aiProviders, title, date, globalTags, cssText, this.projectPath);
|
|
76
76
|
}
|
|
77
77
|
/**
|
|
78
78
|
* Validates that all asset files exist on the filesystem
|
|
@@ -1297,12 +1297,15 @@ class HTMLProjectParser {
|
|
|
1297
1297
|
const assetName = attrs.get('data-asset') || styles['-asset'] || '';
|
|
1298
1298
|
// 3. Check enabled flag from display property
|
|
1299
1299
|
const enabled = this.parseEnabled(styles['display']);
|
|
1300
|
-
// 4. Extract container if present (first one only)
|
|
1300
|
+
// 4. Extract container or app if present (first one only, mutually exclusive)
|
|
1301
1301
|
const container = this.extractFragmentContainer(element);
|
|
1302
|
+
const app = container ? undefined : this.extractFragmentApp(element);
|
|
1302
1303
|
// 5. Parse trimLeft from -trim-start property
|
|
1303
1304
|
const trimLeft = this.parseTrimStart(styles['-trim-start']);
|
|
1305
|
+
// 5b. Parse trimRight from -trim-end property
|
|
1306
|
+
const trimRight = this.parseTrimEnd(styles['-trim-end']);
|
|
1304
1307
|
// 6. Parse duration from -duration property
|
|
1305
|
-
const duration = this.parseDurationProperty(styles['-duration'], assetName, assets, trimLeft);
|
|
1308
|
+
const duration = this.parseDurationProperty(styles['-duration'], assetName, assets, trimLeft, trimRight);
|
|
1306
1309
|
// 7. Parse -offset-start for overlayLeft (can be number or expression)
|
|
1307
1310
|
const overlayLeft = this.parseOffsetStart(styles['-offset-start']);
|
|
1308
1311
|
// 8. Parse -offset-end for overlayRight (temporary, will be normalized)
|
|
@@ -1349,6 +1352,7 @@ class HTMLProjectParser {
|
|
|
1349
1352
|
chromakeyColor: chromakeyData.chromakeyColor,
|
|
1350
1353
|
...(visualFilter && { visualFilter }), // Add visualFilter if present
|
|
1351
1354
|
...(container && { container }), // Add container if present
|
|
1355
|
+
...(app && { app }), // Add app if present
|
|
1352
1356
|
...(timecodeLabel && { timecodeLabel }), // Add timecode label if present
|
|
1353
1357
|
};
|
|
1354
1358
|
}
|
|
@@ -1390,6 +1394,40 @@ class HTMLProjectParser {
|
|
|
1390
1394
|
}
|
|
1391
1395
|
return undefined;
|
|
1392
1396
|
}
|
|
1397
|
+
/**
|
|
1398
|
+
* Extracts the first <app> child from a fragment element.
|
|
1399
|
+
* The src attribute points to the app's dst directory (relative to project).
|
|
1400
|
+
* The data-parameters attribute is parsed as JSON and merged into query params.
|
|
1401
|
+
*/
|
|
1402
|
+
extractFragmentApp(element) {
|
|
1403
|
+
if (!('children' in element) || !element.children) {
|
|
1404
|
+
return undefined;
|
|
1405
|
+
}
|
|
1406
|
+
for (const child of element.children) {
|
|
1407
|
+
if (child.type === 'tag' && child.name === 'app') {
|
|
1408
|
+
const appElement = child;
|
|
1409
|
+
const id = appElement.attribs?.id ||
|
|
1410
|
+
`app_${Math.random().toString(36).substring(2, 11)}`;
|
|
1411
|
+
const src = appElement.attribs?.src ?? '';
|
|
1412
|
+
let parameters = {};
|
|
1413
|
+
const dataParameters = appElement.attribs?.['data-parameters'];
|
|
1414
|
+
if (dataParameters) {
|
|
1415
|
+
try {
|
|
1416
|
+
const parsed = JSON.parse(dataParameters);
|
|
1417
|
+
// Convert all values to strings for query parameters
|
|
1418
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
1419
|
+
parameters[key] = String(value);
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
catch {
|
|
1423
|
+
console.warn(`Warning: invalid JSON in data-parameters for app "${id}": ${dataParameters}`);
|
|
1424
|
+
}
|
|
1425
|
+
}
|
|
1426
|
+
return { id, src, parameters };
|
|
1427
|
+
}
|
|
1428
|
+
}
|
|
1429
|
+
return undefined;
|
|
1430
|
+
}
|
|
1393
1431
|
/**
|
|
1394
1432
|
* Serializes an element's children to HTML string
|
|
1395
1433
|
*/
|
|
@@ -1477,18 +1515,30 @@ class HTMLProjectParser {
|
|
|
1477
1515
|
// Ensure non-negative as per spec
|
|
1478
1516
|
return Math.max(0, value);
|
|
1479
1517
|
}
|
|
1518
|
+
/**
|
|
1519
|
+
* Parses -trim-end property into trimRight
|
|
1520
|
+
* Cannot be negative
|
|
1521
|
+
*/
|
|
1522
|
+
parseTrimEnd(trimEnd) {
|
|
1523
|
+
if (!trimEnd) {
|
|
1524
|
+
return 0;
|
|
1525
|
+
}
|
|
1526
|
+
const value = this.parseMilliseconds(trimEnd);
|
|
1527
|
+
// Ensure non-negative as per spec
|
|
1528
|
+
return Math.max(0, value);
|
|
1529
|
+
}
|
|
1480
1530
|
/**
|
|
1481
1531
|
* Parses the -duration CSS property
|
|
1482
1532
|
* Can be: "auto", percentage (e.g. "100%", "50%"), or time value (e.g. "5000ms", "5s")
|
|
1483
1533
|
*/
|
|
1484
|
-
parseDurationProperty(duration, assetName, assets, trimLeft) {
|
|
1534
|
+
parseDurationProperty(duration, assetName, assets, trimLeft, trimRight) {
|
|
1485
1535
|
if (!duration || duration.trim() === 'auto') {
|
|
1486
|
-
// Auto: use asset duration minus trim-start
|
|
1536
|
+
// Auto: use asset duration minus trim-start and trim-end
|
|
1487
1537
|
const asset = assets.get(assetName);
|
|
1488
1538
|
if (!asset) {
|
|
1489
1539
|
return 0;
|
|
1490
1540
|
}
|
|
1491
|
-
return Math.max(0, asset.duration - trimLeft);
|
|
1541
|
+
return Math.max(0, asset.duration - trimLeft - trimRight);
|
|
1492
1542
|
}
|
|
1493
1543
|
// Handle percentage (e.g., "100%", "50%")
|
|
1494
1544
|
if (duration.endsWith('%')) {
|