apply method
Applies heuristic rule to a retain (format) operation on a document
and
returns resulting Delta.
Implementation
@override
Delta? apply(Delta document, int index, int length, NotusAttribute attribute) {
if (attribute.key != NotusAttribute.link.key) return null;
// If user selection is not collapsed we let it fallback to default rule
// which simply applies the attribute to selected range.
// This may still not be a bulletproof approach as selection can span
// multiple lines or be a subset of existing link-formatted text.
// So certain improvements can be made in the future to account for such
// edge cases.
if (length != 0) return null;
final result = Delta();
final iter = DeltaIterator(document);
final before = iter.skip(index);
final after = iter.next();
var startIndex = index;
int retain = 0;
if (before != null && before.hasAttribute(attribute.key)) {
startIndex -= before.length!;
retain = before.length!;
}
if (after != null && after.hasAttribute(attribute.key)) {
retain += after.length!;
}
// There is no link-styled text around `index` position so it becomes a
// no-op action.
if (retain == 0) return null;
result..retain(startIndex)..retain(retain, attribute.toJson());
return result;
}