Preserve last newline character on delete

Occurs on desktop when DEL is pressed at the end of the document (attempting to delete the last newline character).
pull/526/head
X Code 3 years ago
parent e5fe8a9871
commit 8bd4f1ee64
  1. 28
      lib/src/models/rules/delete.dart
  2. 1
      lib/src/models/rules/rule.dart

@ -16,15 +16,33 @@ abstract class DeleteRule extends Rule {
}
}
class EnsureLastLineBreakDeleteRule extends DeleteRule {
const EnsureLastLineBreakDeleteRule();
@override
Delta? applyRule(Delta document, int index,
{int? len, Object? data, Attribute? attribute}) {
final itr = DeltaIterator(document)..skip(index + len!);
return Delta()
..retain(index)
..delete(itr.hasNext ? len : len - 1);
}
}
/// Fallback rule for delete operations which simply deletes specified text
/// range without any special handling.
class CatchAllDeleteRule extends DeleteRule {
const CatchAllDeleteRule();
@override
Delta applyRule(Delta document, int index,
{int? len, Object? data, Attribute? attribute}) {
final itr = DeltaIterator(document)..skip(index + len!);
return Delta()
..retain(index)
..delete(len!);
..delete(itr.hasNext ? len : len - 1);
}
}
@ -44,6 +62,14 @@ class PreserveLineStyleOnMergeRule extends DeleteRule {
final attrs = op.attributes;
itr.skip(len! - 1);
if (!itr.hasNext) {
// User attempts to delete the last newline character, prevent it.
return Delta()
..retain(index)
..delete(len - 1);
}
final delta = Delta()
..retain(index)
..delete(len);

@ -46,6 +46,7 @@ class Rules {
const EnsureEmbedLineRule(),
const PreserveLineStyleOnMergeRule(),
const CatchAllDeleteRule(),
const EnsureLastLineBreakDeleteRule()
]);
static Rules getInstance() => _instance;

Loading…
Cancel
Save