2019/10/14 に投稿したJavascript で diff (通信なし、ローカルで完結)の内部仕様についての補足、その3です。
Javascript で diff (内部仕様についての補足)
Javascript で diff (内部仕様についての補足2)
(2020/09/10) ソースの更新にあわせて記述を修正しました。
Indent Heuristic
前回は、単語単位の差分についてなるべく意味の区切りで差分をとる方法を検討しましたが、行単位の差分についても、なるべく意味の区切りで差分をとる方法を検討します。
(今のところ、実験的な度合いが強いです……)
何も対策しない状態で先頭から一致する行どうしを組み合わせていくと、上記のような差分が生成されることがあります。
そこで、普通に差分を生成した後、hunk(不一致部分のかたまり)の境界位置をずらすことが可能かどうかを調べることにします。
例題の場合、右ファイルの5行目と2行目は同一の内容なので、hunkの境界を「3-5行目」から「2-4行目」にずらすことができます。
ただし、「}」が1行だけの差分などは境界位置をずらすと不自然な差分になるので、行数が1行だけのhunkは、境界位置をずらさないにします。
diff_orz では、基本的に先頭から一致行の組み合わせを生成しているので、境界位置をずらす方向は後ろ向き(行番号の若いほう)のみです。
機能を無効にしたい場合は、DiffEngine.bIndentHeuristic を false に設定してください。
const DiffEngine = {
bIgnoreCase: false,
flgIgnoreBlank: 1, //0:compare 1:ignore change 2:ignore all
bDetectMovedBlock: true,
bIndentHeuristic: true, //Indent Heuristic の有無
bDetectSimilarLine: true,
bWord: true,
bSemanticCleanup: true
//後略...
}