Spaces:
Running
Running
File size: 2,265 Bytes
a27839e |
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
import { diffLines, Change } from 'diff';
export interface DiffResult {
added: number;
removed: number;
changes: Change[];
}
export interface DiffSummary {
added: number;
removed: number;
summary: string;
}
export const generateDiff = (oldCode: string, newCode: string): DiffResult => {
const changes = diffLines(oldCode, newCode);
let added = 0;
let removed = 0;
changes.forEach(change => {
if (change.added) {
added += change.count || 0;
} else if (change.removed) {
removed += change.count || 0;
}
});
return { added, removed, changes };
};
export const applyPatch = (oldCode: string, changes: Change[]): string => {
const lines = oldCode.split('\n');
let result: string[] = [];
let lineIndex = 0;
changes.forEach(change => {
if (change.removed) {
// Skip removed lines
lineIndex += change.count || 0;
} else if (change.added) {
// Add new lines
const newLines = change.value.split('\n').filter(line => line !== '');
result.push(...newLines);
} else {
// Keep unchanged lines
const unchangedLines = lines.slice(lineIndex, lineIndex + (change.count || 0));
result.push(...unchangedLines);
lineIndex += change.count || 0;
}
});
return result.join('\n');
};
export const generateDiffSummary = (diffResult: DiffResult): DiffSummary => {
return {
added: diffResult.added,
removed: diffResult.removed,
summary: `Modified code: ${diffResult.added} lines added, ${diffResult.removed} lines removed`
};
};
export const formatDiffForDisplay = (changes: Change[]): string => {
let formattedDiff = '';
changes.forEach(change => {
if (change.added) {
const lines = change.value.split('\n').filter(line => line !== '');
lines.forEach(line => {
formattedDiff += `+ ${line}\n`;
});
} else if (change.removed) {
const lines = change.value.split('\n').filter(line => line !== '');
lines.forEach(line => {
formattedDiff += `- ${line}\n`;
});
} else {
const lines = change.value.split('\n').filter(line => line !== '');
lines.forEach(line => {
formattedDiff += ` ${line}\n`;
});
}
});
return formattedDiff;
}; |