computeLineDiff function
Compute a line-level diff between oldText and newText.
Implementation
List<LineDiff> computeLineDiff(String oldText, String newText) {
final oldLines = oldText.isEmpty ? <String>[] : oldText.split('\n');
final newLines = newText.isEmpty ? <String>[] : newText.split('\n');
final lcs = longestCommonSubsequence(oldLines, newLines);
final result = <LineDiff>[];
var oi = 0, ni = 0, li = 0;
while (oi < oldLines.length || ni < newLines.length) {
if (li < lcs.length &&
oi < oldLines.length &&
ni < newLines.length &&
oldLines[oi] == lcs[li] &&
newLines[ni] == lcs[li]) {
result.add(
LineDiff(
lineNumber: ni + 1,
content: newLines[ni],
type: DiffType.context,
),
);
oi++;
ni++;
li++;
} else if (oi < oldLines.length &&
(li >= lcs.length || oldLines[oi] != lcs[li])) {
result.add(
LineDiff(
lineNumber: oi + 1,
content: oldLines[oi],
type: DiffType.remove,
),
);
oi++;
} else if (ni < newLines.length &&
(li >= lcs.length || newLines[ni] != lcs[li])) {
result.add(
LineDiff(lineNumber: ni + 1, content: newLines[ni], type: DiffType.add),
);
ni++;
}
}
return result;
}