> Typora 不需要复刻——它的能力本来就是开源拼装的。这个 skill 把同一套拼装做成 AI 可调用的版本。
愿景: 加速企业向全场景人工智能机器人转变
理念: 打破信息孤岛,用一套系统驱动企业增长
huo15-openclaw-office-doc 的边界(必读)| 维度 | huo15-openclaw-office-doc | huo15-markdown-export(本 skill) |
|---|---|---|
| --- | --- | --- |
| 输入 | 自然语言指令(写合同/写 PRD) | 已有的 markdown 文件 |
| 引擎 | python-docx + reportlab(结构化直出) | markdown-it + Puppeteer + Pandoc |
| 适用 | 合同 / PRD / 会议纪要 / 故障报告等结构化业务公文 | 技术博客 / 复盘 / 营销文案 / 客户报告等视觉化 markdown |
| 主题 | 一套企业公文规范 | 7 套(报纸风/暗色/学术/公众号/小红书/品牌等) |
| 多端 | docx / PDF | docx / PDF / HTML / 长图 / 公众号 inline / live preview |
选择规则:用户给"目的+主题"让你写新文档 → office-doc;用户给一份已有的 .md 让你"导出/渲染/换主题/做长图" → 本 skill。
input.md ──┬──► md2pdf.sh ──► input.pdf Chromium 打印,7 主题
│ └─ md2pdf-puppet.js (推荐)
│ └─ pandoc engine (可选,需 weasyprint/xelatex)
│
├──► md2docx.sh ──► input.docx Pandoc + reference.docx 模板
│
├──► md2html.js ──► input.html 单文件自包含,可邮件可离线
│
├──► md2image.js ──► input.png 1080px 长图(小红书/朋友圈)
│
├──► md2wechat.js ──► input.wechat.html juice 内联,粘到公众号编辑器
│
├──► md-preview.js ──► http://localhost 改文件自动 reload + 主题热切换
│
└──► md-diff.sh <from> <to> ──► changelog.pdf git ref 之间的变更报告
# 1. 第一次用先装依赖
bash scripts/install-deps.sh
# 2. 用样例文件试一发
node scripts/md2pdf-puppet.js examples/sample.md # → examples/sample.pdf
node scripts/md2html.js examples/sample.md # → examples/sample.html
node scripts/md2image.js examples/sample.md # → examples/sample.png(小红书)
node scripts/md2wechat.js examples/sample.md # → examples/sample.wechat.html
# 3. 实时预览
node scripts/md-preview.js examples/sample.md # 浏览器开 http://127.0.0.1:7777
> v0.4.0 起 11 套主题分两大流派阵营:信息密集(给信息读者)/ 视觉沉浸(给阅读者)。
> 设计规范完整版见 themes/DESIGN.md。
| 用户场景关键词 | 选哪个 | 用什么脚本 |
|---|---|---|
| --- | --- | --- |
| "苹果风 / 科技风 / 产品发布稿 / 默认就行" | apple-tech ⭐ v0.4.2 默认 | md2pdf 或 md2html |
| 用户场景关键词 | 选哪个 | 用什么脚本 |
|---|---|---|
| --- | --- | --- |
| "技术博客 / 长文随笔 / 个人复盘 / 报纸感" | typora-newsprint | md2pdf 或 md2html |
| "技术博客 / 产品文档 / Anthropic 风 / Stripe 风 / 行业标杆审美" | anthropic-doc ⭐ v0.4.0 | md2html 或 md2pdf |
| "GitHub / 开源 / API 文档" | github | md2pdf |
| "夜间阅读 / 投影 / 暗色" | typora-night | md2html |
| "学术论文 / IEEE / 投稿初稿" | academic | md2pdf |
| "公司报告 / 客户提案 / 内部周报 / 带页眉页脚" | huo15-brand | md2pdf |
| "changelog / release notes / 版本对比" | huo15-brand | md-diff |
| 用户场景关键词 | 选哪个 | 用什么脚本 |
|---|---|---|
| --- | --- | --- |
| "品牌故事 / 商业杂志 / 深度长文 / 访谈" | editorial-magazine ⭐ v0.4.0 | md2pdf 或 md2html |
| "小说 / 长篇随笔 / 思考长文 / 沉浸阅读" | manuscript-book ⭐ v0.4.0 | md2pdf |
| "研究报告 / 数据分析 / 教学讲义 / 论证型长文" | tufte-handout ⭐ v0.4.0 | md2html(右挂边注需 ≥1100px 宽屏) |
| 用户场景关键词 | 选哪个 | 用什么脚本 |
|---|---|---|
| --- | --- | --- |
| "微信公众号 / 推文" | wechat | md2wechat(juice 内联化) |
| "小红书 / 朋友圈 / 长图文" | xiaohongshu | md2image(1080px PNG) |
用户没说就默认 apple-tech(苹果科技风,通用 + 极简 + 黑白蓝 + 大留白,适合 90% 场景)。
做技术文档无脑选 anthropic-doc(2026 年行业主流审美)。
md2pdf-puppet.jsnode scripts/md2pdf-puppet.js <input.md> [output.pdf] \
--theme typora-newsprint # 11 选 1(见 §三 决策树)
--paper A4 # A4 / Letter / A3 / A5
--margin 18 # 四边等距 mm(默认 18)
--header "我的文档" # 自定义页眉(huo15-brand 主题已内置)
--footer "{pageNumber} / {totalPages}"
--print-urls # 链接后追加 (URL) 文本
--no-mermaid # 跳过 mermaid 等待加速
md2docx.sh(需先装 pandoc)bash scripts/md2docx.sh <input.md> [output.docx] \
--no-toc # 不要目录
--reference templates/reference.docx # 自定义模板
md2image.jsnode scripts/md2image.js <input.md> [output.png] \
--theme xiaohongshu # 默认 xiaohongshu
--width 1080 # 画幅宽度
--scale 2 # 倍清(2 = retina)
md-diff.shbash scripts/md-diff.sh <from-ref> <to-ref> [output.pdf] \
--theme huo15-brand # 默认 huo15-brand
--repo /path/to/git/repo # 默认当前目录
> 用户:"把这份分析报告导成 PDF 给我"
> AI:Bash → bash scripts/md2pdf.sh /tmp/report.md /tmp/report.pdf --theme huo15-brand
> 用户:"复盘报告导成 PDF 发到运营群"
> 1. AI 写 report.md 到 /tmp
> 2. AI 调本 skill 导 PDF → /tmp/report.pdf
> 3. AI 调 huo15-wecom 发文件到目标群
> 用户:"这篇文章我要发公众号 + 小红书 + 个人博客"
> AI 并行:
> - md2wechat.js article.md → 公众号粘贴版
> - md2image.js article.md --theme xiaohongshu → 小红书长图
> - md2html.js article.md --theme typora-newsprint → 博客 HTML
> 用户:"主题再暖一点,标题大一点"
> AI 用 Edit 工具直接改 themes/typora-newsprint.css 的 --accent 与 h1 font-size,不需要写新脚本——这是本 skill 的元能力。
> 用户:"v1.2 到 v1.3 都改了什么,出个 PDF 给客户"
> AI:bash scripts/md-diff.sh v1.2.0 v1.3.0 release-notes.pdf --theme huo15-brand
> 用户(在企微对话框):"把这份复盘渲染成 PDF 发给我"
> 1. AI 调 bash scripts/md-share.sh report.md --mode pdf --label "Q1 复盘报告"(默认 --prefer file)
> 2. AI 拿到 stdout 的 JSON,看到 files[0].path = /tmp/.../report-20260505.pdf + 3 个 next_actions
> 3. priority=1 send_file_to_channel:AI 看当前会话有哪个 _send_file / _upload_file 工具(wecom_send_file / wechat_send_file / dingtalk_send_file 等),直接发文件到对话框——用户在企微/钉钉/微信里看到的是带预览的文件消息,点开下载
> 4. priority=2 share_via_public_url(fallback):send_file 类工具都不可见 / 文件 > 25MB / 用户明确说"给我链接" → 才调 enhance_share_file 拿公网 URL。收到 URL 后检查 host:含 localhost:18789 就不要发(用户看 404 — 见 §八踩坑 §14),降级 priority=3
> 5. priority=3 local_path(降级):把 file.path 告诉用户(终端 / SSH 场景)
> 用户明确要链接:加 --prefer link 反转顺序,先拿 URL 再降级到发文件
> 用户:"给我个公网链接发给客户,链接形式"
> AI:bash scripts/md-share.sh report.md --mode pdf --label "..." --prefer link
> → JSON.next_actions 的 priority=1 变成 share_via_public_url,AI 调 enhance_share_file 拿 URL 发出
> 用户:"把 Q1 复盘发布出去,我可能要发企微 + 朋友圈 + 邮件"
> AI:bash scripts/md-publish.sh report.md --slug q1-summary --label "Q1 复盘"(默认 mode=all)
> → 一次渲染 4 端产物 + 写归档 ~/knowledge/huo15/<日期>- + JSON.post_share_actions
> → 4 个 file 各调一次 enhance_share_file 拿 URL → AI 用 Edit 把 URL 回写到 KB 归档 frontmatter share_urls:
> → 组装"多版本菜单"消息回当前会话(PDF / 长图 / HTML / 公众号 inline)— 用户自己决定转发哪个,不替用户广播
> 加 --with-qr 触发"二阶段二维码":AI 用 PDF URL 二刷 md2pdf-puppet --qr-url 出打印版
> 用户:"发个链接给同事,要在企微对话框里直接看到标题+摘要预览"
> AI:md2html.js 生成 HTML(默认从 markdown 抽 H1 + 首段作 OG title/description)→ enhance_share_file → 发企微
> 同事看到带卡片预览的链接(微信/企微/Slack/Twitter 都支持 OG)
> 用户:"客户提案打印 50 份发线下,客户能扫码看在线版"
> 两阶段:① md-publish.sh proposal.md --mode pdf --with-qr 拿 PDF URL ② md2pdf-puppet --qr-url 二维码进每页页脚
> 用户打印 → 客户扫码 → 跳 enhance 公网链接看高保真 PDF
用户说"我要 X 风格" → AI 直接改 CSS,不要重写脚本:
themes/DESIGN.md(8 大设计范式 + 红线清单 + 命名规范)cp themes/typora-newsprint.css themes/.css :root 中的 token override(差异化变量,如 --font-body / --color-accent / --measure / --leading)— 不要复制 _tokens.css 的内容,render.js 自动 prependscripts/lib/render.js 的 AVAILABLE_THEMES 数组加新名字--theme 主题文件不允许:
/ 远程 @import 字体(打印会卡)/ JS| 依赖 | 必需性 | 装法 |
|---|---|---|
| --- | --- | --- |
| Node ≥ 18 | 必装 | https://nodejs.org/ 或 brew install node |
npm install(本目录) | 必装 | bash scripts/install-deps.sh |
| Pandoc | md2docx 必需 | brew install pandoc / apt install pandoc |
| WeasyPrint | md2pdf --engine pandoc 路线可选 | pip install weasyprint |
| huo15-openclaw-enhance | 可选 — 装了启用"企微对话拿公网 URL"模式 F | openclaw plugins install @huo15/huo15-openclaw-enhance |
默认路线(puppeteer)只需 npm install,不依赖 pandoc;企微集成所需的 enhance 也是可选,无 enhance 仍能用本机渲染。
md2wechat.js(已 juice 内联),不能直接用 md2html.js 的输出粘md2pdf-puppet.js 默认从 jsdelivr CDN 加载 mermaid 运行时,离线环境加 --no-mermaidacademic 主题用衬线英文优先,中文长段落建议手动加空格断词,或改用 huo15-brand 主题--header 参数手动加templates/README.mdenhance_share_file 工具的 structuredContent.url 取真实链接。不能手写、拼接、猜测、回忆类似 http://localhost:18789/、/plugins/enhance-share/(缺 token)等任何形式——它们都不是真实链接,用户点了只会 404。这条与 enhance v5.7.24+ 的规则一致bot_base_url=http://localhost:18789,OpenClaw gateway 默认端口 18999(可能绑 LAN IP)。如果用户的 OpenClaw 没配公网 bot_base_url,任何 share/preview 工具返回的 URL 可能是 localhost 或 LAN IP(http://192.168.1.x:18999/... / http://10.0.0.x:18789/...),企微/钉钉外网用户机器根本访问不到这些地址,点开就 404。AI 拿到 URL 后必须跑 unsafe_host_check:localhost / 127.0.0.1 / 0.0.0.0 / ::1 → 不发192.168. / 10. / 169.254. / 172.16.-172.31. 开头 → 不发(RFC 1918 私网地址)priority=3(本地路径) 或 priority=$P_SEND(发文件),并提示用户"enhance/gateway 未配公网 bot_base_url,本次走文件路径"enhance_share_file,任何来自 enhance_preview / gateway static / agent 自写 HTML 等第三方工具的 URL 都按这条把关--prefer file 直接绕过这个坑——发文件不依赖公网 URL。md-share.sh / md-publish.sh JSON next_actions[].unsafe_host_check 字段明文列了所有 unsafe host pattern,AI 必看必跑md-share.sh + enhance_share_file 链路lesson_wecom_at_all_broadcast.md v2.8.1 @all 事故的红线feedback_plugins_must_be_independently_installable.md 一致)企微用户:"把这份分析报告导成 PDF 发我"
│
▼
OpenClaw inbound
│
▼
AI 看到 SKILL.md §九 模式 F
│
▼
bash scripts/md-share.sh report.md --mode pdf --label "..."
│
│ stdout: {"files":[{"path":"/tmp/.../report-TS.pdf",...}], "next_actions":[...]}
▼
AI 按 next_actions priority=1 尝试:
enhance_share_file({filePath, label, expireHours: 24})
│
├─ 工具可见 ─→ 拿 structuredContent.url ─→ outbound 发链接到企微 ─→ ✓
│
└─ 工具不可见 / 调用失败 ─→ priority=2 fallback ─→
outbound 把 file.path 告诉用户(降级)
md-share.sh 用法速查# 单一格式
bash scripts/md-share.sh report.md --mode pdf --label "Q1 复盘报告"
bash scripts/md-share.sh post.md --mode image --theme xiaohongshu # 小红书长图
bash scripts/md-share.sh news.md --mode wechat # 公众号 inline
# 一份 md 多端并行(企微一次给齐 PDF + 长图 + 网页 三个链接)
bash scripts/md-share.sh report.md --mode all --label "战略分析报告"
# 长效链接(客户 30 天内可访问)
bash scripts/md-share.sh proposal.md --mode pdf --expire-hours 720 --label "客户提案 v1"
md-publish.sh 用法速查(v0.3.0,比 md-share 多了 KB 归档 + 多端默认)# 默认:mode=all,自动归档到 ~/knowledge/huo15/<日期>-<slug>.md
bash scripts/md-publish.sh report.md --slug q1-summary --label "Q1 复盘报告"
# 客户提案(打印场景):带二维码,二阶段 AI 自动二刷 PDF
bash scripts/md-publish.sh proposal.md --slug client-proposal-v1 \
--label "客户提案 v1" --with-qr --expire-hours 720
# 不归档(纯发布,不写知识库)
bash scripts/md-publish.sh quick-note.md --no-archive
# 自定义归档目录
bash scripts/md-publish.sh internal.md --kb-dir ~/work/wiki/2026-q2
# 仅 PDF + 归档
bash scripts/md-publish.sh report.md --mode pdf --slug q1-summary
md-publish vs md-share 选择:
md2html 默认从 H1 + 首段抽 og:title/description;显式覆盖用 --og-title/--og-description/--og-image/--og-url。HTML 粘到企微/微信/Slack 自动渲染卡片md2pdf-puppet --qr-url --qr-label "扫码看在线版" ,二维码进每页右下角页脚(huo15-brand 主题最佳)输出 JSON(stdout)始终遵循 schema:
{
"status": "render_complete",
"files": [{ "path": "/tmp/.../xxx.pdf", "kind": "pdf", "label": "...", "size_kb": 234, "mime": "...", "theme": "huo15-brand" }],
"next_actions": [
{ "priority": 1, "tool": "enhance_share_file", "args_per_file": {...}, "result_field": "structuredContent.url", "warning": "严禁手写 URL" },
{ "priority": 2, "tool": null, "fallback": "把 path 告诉用户" }
],
"ai_instruction": "对每个 file 优先 priority=1,失败降级 priority=2"
}
用户出现以下意图就走模式 F:
如果用户只是说"导出 PDF" 而没有发送/链接意图,走模式 A(纯本机文件输出);用户后续说"发我" 再切到模式 F。
huo15-markdown-export/
├── SKILL.md / README.md / package.json / _meta.json / LICENSE
├── scripts/
│ ├── install-deps.sh / install-to-workspaces.sh
│ ├── md2pdf.sh + md2pdf-puppet.js # PDF
│ ├── md2docx.sh # Word(Pandoc)
│ ├── md2html.js # HTML 自包含 + OG 卡片
│ ├── md2image.js # 长图 PNG
│ ├── md2wechat.js # 微信公众号 inline
│ ├── md-preview.js # 127.0.0.1 live preview
│ ├── md-share.sh / md-publish.sh # 对接 enhance(JSON)
│ ├── md-diff.sh # git → changelog PDF
│ └── lib/render.js # 共享渲染核心
├── themes/
│ ├── DESIGN.md ⭐ v0.4.0 # 设计规范(必读)
│ ├── _tokens.css ⭐ v0.4.0 # design tokens
│ ├── apple-tech.css ⭐ v0.4.2 默认 # 苹果科技风
│ ├── typora-newsprint / -night / github / academic / huo15-brand
│ ├── anthropic-doc / editorial-magazine / manuscript-book / tufte-handout ⭐ v0.4.0
│ └── wechat / xiaohongshu # hardcode(目标编辑器剥 var)
├── templates/{pdf-print.css, README.md}
└── examples/{sample.md, chart-demo.md}
http://192.168.1.177:18999/nengbai_preview.html LAN 预览链接,企微外网用户访问不到。18999 是 OpenClaw gateway 默认端口,LAN IP 是用户机器内网地址 — 跟 v0.4.3 修的 localhost:18789 同源localhost / 127.0.0.1,这次扩:localhost / 127.0.0.1 / 0.0.0.0 / ::1(本机 loopback)192.168. / 10. / 169.254. / 172.16.-172.31.(RFC 1918 私网地址)next_actions[].unsafe_host_check 新增字段明文列检测规则;ai_instruction 强调跨 skill 适用 — 不只检查 enhance_share_file 返回值,任何来自第三方工具(enhance_preview / gateway static / agent 自写 HTML 等)的 URL 也按此把关enhance_share_file 拿的 URL 是 http://localhost:18789/plugins/enhance-share/...(enhance 默认 bot_base_url 未改),企微用户点开 404md-share.sh / md-publish.sh 默认 --prefer file,JSON next_actions 改 3 优先级:--prefer link 反转优先级(用户明确要链接时用)tools_pattern 列举:wecom_send_file / wechat_send_file / dingtalk_send_file / _send_file / _upload_fileapple-tech 主题作为默认 — Apple 官网视觉:大字 hero(h1=3rem 紧字距 -0.022em)+ 大留白(80px+ padding)+ 黑白为主(#1d1d1f 字 / #ffffff 底)+ 极少色(Apple Blue #0066cc 仅在链接,60-30-10)+ 圆角(8-12px panel)+ 零装饰(无下划线 / 无边框 / 无分隔线)@media print 切到 Helvetica Neue + Songti SC(反 Type 3 安全字体,PDF 嵌入 CID TrueType 正常)render.js 在 markdown-it parse 前调 stripFrontMatter() 剥掉 --- title: x\nauthor: y ---,原来被当成
+ 段落渲染显示为大字标题段,现在剥干净 + meta.title 注入 OG titlerender.js 内 DEFAULT_THEME = 'apple-tech'(原 typora-newsprint),md2html.js / md2pdf-puppet.js / md2pdf.sh / md-share.sh 默认全部同步description 开头加"火一五排版发布技能"重复 3 次提升嵌入向量命中,aliases 列表前 8 位全是"火一五XXX"高频锚词,补"苹果科技风排版" / "火一五苹果风"anchor permalink 染色 bug:markdown-it-anchor 给 h1-h6 内嵌的 继承 --color-accent 致 h1/h2 整段变 Apple Blue,显式 h1-h6 a { color: inherit } 让标题保持 fg 色-apple-system / system-ui / PingFang SC / SF Pro / Iowan Old Style)+ OpenType CFF 字体(Source Han Sans/Serif SC / Noto CJK / Hiragino Sans GB)走 Type 3 路径渲染,WPS / Foxit / 旧 Acrobat 渲染成笔画细 + 灰阶模糊_tokens.css 字体栈剔除所有禁忌字体,英文用 PT Serif/Merriweather/Open Sans/Helvetica Neue,中文 fallback 不论英文衬线/无衬线统一用 Songti SC(macOS 预装真 TTC,嵌成 CID TrueType 正常)@media print 自动反色为浅底深字 — 原本暗底浅字打印模式 1.4:1(WCAG 远不达 4.5:1)看不清,反色后 17.4:1templates/pdf-print.css 删 body { background: #ffffff !important } 强制白底 — 让主题自控背景(newsprint 米色 / manuscript 旧书纸 / editorial 暖白等保留)themes/DESIGN.md §7.5 新增"反 Type 3 字体硬红线"段,落禁忌字体清单 + 推荐字体 + 发版前 pdffonts | grep "Type 3" 自查themes/_tokens.css(全局 design tokens:字体栈 / 字号阶梯 1.25 Major Third / 行高档位 / 留白 8pt grid / 容器宽 / 语义色)render.js 自动为 9 个支持 token 的主题 prepend _tokens.css,wechat / xiaohongshu 因目标编辑器剥 var 保留 hardcodethemes/DESIGN.md — 8 大设计范式 + 反 AI Slop 红线 + 主题选择决策树 + 新主题 7 步 checklist + 发版前红线 grep 自查anthropic-doc — Anthropic / Stripe 技术文档风,衬线正文 + 灰底代码 + 极少装饰(2026 年技术文档主流审美)editorial-magazine — 商业杂志体,Playfair Display 大字 + drop cap + 满版图 + 大留白(品牌故事 / 深度长文)manuscript-book — 书稿 / 小说体,单一衬线 + 1.95 行高 + 章标居中 + 0 装饰 + 段首缩进(无干扰沉浸阅读)tufte-handout — Tufte 边注体,窄主文 + 右挂边注(≥1100px)+ 三线表 + ET Book 衬线感(数据分析 / 研究报告)md-publish.sh 多端发布 + KB 归档;HTML OG 卡片;PDF --qr-url 二维码;install-to-workspaces.sh 多 workspace 安装md-share.sh + capability detection 集成 enhance> 详细 changelog 见 git log / cnb.cool 仓库 commit history
公司: 青岛火一五信息科技有限公司 · postmaster@huo15.com · QQ群 1093992108
共 3 个版本