@lemonppt/renderer 0.1.8 → 0.2.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.
@@ -0,0 +1,45 @@
1
+ import type { DeckGoal, Slide } from '@lemonppt/core';
2
+ declare global {
3
+ interface Window {
4
+ __lemonPPT_goal?: DeckGoal;
5
+ __lemonPPT_renderEditableHtml?: (goal: DeckGoal) => string;
6
+ __lemonPPT_renderSlideHtml?: (slide: Slide, options: {
7
+ slideIdx: number;
8
+ editable: boolean;
9
+ theme?: string;
10
+ }) => string;
11
+ __lemonPPT_renderSlideToRoot?: (container: HTMLElement, slide: Slide, options: {
12
+ slideIdx: number;
13
+ editable: boolean;
14
+ theme?: string;
15
+ }) => void;
16
+ __lemonPPT_initECharts?: (theme?: string, root?: Element | null) => Promise<void>;
17
+ __lemonPPT_disposeECharts?: (theme?: string) => Promise<void>;
18
+ }
19
+ }
20
+ /**
21
+ * 浏览器端离线渲染入口。
22
+ * 将当前 goal 渲染为完整的 editor.html 字符串,供静态文件模式下结构变更后重新加载。
23
+ */
24
+ declare function renderEditableHtml(goal: DeckGoal): string;
25
+ declare function renderSlideHtml(slide: Slide, options: {
26
+ slideIdx: number;
27
+ editable: boolean;
28
+ theme?: string;
29
+ }): string;
30
+ declare function renderSlideToRoot(container: HTMLElement, slide: Slide, options: {
31
+ slideIdx: number;
32
+ editable: boolean;
33
+ theme?: string;
34
+ }): void;
35
+ /**
36
+ * 根据当前主题初始化对应分包的 ECharts 模块。
37
+ * 旧代码可能无参调用,默认使用 theme01。
38
+ *
39
+ * ECharts 初始化逻辑已拆分到 theme-echarts.js IIFE bundle 中,通过全局函数委托调用,
40
+ * 使 client-render.js 主 bundle 不依赖 echarts 核心库。
41
+ */
42
+ declare function initECharts(theme?: string, root?: Element | null): Promise<void>;
43
+ declare function disposeECharts(theme?: string): Promise<void>;
44
+ export { renderEditableHtml, renderSlideHtml, renderSlideToRoot, initECharts, disposeECharts };
45
+ //# sourceMappingURL=client-render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-render.d.ts","sourceRoot":"","sources":["../src/client-render.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAMtD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,eAAe,CAAC,EAAE,QAAQ,CAAC;QAC3B,6BAA6B,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,CAAC;QAC3D,0BAA0B,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,OAAO,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,MAAM,CAAC;QACxH,4BAA4B,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,OAAO,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;QAChJ,sBAAsB,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAClF,yBAAyB,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC/D;CACF;AAWD;;;GAGG;AACH,iBAAS,kBAAkB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAGlD;AAED,iBAAS,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAM/G;AAED,iBAAS,iBAAiB,CACxB,SAAS,EAAE,WAAW,EACtB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/D,IAAI,CAaN;AAED;;;;;;GAMG;AACH,iBAAe,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/E;AAED,iBAAe,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM3D;AAQD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,iBAAiB,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,75 @@
1
+ // lemonPPT - AI-powered presentation generation
2
+ // Copyright (c) 2026 lemonforme
3
+ // SPDX-License-Identifier: AGPL-3.0-or-later
4
+ import { renderSlide } from '@lemonppt/templates';
5
+ import ReactDOMClient from 'react-dom/client';
6
+ import ReactDOMServer from 'react-dom/server';
7
+ import { renderDeck } from './render.js';
8
+ function escapeHtml(text) {
9
+ return text
10
+ .replace(/&/g, '&amp;')
11
+ .replace(/</g, '&lt;')
12
+ .replace(/>/g, '&gt;')
13
+ .replace(/"/g, '&quot;')
14
+ .replace(/'/g, '&#39;');
15
+ }
16
+ /**
17
+ * 浏览器端离线渲染入口。
18
+ * 将当前 goal 渲染为完整的 editor.html 字符串,供静态文件模式下结构变更后重新加载。
19
+ */
20
+ function renderEditableHtml(goal) {
21
+ const output = renderDeck(goal, { editable: true });
22
+ return output.html;
23
+ }
24
+ function renderSlideHtml(slide, options) {
25
+ const element = renderSlide(slide, options);
26
+ if (!element) {
27
+ return `<div class="lp-error">未找到版式: ${escapeHtml(slide.layout)}</div>`;
28
+ }
29
+ return ReactDOMServer.renderToStaticMarkup(element);
30
+ }
31
+ function renderSlideToRoot(container, slide, options) {
32
+ const element = renderSlide(slide, options);
33
+ if (!element) {
34
+ container.innerHTML = `<div class="lp-error">未找到版式: ${escapeHtml(slide.layout)}</div>`;
35
+ return;
36
+ }
37
+ // 复用已存在的 React root,避免重复创建
38
+ let root = container.__lemonPPT_root;
39
+ if (!root) {
40
+ root = ReactDOMClient.createRoot(container);
41
+ container.__lemonPPT_root = root;
42
+ }
43
+ root.render(element);
44
+ }
45
+ /**
46
+ * 根据当前主题初始化对应分包的 ECharts 模块。
47
+ * 旧代码可能无参调用,默认使用 theme01。
48
+ *
49
+ * ECharts 初始化逻辑已拆分到 theme-echarts.js IIFE bundle 中,通过全局函数委托调用,
50
+ * 使 client-render.js 主 bundle 不依赖 echarts 核心库。
51
+ */
52
+ async function initECharts(theme, root) {
53
+ const t = theme || window.__lemonPPT_goal?.theme || 'theme01';
54
+ const fn = window.__lemonPPT_initEChartsForTheme;
55
+ if (typeof fn === 'function') {
56
+ await fn(t, root);
57
+ }
58
+ else {
59
+ console.warn('[lemonPPT] ECharts 初始化脚本未加载,跳过图表渲染。主题:', t);
60
+ }
61
+ }
62
+ async function disposeECharts(theme) {
63
+ const t = theme || window.__lemonPPT_goal?.theme || 'theme01';
64
+ const fn = window.__lemonPPT_disposeEChartsForTheme;
65
+ if (typeof fn === 'function') {
66
+ await fn(t);
67
+ }
68
+ }
69
+ window.__lemonPPT_renderEditableHtml = renderEditableHtml;
70
+ window.__lemonPPT_renderSlideHtml = renderSlideHtml;
71
+ window.__lemonPPT_renderSlideToRoot = renderSlideToRoot;
72
+ window.__lemonPPT_initECharts = initECharts;
73
+ window.__lemonPPT_disposeECharts = disposeECharts;
74
+ export { renderEditableHtml, renderSlideHtml, renderSlideToRoot, initECharts, disposeECharts };
75
+ //# sourceMappingURL=client-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-render.js","sourceRoot":"","sources":["../src/client-render.ts"],"names":[],"mappings":"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"}