Google Wave Protocol的常见问题解答说,HTML“没有理想的属性”,"HTML使OT (操作转换)变得困难(如果不是不可能的话)“1.为什么会这样?如果将HTML简单地视为纯文本,然后应用OT,会出现什么问题?
发布于 2012-09-16 16:28:03
我在这里假设您了解OT的基础知识。将HTML作为纯文本进行OT操作的主要问题是合并html标记。举个简单的例子,假设我们有一个文档如下所示:
Hello world
爱丽丝然后决定世界应该是粗体的:
Hello <b>world</b>
这可以用OT中的双插入操作来表示,示意性地:
Edit A: Keep 6 : Insert "<b>" : Keep 5 : Insert "</b>"
如果Bob在看到Alice的编辑之前决定'world‘应该是斜体,他会添加操作
Edit B: Keep 6 : Insert "<i>" : Keep 5 : Insert "</i>"
如果服务器在Alice的编辑之后收到Bob的编辑,它将需要将B与A转换为B‘。
Keep语句在转换过程中保持不变,但Insert "“transformed over 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
发布于 2012-04-20 08:08:40
我没有一个完整的答案,但我有兴趣看到在使现有的开源操作转换库与富文本一起工作方面所做的更多工作,所以我将贡献我所知道的。
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项目中的relevant issue。也许他们可以通过采用部分Wave XML模式来实现富文本支持。
发布于 2014-08-25 09:06:29
有一些approaches in OT支持SGML (XML的超集),但还没有实现。因此,这并不是不可能的!不过,我同意OT不是启用XML的最佳方法。这是因为OT是为线性数据结构设计的。但是HTML/XML要复杂得多:它具有属性,并且构建起来像一棵树。它是一棵树的事实是可以解决的,但是OT不支持属性--它实现为有序的关联数组。很简单,因为OT (目前)不支持关联数组。上面的方法实际上建议将属性作为字符串处理:例如,"id='myid‘value='mystuff'“,但当一个用户删除所有属性,而另一个用户直接在"mystuff”之后插入“字符时,你可以很容易地打破' attributes -string’的整个语法。这可以在一些看起来像这个<div ">
的div标签中解决,这不是有效的语法。”
也许你会对此感兴趣:
CEFX是一个旨在支持XML的项目--据我所知它已经死了。但它使用的是OT方法。由于某些原因,无法编辑仅限字符串的xml元素。
Google的Drive SDK支持类似图形的数据结构。然而,它是专有的,没有人知道它是如何工作的。
我正在开发一个支持任意数据结构的框架。目前支持Text、Json、XML、HTML。它有一种不同的方法:查看它:Yatta!
顺便说一句: Wave协议和Eric Drechsel所描述的内容在OT中称为注释。它通常被用来支持富文本。
https://stackoverflow.com/questions/10149861
复制相似问题