Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | 1x 1x 1x 1x 1x | export interface DiffLine {
type: 'del' | 'add' | 'same';
text: string;
}
export function computeLineDiff(originalText: string, newText: string): DiffLine[] {
const a = originalText.split('\n');
const b = newText.split('\n');
const n = a.length;
const m = b.length;
const lcs: number[][] = Array.from({ length: n + 1 }, () => new Array<number>(m + 1).fill(0));
for (let i = n - 1; i >= 0; i--) {
for (let j = m - 1; j >= 0; j--) {
if (a[i] === b[j]) {
lcs[i][j] = lcs[i + 1][j + 1] + 1;
} else {
lcs[i][j] = Math.max(lcs[i + 1][j], lcs[i][j + 1]);
}
}
}
const out: DiffLine[] = [];
let i = 0;
let j = 0;
while (i < n && j < m) {
if (a[i] === b[j]) {
out.push({ type: 'same', text: a[i] });
i++;
j++;
} else if (lcs[i + 1][j] >= lcs[i][j + 1]) {
out.push({ type: 'del', text: a[i] });
i++;
} else {
out.push({ type: 'add', text: b[j] });
j++;
}
}
while (i < n) {
out.push({ type: 'del', text: a[i] });
i++;
}
while (j < m) {
out.push({ type: 'add', text: b[j] });
j++;
}
return out;
}
|