reset_format_on_new_line.rs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. use crate::{client_document::InsertExt, util::is_newline};
  2. use lib_ot::{
  3. core::{DeltaBuilder, DeltaIterator, Utf16CodeUnitMetric, NEW_LINE},
  4. rich_text::{RichTextDelta, TextAttributeKey, TextAttributes},
  5. };
  6. pub struct ResetLineFormatOnNewLine {}
  7. impl InsertExt for ResetLineFormatOnNewLine {
  8. fn ext_name(&self) -> &str {
  9. "ResetLineFormatOnNewLine"
  10. }
  11. fn apply(&self, delta: &RichTextDelta, replace_len: usize, text: &str, index: usize) -> Option<RichTextDelta> {
  12. if !is_newline(text) {
  13. return None;
  14. }
  15. let mut iter = DeltaIterator::new(delta);
  16. iter.seek::<Utf16CodeUnitMetric>(index);
  17. let next_op = iter.next_op()?;
  18. if !next_op.get_data().starts_with(NEW_LINE) {
  19. return None;
  20. }
  21. let mut reset_attribute = TextAttributes::new();
  22. if next_op.get_attributes().contains_key(&TextAttributeKey::Header) {
  23. reset_attribute.delete(&TextAttributeKey::Header);
  24. }
  25. let len = index + replace_len;
  26. Some(
  27. DeltaBuilder::new()
  28. .retain(len)
  29. .insert_with_attributes(NEW_LINE, next_op.get_attributes())
  30. .retain_with_attributes(1, reset_attribute)
  31. .trim()
  32. .build(),
  33. )
  34. }
  35. }