apply method
Applies heuristic rule to an insert operation on a document
and returns
resulting Delta.
Implementation
@override
Delta? apply(Delta document, int index, String text) {
if (!text.contains('\n') || text.length == 1) {
// Only interested in text containing at least one line-break and at least
// one more character.
return null;
}
final iter = DeltaIterator(document);
iter.skip(index);
// Look for next line-break.
Map<String, dynamic>? lineStyle;
while (iter.hasNext) {
final op = iter.next();
final lf = op!.data.indexOf('\n');
if (lf >= 0) {
lineStyle = op.attributes;
break;
}
}
Map<String, dynamic>? resetStyle;
Map<String, dynamic>? blockStyle;
if (lineStyle != null) {
if (lineStyle.containsKey(NotusAttribute.heading.key)) {
resetStyle = NotusAttribute.heading.unset.toJson();
}
if (lineStyle.containsKey(NotusAttribute.block.key)) {
blockStyle = <String, dynamic>{
NotusAttribute.block.key: lineStyle[NotusAttribute.block.key]
};
}
}
final lines = text.split('\n');
final result = Delta()..retain(index);
for (var i = 0; i < lines.length; i++) {
final line = lines[i];
if (line.isNotEmpty) {
result.insert(line);
}
if (i == 0) {
result.insert('\n', lineStyle);
} else if (i == lines.length - 1) {
if (resetStyle != null) result.retain(1, resetStyle);
} else {
result.insert('\n', blockStyle);
}
}
return result;
}