19

Google Wave Protocol の FAQ には、[HTML] には「望ましい特性がない」、「HTML は OT (Operational Transforms) を不可能ではないにしても困難にする」[1] と書かれています。これはなぜですか?HTML を単純なテキストとして扱い、OT を適用すると、どのような問題が発生しますか?

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

3 に答える 3

17

ここでは、OT の基本を理解していることを前提としています。プレーン テキストとして HTML で OT を実行する際の主な問題は、html タグをマージすることです。簡単な例として、次のようなドキュメントがあるとします。

Hello world

Alice は次に、world を太字にすることにしました。

Hello <b>world</b>

これは、OT の二重挿入操作で概略的に表すことができます。

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

ボブがアリスの編集を見る前に「世界」をイタリック体にすべきだと判断した場合、ボブは次の操作を追加します。

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 then B' を元の文字列に適用すると、無効な html が得られます。

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

理論的には、これは事前挿入と事後挿入を変えることで解決できますが、より複雑な例では複雑になり、変換ごとに完全なドキュメント スキャンが必要になる可能性があります。

他の回答が指摘したように、この混乱は、帯域外の注釈とプレーンテキストを使用して回避できます。これまで学術論文でしか見たことがなかったもう 1 つのアプローチは、ノードの追加、削除のための OT 操作を含むツリーとして XML 構造を扱うことです。

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

于 2012-09-16T08:28:03.343 に答える
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 スキーマの一部を採用することで、リッチ テキストのサポートを実装できるでしょう。

于 2012-04-20T00:08:39.600 に答える
2

OTにはアプローチがありますSGML (XML のスーパーセット) をサポートしていますが、実装はありません。したがって、それは不可能ではありません!ただし、OT は XML を有効にする最善の方法ではないことに同意します。これは、OT が線形データ構造用に設計されているためです。しかし、HTML/XML ははるかに複雑です。属性があり、ツリーのように構築されています。ツリーであるという事実は解決可能ですが、属性 (順序付き連想配列として実現される) は OT ではサポートされていません。連想配列が OT でサポートされていないためです (現時点では)。上記のアプローチでは、属性を文字列として扱うことを実際に推奨しています: 例: "id='myid' value='mystuff'"別のものは、"mystuff" の直後に " 文字を挿入します。<div ">、これは有効な構文ではありません。

多分これはあなたに興味があります:

CEFX は XML をサポートすることを目的としたプロジェクトです。私の知る限り、それは死んでいます。ただし、OT アプローチを使用します。何らかの理由で文字列を編集することはできません - xml 要素のみです。

Google の Drive SDK は、グラフのようなデータ構造をサポートしています。ただし、それは独自のものであり、誰もそれがどのように機能するかを知りません.

任意のデータ構造をサポートするフレームワークを開発しています。現在、テキスト、Json、XML、および HTML がサポートされています。それは別のアプローチを持っています: それをチェックしてください: Yatta!

ところで: Wave プロトコルと Eric Drechsel が説明したものは、OT の注釈として知られています。通常、リッチ テキストをサポートするために利用されます。

于 2014-08-25T01:06:29.093 に答える