逐块编辑
编辑的方式和在维基百科上改错别字一样:改的是你正在看的那一段,而不是一个装着整页的大文本框。编辑模式下(npm run wiki)登录,把鼠标停在任何笔记的任何块上——这一块也不例外——点 ✎。
§1.1一个来回
渲染好的块隐去,原位置展开一个 CodeMirror 编辑器,装着这个块的 Markdown 源码。你一边敲,实时预览就在下方一边渲——用的是引擎的方言,加上站点递给 inkbrush({ markdown }) 的插件,和页面管线挂载的是同一套规则,所以预览与页面不可能说两样话。⌘/Ctrl + Enter 保存,Esc 取消。
frontmatter 也是一个块:这里每篇笔记页头的分类条自带一个 ✎,点开就是整篇的 YAML——改个状态、换个日期,页头随即按更新后的 frontmatter 重新渲染。
§1.2两道保险
乐观锁。每个块都带着一枚哈希,记着它是从哪段源码上切下来的。文件若在你编辑期间被别人改过,保存会以冲突被拒,而不是悄悄盖掉别人的工作——刷新再来即可。
构建关。任何内容写进文件之前,整篇先过一遍站点的 Markdown 管线——方言、内容守门、站点自己的插件,.mdx 还要过 MDX 编译器。会弄坏页面的保存——配不上对的 **、没闭合的组件标签、写坏的表达式——会连同确切的报错一起被拒收,硬盘上的文件原样不动。守门的完整拦截清单,在全要素演示结尾有现场展示。
§1.3保存去了哪儿
一次保存写的是 Markdown 文件本身;开了 autocommit,它同时成为一条以登录用户署名的 git 提交。任何地方都没有数据库:内容文件是唯一的事实来源,git 是持久的历史。支撑修订历史的那层逐块细粒度日志,叠在这之上。
方言本身——GFM 加对中文友好的强调解析,再加一个拒收静默变形写法的内容守门——在引擎里只定义一次,页面渲染、编辑器预览和 check-content 命令行(五道检查)消费的永远是同一份。一套语法,三个消费者,零漂移。