0

私は CKEDitor5 で遊んでいて、カスタム データ プロセッサを作成しようとしました。toData変換でモデルを使いたいのですが、メソッドがview/DocumentFragmentオブジェクトで呼び出されます。model/DocumentFragmentしたがって、私の質問は、それをオブジェクトに変換する方法 (またはデータ プロセッサからモデルにアクセスする方法) です。

更新(コメントに収まらないため):私がやろうとしていること(またはこれまでに行ったこと)をもう少し詳しく説明してみましょう。モデル自体にアクセスする方法を理解しましたが、あなたも指摘したように、それは悪い解決策のように思えました。

DataProcessorしたがって、基本的には、エディター データを BBCode に変換するを作成したいと考えています。

一方ではtoView、BBCode から HTML への変換が既に実装されていると想定できるため (私の場合)、この方法は単純です。また、HTML から、エディタ データをロードするのは簡単なようです (Markdown プロセッサで使用されるのと同じプロセスによって)。

一方、ビューよりもモデルデータから BBCode に変換する方が簡単なようです。ほとんどの場合、view/DocumentFragmentオブジェクトとビュー ツリーの残りの部分は、DOM または HTML の別の表現にすぎないためです。太字かどうかはあまり気にしません。ノードに属性がある<b><strong>どうかを知りたいだけです。textbold

このモデルを使用することで、HTML で使用される表現ではなく、セマンティクスに取り組みたいと考えています。基本的にすべての HTML タグを対応する BBCode にマップするのは少し無意味に思えます (たとえ CKE5 が一貫した HTML タグを提供するのに優れているとしても)。したがって、私の観点からは、モデルを使用する方が理にかなっています。セマンティック表現から「データ形式」への変換は、「データ形式」(ビューツリー、DOM、HTML、モールス信号) に変換してから「表現マップ」を作成するよりも簡単です。

長い間、RTE や WYSIWYG エディターの使用を妨げていたのは、まさに HTML から BBCode への変換の難しさでした。現在、CKE5 には、HTML 形式だけでなく、エディターに表示される HTML からも独立しているため、何にでも簡単に変換できるように思われるモデルがあります (ビュー ツリーについては、正確に HTML であるため、これは言えません)。エディター - 少なくとも contenteditable が生成するものではありませんが、それでも十分ではありません)。

またPluginを設定する を作成しました。DataProcessorこれは、Markdown 機能の種類も同様でした (どこかのドキュメントで)。それは悪い考えですか?

ご回答ありがとうございます。

4

1 に答える 1

5

最近、同様の質問が CKE5 GitHub で提起されました。質問は JSON データをエディター出力として取得することですが、あなたが提起したトピックも部分的にカバーされています。

(...) データ プロセッサからモデルにアクセスする方法

モデルをそのまま操作することには、特定の問題とリスクが伴います。これは推奨されるものではありません。リンク先の記事で解説しています。

(...) 私の質問は、どうすればそれをmodel/DocumentFragment

これは、モデルを直接操作するよりも優れた (リスクの少ない) アプローチです。しかし、私は尋ねなければなりません - なぜあなたはモデルから変換したいのですか? 多分あなたの問題に対するより良い解決策がありますか?

ビューとモデルの間で変換するには、 and を使用する必要がDataController#toViewありDataController#toModelます。DataControllerインスタンスは で入手できますEditor#data。これをデータ プロセッサで使用するには、データ プロセッサがエディタ インスタンスにアクセスする必要があります。

CKE5 エディター クラスの 1 つを拡張して、独自のエディター クラスを作成することをお勧めします。次に、新しいエディター クラス コンストラクターで、データ プロセッサを上書きし、エディター インスタンスも渡します。何かのようなもの:

class MyEditor extends ClassicEditor {
  constructor() {
    this.data.processor = new MyDataProcessor( this );
  }
}

class MyDataProcessor() {
  constructor( editor ) {
    this._editor = editor;
  }

  toData( viewDocumentFragment ) {
    const modelDocumentFragment = this._editor.data.toModel( viewDocumentFragment );
    // ...
  }

  toView( modelData ) {
    // ...
    this._editor.data.toView( ... );
    // ...
  }
}

これらは方向性を示すためのものであり、動作中/テスト済みのサンプルではありません。

それでも、ビューではなくモデルを使用してエディター出力を生成することにこだわる理由を知りたいです。

ところで。このように続けて実装すると、プロセス全体が少しばかげたものになります:)。まず、モデル データを取得し、それを (データ プロセッサで) ビューに変換します。次に、エディタがビュー データを取得し、それをモデルに変換します:)。Editor#setDataしたがって、不要な変換が行われないようにメソッドを上書きすることにも関心があるかもしれません。

于 2017-10-24T11:02:33.603 に答える