回答

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項目relevant issue。也許他們可以通過採用Wave XML模式的一部分來實現豐富的文本支持。

+1

+1 [ShareJS討論](https://github.com/josephg/ShareJS/issues/1)! – mb21 2013-01-31 14:28:08

16

我假設你在這裏瞭解OT的基礎知識。將HTML做爲純文本的主要問題是合併html標籤。舉一個簡單的例子,假設我們有一個文件如下:

Hello world 

愛麗絲然後決定這個世界應該是大膽:

Hello <b>world</b> 

這可以用在OT雙插入操作來表示,示意圖:

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

如果Bob決定,「世界」應該是斜體,他看到了愛麗絲的編輯之前,他會增加操作的

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

我想這裏的根本問題是,在同時插入時,最終結果總是可能在語義上不正確 - 但對於XML/HTML的情況,最終結果可能在語法上不正確。註釋的使用不會減輕語義的不一致性,但可以確保轉換將生成有效的XML/HTML,並且始終可以很好地呈現。謝謝。 – Nakedible 2012-09-17 18:27:46

+0

絕對正確 – jazmit 2012-09-18 06:48:35

1

approaches in OT支持的SGML(超XML),但沒有實現。所以,這不是不可能!雖然,我同意OT不是啓用XML的最佳方法。這是因爲OT是爲線性數據結構設計的。但HTML/XML更復雜:它具有屬性,並且它像樹一樣構建。它是一棵樹的事實是可以解決的,但是這些屬性 - 作爲一個有序的關聯數組來實現 - 並不支持OT。僅僅因爲關聯數組不被OT支持(目前)。上面的方法實際上建議將屬性視爲一個字符串:例如, 「id ='myid'value ='mystuff'」 但是,當一個用戶刪除所有屬性,並且另一個用戶在「mystuff」之後直接插入「字符時,您可以輕鬆地打破'屬性字符串'的整個語法。 。可能在一些div標籤看起來像這樣<div ">,這不是有效的語法解析

也許您對此有興趣:

CEFX是一個項目,目的是支持XML - 它已經死了,據我所知,但它使用。由於某些原因,不可能編輯字符串 - 只有xml元素

谷歌的Drive SDK支持類似圖形的數據結構,但它是專有和nobod你知道它是如何工作的。

我正在開發一個支持任意數據結構的框架。目前支持Text,Json,XML和HTML。它有一個不同的方法:檢查出來:Yatta!

順便說一句:Wave協議和Eric Drechsel描述的是OT中的Annotations。它通常用於支持富文本。