diffStrings static method
Diff two strings under the assumption that at most one insertion and one
deletion took place, and both happened at the same index, after which the
cursor was at index cursor
in the new string.
Implementation
static StringDiff diffStrings(String oldText, String newText, int cursor) {
assert(cursor >= 0, 'Cursor was negative.');
assert(cursor <= newText.length, 'Cursor was outside of newText range.');
final maxInsertion = cursor;
final maxDeletion =
math.max(0, oldText.length - newText.length + maxInsertion);
final oldLength = oldText.characters.length;
final oldEnd = CharacterRange.at(oldText, maxDeletion, oldText.length)
.currentCharacters
.iteratorAtEnd;
final newEnd = newText.characters.iteratorAtEnd;
var end = oldLength;
while (oldEnd.moveBack() &&
newEnd.moveBack() &&
oldEnd.current == newEnd.current) {
end--;
}
var start = 0;
final delta = newText.length - oldText.length;
final strStartLimit = cursor - math.max<int>(0, delta);
final startLimit =
CharacterRange.at(newText, 0, strStartLimit).currentCharacters.length;
final oldStart = oldText.characters.iterator;
final newStart = newText.characters.iterator;
while (start < startLimit &&
oldStart.moveNext() &&
newStart.moveNext() &&
oldStart.current == newStart.current) {
start++;
}
final deleted = oldText.characters.getRange(math.min(start, end), end);
final inserted =
newText.characters.getRange(start, math.max(end + delta, start));
return StringDiff(
start,
deleted,
inserted,
);
}