Help us understand the problem. What is going on with this article?

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

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

Indent Heuristic

前回は、単語単位の差分についてなるべく意味の区切りで差分をとる方法を検討しましたが、
行単位の差分についても、なるべく意味の区切りで差分をとる方法を検討します。

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

何も対策しない状態で先頭から一致する行どうしを組み合わせていくと、上記のような差分が生成されることがあります。
そこで、普通に差分を生成した後、hunk(不一致部分のかたまり)の境界位置をずらすことが可能かどうかを調べることにします。

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

diff_orz では、基本的に先頭から一致行の組み合わせを生成しているので、境界位置をずらす方向は後ろ向き(行番号の若いほう)のみです。
機能を無効にしたい場合は、IndentHeuristic()関数の呼び出し部分をコメントアウトしてください。(今のところ、実験的な度合いが強いです……)

Diff(s1, s2) {
    [this.vLeft, this.vRight] = [s1.split("\n"), s2.split("\n")];
    let len1 = this.vLeft.length, len2 = this.vRight.length, vResult = [];
    this.InitInfo(len1, len2);
    for (let o = (len1 > len2) ? this.Diff_(len2, len1, true) : this.Diff_(len1, len2, false); o != null; o = o.prev) {
        vResult.unshift(o);
        if (o.op == "-" || o.op == "+") { continue; }
        this.vInfo_L[o.x].status = this.vInfo_R[o.y].status = o.op;
        [this.vInfo_L[o.x].pair, this.vInfo_R[o.y].pair] = [o.y, o.x];
    }

    let o_L = new Hunks(), o_R = new Hunks();
    this.CreateHunksList(len1, len2, o_L, o_R, vResult);

    //IndentHeuristicを無効にしたい場合はこの行をコメントアウト
    this.IndentHeuristic(len1, len2, o_L, o_R, vResult);    

    if (o_L.unlinkedCount > 0 && o_R.unlinkedCount > 0 && this.bDetectMovedBlock) {
        this.DetectMovedBlock(len1, len2, o_L, o_R);
        for (let x = len1 - 1; x >= 0; x--) {
            if ((this.vInfo_L[x].status == "#" && this.vInfo_L[x].isBlank) 
            && ((x == (len1 - 1)) || (this.vInfo_L[x + 1].status != "#") 
                || (this.vInfo_L[x].pair != (this.vInfo_L[x + 1].pair - 1)))
            ) {
                let y = this.vInfo_L[x].pair;
                this.vInfo_L[x].status = this.vInfo_R[y].status = "+";
                this.vInfo_L[x].pair =  this.vInfo_R[y].pair = -1;
            }
        }
    }

    return vResult;
},

stonee
職業プログラマー 兼 趣味プログラマー。
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした