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
| 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;
}