141 lines
3.3 KiB
Markdown
141 lines
3.3 KiB
Markdown
# [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
|
||
|
|
- 缺口
|
||
|
|
|
||
|
|
当前文档已满足这些项。
|