docs: 新增编辑器即时渲染方案、实施与 P3 加固记录
- editor-live-rendering.md(新):Typora 式单编辑面方案——路线选型、装饰层分层设计、 widget 规格、安全与风险、测试方案、P0–P3 实施拆解;§12 为实施与加固记录: 两个实测缺陷的根因与修复、3000 行性能实测数据、§12.6 真机输入法人工门槛(阻塞发布)、 §12.7 编辑区高度 - design.md §8.2:编辑器段落由「分屏实时预览」改为即时渲染表述,链接本方案并标注发布门槛 - decisions.md:D37–D52(装饰器路线、单一 ViewPlugin、行级 reveal、长文档补解析、 选区端点行采集、reveal 二分、@codemirror/commands 仅为 devDependency、人工门槛、编辑区高度) - acceptance.md:新增 M5 里程碑与 M5-G 人工门槛行,补 v1.1/v1.2 浏览器复走记录与用例数 文档先行,代码实现见后续提交。
This commit is contained in:
+33
-3
@@ -43,6 +43,7 @@
|
||||
| slug | 中文 post-YYYYMMDD、同日冲突 -2、回收站占用、手改 409 字段级错误、非法格式 400 | 同上 |
|
||||
| 元信息注入 | 公开注入笔记 meta;私有/不存在回退站点默认;html/template 转义 | visibility_test.go + webui_test.go |
|
||||
| 前端 vitest | sanitize schema 快照 + 恶意 Markdown 冒烟 + GFM 回归 + node prop 泄漏检查 | web/tests/markdown.test.tsx(6/6) |
|
||||
| 即时渲染装饰层 | 语法区间识别 / reveal(含二分等价)/ 安全 / 文首文末边界 / 跨原子区间选区 / 不变量 / 3000 行性能基准 | web/tests/editor-live-preview.test.ts(29)+ editor-boundaries.test.ts(32) |
|
||||
|
||||
**回归命令**:`make test`(go vet + go test ./... + vitest)与 `make smoke`。
|
||||
|
||||
@@ -55,6 +56,8 @@
|
||||
| M2 管理端 | 登录/会话/CSRF + CRUD + 回收站 + 图片上传 + 编辑器 + 改密;完整矩阵 + 各组用例随功能交付 | ✅ |
|
||||
| M3 安全加固 | §9.3 全项通过(见上表);CSP nonce 硬化按设计留 M3+ 待办 | ✅ |
|
||||
| M4 运维 | systemd ×3 + Caddyfile + 备份恢复演练真还原 | ✅(压测 hey 未做:单机个人规模非验收必需,工具未安装;`SetMaxOpenConns(1)` 串行模型按设计实现) |
|
||||
| M5 编辑器即时渲染(P0–P3) | 编辑态=阅读态排版(`--md-*` 契约)、全语法即时渲染、光标行展开/失焦整篇、任务框回写源文本、源码模式逃生舱;边界与选区回归(`web/tests/editor-boundaries.test.ts` 32 条);3000 行性能基准达成 §7.4 的 <16ms 目标 | ✅ 代码与自动化(实测数据见 [editor-live-rendering.md](editor-live-rendering.md) §12.5) |
|
||||
| **M5-G 人工门槛:真机输入法** | 系统拼音 / 搜狗拼音按 §12.6 的 I1–I8 用例走查并签字 | ⛔ **未执行 —— 阻塞发布** |
|
||||
|
||||
## 五、真实浏览器走查(补充验收)
|
||||
|
||||
@@ -64,23 +67,50 @@
|
||||
2. **详情页**:面包屑、标题/日期/标签、GFM 表格与任务列表(disabled checkbox)渲染、上一篇/下一篇;
|
||||
3. **登录**:错误口令提示、成功跳转 /admin;
|
||||
4. **管理列表**:公/私徽标、slug/时间/标签、状态切换/编辑/删除;
|
||||
5. **编辑器**:CodeMirror 输入、分屏实时预览、保存后自动生成 slug("go")、摘要自动截取、URL 迁移到 /notes/3/edit;
|
||||
5. **编辑器**:CodeMirror 输入、~~分屏实时预览~~(v1.1 起改为**即时渲染**,方案见 [editor-live-rendering.md](editor-live-rendering.md);源码模式为逃生舱)、保存后自动生成 slug("go")、摘要自动截取、URL 迁移到 /notes/3/edit;
|
||||
6. **回收站**:删除确认弹窗 → 列表移除 → 回收站出现 → 恢复 → 公开页重新可见(标签页标题即 meta 注入验证)。
|
||||
|
||||
### v1.1 编辑器即时渲染复走(2026-09-11)
|
||||
|
||||
在 `pn start --dev` + `vite dev` 上对内联渲染逐项复走:标题/粗体/斜体/删除线/行内代码/链接/嵌套引用/
|
||||
三级无序圆点/有序序号保留/任务框/图片(原尺寸+圆角)/水平线/围栏语言标签与底色/表格等宽淡化均按预期;
|
||||
光标行展开源码、失焦整篇渲染;点击任务框改写源文本并自动保存;源码模式反复切换无残留。
|
||||
细节与剩余人工项见 [editor-live-rendering.md](editor-live-rendering.md) §12。
|
||||
|
||||
### v1.2 P3 加固复走(2026-09-11)
|
||||
|
||||
- **边界**:文档以标题/任务项/围栏/水平线开头、以水平线/图片/围栏/任务结尾均正确渲染;整篇只有一条水平线可用;
|
||||
文首连续退格不损坏内容;文末追加内容后装饰正确重建。
|
||||
- **跨原子区间选区**:3000 行文档 `Cmd+A` + 退格清空、`Cmd+Z` 完整恢复;跨隐藏标记的选区替换不残留标记碎片;
|
||||
只选中可见内容时标记完整保留。
|
||||
- **性能**:3000 行 / 15.6 万字符文档,视口装饰采集中位数 0.26ms、全篇最坏 5.0ms、最坏选区(Cmd+A)0.98ms、
|
||||
真实输入同步耗时中位数 0.1ms、冷启动直跳文末最大帧间隔 7.1ms 且零 long task(详见方案 §12.5.2)。
|
||||
- **修复**:长文档惰性解析导致未解析区间显示裸 Markdown(已修,方案 §12.5.1 P3-1);
|
||||
`Cmd+A` 全文档装饰构建与线性 reveal 扫描(已修,P3-2)。
|
||||
- **编辑区高度**(2026-09-11,用户要求):编辑卡默认吃满视口剩余高度、长文改为编辑器内部滚动。
|
||||
1280×720 下空文档与 3000 行长文的编辑卡均为 610px;长文页面保持一屏(此前 8.4 万像素),
|
||||
`.cm-scroller` 内部可滚;窄屏 ≤900px 回落内容高度。方案 §12.7。
|
||||
|
||||
### ⛔ 未通过的人工门槛(阻塞发布)
|
||||
|
||||
真机输入法回归(系统拼音 / 搜狗拼音)**尚未执行**,用例、环境要求与签字要求见
|
||||
[editor-live-rendering.md](editor-live-rendering.md) §12.6。**在签字通过前不得发布**。
|
||||
|
||||
## 六、交付物清单
|
||||
|
||||
```
|
||||
pn(单二进制,CGO_ENABLED=0,go:embed 前端产物)
|
||||
├── cmd/pn/ start / init / passwd / backup / gc / version
|
||||
├── internal/{config,store,auth,markdown,middleware,httpapi,webui}
|
||||
├── web/ React 19 + Vite 8 + Tailwind 4(vitest 6 用例)
|
||||
├── web/ React 19 + Vite 8 + Tailwind 4(vitest 71 用例)+ editor/ 即时渲染装饰层
|
||||
├── deploy/ pn.service、pn-maint.{service,timer}、Caddyfile
|
||||
├── scripts/smoke.sh 构建冒烟(make smoke)
|
||||
├── Makefile / README.md / .gitignore
|
||||
└── docs/{design.md, review-round1.md, decisions.md, acceptance.md}
|
||||
```
|
||||
|
||||
依赖面:Go 直接依赖 6 个(预算 ≤6);npm 生产依赖与设计一致,0 漏洞。
|
||||
依赖面:Go 直接依赖 6 个(预算 ≤6);npm 生产依赖与设计一致(运行时零新增),0 漏洞;
|
||||
新增 `@codemirror/commands` 为 devDependency(本就在依赖树中,用于边界回归真实执行编辑命令)。
|
||||
锁定文件 go.sum / package-lock.json 入库。
|
||||
|
||||
## 七、遗留事项(不阻塞验收)
|
||||
|
||||
Reference in New Issue
Block a user