Files
mnote/design/old/05-editor-mainline/process/rust-block-editor-blocks-spike-v0.md
T

141 lines
3.3 KiB
Markdown
Raw Normal View History

# [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_reference`
- `block_reference`
- `media_placeholder`
- `progress_placeholder`
因此不能直接拿来当最终枚举。
### 4.3 默认 ID 体系不适合
`blocks``Uuid`
`mnote` 当前更适合:
- `DocumentId = String`
- `BlockId = 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
- 缺口
当前文档已满足这些项。