3.3 KiB
3.3 KiB
[recycle] mnote Rust Block Editor Blocks Spike v0
更新时间:2026-04-18
1. 目标
本 spike 聚焦 blocks 参考层是否适合承担:
- Markdown
- round-trip
- history
- diff
- merge
以及哪些地方存在 缺口。
2. 参考入口
/mnt/Data1T/mnote/design/05-editor-mainline/reference-code/blocks/src/document.rs/mnt/Data1T/mnote/design/05-editor-mainline/reference-code/blocks/src/block.rs/mnt/Data1T/mnote/design/05-editor-mainline/reference-code/blocks/src/converters.rs/mnt/Data1T/mnote/design/05-editor-mainline/reference-code/blocks/src/history.rs/mnt/Data1T/mnote/design/05-editor-mainline/reference-code/blocks/src/diff.rs
3. 适配性结论
3.1 Markdown
blocks 最适合直接借的是 Markdown 相关思路。
原因:
- 已有文档模型
- 已有 converter facade
- 方向上天然适合 Markdown import/export
这意味着第一阶段不应该自己先写一套新的 Markdown parser 胶水。
3.2 round-trip
Markdown -> blocks -> Markdown round-trip 是 blocks 最容易先验证的一条链。
对 mnote 的价值:
- 可以快速检查标题、列表、待办、引用、代码块的稳定性
- 可以给
task-057的导入导出提供直接参考
3.3 history
blocks 的 history 适合直接借思路,不建议第一阶段重写。
至少在 undo / redo 的双栈组织上,它比从零发明更稳。
3.4 diff / merge
blocks 的 diff / merge 很适合做 AI-first 和 CLI-first 后续阶段的基础参考。
第一阶段不要求完整采用,但必须明确后续方向,否则 AI 重写链会缺审计基础。
4. 主要缺口
4.1 文档模型仍偏扁平
当前 blocks::Document 是 Vec<Block> 为主。
而 mnote 要的不是简单扁平列表,而是:
- 块树
- children
- 自定义
BlockProps - 引用 token
- 字符串 ID
这就是第一大 缺口。
4.2 BlockType 与 mnote 目标不完全一致
blocks 的 BlockType 更偏通用编辑器,不直接覆盖:
page_referenceblock_referencemedia_placeholderprogress_placeholder
因此不能直接拿来当最终枚举。
4.3 默认 ID 体系不适合
blocks 用 Uuid。
但 mnote 当前更适合:
DocumentId = StringBlockId = String
因为要跟现有页面、引用、CLI、AI 命令保持统一可读标识。
5. Spike 结论
blocks 的定位应固定为:
- 采用:Markdown 思路
- 采用:round-trip 参考
- 采用:history 思路
- 采用:diff / merge 思路
- 不直接采用:最终 block model
- 不直接采用:最终 ID 体系
6. 建议落地方式
建议在 mnote-editor-core 中这样接:
- 自定义
EditorDocument - 自定义
EditorBlockNode - 自定义
EditorBlockType - 用
blocks作为后续markdown/history/diff/merge参考或局部依赖
不要反过来把 mnote 的核心模型强行塞进 blocks。
7. 第一阶段保留判断
第一阶段可接受的保守做法:
- 先不把
blocks作为正式依赖 - 但在文档中冻结:后续 Markdown、history、diff、merge 优先复用其思路
若到 task-057 时验证表明 blocks 已足够稳定,再引正式依赖。
8. 完成判定映射
task-052 的完成判定要求本文显式包含:
- Markdown
- round-trip
- history
- diff
- merge
- 缺口
当前文档已满足这些项。