baoyu-markdown-to-html实战:把Markdown变成可交付的公众号HTML
baoyu-markdown-to-html 把 Markdown 渲染为内联样式 HTML,目标是适配微信公众号等不方便加载外部 CSS 的平台。它不是通用 Markdown 清洗器,也不会替你判断文章事实、版权或图片是否可公开。
本文基于固定提交源码核对;案例是操作示例,不是公众号账号、在线发布或浏览器实测。写作过程中未执行安装、转换、渲染或发布。
一、适用场景与边界
适合已经完成内容和排版的中文文章:需要选择主题色、代码高亮、表格、图片、脚注、提示块,或把普通外链集中成文末引用。输出 HTML 与输入 Markdown 同目录,便于把它复制到公众号编辑器或交给其他发布流程。
它不是“把任意 Markdown 变成浏览器完全等价页面”的保证。微信编辑器可能再次清洗 HTML;外链图片需要网络访问;Mermaid 依赖 Chrome/Chromium/Edge 通过 CDP 渲染,缺浏览器时会退回 <pre class="mermaid">,转换仍可能成功但不再是图片。PlantUML、数学、脚注和自定义主题也应在目标平台预览。
中文文件还有一个前置分支:若检测到 CJK 且Markdown 排版可用,技能会询问是否先整理格式。这是用户选择,不应自动把原稿改成另一份内容。标题默认从 frontmatter 或首个 H1/H2 推断,并默认移除正文第一个标题;若需要保留必须明确使用 --keep-title。
二、按需安装与固定版本
本系列已核实 skills CLI 1.7.2 的按技能参数,按需安装命令是:
1 | npx skills add jimliu/baoyu-skills --skill baoyu-markdown-to-html --agent codex |
该命令安装的是当前仓库内容,最新安装不等于固定快照。本文核对的来源固定在提交 1567581c26ec29f4216c6e6835415bf30343b0e3。要重现同一行为,应把该提交的完整技能目录放入项目,并检查 scripts/package.json 中的 baoyu-md 与 baoyu-chrome-cdp 依赖。
运行时需要 Bun 或可用的 npx -y bun;源码帮助输出已核实使用:
1 | npx -y bun "{baseDir}/scripts/main.ts" "article.md" --theme grace |
{baseDir} 是技能目录,文件路径可为绝对路径。不要把 --theme 当作 Agent 的自然语言主题名;脚本支持 default、grace、simple、modern。安装前无需执行发布或登录,也不需要公众号凭证。
三、输入、输出与选项
输入必须是 .md 且存在。输出固定为同目录的同名 .html;例如 article.md 生成 article.html。如果 HTML 已存在,脚本先改名为 article.html.bak-YYYYMMDDHHMMSS,再写新文件。这个备份是输出冲突保护,不代表输入 Markdown 有备份,重要改动前仍应保存版本。
常用选项来自源码帮助:
| 需求 | 参数 | ||||
|---|---|---|---|---|---|
| 主题 | `—theme default\ | grace\ | simple\ | modern` | |
| 主色 | --color red 或十六进制 |
||||
| 字体 | `—font-family sans\ | serif\ | serif-cjk\ | mono` 或 CSS 值 | |
| 字号 | --font-size 14px 到 18px |
||||
| 代码主题 | --code-theme NAME |
||||
| Mac 风格代码框 | --mac-code-block / --no-mac-code-block |
||||
| 行号 | --line-number |
||||
| 统计 | --count |
||||
| 图片图注 | `—legend title-alt\ | alt-title\ | title\ | alt\ | none` |
| 保留首标题 | --keep-title |
||||
| 外链文末引用 | --cite |
||||
| Mermaid | --mermaid-theme、--mermaid-scale、--mermaid-width、--mermaid-bg |
||||
| 禁用 Mermaid | --no-mermaid |
--cite 默认关闭,只在用户明确要求“底部引用”等场景启用。普通外链变成编号上标并集中到 引用链接;微信公众号文章链接保持直接链接,链接文字本身就是 URL 时也保留行内形式。不要为了“看起来更像论文”自行打开该选项。
四、可复制的自然语言 Agent 请求
1 | 请使用 baoyu-markdown-to-html 转换 [Markdown绝对路径]。 |
如果文章是技术教程:
1 | 请保留代码原文和 fenced language,使用清晰的代码主题与行号。 |
五、操作案例:将中文教程交付给公众号编辑
假设 Obsidian 中已有 deploy-guide.md,包含 frontmatter、二级标题、Shell 代码、两张本地截图和一个 Mermaid 流程图。目标是交给编辑预览,而不是直接发布。下面展示核实后的操作顺序,不声称已经运行这个文件。
- 先检查输入。 确认文件扩展名为
.md,图片相对deploy-guide.md的路径存在,Mermaid 围栏没有被代码示例嵌套破坏。 - 处理中文预检查。 若 Markdown 强调标记夹着中文标点,询问是否先用排版技能。接受时使用排版后的副本;拒绝时保留原稿并记录选择。
- 选择主题和标题策略。
grace用于更柔和的卡片式呈现,simple适合留白,modern可配自定义主色。frontmatter 已有title时默认以它为标题,正文首个 H1 通常移除,避免出现两份标题。 - 转换 Mermaid。 有 Chrome 时按代码、主题、缩放、宽度、背景计算缓存键,PNG 写入
imgs/.mermaid-cache/。检查 JSON 结果里的mermaidImages,关注是新渲染还是命中缓存。 - 检查图片与外链。 本地图片会解析为 HTML 图片;远程图片可能先在临时目录处理,输出 HTML 中保留可访问来源。选择
--cite后只移动普通外链,不应期待微信链接也出现在文末。 - 对照 HTML。 打开生成文件,检查标题、摘要、代码、表格、图片宽度和引用段。再粘贴到测试公众号草稿或本地 HTML 预览环境;这是内容交付前检查,不是发布授权。
- 回写 Obsidian 链接。 Obsidian 继续以 Markdown 为源文件,HTML 作为交付产物。不要让发布脚本反过来把 HTML 当成下一次 Markdown 输入,否则容易积累内联样式和重复标题。
六、主题、配置与渲染细节
EXTEND.md 按项目、XDG、用户目录查找,第一个命中生效;没有就用默认值。支持默认主题、自定义 CSS 变量、代码样式和 Mermaid 默认值。CLI 显式参数优先于配置。若本技能没有 default_theme,流程还会检查 baoyu-post-to-wechat 的同名配置,作为跨技能回退;不要只在一个文件里找不到主题就马上询问用户。
Mermaid 相关参数可在配置或命令行表达:主题支持 default、forest、dark、neutral、base;缩放为正数且不大于 4;宽度为正整数;背景可用 white、transparent 或十六进制颜色。没有 Chrome 时仍输出 HTML,但 Mermaid 会以 <pre> 回退,不应在交付报告里写“图已渲染”为真。
源码返回 JSON,包含标题、作者、摘要、htmlPath、可选 backupPath、内容图片与 Mermaid 图片列表。错误日志写到 stderr,JSON 写到 stdout;若用脚本串接,应分别读取,不要把日志文本当作 JSON。
七、验收清单
- [ ] 输入 Markdown 路径存在且扩展名正确,原文件保持未改。
- [ ] 标题只出现一次,
--keep-title的选择与预期一致。 - [ ] frontmatter 的 title、author、description、图片路径均正确。
- [ ] HTML 输出路径准确,旧 HTML 有备份时路径已记录。
- [ ] 代码、表格、脚注、提示块、图片和外链按预期渲染。
- [ ] Mermaid 报告明确写出渲染、缓存或
<pre>回退状态。 - [ ]
--cite只有在明确要求时开启,微信链接规则符合预期。 - [ ] Obsidian 保留 Markdown 源,Hexo 或公众号只接收经过预览的 HTML。
八、排错
HTML 有了但 Mermaid 是代码块。 先检查 Chrome/Chromium/Edge 和 CDP 渲染条件;这是源码允许的成功回退,不是正文转换完全失败。若发布平台不支持 <pre class="mermaid">,应安装或指定可用浏览器后重跑,并检查缓存目录。
标题重复。 这是默认删除首标题的边界:如果使用了 --keep-title,或 frontmatter 与正文各有一个标题,按目标平台选择其一。不要在 HTML 上手工删除后又重复转换源 Markdown。
远程图片不显示。 HTML 可能保留原始 URL,目标平台会受防盗链、HTTPS、网络策略影响。优先使用有授权的本地图片并检查相对路径;不要把图片下载到技能源码目录。
主题没有按配置生效。 按优先级检查 CLI、当前技能 EXTEND.md 和发布技能的跨技能配置。显式 --theme 后应以命令为准。
文末引用多了或少了。 核对是否真的传了 --cite,并按规则区分普通外链、微信文章链接和“链接文字等于 URL”的情况。
九、相关技能与固定来源
- Markdown 排版:中文预处理和结构整理。
- 文章翻译:先完成译文,再生成 HTML。
- 网页转 Markdown:采集来源正文。
- YouTube 字幕提取:把字幕整理稿转成展示页面。
固定源码提交:1567581c26ec29f4216c6e6835415bf30343b0e3。





