1

我一直在研究 CRDT,了解到它们已被用于构建协作编辑器,包括Ritzy、TreeDoc、WOOT 和 Logoot。

我对构建这样的编辑器很感兴趣,并且需要知道 CRDT 是否能够在一般情况下处理这个问题。

详细说明:富文本文档(想想 html)具有树结构,但节点是异构的。有块元素、行内元素、表格、列表等。此外,文档中可能嵌入了样式和样式表(例如 css)。最后,撤消是必不可少的。

上面列出的编辑器不处理更高级的功能,例如表格、嵌入式样式表和撤消/重做。

Ritzy 文档链接到描述基于 CRDT 的因果树的论文 ( pdf ),但我并不真正理解这篇论文。

因果树 CRDT 背后的基本原理是什么?处理上述异构树是否足够强大?或者,是否有其他 CRDT 可以处理这种情况?

4

1 回答 1

2

富文本的 CRDT 的实现不是很直接。一些 CRDT 可用于构建树。因此,富文本的天真方法是将其构建为树。然后,一个节点将表示具有诸如“斜体”之类的格式的文本块。为了格式化文本,您通常必须将其删除,然后插入具有该格式的新节点。但这并不总是像预期的那样工作:例如,如果两个用户同时格式化相同的文本,则格式化后的文本会在收敛后插入两次(User1删除文本,并插入一个新节点。User2删除相同的文本,并插入一个新节点)。据我所知,没有 CRDT 可以解决这个问题。

实际上,线性结构的 CRDT 就足够了。您可以将格式实现为标记(即格式开始和格式结束)。当两个用户同时格式化/插入文本时,这还具有您获得预期结果的优点。

对于这种方法的工作实现,您可以查看Yjs。示例部分包含富文本编辑器的工作示例。

(完全披露:我是Yjs的作者)

于 2016-10-23T23:07:59.820 回答