Code & Text

Diff Checker

Compare two text files or code snippets line-by-line. Highlights insertions, deletions, and line changes 100% offline.

100% Client-Side — Code remains on your device
+0 insertions -0 deletions 0 unchanged
Paste text into both boxes above to calculate diff
Developer Reference

Core Algorithm & Standalone Script

Standalone, zero-dependency Myers LCS diff algorithm for line-by-line text and code comparisons.

// Standalone Line-by-Line LCS Diff Algorithm (Vanilla JS)
function computeLineDiff(oldText, newText, ignoreWhitespace = false) {
  const lines1 = oldText.split('\n');
  const lines2 = newText.split('\n');

  const comp1 = ignoreWhitespace ? lines1.map(l => l.trim().replace(/\s+/g, ' ')) : lines1;
  const comp2 = ignoreWhitespace ? lines2.map(l => l.trim().replace(/\s+/g, ' ')) : lines2;

  const N = comp1.length;
  const M = comp2.length;
  const dp = Array.from({ length: N + 1 }, () => new Int32Array(M + 1));

  for (let i = N - 1; i >= 0; i--) {
    for (let j = M - 1; j >= 0; j--) {
      if (comp1[i] === comp2[j]) dp[i][j] = dp[i + 1][j + 1] + 1;
      else dp[i][j] = Math.max(dp[i + 1][j], dp[i][j + 1]);
    }
  }

  let i = 0, j = 0;
  let line1Num = 1, line2Num = 1;
  const diffResult = [];

  while (i < N && j < M) {
    if (comp1[i] === comp2[j]) {
      diffResult.push({ type: 'same', oldLine: line1Num++, newLine: line2Num++, text: lines1[i] });
      i++; j++;
    } else if (dp[i + 1][j] >= dp[i][j + 1]) {
      diffResult.push({ type: 'del', oldLine: line1Num++, newLine: null, text: lines1[i] });
      i++;
    } else {
      diffResult.push({ type: 'add', oldLine: null, newLine: line2Num++, text: lines2[j] });
      j++;
    }
  }

  while (i < N) diffResult.push({ type: 'del', oldLine: line1Num++, newLine: null, text: lines1[i++] });
  while (j < M) diffResult.push({ type: 'add', oldLine: null, newLine: line2Num++, text: lines2[j++] });

  return diffResult;
}