2

私は CKEditor を使用してドキュメント編集アプリケーションに取り組んでおり、ユーザーは一対のエディター インスタンスで複数のドキュメントを並べて開くことができます。

ほとんどの場合、ユーザーは 2 つの異なるドキュメントを編集しますが、2 つのエディター インスタンスに同じドキュメントの異なるビューが含まれている可能性もあります。1 つのエディター インスタンスでの変更を別のインスタンスにすぐに反映させたいので、これは厄介なことです。

CKEditor コアをハッキングせずに、そのようなことは可能ですか?

そうでない場合、そのような機能を提供するプラグインを作成することは可能でしょうか?

コア コードに触れて、少しハックしてみたらどうですか? それはどれほど難しいでしょうか?

4

1 に答える 1

2

これは、Google ドキュメントが許可するような共同編集と非常によく似たケースです。唯一の違いは、ネットワーク経由でこれを同期する必要がないことと、同じ文書が 2 人のユーザーによって同時に変更される可能性は非常に低い (不可能ではないにしても) ことです。これにより、物事が簡単になります...少し。

1 年前、私と同僚 (2 人とも CKEditor コア開発者) はNode.JS Knockoutに参加し、CKEditor に基づく共同エディターを作成することを計画していました。わずか 48 時間だったので、結果は印象的ではありませんが、うまくいきました。ソースコードはこちらです。

主な問題は、エディター B のキャレット位置を壊さずに、エディター A からエディター B に変更を適用することです。基本的に、エディター A からデータを取得してエディター B に設定することはできません。これは、エディター B のすべてがスクロール位置とキャレットを含めてリセットされるためです。これが問題でない場合を除きますが、問題があると思います。

したがって、次のことが必要になります。

  • エディタ A で作成された変更を抽出するための優れたアルゴリズム ( diffHTML 文字列ではなく DOM ツリーで動作するようなもの) と、それらをエディタ B に適用するためのアルゴリズムを見つける (これが Node.JS Knockout で実装したものです)。
  • または、エディター B でデータをリセットした後にキャレットの位置を推測する方法を見つけます。たとえば、データを設定する前にエディター B のキャレット コンテキストを覚えておき、ロードされるデータでそれを見つけようとすることができます。

どちらの方法も実行可能ですが、最初の方法をうまく実装すれば、より良い結果が得られます。ただし、DOM と について十分に理解していない場合はcontenteditable、このタスクに圧倒される可能性があります。この場合、1 つのドキュメントを 2 回開く可能性をブロックすることをお勧めします。

于 2013-09-20T07:30:45.450 に答える