design expand gfm parser migration checklist

This commit is contained in:
lix-2026
2026-05-08 00:48:12 +08:00
parent ffab095d86
commit e082e71b5d
@@ -201,3 +201,86 @@
- AST -> block / inline 映射接口冻结。 - AST -> block / inline 映射接口冻结。
- 当前手写 parser 的临时补丁有对应回归测试。 - 当前手写 parser 的临时补丁有对应回归测试。
- 浏览器 smoke 能稳定证明 task list 和 inline mark 真正渲染出来。 - 浏览器 smoke 能稳定证明 task list 和 inline mark 真正渲染出来。
## 11. 详细 checklist
### 11.1 选型与边界冻结
- [ ] 确认 Rust 侧 Markdown AST 解析器选型。
- [ ] 明确是否需要 GitHub Flavored Markdown 全集,还是只保留当前本地链路所需的 GFM 子集。
- [ ] 冻结 frontmatter 处理方式:解析器只解析正文,还是 frontmatter 也由同一模块统一处理。
- [ ] 冻结 AST 输出到中间 IR 的边界,不直接在 AST 层拼 `PageAggregate`
- [ ] 明确 table、task list、inline mark、fenced code、attachment link 的优先级。
- [ ] 明确不支持语法的降级策略,要求可解释且可测试。
### 11.2 AST -> 中间 IR
- [ ] 建立 `MarkdownAstDocument` / 等价中间结构。
- [ ] 建立 block 级节点映射:paragraph / heading / list / task / quote / code / divider / table / media。
- [ ] 建立 inline 级节点映射:text / code / bold / italic / strike / underline / link。
- [ ] 保证 task list 的 checked 状态进入正确的 task item 节点,而不是外层 list 节点。
- [ ] 保证表格单元格内的 inline mark 不丢失。
- [ ] 保证空段落、空表格单元格、空引用块的处理规则固定。
- [ ] 统一处理标题优先级:frontmatter title > H1 > 文件名。
### 11.3 中间 IR -> PageAggregate / block document
- [ ] 把 AST 到 `PageAggregate.body.content` 的映射集中到单一模块。
- [ ] 消除 `local_folder_source.rs` 里散落的手写语法分支。
- [ ] 让 block document 输出保持与 `web_shell.rs` 兼容。
- [ ] 保留 block id 稳定性,避免刷新后整篇文档重建导致的局部状态抖动。
- [ ] 保留 frontmatter 原文和页面设置写回边界。
- [ ] 对 unsupported 节点采用明确降级,而不是静默丢语义。
### 11.4 Inline mark 双向转换
- [ ] `code` 解析为 inline code mark。
- [ ] `bold` 解析为 strong mark。
- [ ] `italic` 解析为 emphasis mark。
- [ ] `strike` 解析为 strike mark。
- [ ] `link` 解析为带 href 的 link mark。
- [ ] 保存回写时按同一映射反向输出 Markdown。
- [ ] 确保 table cell 内的 inline mark 在读写两端都保留。
- [ ] 确保 legacy block -> Tiptap -> legacy block 不再丢 marks。
### 11.5 Task list 双向转换
- [ ] `- [x]` / `- [X]` 进入 checked task item。
- [ ] `- [ ]` 进入未勾选 task item。
- [ ] task item 文本内容走 inline IR,不走纯文本拼接。
- [ ] Tiptap 的 `taskList` / `taskItem` 与 legacy `todo` 对应关系固定。
- [ ] 保存回写时 task item 重新输出为标准 Markdown checkbox 语法。
- [ ] 浏览器 smoke 断言 checked / unchecked 两种状态都出现。
### 11.6 Table 处理
- [ ] 统一 pipe table 解析规则。
- [ ] 单元格内容通过 inline IR 输出,不再只保留纯文本。
- [ ] 表头 / 普通单元格类型在 AST 映射中保持稳定。
- [ ] 保存回写时保留表格分隔行和列数对齐。
- [ ] 列对齐、空单元格、带 mark 单元格的降级策略要写入测试。
### 11.7 保存回写
- [ ] 保存链路只依赖 block document / editor document,不依赖 Markdown 手写规则。
- [ ] 前端编辑器保存路径仍能写回 `.md`
- [ ] task list、inline mark、table 的回写结果可再次被 AST 解析器读回。
- [ ] 保留 frontmatter `title` / `mnote_id` / 页面设置写回逻辑。
- [ ] 保存失败时保留编辑器状态并给出可解释错误。
### 11.8 回归测试
- [ ] `local_markdown` 测试组覆盖基础块、task list、inline marks、table、附件链接。
- [ ] 新增 AST 解析器单测,验证解析结果和当前手写 parser 预期一致或更强。
- [ ] 新增保存回写单测,验证 round-trip 不丢 task / marks。
- [ ] 新增 web shell 单测,验证 legacy <-> Tiptap 转换不丢 marks。
- [ ] 新增浏览器 smoke,验证 checkbox、code、strong、em、strike、link、table cell marks。
- [ ] 确认本地 `.md` 读写 smoke 不影响 file tree / page tree / page aggregate 路由。
### 11.9 清理与迁移收尾
- [ ] 把手写 parser 标记为过渡实现。
- [ ] 移除 `local_folder_source.rs` 中不再需要的临时解析函数。
- [ ] 移除 `web_shell.rs` 中只为补丁存在的临时适配分支。
- [ ] 保留回归测试和兼容层,不删除验证资产。
- [ ] 迁移完成后把设计稿状态从 `process` 移到 `done`