我一直在研究CRDT,我知道它们已经被用来构建协作编辑器,包括Ritzy,TreeDoc,WOOT和Logoot。
我对构建这样一个编辑器很感兴趣,并且需要知道CRDT是否能够处理这个通用问题。
详细说明:富文本文档(比如html)具有树形结构,但节点是异构的。有块元素、内联元素、表、列表等等。此外,可以在文档中嵌入样式和样式表(例如css)。最后,撤销是必不可少的。
上面列出的编辑器不处理更高级的特性,如表、嵌入式样式表和撤消/重做。
Ritzy文档链接到一篇描述基于CRDT的因果树(pdf)的论文,但我并不真正理解这篇文章。
因果树CRDT背后的基本原理是什么?它是否足够强大,能够处理上面描述的异构树?或者,是否有其他CRDT可以处理这种情况?
发布于 2016-10-24 07:08:00
用于富文本的CRDT的实现并不是很直接。一些CRDT可用于构建树。因此,对于富文本来说,天真的方法是将其构建为一棵树。然后,节点将用诸如'italic‘之类的格式表示文本块。为了格式化文本,您通常必须删除它,并插入一个具有该格式的新节点。但这并不总是如预期的那样工作:例如,如果两个用户同时设置相同文本的格式,则带格式的文本将在收敛后插入两次(User1将删除文本并插入新节点。User2删除相同的文本,并插入一个新节点)。据我所知,目前还没有解决这个问题的CRDT。
实际上,线性结构的CRDT是完全够用的。您可以将格式实现为标记(即格式开始和格式结束)。这也有一个好处,当两个用户同时格式化/插入文本时,您会得到预期的结果。
有关此方法的有效实现,请查看Yjs。examples部分包含一个富文本编辑器的工作示例。
(全面披露:我是Yjs的作者)
https://stackoverflow.com/questions/38512294
复制相似问题