新しいデルタ

Quill で完全な API を提供する一環として、エディターでいつ、どのような変更が発生するかを示すイベントを提供します。これらの変更は現在、デルタオブジェクトは、直感的で人間が読みやすく、表現が必要な変更やドキュメントを表現できることを目指しています。ここ数週間、私はこれらの目標をよりよく達成し、現在のフォーマットの課題に対処する新しいフォーマットに取り組んできました。

新しいデルタ形式のドキュメントは、独自のドキュメントにあります。Githubリポジトリただし、この投稿では、いくつかの変更の背後にある理論的根拠について説明します。

もっと

複雑さの軽減

デルタ形式が最初に設計されたとき、それは汎用であり、あらゆる種類のドキュメントを表現できるという野心的な目標を持っていました。新しい形式では範囲がリッチ テキスト ドキュメントのみに減り、より厳密な実装が可能になります。1

Quill は共同エディターとして特別に構築されているわけではありませんが、共同エディターとして使用できる機能は API の優れたベンチマークです。新しいデルタ形式はこの機能を維持し、オットタイプと互換性があります。ShareJS。

明示的な削除

現在のデルタ形式では、削除操作は保持操作がないことを意味します。基本的に、保存する必要があると指示されない限り、すべて削除されます。これには実装の観点から見ていくつかの優れた特性があります2しかし、これはおそらく、デルタを使用しようとするユーザーにとって最大の混乱の原因であり、人間が読みやすいという目標に挑戦していました。インデックスを追跡して、何が考慮されていないのか、何を削除する必要があるのか​​を把握することは非常に困難です。

新しい形式には明示的な削除操作があり、デフォルトではすべてが保持されます。以下は、両方とも「abc」の「b」を削除することを表す 2 つの形式の比較です。

var oldFormat = {
  startLength: 3,
  endLength: 2,
  ops: [
    { start: 0, end: 1 },
    { start: 2, end: 3 }
  ]
};

var newFormat = {
  ops: [
    { retain: 1 },
    { delete: 1 }
  ]
};

明示的に削除し、デフォルトでテキストを保持することの副作用として、実際には、新しいデルタの表現が通常より小さくなることが挙げられます。

埋め込みサポート

新しいデルタ形式は、画像やビデオなどを表すために使用できる埋め込みのネイティブ サポートを提供します。現在の形式ではこれはサポートされておらず、属性内の画像キーで「!」を表すことによって実装がハック的に実現されています。 (ビデオサポートが追加されると壊れます)。

var oldFormat = {
  startLength: 0,
  endLength: 1,
  ops: [{
    text: '!',
    attributes: { image: 'https://octodex.github.com/images/labtocat.png' }
  }]
};

var newFormat = {
  ops: [{
    insert: 1, attributes: { image: 'https://octodex.github.com/images/labtocat.png' }
  }]
};

今後

この新しい形式は、今後の Quill の変更と状態の最終的な表現となり、1.0 リリースに向けた主要なステップの 1 つになります (このトピックについては別の記事で説明します)。

  1. 現在、コードの行数は 28658 行と 9507 行です (ただし、実際には縮小と gzip のせいで関連性は低くなります)。

  2. サポートする操作の数を最小限に抑え、結果として得られるドキュメントのテキストの長さを簡単に計算できるため、健全性チェックに役立ちます。