highlightInlineDiff method

(List<InlineSpan>, List<InlineSpan>) highlightInlineDiff(
  1. String oldLine,
  2. String newLine
)

Compute word-level inline diff between oldLine and newLine.

Returns a pair of span lists: the first for the old line, the second for the new line. Changed words are marked with InlineSpan.isChanged = true.

Implementation

(List<InlineSpan>, List<InlineSpan>) highlightInlineDiff(
  String oldLine,
  String newLine,
) {
  final oldTokens = _tokenize(oldLine);
  final newTokens = _tokenize(newLine);
  final edits = _myersDiff(oldTokens, newTokens);

  final oldSpans = <InlineSpan>[];
  final newSpans = <InlineSpan>[];

  for (final edit in edits) {
    switch (edit.type) {
      case _EditType.equal:
        oldSpans.add(
          InlineSpan(text: oldTokens[edit.oldIndex], isChanged: false),
        );
        newSpans.add(
          InlineSpan(text: newTokens[edit.newIndex], isChanged: false),
        );
        break;
      case _EditType.delete:
        oldSpans.add(
          InlineSpan(text: oldTokens[edit.oldIndex], isChanged: true),
        );
        break;
      case _EditType.insert:
        newSpans.add(
          InlineSpan(text: newTokens[edit.newIndex], isChanged: true),
        );
        break;
    }
  }

  return (_mergeSpans(oldSpans), _mergeSpans(newSpans));
}