Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@stonee

JavaScript で diff (内部仕様についての補足3)

2019/10/14 に投稿したJavascript で diff (通信なし、ローカルで完結)の内部仕様についての補足、その3です。
Javascript で diff (内部仕様についての補足)
Javascript で diff (内部仕様についての補足2)

(2020/09/10) ソースの更新にあわせて記述を修正しました。

Indent Heuristic

前回は、単語単位の差分についてなるべく意味の区切りで差分をとる方法を検討しましたが、行単位の差分についても、なるべく意味の区切りで差分をとる方法を検討します。
(今のところ、実験的な度合いが強いです……)

インデント_対策なし.png

何も対策しない状態で先頭から一致する行どうしを組み合わせていくと、上記のような差分が生成されることがあります。
そこで、普通に差分を生成した後、hunk(不一致部分のかたまり)の境界位置をずらすことが可能かどうかを調べることにします。
例題の場合、右ファイルの5行目と2行目は同一の内容なので、hunkの境界を「3-5行目」から「2-4行目」にずらすことができます。
ただし、「}」が1行だけの差分などは境界位置をずらすと不自然な差分になるので、行数が1行だけのhunkは、境界位置をずらさないにします。

インデント_対策あり.png

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

    //後略...
}

0
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
stonee
職業プログラマー 兼 趣味プログラマー。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
0
Help us understand the problem. What is going on with this article?