最近在开发一个轻量级 Markdown 所见即所得编辑器内核——DOMD。
它不仅提供 Markdown 编辑能力,也希望把文本渲染和编辑本身变成一个可以扩展的系统。开发者可以注册自己的行内语法,把高亮、用户提及、批注、Wiki 链接,甚至交互式 UI 和复杂组件直接嵌入文档。
这一点和 BBS1 的使用场景比较契合,想在这里安利一下。
DOMD 目前支持什么?
- Markdown 原生所见即所得编辑,交互接近 Typora
- 代码实时高亮与代码格式化
- 文档增量加载,大文档也可以快速打开
- 增量流式输入和实时渲染,适合接入 AI 输出
- 段落内细粒度的离线、多端无冲突合并与实时协同
- 富文本和所见即所得模式切换
- 自定义行内语法和渲染组件
- 内核保持在约 30KB 量级
最初其实想把它控制在 20KB 以内,不过随着协同编辑、自定义语法等能力加入,目前已经突破 30KB,README 中的体积说明还没有及时更新。
富文本与所见即所得有什么区别?
两种模式底层使用的是同一套文档能力,区别主要在于 Markdown 标记是否会出现在编辑过程中:
- 富文本模式:始终隐藏 Markdown 语法标记。
- 所见即所得模式:交互接近 Typora,编辑当前内容时可以显示相应的 Markdown 标记。
因此,同一份 Markdown 内容可以根据 BBS1 的产品需求,选择更接近传统论坛编辑器的富文本体验,也可以保留 Markdown 用户熟悉的所见即所得体验。
为什么我觉得它适合 BBS1?
很多 Markdown 工具最终都会遇到同一个问题:行内语法基本是固定的。
当产品需要增加文本高亮、@用户、批注、Wiki 链接、话题标签或其他交互能力时,通常只能选择:
- 在渲染前预处理文本
- 修改或 fork Markdown 解析器
- 塞入原始 HTML
- 在编辑器外面额外维护一套数据
这些方案要么难以维护,要么只能控制最终渲染结果,无法真正融入编辑器的光标、选区、撤销重做和协同编辑机制。
在
@do-md/core-react0.6 中,DOMD 把行内语法直接做成了编辑器的一等扩展能力。自定义语法不只参与帖子展示,也能够参与实时编辑。对于 BBS1 来说,这意味着未来可以通过插件扩展帖子内部的文本能力,而不必每增加一种内容类型,就重新改造编辑器和 Markdown 解析流程。
自定义行内语法是什么样的?
DOMD 的参数设计参考了 Pandoc/Djot 的行内属性语法。它和 Pandoc、Quarto、kramdown、markdown-it 等工具使用的扩展方式比较接近。
一套语法可以从最简单的高亮,逐步扩展到带类型和结构化参数的内容:
==highlight== =={red}highlight== =={.comment author="Alice"}highlight==它们可以分别表示:
- 普通高亮
- 指定颜色的高亮
- 一条由 Alice 创建的批注
其中,定界符只负责确定文本范围,本身不绑定具体含义。真正的语义由
.mention、.comment这样的 variant 决定。例如下面两种写法可以映射到同一种用户提及组件:
=={.mention id=1}Alice== <{.mention id=1}Alice>也就是说,语法形式与业务语义是分离的。
BBS1 可以选择自己喜欢的定界符,同时复用相同的用户提及、批注或话题标签组件。没有注册的类型也不会导致文档报错,而是可以自然降级为普通文本或 CSS class。
不只是改变文字颜色
自定义语法不只是给一段文本增加样式。
一个 variant 可以绑定 React 组件。编辑器会把解析后的参数和内部文本交给组件,让组件直接渲染在正在编辑的文档中。
例如:
=={.mention userId="42"}Alice== =={.comment id="108"}这句话需要补充来源== =={.topic slug="markdown"}Markdown 编辑器==它们可以分别渲染成:
- 可以点击并打开用户资料的 @用户卡片
- 点击后展开批注面板的文本标记
- 可以跳转到相关板块或搜索页的话题标签
还可以继续扩展:
- 用户提及和用户卡片
- 帖子内批注、审核意见
- Wiki 链接和双向链接
- 剧透、折叠内容
- 投票、评分或状态标签
- 术语解释、引用来源
- 交互式按钮和复杂 React 组件
DOMD 对组件提供了明确的渲染约束,以保护光标、选区和协同编辑逻辑;在这个约束内,组件仍然可以使用 React 完成交互。
Markdown 仍然是 Markdown
扩展能力不会把帖子变成某种私有文档格式。
内容底层依然是普通 Markdown 文本:
- 原有链接、图片、自动链接和行内 HTML 可以继续解析
- 新语法只会在规则明确、没有歧义的位置触发
- 没有安装对应插件时,内容仍然可以保存、传输和降级展示
- 文档可以继续被 Git、数据库或其他 Markdown 工具管理
DOMD 本身以协同编辑为基础,因此自定义规则集也会成为协同端之间的一部分约定,确保所有参与者看到相同的文档结构和渲染结果。
目前的进度
inlineRules v2已经随@do-md/core-react0.6 发布,DOMD 在线编辑器中的==highlight==高亮功能已经在使用这套机制。后续还会增加一个独立的 Playground,用来集中演示:
- mentions
- comments
- wikilinks
- 自定义属性
- 交互式 React 组件
主编辑器则会继续保持相对精简。
关于授权
DOMD 目前采用 PolyForm Noncommercial 1.0.0 许可。
如果 BBS1 社区评估后认为这套内核和自定义语法机制适合接入,我可以针对 BBS1 提供一份正式的免费授权,避免许可问题影响后续集成。
主楼- bbs1org2026-08-18
搞成插件啊老板
搞成插件啊老板
搞成插件啊老板
- flinthub2026-08-19
好厉害啊,支持一下。