dsh-ppt 0.4.3 → 0.4.5

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 CHANGED
@@ -1,166 +1,170 @@
1
- [English](README.en.md)
2
-
3
- # dsh-ppt
4
-
5
- > **一句话 / 一篇文档 → 完整演示文稿**:HTML 网页放映 + PPTX 导出,5 套视觉主题,页间转场 + 要点入场动画,中英双语。
6
-
7
- ![npm version](https://img.shields.io/npm/v/dsh-ppt?label=npm&color=blue) ![npm downloads](https://img.shields.io/npm/dm/dsh-ppt) ![license](https://img.shields.io/npm/l/dsh-ppt) ![stars](https://img.shields.io/github/stars/STARDUSTLC666/dsh-ppt?style=social)
8
-
9
- [![Awesome DSH Plugin](https://awesome-dsh-plugin.com/badge.svg)](https://awesome-dsh-plugin.com)
10
-
11
- DSH(DeepSeek Harness)演示文稿技能 + 工具插件:把一句话、一段文字或一篇 Markdown 文档变成可直接放映的 **HTML 网页** 与可编辑的 **PPTX**。纯 Node 实现,**零运行时依赖**,Windows / macOS / Linux 同一份代码。
12
-
13
- ## 能力一览
14
-
15
- | 能力 | 说明 |
16
- | --- | --- |
17
- | `ppt_create` 工具 | Markdown / 结构化 slides → `*.html` + `*.pptx` + `*.json` 三件套 |
18
- | `ppt_themes` 工具 | 列出 5 套内置主题与适用场景 |
19
- | 7 种页型 | 封面 / 章节 / 要点 / 核心观点 / **金句** / **表格** / 结束页 |
20
- | 演讲者备注 | `<!-- 备注: ... -->` 或 `notes` 字段:HTML 按 `S` 呼出,PPTX 原生备注页(演示者视图) |
21
- | 动效(motion) | 默认开:HTML 页间淡入 + 要点逐条入场;PPTX 原生转场 + 要点逐条点击显现;`motion: 'off'` / `--motion off` 产出纯静态 |
22
- | Markdown 进阶 | 表格(`\| ... \|`)、引用金句(`>`)、备注注释自动识别成对应页型 |
23
- | `dsh-ppt` 技能 | 完整 SOP 注册进 DSH:从一句话到成品 deck 的六步流水线 |
24
- | 裸 SKILL.md | 把 `skills/dsh-ppt/` 复制到 Claude Code / Cursor / Gemini CLI / Codex 即可跨 harness 使用 |
25
- | 视觉引擎 | 复用 hyperframes 视觉风格库,5 套主题 HTML 与 PPTX 同源同色 |
26
-
27
- 示例对话:
28
-
29
- > 把这句话做成 PPT:「AI 客服把首次响应时间压缩到 8 秒」,主题用科技感深色。
30
- >
31
- > 把 `docs/季度汇报.md` 做成双语演示文稿,导出 PPTX。
32
-
33
- ## 兼容性
34
-
35
- 已在官方 `@deepseek-ai/dsh@0.1.5-rc.1`、Node `24.16.0` 上验证(2026-09-11):18 个组件与 Modlens 同载,工具 schema、技能注册及离线只读调用检查通过。采用 `cordis.patch.yml` + `dsh.bundle.patch` 组合包模型。Node 要求与该版本 Harness 一致:22.19 及以上的 22.x,或 24 及以上。外部服务的实际业务操作需按各组件配置单独验证。
36
-
37
- ## 安装
38
-
39
- ```bash
40
- dsh plugin --profile web add dsh-ppt
41
- ```
42
-
43
- 重启后即可使用 `ppt_create` / `ppt_themes` 工具,并自动加载 `dsh-ppt` 技能。插件自带空配置,**不会弄崩启动**。
44
-
45
- ## 快速开始
46
-
47
- ### DSH 内(推荐)
48
-
49
- ```
50
- 1. ppt_themes # 看 5 套主题
51
- 2. ppt_create {
52
- title: "把会议减半",
53
- content: "# 问题\n- 周会太多\n\n# 方案\n- 异步决策",
54
- theme: "data",
55
- lang: "zh"
56
- }
57
- 3. 打开返回的 HTML 路径(浏览器放映),PPTX 用 PowerPoint / WPS / Keynote 编辑
58
- ```
59
-
60
- ### 任意 harness(裸 SKILL.md)
61
-
62
- 把 `skills/dsh-ppt/` 复制到任意 Agent Skills 目录,然后:
63
-
64
- ```bash
65
- node <skill-dir>/scripts/build-deck.mjs \
66
- --title "产品发布" \
67
- --content deck.md \
68
- --theme data \
69
- --lang zh \
70
- --out dist/deck
71
- ```
72
-
73
- 输出三件套:
74
-
75
- 默认不会覆盖已有同名产物:三件套中任一文件存在时会整组追加 `-1`、`-2`… 后缀;只有显式传 `overwrite: true`(CLI 为 `--overwrite`)才会覆盖。
76
-
77
- | 文件 | 用途 |
78
- | --- | --- |
79
- | `*.html` | 独立网页放映:方向键/滚轮/触屏翻页,F 全屏,G 总览,P 打印或另存 PDF |
80
- | `*.pptx` | 16:9 可编辑演示文稿(OOXML 由插件手写,zip 用 node:zlib,无第三方依赖) |
81
- | `*.json` | 结构化 manifest(版本、主题、语言、每页内容) |
82
-
83
- ## 内置主题
84
-
85
- | ID | 名称 | 情绪 | 适用 |
86
- | --- | --- | --- | --- |
87
- | `data` | 数据漂移(默认) | 未来 / 沉浸 | AI、技术发布、研究 |
88
- | `swiss` | 瑞士脉冲 | 精准 / 理性 | 数据、SaaS、开发者工具 |
89
- | `velvet` | 天鹅绒标准 | 高级 / 克制 | 高管汇报、品牌、融资路演 |
90
- | `soft` | 柔和信号 | 温暖 / 人本 | 品牌故事、培训、个人分享 |
91
- | `bold` | 极繁大字 | 大声 / 动能 | 产品发布、活动、大事件 |
92
-
93
- 主题灵感来自 [hyperframes](https://github.com/STARDUSTLC666/dsh-hyperframes) 的 `visual-styles.md`,完整色板见 `skills/dsh-ppt/references/themes.md`。
94
-
95
- ## Markdown 输入规则
96
-
97
- - 第一个 `# 标题` → 封面标题;其下第一段 → 封面副标题。
98
- - 每个 `## 小节` → 一页:有列表生成 `bullets` 页,无内容生成 `section` 过渡页。
99
- - 没有标题的纯文本 → 第一段作封面,后续每 5 句一页。
100
- - 只有一句话 → 自动生成「封面 → 核心观点 → 结束页」三页完整结构。
101
- - 需要精确控制时用结构化 `slides`(`cover | section | bullets | statement | quote | table | closing`),表格使用 `rows`,备注使用 `notes`。
102
-
103
- ## 配置
104
-
105
- 插件无必填配置。可选:
106
-
107
- ```yaml
108
- - id: dsh-ppt
109
- config:
110
- outputDir: E:\decks # 可选;默认会话工作目录
111
- maxSlides: 40 # 可选;默认 60(3–120)
112
- defaultTheme: data # 可选;ppt_create 未指定 theme 时使用
113
- defaultLang: zh # 可选;ppt_create 未指定 lang 时使用(zh/en/bilingual)
114
- ```
115
-
116
- 也可用环境变量 `DSH_PPT_OUTPUT_DIR` 指定默认输出目录;`ppt_create` 的 `outputDir`/`theme`/`lang` 参数优先级最高。
117
-
118
- 输出目录按每次工具调用的 `exec.agent.session.header.cwd` 解析:不指定目录时写入当前会话工作目录,相对目录(包括插件配置)相对此目录解析,绝对目录保持原意。直接调用工具而未提供会话时,回退到进程工作目录;并行会话不会修改进程 cwd。工具在加载引擎前和加载完成后检查 `exec.signal`,取消的调用不会继续生成文件;生成和写入阶段为同步操作,开始后会完成本次三件套。
119
-
120
-
121
- ## 卸载
122
-
123
- ```bash
124
- dsh plugin --profile web remove dsh-ppt
125
- ```
126
-
127
- 卸载后重启 Web 服务。如需彻底清理,可再手动删除自己 profile `cordis.patch.yml` 中的对应插件行。
128
-
129
- ## 中英双语
130
-
131
- - `lang` 参数:`zh`(默认)/ `en` / `bilingual`,控制播放器界面、页码与结束页默认文案。
132
- - 内容语言由你撰写:双语 deck 推荐「中文标题 + 英文副标题」,或同一大纲分别生成中英两份。
133
- - 插件文档提供中英两版(README.md / README.en.md);CLI 与技能的报错提示为中文。
134
-
135
- ## 工程质量
136
-
137
- - 纯 Node,零运行时依赖:HTML 模板、OOXML、zip 全部手写,只用 `node:fs` / `node:path` / `node:zlib`。
138
- - 技能与工具共用一个引擎(`skills/dsh-ppt/scripts/deck-core.mjs`),不会出现「DSH 一个效果、裸技能另一个效果」。
139
- - 单元测试覆盖注册契约、JSON Schema、主题解析、Markdown 解析、三件套落盘、PPTX 部件完整性、CLI。
140
- - 无 `eval` / `child_process` / 密钥;产物只写用户指定的本地目录。
141
-
142
- ## 开发
143
-
144
- ```sh
145
- pnpm install
146
- pnpm run build # tsc → lib/
147
- pnpm test # 构建 + node --test(注册/配置/引擎/CLI)
148
- pnpm run smoke:cli # 裸 CLI 冒烟,生成 .smoke-deck
149
- ```
150
-
151
- ## 已知限制
152
-
153
- - PPTX 采用空白版式 + 文本框实现:PowerPoint / WPS 中可正常编辑文字,但暂不生成智能母版占位符。
154
- - 一句话输入自动生成三页最小结构;更丰富的内容需要先扩写成 Markdown 大纲再调用 `ppt_create`。
155
- - `bilingual` 只双语化播放器界面,不自动翻译内容。
156
- - 暂不支持图表与图片;演讲者备注及 HTML/PPTX 动效已经支持。
157
-
158
- ## 协议
159
-
160
- MIT。社区插件,与 DeepSeek 官方无关;`@deepseek-ai/*` 为官方保留命名空间。
161
-
162
- ## 相关项目
163
-
164
- - [dsh-hyperframes](https://github.com/STARDUSTLC666/dsh-hyperframes) — HTML 视频创作技能(本插件视觉风格来源)
165
- - [dsh-remotion](https://github.com/STARDUSTLC666/dsh-remotion) — React 编程式视频技能
166
- - [dsh-email](https://github.com/STARDUSTLC666/dsh-email) — 邮件六件套
1
+ [English](README.en.md)
2
+
3
+ # dsh-ppt
4
+
5
+ > **一句话 / 一篇文档 → 完整演示文稿**:HTML 网页放映 + PPTX 导出,5 套视觉主题,页间转场 + 要点入场动画,中英双语。
6
+
7
+ ![npm version](https://img.shields.io/npm/v/dsh-ppt?label=npm&color=blue) ![npm downloads](https://img.shields.io/npm/dm/dsh-ppt) ![license](https://img.shields.io/npm/l/dsh-ppt) ![stars](https://img.shields.io/github/stars/STARDUSTLC666/dsh-ppt?style=social)
8
+
9
+ [![Awesome DSH Plugin](https://awesome-dsh-plugin.com/badge.svg)](https://awesome-dsh-plugin.com)
10
+
11
+ DSH(DeepSeek Harness)演示文稿技能 + 工具插件:把一句话、一段文字或一篇 Markdown 文档变成可直接放映的 **HTML 网页** 与可编辑的 **PPTX**。纯 Node 实现,**零运行时依赖**,Windows / macOS / Linux 同一份代码。
12
+
13
+ ## 能力一览
14
+
15
+ | 能力 | 说明 |
16
+ | --- | --- |
17
+ | `ppt_create` 工具 | Markdown / 结构化 slides → `*.html` + `*.pptx` + `*.json` 三件套 |
18
+ | `ppt_themes` 工具 | 列出 5 套内置主题与适用场景;传 `preview: true, outputDir: "dist"` 生成主题对比页 + 每套一张 SVG 色板卡(可直接进 README/npm 首屏) |
19
+ | 7 种页型 | 封面 / 章节 / 要点 / 核心观点 / **金句** / **表格** / 结束页 |
20
+ | 演讲者备注 | `<!-- 备注: ... -->` 或 `notes` 字段:HTML 按 `S` 呼出,PPTX 原生备注页(演示者视图) |
21
+ | 动效(motion) | 默认开:HTML 页间淡入 + 要点逐条入场;PPTX 原生转场 + 要点逐条点击显现;`motion: 'off'` / `--motion off` 产出纯静态 |
22
+ | Markdown 进阶 | 表格(`\| ... \|`)、引用金句(`>`)、备注注释自动识别成对应页型 |
23
+ | `dsh-ppt` 技能 | 完整 SOP 注册进 DSH:从一句话到成品 deck 的六步流水线 |
24
+ | 裸 SKILL.md | 把 `skills/dsh-ppt/` 复制到 Claude Code / Cursor / Gemini CLI / Codex 即可跨 harness 使用 |
25
+ | 视觉引擎 | 复用 hyperframes 视觉风格库,5 套主题 HTML 与 PPTX 同源同色 |
26
+
27
+ 示例对话:
28
+
29
+ > 把这句话做成 PPT:「AI 客服把首次响应时间压缩到 8 秒」,主题用科技感深色。
30
+ >
31
+ > 把 `docs/季度汇报.md` 做成双语演示文稿,导出 PPTX。
32
+
33
+ ## 兼容性
34
+
35
+ 2026-09-21:当前发布包经官方 CLI 安装到隔离 profile,在源码构建的 Harness `0.1.6-alpha.2` 上与另外两个下载量前三插件共同加载,18 个插件工具注册正常;日历/邮件配置自检、PPT 主题查询和 17 行表格生成通过。测试本体基于官方 alpha.2 发布提交,另含工具调度器 `Symbol.for` 修复(`93badd88`)。本轮未连接真实邮箱或日历服务。
36
+
37
+ 已在官方 `@deepseek-ai/dsh@0.1.5-rc.1`、Node `24.16.0` 上验证(2026-09-11):18 个组件与 Modlens 同载,工具 schema、技能注册及离线只读调用检查通过。采用 `cordis.patch.yml` + `dsh.bundle.patch` 组合包模型。Node 要求与该版本 Harness 一致:22.19 及以上的 22.x,或 24 及以上。外部服务的实际业务操作需按各组件配置单独验证。
38
+
39
+ ## 安装
40
+
41
+ ```bash
42
+ dsh plugin --profile web add dsh-ppt
43
+ ```
44
+
45
+ 重启后即可使用 `ppt_create` / `ppt_themes` 工具,并自动加载 `dsh-ppt` 技能。插件自带空配置,**不会弄崩启动**。
46
+
47
+ ## 快速开始
48
+
49
+ ### DSH 内(推荐)
50
+
51
+ ```
52
+ 1. ppt_themes { preview: true, outputDir: "dist" } # 看 5 套主题 + 生成对比页
53
+ 2. ppt_create {
54
+ title: "把会议减半",
55
+ content: "# 问题\n- 周会太多\n\n# 方案\n- 异步决策",
56
+ theme: "data",
57
+ lang: "zh"
58
+ }
59
+ 3. 打开返回的 HTML 路径(浏览器放映),PPTX 用 PowerPoint / WPS / Keynote 编辑
60
+ ```
61
+
62
+ ### 任意 harness(裸 SKILL.md)
63
+
64
+ 把 `skills/dsh-ppt/` 复制到任意 Agent Skills 目录,然后:
65
+
66
+ ```bash
67
+ node <skill-dir>/scripts/build-deck.mjs \
68
+ --title "产品发布" \
69
+ --content deck.md \
70
+ --theme data \
71
+ --lang zh \
72
+ --out dist/deck
73
+ ```
74
+
75
+ 输出三件套:
76
+
77
+ 默认不会覆盖已有同名产物:三件套中任一文件存在时会整组追加 `-1`、`-2`… 后缀;只有显式传 `overwrite: true`(CLI 为 `--overwrite`)才会覆盖。
78
+
79
+ | 文件 | 用途 |
80
+ | --- | --- |
81
+ | `*.html` | 独立网页放映:← → 翻页,V 演讲者视图(独立窗口:备注/下一页/计时/进度),S 备注,G 缩略图总览,F 全屏,P 打印,? 快捷键,Esc 关闭 |
82
+ | `*.pptx` | 16:9 可编辑演示文稿(OOXML 由插件手写,zip 用 node:zlib,无第三方依赖) |
83
+ | `*.json` | 结构化 manifest(版本、主题、语言、每页内容) |
84
+
85
+ ## 内置主题
86
+
87
+ | ID | 名称 | 情绪 | 适用 |
88
+ | --- | --- | --- | --- |
89
+ | `data` | 数据漂移(默认) | 未来 / 沉浸 | AI、技术发布、研究 |
90
+ | `swiss` | 瑞士脉冲 | 精准 / 理性 | 数据、SaaS、开发者工具 |
91
+ | `velvet` | 天鹅绒标准 | 高级 / 克制 | 高管汇报、品牌、融资路演 |
92
+ | `soft` | 柔和信号 | 温暖 / 人本 | 品牌故事、培训、个人分享 |
93
+ | `bold` | 极繁大字 | 大声 / 动能 | 产品发布、活动、大事件 |
94
+
95
+ 主题灵感来自 [hyperframes](https://github.com/STARDUSTLC666/dsh-hyperframes) 的 `visual-styles.md`,完整色板见 `skills/dsh-ppt/references/themes.md`。也可运行 `ppt_themes { preview: true, outputDir: "dist" }` 生成并排对比页与 SVG 色板卡。
96
+
97
+ ## Markdown 输入规则
98
+
99
+ - 第一个 `# 标题` → 封面标题;其下第一段 → 封面副标题。
100
+ - 每个 `## 小节` → 一页:有列表生成 `bullets` 页,无内容生成 `section` 过渡页。
101
+ - 没有标题的纯文本 → 第一段作封面,后续每 5 句一页。
102
+ - 只有一句话 → 自动生成「封面 → 核心观点 → 结束页」三页完整结构。
103
+ - 长表格自动分页:每页重复表头,最多 8 行数据;备注只放第一页。最多 8 列、每格 60 字符,超限会提示拆分。短行补空白,三种产物保留相同数据。
104
+ - `maxSlides` 计算分页后的总页数;超过限制时先报错,不落盘、不静默删掉中间页。可提高配置上限(最多 120)或拆分文稿。
105
+ - 需要精确控制时用结构化 `slides`(`cover | section | bullets | statement | quote | table | closing`),表格使用 `rows`,备注使用 `notes`。
106
+
107
+ ## 配置
108
+
109
+ 插件无必填配置。可选:
110
+
111
+ ```yaml
112
+ - id: dsh-ppt
113
+ config:
114
+ outputDir: E:\decks # 可选;默认会话工作目录
115
+ maxSlides: 40 # 可选;默认 60(3–120)
116
+ defaultTheme: data # 可选;ppt_create 未指定 theme 时使用
117
+ defaultLang: zh # 可选;ppt_create 未指定 lang 时使用(zh/en/bilingual)
118
+ ```
119
+
120
+ 也可用环境变量 `DSH_PPT_OUTPUT_DIR` 指定默认输出目录;`ppt_create` 的 `outputDir`/`theme`/`lang` 参数优先级最高。
121
+
122
+ 输出目录按每次工具调用的 `exec.agent.session.header.cwd` 解析:不指定目录时写入当前会话工作目录,相对目录(包括插件配置)相对此目录解析,绝对目录保持原意。直接调用工具而未提供会话时,回退到进程工作目录;并行会话不会修改进程 cwd。工具在加载引擎前和加载完成后检查 `exec.signal`,取消的调用不会继续生成文件;生成和写入阶段为同步操作,开始后会完成本次三件套。
123
+
124
+
125
+ ## 卸载
126
+
127
+ ```bash
128
+ dsh plugin --profile web remove dsh-ppt
129
+ ```
130
+
131
+ 卸载后重启 Web 服务。如需彻底清理,可再手动删除自己 profile `cordis.patch.yml` 中的对应插件行。
132
+
133
+ ## 中英双语
134
+
135
+ - `lang` 参数:`zh`(默认)/ `en` / `bilingual`,控制播放器界面、页码与结束页默认文案。
136
+ - 内容语言由你撰写:双语 deck 推荐「中文标题 + 英文副标题」,或同一大纲分别生成中英两份。
137
+ - 插件文档提供中英两版(README.md / README.en.md);CLI 与技能的报错提示为中文。
138
+
139
+ ## 工程质量
140
+
141
+ - 纯 Node,零运行时依赖:HTML 模板、OOXML、zip 全部手写,只用 `node:fs` / `node:path` / `node:zlib`。
142
+ - 技能与工具共用一个引擎(`skills/dsh-ppt/scripts/deck-core.mjs`),不会出现「DSH 一个效果、裸技能另一个效果」。
143
+ - 单元测试覆盖注册契约、JSON Schema、主题解析、Markdown 解析、三件套落盘、PPTX 部件完整性、CLI。
144
+ - 无 `eval` / `child_process` / 密钥;产物只写用户指定的本地目录。
145
+
146
+ ## 开发
147
+
148
+ ```sh
149
+ pnpm install
150
+ pnpm run build # tsc → lib/
151
+ pnpm test # 构建 + node --test(注册/配置/引擎/CLI)
152
+ pnpm run smoke:cli # 裸 CLI 冒烟,生成 .smoke-deck
153
+ ```
154
+
155
+ ## 已知限制
156
+
157
+ - PPTX 采用空白版式 + 文本框实现:PowerPoint / WPS 中可正常编辑文字,但暂不生成智能母版占位符。
158
+ - 一句话输入自动生成三页最小结构;更丰富的内容需要先扩写成 Markdown 大纲再调用 `ppt_create`。
159
+ - `bilingual` 只双语化播放器界面,不自动翻译内容。
160
+ - 暂不支持图表与图片;演讲者备注及 HTML/PPTX 动效已经支持。
161
+
162
+ ## 协议
163
+
164
+ MIT。社区插件,与 DeepSeek 官方无关;`@deepseek-ai/*` 为官方保留命名空间。
165
+
166
+ ## 相关项目
167
+
168
+ - [dsh-hyperframes](https://github.com/STARDUSTLC666/dsh-hyperframes) — HTML 视频创作技能(本插件视觉风格来源)
169
+ - [dsh-remotion](https://github.com/STARDUSTLC666/dsh-remotion) — React 编程式视频技能
170
+ - [dsh-email](https://github.com/STARDUSTLC666/dsh-email) — 邮件六件套
package/lib/execution.js CHANGED
@@ -23,7 +23,18 @@ export function createPptExecutors(config, loadEngine = getEngine) {
23
23
  const lang = typeof args.lang === 'string' && args.lang.trim() !== '' ? args.lang.trim() : 'zh';
24
24
  const engine = await loadEngine();
25
25
  exec?.signal?.throwIfAborted();
26
- return { ok: true, themes: engine.listThemes(lang) };
26
+ const themes = engine.listThemes(lang);
27
+ if (args.preview === true) {
28
+ const cwd = exec?.agent?.session.header.cwd ?? process.cwd();
29
+ const requested = typeof args.outputDir === 'string' && args.outputDir.trim() !== '' ? args.outputDir.trim() : '.';
30
+ const preview = engine.buildThemePreview({
31
+ outputDir: resolve(cwd, requested),
32
+ lang,
33
+ overwrite: args.overwrite === true,
34
+ });
35
+ return { ok: true, themes, preview };
36
+ }
37
+ return { ok: true, themes };
27
38
  },
28
39
  async create(rawArgs, exec) {
29
40
  exec?.signal?.throwIfAborted();
package/lib/tools.js CHANGED
@@ -40,6 +40,7 @@ const themesResultSchema = {
40
40
  properties: {
41
41
  ok: { type: 'boolean' },
42
42
  themes: { type: 'array', items: themeInfoSchema },
43
+ preview: { type: 'object', additionalProperties: true },
43
44
  },
44
45
  additionalProperties: true,
45
46
  };
@@ -74,14 +75,18 @@ function renderThemes(value) {
74
75
  if (value.themes.length === 0)
75
76
  return oneText('dsh-ppt 没有可用主题。');
76
77
  const lines = value.themes.map((theme) => '- ' + theme.id + ':' + theme.name + '(' + theme.mood + ')|适合:' + theme.bestFor + '|' + (theme.dark ? '深色' : '浅色'));
77
- return oneText('dsh-ppt 内置主题:\n\n' + lines.join('\n') + '\n\nppt_create 的 theme 参数填其中的 id(默认 data)。');
78
+ const summary = 'dsh-ppt 内置主题:\n\n' + lines.join('\n') + '\n\nppt_create 的 theme 参数填其中的 id(默认 data)。';
79
+ if (value.preview) {
80
+ return oneText(summary + '\n\n主题预览已写入:' + value.preview.htmlPath + '\nSVG 色板卡:' + value.preview.svgs.map((svg) => svg.path).join(' / '));
81
+ }
82
+ return oneText(summary + '\n\n想要并排对比:ppt_themes { preview: true, outputDir: "..." } 会生成 themes-preview.html 和每套主题的 SVG 色板卡。');
78
83
  }
79
84
  function renderCreate(value) {
80
85
  return oneText('dsh-ppt 已生成 ' + value.slideCount + ' 页演示文稿(主题 ' + value.theme + ',语言 ' + value.language + '):\n' +
81
86
  'HTML 网页放映:' + value.htmlPath + '\n' +
82
87
  'PPTX 导出:' + value.pptxPath + '\n' +
83
88
  'Manifest:' + value.jsonPath + '\n' +
84
- 'HTML 双击即可放映(方向键翻页 / F 全屏 / G 总览 / P 打印);PPTX 可用 PowerPoint / WPS / Keynote 打开。');
89
+ 'HTML 双击即可放映(← → 翻页 / V 演讲者视图 / S 备注 / G 缩略图总览 / F 全屏 / P 打印 / ? 快捷键);PPTX 可用 PowerPoint / WPS / Keynote 打开。');
85
90
  }
86
91
  /** Assemble presentation schemas, rendering and the session-aware executors. */
87
92
  export function buildPptTools(config) {
@@ -89,9 +94,12 @@ export function buildPptTools(config) {
89
94
  return [
90
95
  {
91
96
  name: 'ppt_themes',
92
- description: 'List the built-in visual themes of dsh-ppt (id, name, mood, best-for, light/dark palette) before building a deck. Use a theme id as the theme argument of ppt_create. 中文:列出 dsh-ppt 内置视觉主题(id、名称、情绪、适用场景、明暗色板),用于选择 ppt_create 的 theme 参数。',
97
+ description: 'List the built-in visual themes of dsh-ppt (id, name, mood, best-for, light/dark palette) before building a deck. Pass preview: true with outputDir to also write a self-contained theme gallery HTML plus one SVG palette card per theme (ready for README/npm screenshots). Use a theme id as the theme argument of ppt_create. 中文:列出 dsh-ppt 内置视觉主题(id、名称、情绪、适用场景、明暗色板);传 preview: true + outputDir 会额外生成主题对比页和每套主题的 SVG 色板卡(可直接放 README/npm 首屏),用于选择 ppt_create 的 theme 参数。',
93
98
  parameters: compileParameters({
94
99
  lang: { type: 'string', description: 'Theme description language: zh (default), en, or bilingual.' },
100
+ preview: { type: 'boolean', description: 'Write a theme gallery HTML and one SVG palette card per theme into outputDir. Default false (list only).' },
101
+ outputDir: { type: 'string', description: 'Directory for preview files when preview is true. Default: session working directory (or the plugin outputDir config).' },
102
+ overwrite: { type: 'boolean', description: 'Overwrite existing preview files instead of adding a numeric suffix. Default false.' },
95
103
  }),
96
104
  output: {
97
105
  schema: themesResultSchema,
@@ -104,11 +112,11 @@ export function buildPptTools(config) {
104
112
  description: 'Build a complete presentation deck from one sentence or a Markdown document and write three artifacts to outputDir: a standalone HTML web slideshow, an editable 16:9 PPTX, and a deck.json manifest. Five built-in visual themes are available (see ppt_themes). content is Markdown text (recommended); advanced callers may pass structured slides instead. 中文:把一句话或一篇 Markdown 文档生成完整演示文稿,写入 outputDir 三个文件:独立 HTML 网页放映、可编辑 16:9 PPTX、deck.json manifest;内置 5 套视觉主题。',
105
113
  parameters: compileParameters({
106
114
  title: { type: 'string', required: true, description: 'Deck title (used for the cover and file names).' },
107
- content: { type: 'string', description: 'Markdown content: one sentence, a paragraph, or a full document. First # heading becomes the cover title; ## headings become slides; -/* lists become bullets; | ... | tables become table slides; > blockquotes become quote slides; <!-- 备注: ... --> comments become speaker notes. Required unless slides is provided.' },
115
+ content: { type: 'string', description: 'Markdown content: one sentence, a paragraph, or a full document. First # heading becomes the cover title; ## headings become slides; -/* lists become bullets; | ... | tables paginate with repeated headers (8 data rows/page, up to 8 columns and 60 characters/cell); > blockquotes become quote slides; <!-- 备注: ... --> comments become speaker notes. Required unless slides is provided.' },
108
116
  theme: { type: 'string', description: 'Visual theme id: swiss / velvet / data / soft / bold. Default data. See ppt_themes.' },
109
117
  lang: { type: 'string', description: 'UI language of the generated player: zh (default), en, or bilingual. Content language is whatever you write.' },
110
118
  motion: { type: 'string', enum: ['on', 'off'], description: 'Slide transitions plus bullet entrance animations: on (default) or off for a fully static deck.' },
111
- slides: { type: 'array', items: { type: 'object', additionalProperties: true }, description: 'Optional structured slides: [{ layout: cover|section|bullets|statement|quote|table|closing, title, subtitle, kicker, bullets: [], rows: [][] (for table), notes: "speaker notes" }]. Use this for precise control instead of content.' },
119
+ slides: { type: 'array', items: { type: 'object', additionalProperties: true }, description: 'Optional structured slides: [{ layout: cover|section|bullets|statement|quote|table|closing, title, subtitle, kicker, bullets: [], rows: [][] (for table), notes: "speaker notes" }]. Tables paginate with repeated headers (8 data rows/page, up to 8 columns and 60 characters/cell). Exceeding the configured maxSlides returns an error before writing. Use this for precise control instead of content.' },
112
120
  outputDir: { type: 'string', description: 'Directory to write the files into. Default: session working directory (or the plugin outputDir config).' },
113
121
  fileName: { type: 'string', description: 'Base file name for the three artifacts. Default: sanitized deck title.' },
114
122
  overwrite: { type: 'boolean', description: 'Replace an existing same-name HTML/PPTX/JSON trio. Default false: choose a unique numeric suffix instead.' },
package/lib/types.d.ts CHANGED
@@ -48,9 +48,22 @@ export interface PptThemeInfo {
48
48
  palette: Record<string, string>;
49
49
  fonts: Record<string, string>;
50
50
  }
51
+ export interface PptThemePreviewResult {
52
+ ok: boolean;
53
+ outputDir: string;
54
+ htmlPath: string;
55
+ svgs: Array<{
56
+ id: string;
57
+ path: string;
58
+ }>;
59
+ themeCount: number;
60
+ language: string;
61
+ }
51
62
  export interface PptThemesResult {
52
63
  ok: boolean;
53
64
  themes: PptThemeInfo[];
65
+ /** 传 preview: true 时返回:主题对比页 + 每套主题的 SVG 色板卡。 */
66
+ preview?: PptThemePreviewResult;
54
67
  }
55
68
  export interface PptCreateResult {
56
69
  ok: boolean;
@@ -71,6 +84,7 @@ export interface PptCreateResult {
71
84
  /** deck-core.mjs 暴露给插件的最小面。 */
72
85
  export interface DeckEngine {
73
86
  buildDeck(options: Record<string, unknown>): PptCreateResult;
87
+ buildThemePreview(options: Record<string, unknown>): PptThemePreviewResult;
74
88
  listThemes(lang?: string): PptThemeInfo[];
75
89
  resolveTheme(input: unknown): Record<string, unknown>;
76
90
  resolveLanguage(input: unknown): Record<string, unknown>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-ppt",
3
- "version": "0.4.3",
4
- "description": "DSH 演示文稿插件:一句话或一篇 Markdown → 网页放映 + 可编辑 PPTX,内置 5 套主题与转场动画。",
3
+ "version": "0.4.5",
4
+ "description": "DSH 演示文稿插件:Markdown 生成网页放映与可编辑 PPTX,长表格自动分页,内置 5 套主题、备注与转场动画。",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/index.d.ts",
@@ -1,44 +1,44 @@
1
- # dsh-ppt 输入语法参考(Markdown / 结构化 slides / 动效)
2
-
3
- 只在需要查具体语法时读本文件;常规流程在 SKILL.md。
4
-
5
- ## Markdown 解析规则
6
-
7
- `ppt_create` 与 `build-deck.mjs` 按以下规则解析 Markdown:
8
-
9
- - 第一个 `# 标题` 会成为封面标题;其后的段落/列表成为封面副标题来源。
10
- - 每个 `## 小节`(或更深标题)生成一页:
11
- - 有 `- ` / `* ` / `1.` 列表 → `bullets` 页;
12
- - 无列表且无正文 → `section` 过渡页;
13
- - 有正文段落 → 正文拆句后作为 bullets。
14
- - 没有标题的纯文本:第一段第一句为封面副标题,后续段落按 5 句一组拆成要点页。
15
- - 只有一句话:自动生成「封面 → 核心观点 → 结束页」三页。
16
- - 需要更精细控制时使用结构化 `slides` JSON,不要和 Markdown 混用。
17
-
18
- ## 进阶语法(自动识别)
19
-
20
- - **表格**:`| 列 | 列 |` 连续行(第二行 `| --- | --- |` 分隔线)→ 独立 `table` 页(主题色表头,限 9 行 8 列)。数据对比优先用表格,别堆要点。
21
- - **金句**:`>` 引用块 → 独立 `quote` 页;最后一行写 `—— 出处` 会成为署名。
22
- - **演讲者备注**:`<!-- 备注: 这页要讲的内容 -->`(或 `<!-- note: ... -->`)附着到该页。备注不进正文:HTML 放映按 `S` 呼出备注面板,PPTX 写入原生备注(演示者视图可见)。为汇报/演讲类 deck 主动写备注(口径、数据出处、应答预案)。
23
-
24
- ## 结构化 slides(高级用法)
25
-
26
- `ppt_create` 的 `slides` 与 CLI `--slides` 接受 JSON 数组:
27
-
28
- ```json
29
- [
30
- { "layout": "cover", "title": "标题", "subtitle": "副标题", "kicker": "开场", "notes": "开场先自我介绍 30 秒" },
31
- { "layout": "section", "kicker": "01", "title": "背景" },
32
- { "layout": "bullets", "title": "三个论点", "bullets": ["论点一", "论点二", "论点三"] },
33
- { "layout": "table", "title": "业绩对比", "rows": [["大区", "营收"], ["华东", "1.2 亿"]], "notes": "强调华东增速" },
34
- { "layout": "quote", "title": "慢就是快。", "subtitle": "创始人" },
35
- { "layout": "statement", "title": "核心观点一句话", "subtitle": "支撑说明" },
36
- { "layout": "closing", "title": "谢谢", "subtitle": "行动号召" }
37
- ]
38
- ```
39
-
40
- `layout` 仅限 `cover | section | bullets | statement | quote | table | closing`;每页可选 `notes`(演讲者备注),`table` 页用 `rows`(首行为表头)。Markdown 输入不够精确时,用结构化 slides 重写。
41
-
42
- ## 动效(motion)
43
-
44
- 默认 `motion: on`:HTML 放映有页间淡入与要点逐条入场;PPTX 每页原生淡入转场,`bullets` 页的要点按「点击一次出现一条」放映。交付严肃/打印场景或用户明确要静态时传 `motion: 'off'`(CLI `--motion off`),产物不含任何动画代码。
1
+ # dsh-ppt 输入语法参考(Markdown / 结构化 slides / 动效)
2
+
3
+ 只在需要查具体语法时读本文件;常规流程在 SKILL.md。
4
+
5
+ ## Markdown 解析规则
6
+
7
+ `ppt_create` 与 `build-deck.mjs` 按以下规则解析 Markdown:
8
+
9
+ - 第一个 `# 标题` 会成为封面标题;其后的段落/列表成为封面副标题来源。
10
+ - 每个 `## 小节`(或更深标题)生成一页:
11
+ - 有 `- ` / `* ` / `1.` 列表 → `bullets` 页;
12
+ - 无列表且无正文 → `section` 过渡页;
13
+ - 有正文段落 → 正文拆句后作为 bullets。
14
+ - 没有标题的纯文本:第一段第一句为封面副标题,后续段落按 5 句一组拆成要点页。
15
+ - 只有一句话:自动生成「封面 → 核心观点 → 结束页」三页。
16
+ - 需要更精细控制时使用结构化 `slides` JSON,不要和 Markdown 混用。
17
+
18
+ ## 进阶语法(自动识别)
19
+
20
+ - **表格**:`| 列 | 列 |` 连续行(第二行 `| --- | --- |` 分隔线)→ 独立 `table` 页(主题色表头;每页 8 行数据,长表格自动续页并重复表头;最多 8 列、每格 60 字符,超限先报错)。数据对比优先用表格,别堆要点。
21
+ - **金句**:`>` 引用块 → 独立 `quote` 页;最后一行写 `—— 出处` 会成为署名。
22
+ - **演讲者备注**:`<!-- 备注: 这页要讲的内容 -->`(或 `<!-- note: ... -->`)附着到该页。备注不进正文:HTML 放映按 `S` 呼出备注面板,PPTX 写入原生备注(演示者视图可见)。为汇报/演讲类 deck 主动写备注(口径、数据出处、应答预案)。
23
+
24
+ ## 结构化 slides(高级用法)
25
+
26
+ `ppt_create` 的 `slides` 与 CLI `--slides` 接受 JSON 数组:
27
+
28
+ ```json
29
+ [
30
+ { "layout": "cover", "title": "标题", "subtitle": "副标题", "kicker": "开场", "notes": "开场先自我介绍 30 秒" },
31
+ { "layout": "section", "kicker": "01", "title": "背景" },
32
+ { "layout": "bullets", "title": "三个论点", "bullets": ["论点一", "论点二", "论点三"] },
33
+ { "layout": "table", "title": "业绩对比", "rows": [["大区", "营收"], ["华东", "1.2 亿"]], "notes": "强调华东增速" },
34
+ { "layout": "quote", "title": "慢就是快。", "subtitle": "创始人" },
35
+ { "layout": "statement", "title": "核心观点一句话", "subtitle": "支撑说明" },
36
+ { "layout": "closing", "title": "谢谢", "subtitle": "行动号召" }
37
+ ]
38
+ ```
39
+
40
+ `layout` 仅限 `cover | section | bullets | statement | quote | table | closing`;每页可选 `notes`(演讲者备注),`table` 页用 `rows`(首行为表头)。结构化表格同样自动分页,备注只放第一页。分页后总页数超过 maxSlides 时会报错,请提高配置上限(最多 120)或拆分文稿。Markdown 输入不够精确时,用结构化 slides 重写。
41
+
42
+ ## 动效(motion)
43
+
44
+ 默认 `motion: on`:HTML 放映有页间淡入与要点逐条入场;PPTX 每页原生淡入转场,`bullets` 页的要点按「点击一次出现一条」放映。交付严肃/打印场景或用户明确要静态时传 `motion: 'off'`(CLI `--motion off`),产物不含任何动画代码。
@@ -2,6 +2,8 @@
2
2
 
3
3
  主题系统移植自 hyperframes 技能的 `visual-styles.md` 视觉风格库。每套主题在 HTML 与 PPTX 中使用同一色板、同一字体族、同一情绪规则。
4
4
 
5
+ > 想先看效果:运行 `ppt_themes { preview: true, outputDir: "dist" }`,会生成 `themes-preview.html` 与每套主题一张 `theme-<id>.svg`;README/npm 首屏可以直接引用 SVG。
6
+
5
7
  ## 速查
6
8
 
7
9
  | ID | 中文名 | English | 明暗 | 底色 | 前景 | 主强调 | 次强调 | 情绪 | 适用 |