use*_*671 19 real-time distributed-computing google-wave real-time-systems operational-transform
谷歌波浪协议的常见问题解答说[HTML]"没有理想的属性",并且"HTML使OT(操作变换)变得困难,如果不是不可能的"[1].为什么会这样?如果将HTML简单地视为纯文本然后应用OT,会出现什么问题?
jaz*_*mit 17
我假设你在这里了解OT的基础知识.将HTML作为纯文本进行OT的主要问题是合并html标记.举个简单的例子,假设我们有一份文件如下:
Hello world
Run Code Online (Sandbox Code Playgroud)
爱丽丝然后决定世界应该是粗体:
Hello <b>world</b>
Run Code Online (Sandbox Code Playgroud)
这可以用OT中的双插入操作来表示,示意性地:
Edit A: Keep 6 : Insert "<b>" : Keep 5 : Insert "</b>"
Run Code Online (Sandbox Code Playgroud)
如果Bob在看到Alice的编辑之前决定"世界"应该是斜体,他会添加操作
Edit B: Keep 6 : Insert "<i>" : Keep 5 : Insert "</i>"
Run Code Online (Sandbox Code Playgroud)
如果服务器在Alice之后接收Bob的编辑,则需要将B转换为A以变为B'.
Keep语句通过转换保持不变,但Insert""转换为Insert""可以变为Keep 3:Insert""或Insert"":Keep 3.通常,服务器将配置为在第一次编辑后放置后面的编辑.
Edit B': Keep 6 : Keep 3 : Insert "<i>" : Keep 5 : Keep 3 : Insert "</i>"
Run Code Online (Sandbox Code Playgroud)
这里的问题变得很明显.将A然后B'应用于原始字符串会产生无效的html:
Hello <b><i>world</b></i>
Run Code Online (Sandbox Code Playgroud)
从理论上讲,这可以通过改变插入前后插入来解决,但是对于更复杂的示例来说这会很麻烦,可能涉及每次转换的完整文档扫描.
正如另一个答案所指出的那样,使用带外注释+纯文本可以避免这种混乱.到目前为止我在学术论文中只看到的另一种方法是将XML结构视为具有OT操作的树,用于节点添加,删除,例如:
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.100.74
我没有完整的答案,但我有兴趣看到更多的工作,使现有的开源操作转换库与富文本一起工作,所以我将贡献我所知道的.
HTML和Wave模式之间的重要区别似乎是标记文本格式的方式:HTML的嵌套标签和带外注释(在文档的页脚中)的层次结构,包含Wave XML的范围.带外注释可能是标记文本格式的更自然的方式,因为它们允许重叠(非嵌套)格式.它允许这样的东西(在伪标记中),它不是使用嵌套表示的有效XML:
(b) This is bold (i) while this range is both bold and italic (/b) and this last bit is just italic (/i)
相关,这里是相关的问题在ShareJS项目.也许他们可以通过采用Wave XML模式的一部分来实现富文本支持.