Skip to content

feat(content): 正文提取改为 Markdown 输出 - #11

Merged
ZouZhao321 merged 3 commits into
mainfrom
feat/markdown-output
Oct 9, 2026
Merged

ZouZhao321 merged 3 commits into
mainfrom
feat/markdown-output

Conversation

@ZouZhao321

Copy link
Copy Markdown
Owner

关联

无对应 issue。

做了什么

content 命令的正文提取,从「取 #js_content 纯文本、按空白切行」改为「HTML → Markdown」:

  • 用 turndown + @joplin/turndown-plugin-gfm 转换,保留标题、列表、代码块、图片、引用与表格。
  • 图片取 data-src(微信懒加载的真实地址),跳过 data: 占位图。
  • script / style 移除,只取 #js_content。
  • 顺带修掉旧实现 split(/\s+/).join("\n") 造成的正文断行:Claude code 以前会被切成两行。

依赖选型说明:microsoft/markitdown 是 Python 包(pyproject.toml 依赖 beautifulsoup4、markdownify),Node CLI 用不了;npm 上的 markitdown-ts 是社区移植(0.0.10,2026-02 停更),依赖 jsdom、mammoth、pdf-parse、xlsx、ai,而它自己的 src/converters/html.ts 就是 jsdom + turndown。所以只引入 turndown 与 GFM 插件这两个库。

JSON 外壳保持不动:结果仍在 stdout 的 { url, content },错误仍在 stderr + {"error":...} + 退出码 1。

验收

  • 命令:pnpm format:check && pnpm lint && pnpm build && pnpm test,结果:全绿,6 个文件 37 条测试通过(新增 4 条)
  • 命令:node dist/index.js content "https://mp.weixin.qq.com/s/s_AmjWIB57b7fQY_3VNkoQ",结果:exit 0,17076 字符;### 13 处、#### 35 处、图片 15 处、表格行 15 处、引用 24 处、列表项 42 处,与页面 HTML 里的 h3 13 / h4 35 / img 15 一致
  • 对照改动前:同一篇正文为 12269 字符,Markdown 标记数为 0(#、**、代码围栏、图片语法均不出现)

影响面与回滚

content 字段的值由纯文本变为 Markdown,字段名与 JSON 外壳不变,退出码与错误分支不变;MCP 的 content 工具返回同一份载荷,随之变化。回滚:git revert 本提交。

检查清单

  • 一个 PR 只对应一个逻辑变更,提交信息形如 type(scope): 中文描述
  • 本地跑了完整测试,不只跑改动的那一条
  • 涉及对外接口或结构的改动已同步到 docs/(README、docs/README.zh-CN.md)

@github-actions github-actions Bot added kind/docs 文档 kind/chore 依赖、配置、构建、脚本 needs-triage 待评估:类型、优先级、可执行性都未判定 labels Oct 9, 2026
@ZouZhao321
ZouZhao321 force-pushed the feat/markdown-output branch from aa51315 to 40d3670 Compare October 9, 2026 10:47
@ZouZhao321

Copy link
Copy Markdown
Owner Author

ocr 评审与处理

命令:ocr review --from main --to HEAD --provider commandcode(worktree 内执行)。

  • 默认 provider ark 整月额度已用尽:ocr llm test 返回 429 AccountQuotaExceeded,重置时间 2026-10-16 23:59:59 +0800。commandcode 是 ~/.opencodereview/config.json 里已有的另一个 provider,用 --provider 单次指定,配置文件未改动。
  • 第一轮 6 个文件里 3 个失败(含 src/lib/markdown.ts 所在分组),0 条结论,不可用;--resume 续跑后完成,2 条发现,均 low。

1. src/lib/markdown.ts 图片地址与 alt 未转义 → 已处理(结论与评审不同)

评审建议对地址做转义/加尖括号。实测 turndown 7.2.4 的默认规则已经处理:

输入  <img src="https://x/a b(c)d<e>f.png" alt="图[1]">
输出  ![图\[1\]](<https://x/a b\(c\)d\<e\>f.png>)

即地址含空格/圆括号时加尖括号并转义,alt 里的方括号也会转义。因此删除了我原先手写的转义——它会把反斜杠叠加成 \\\[,反而破坏输出。补了一条测试固定该行为(fixture 里的 data-src="https://mmbiz.qpic.cn/a/b (1).png")。

补充事实:真实文章 15 张图的地址里没有空格/圆括号/尖括号,alt 里没有方括号,这一条是潜在边界,当前语料不触发。

2. src/lib/markdown.ts 双重类型断言 → 已处理

图片的 data-src 归一化移到 cheerio 阶段(content.find("img"),typed API),自定义 turndown 规则整段删除,断言随之消失。评审建议的 lib: ["ES2022", "DOM"] 未采纳:会给 Node CLI 引入浏览器全局类型,与 @types/node 的同名声明冲突风险更高。

验证

  • pnpm format:check && pnpm lint && pnpm build && pnpm test:全绿,38 条测试通过。
  • node dist/index.js content "https://mp.weixin.qq.com/s/s_AmjWIB57b7fQY_3VNkoQ":17076 字符,### 13、#### 35、图片 15、data: 占位图 0、表格行 15、引用 24、列表项 42,与页面 HTML 一致。

@ZouZhao321
ZouZhao321 merged commit 516d026 into main Oct 9, 2026
2 checks passed
@ZouZhao321
ZouZhao321 deleted the feat/markdown-output branch October 9, 2026 17:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

kind/chore 依赖、配置、构建、脚本 kind/docs 文档 needs-triage 待评估:类型、优先级、可执行性都未判定

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant