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

时间:2012-04-14 00:12:05

标签: real-time distributed-computing google-wave real-time-systems operational-transform

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

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

3 个答案:

答案 0 :(得分:17)

我在这里假设您了解OT的基础知识。将HTML作为纯文本进行OT的主要问题是合并html标记。举个简单的例子,假设我们有一份文件如下:

Hello world

Alice然后决定世界应该是粗体:

Hello <b>world</b>

这可以用OT中的双插入操作来表示,示意:

Edit A: Keep 6 : Insert "<b>" : Keep 5 : Insert "</b>"

如果Bob在看到Alice的编辑之前决定'世界'应该是斜体,他会添加操作

Edit B: Keep 6 : Insert "<i>" : Keep 5 : Insert "</i>"

如果服务器在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>"

这里的问题变得很明显。将A然后B'应用于原始字符串会产生无效的html:

Hello <b><i>world</b></i>

从理论上讲,这可以通过改变插入前后插入来解决,但是对于更复杂的示例来说这会很麻烦,可能涉及每次转换的完整文档扫描。

正如另一个答案所指出的那样,使用带外注释+纯文本可以避免这种混乱。到目前为止我在学术论文中看到的另一种方法是将XML结构视为具有OT操作的树,用于节点添加,删除,例如:

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.100.74

答案 1 :(得分: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)

相关,这是relevant issue项目中的ShareJS。也许他们可以通过采用Wave XML模式的一部分来实现富文本支持。

答案 2 :(得分:2)

approaches in OT支持SGML(XML的超集),但没有实现。因此,这不是不可能的!虽然,我同意,OT不是启用XML的最佳方法。这是因为OT是为线性数据结构而设计的。但是HTML / XML要复杂得多:它具有属性,并且像树一样构建。事实上它是一棵树是可以解决的,但OT不支持属性 - 它被实现为有序的关联数组。仅仅因为OT不支持关联数组(目前)。上面的方法实际上建议将属性视为字符串:例如。 &#34; ID =&#39;本身份识别码&#39;值=&#39;我的资料#39;&#34; 但是,当一个用户删除所有属性时,您可以轻松地破坏&#39; attributes-string&#39;的整个语法,另一个用户插入&#34;直接在&#34; mystuff&#34;之后的角色。这可以解决一些看起来像这个<div ">的div标签,这是无效的语法。

也许这让你感兴趣:

CEFX是一个旨在支持XML的项目 - 据我所知,它已经死了。但它使用OT方法。由于某种原因,无法编辑仅字符串的xml元素。

Google的Drive SDK支持类似图形的数据结构。然而,它是专有的,没有人知道它是如何工作的。

我正在开发一个支持任意数据结构的框架。目前,支持Text,Json,XML和HTML。它有不同的方法:检查出来:Yatta!

BTW:Wave协议和Eric Drechsel描述的内容在OT中被称为Annotations。它通常用于支持富文本。