0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-10-27

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

diff の出力結果をクリーンナップしてみる

「空行を含む関数を別の(空行を含んだ)関数に差し替える」ような場合、「関数1に含まれる空行」と「関数2に含まれる空行」群が一致行とみなされて、まだら模様の差分が生成されることがあります。

行単位_対策なし.png

diff_orzでは、「前後の行ごと一致しなければ空行どうしのマッチングを認めない」というルールで、まだら模様の差分が生成されるのを回避しています。

行単位_対策あり.png

同様に、単語単位の差分でも、「単語の間にはさまった空白は、前後のフレーズごと一致しなければマッチングを認めない」というルールを設けるようにします。

単語単位の差分の境界を調整する

  • 文字列1 「<tr><td>1</td></tr>」
  • 文字列2 「<tr><td>1</td><td>2</td></tr>」

上記のような例題に対して、数学的な手段のみで差分を取ると「td>2<」「td></」が差分として検出されますが、意味的には「<td>2</td>」を差分として検出させたいわけです。

単語単位_対策なし.png

構文解析を行って「<tr>」「<td>」「1」……を単語として検出すれば完璧ですが、今回は「(<{[など左かっこを特別扱い」「</」は単一の単語として扱う」というルールを設け、一旦普通に差分をとった後、左かっこの位置まで差分の境界位置をずらしています。

単語単位_対策あり.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?