如果简单地将操作转换视为纯文本,那么操作转换是否适用于HTML等结构化文档

use*_*671 19 real-time distributed-computing google-wave real-time-systems operational-transform

谷歌波浪协议的常见问题解答说[HTML]"没有理想的属性",并且"HTML使OT(操作变换)变得困难,如果不是不可能的"[1].为什么会这样?如果将HTML简单地视为纯文本然后应用OT,会出现什么问题?

  1. http://www.waveprotocol.org/faq#TOC-What-s-the-XML-schema-for-waves-Why

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

  • 我想这里的基本问题是,在同时插入的情况下,最终结果在语义上总是不正确的——但是对于 XML/HTML,最终结果在语法上可能是不正确的。注释的使用并不能缓解语义不一致,但可以确保转换将生成有效的 XML/HTML,因此始终可以很好地呈现。谢谢。 (2认同)

Eri*_*sel 5

我没有完整的答案,但我有兴趣看到更多的工作,使现有的开源操作转换库与富文本一起工作,所以我将贡献我所知道的.

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模式的一部分来实现富文本支持.