我一直在研究CRDT,并了解到它们已被用于构建协作编辑器,包括Ritzy、TreeDoc、WOOT和Logoot。
我对构建这样一个编辑器很感兴趣,并且需要知道CRDT是否能够普遍地处理这个问题。
详细说明:富文本文档(想想html)有一个树结构,但节点是异构的。有块元素、内联元素、表、列表等等。此外,文档中可能嵌入了样式和样式表(例如css)。最后,撤消是必不可少的。
上面列出的编辑器不处理更高级的功能,如表、嵌入式样式表和undo/redo。
Ritzy文档链接到一篇描述基于CRDT的因果树(pdf)的论文,但我并不真正理解这篇论文。
因果树CRDT背后的基本原理是什么?它是否足以处理上面描述的异构树?或者,是否有其他CRDT可以处理这种情况?
富文本CRDT的实现不是很直接。一些CRDT可用于构建树。因此,富文本的天真方法是将其构建为一棵树。然后,一个节点将用诸如"斜体"之类的格式表示一个文本块。为了格式化文本,通常必须删除它,然后插入具有该格式的新节点。但这并不总是如预期的那样起作用:例如,如果两个用户同时格式化同一文本,则格式化后的文本在收敛后插入两次(User1删除文本并插入新节点。User2删除相同文本并插入一个新节点)。据我所知,没有CRDT可以解决这个问题。
实际上,线性结构的CRDT就足够了。您可以将格式实现为标记(即格式开始和格式结束)。这还有一个优点,即当两个用户同时格式化/插入文本时,可以获得预期的结果。
对于这种方法的有效实现,您可以查看Yjs。示例部分包含一个富文本编辑器的工作示例。
(完整披露:我是Yjs的作者)