computeLineDiff function

List<LineDiff> computeLineDiff(
  1. String oldText,
  2. String newText
)

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