富文档导出 · Rich Export
把内容先收敛为一个可审计的源,再针对每个交付格式生成其能忠实表达的版本。HTML 保留交互媒体;DOCX、PDF 和 Markdown 生成可编辑或可打印的静态投影,并为媒体保留封面、说明和原链接。
Triggers
- 用户要求把一份内容或产品数据一键导出为 HTML、Markdown、DOCX、PDF、ZIP 或离线交付包。
- 用户要求导出含图片、音频、视频、iframe、交互图表或媒体说明的内容,并需要针对不同格式正确处理。
- 用户需要给 Web、桌面端或服务端产品接入可复用的多格式导出能力。
Do not activate when
- 只需要编辑一个已有 DOCX、PDF 或网页中的局部内容,且不涉及多格式交付。
- 只需要生成单张图片、单个幻灯片或一个视频文件;使用对应的媒体制作工作流。
先做内容边界
- 将聊天中的人名、项目背景、内部状态、提示词、创作过程视为内部上下文;只有用户要求出现在成品中的字段才进入输入内容。
- 生成标题、作者、封面、页脚和文件名时,只读取显式
document元数据;不要从聊天背景推断或补入个人信息。 - 有视频、音频、地图、嵌入网页或交互图表时,先声明其静态投影。没有封面时,PDF/DOCX 至少保留名称、摘要和可访问链接。
输入与命令
默认输入为 .md;也支持 .html 和本 Skill 定义的 rich-export.json。输入中的相对资源相对输入文件解析。
python3 "$SKILL_DIR/scripts/export_rich.py" \
--input ./release/article.md \
--out ./release/exports \
--formats html-single,html-dir,md,docx,pdf \
--zip
先通过 --formats 只生成用户所需格式。html-single 适合直接发送和离线打开;html-dir 适合视频大、文件多或需要保留媒体原文件;docx 适合继续编辑;pdf 适合打印和归档;md 是可追溯源稿。
运行 python3 "$SKILL_DIR/scripts/export_rich.py" --help 查看依赖与选项。完整输入契约见 references/format-contract.md,产品集成见 references/product-integration.md。
渲染策略
| 目标 | 生成方式 | 媒体行为 |
|---|---|---|
| 单文件 HTML | Pandoc --embed-resources |
内嵌图片、样式、脚本、音视频;大文件会显著膨胀 |
| HTML 文件夹 | Pandoc + assets/ |
保持交互与独立资源,适合实际分发 |
| Markdown | Pandoc 规范化 | 保留图片和链接;媒体使用显式链接 |
| DOCX | Pandoc + 可选 reference.docx | 图片嵌入;视频/音频/iframe 投影为封面、说明与链接 |
| Chromium/Playwright 打印静态 HTML | 图片和版式保留;媒体投影为封面、说明与链接 |
不要把单文件 HTML 当作大型视频的默认交付。媒体总量超过约 20 MB 时默认同时交付 html-dir;若用户必须只收一个文件,交付 ZIP,其中包含 HTML 文件夹和 export-manifest.json。
验收
每次导出后执行以下检查:
- 打开单文件 HTML 并断网刷新;检查字体、图片、音视频控件、目录和链接。
- 解压/打开 HTML 文件夹;检查
index.html的所有资源均来自包内,且没有绝对本机路径。 - 用 Word/LibreOffice 打开 DOCX;检查中文字体、表格、图片、分页及每个媒体链接。
- 渲染 PDF 首页、含图片页、含媒体投影页和末页;检查裁切、溢出、乱码、链接和页码。
- 检查
export-manifest.json的warnings;不得把内部元数据或提示词当作正文导出。
选择与限制
- 默认采用 Pandoc + Playwright:前者负责结构化格式互转,后者将已经确认的网页版式稳定打印为 PDF。
- 现有
lov-any2pdf、lov-any2docx仍适合中文长文的专门美术排版;本 Skill 负责多格式同源交付和富媒体降级策略。 - 不将 SingleFile CLI 作为产品内置依赖:其开源仓库为 AGPL,且它更适合网页存档,不是多格式内容发布管线。
- HTML 与打印/办公格式并非等价。交互图表、iframe 和媒体播放能力只在 HTML 保真;其他格式应把信息和访问路径交付完整,而不是伪装成可播放内容。
Runtime context (shared)
运行前读取本 Skill 包的 skill.yaml,由宿主提供 skill-runtime/v1 上下文。字段解析顺序为:当前请求、项目上下文、个人 Preferences、品牌 Profile、通用默认值。
- 只使用 Manifest 声明的字段;Profile 保存公开品牌事实,Preferences 保存个人工作偏好。
required: true字段缺失时,按 Manifest 的问题配置向用户提出一个聚焦问题;用户明确同意后再保存回答。- 报错提供可复制的
context_id、字段路径与来源,诊断内容避开秘密、完整私人路径和原始配置。
通用反馈闭环
用户在 Skill 驱动任务中提出修改意见时,继续当前产物前必须执行:
- 先判断意见是
task-specific(仅本次)还是reusable(可跨任务复用)。 task-specific只修改当前任务,不改 Skill。reusable先确定作用域:领域规则先更新对应 canonical Skill;适用于所有 Skill 的规则先更新共享规范。- 完成规则更新、版本、lint 与分发核验后,再把修改应用到当前任务。
reusable修改会使此前的“确认”“继续”“发吧”失效;完成当前产物修改和回读后必须停下,等待用户下一步指示,不自动进入发布、提交或其他外部写入。