5 个版本

0.0.5 2022 年 7 月 4 日
0.0.4 2022 年 7 月 1 日
0.0.3 2022 年 7 月 1 日
0.0.2 2022 年 7 月 1 日
0.0.1 2022 年 6 月 30 日

#193文本编辑器

MIT/Apache

160KB
3.5K SLoC

crates.io API license build status codecov Lines of code

text-document

Rust 的文本文档结构和管理

该模型被视为文本 UI 的后端。 TextDocument 不能直接由用户修改,只能通过 set_plain_text(...) 来设置整个文档。用户必须使用 TextCursor,通过 document.create_cursor() 来进行任何更改。

文档结构

元素

  • Frame:包含 Block 元素和其他 Frame 元素,可以格式化为 FrameFormat
  • Block:包含 Text 元素或 Image 元素,可以格式化为 BlockFormat
  • Text:包含实际文本,可以格式化为 TextFormat
  • Image:表示图像的位置,可以格式化为 ImageFormat

所有这些项都封装在其相应的 Element 中,以便于存储。

简单的纯文本

Frame
|- Block
   |- Text
|- Block
   |- Text

更复杂的富文本

Frame
|- Block
   |- Text  --> I really lo
   |- Text  --> ve (imagine it Formatted in bold)
   |- Text  --> Rust
   |- Image
   |- Text
|- Frame
   |- Block
      |- Text
      |- Text
      |- Text
   |- Block
      |- Text
      |- Text
      |- Text
|- Block
   |- Image

信号更改

每个修改都通过回调来通知。 TextDocument 提供了不同的方式让您的代码知道任何更改

  • [TextDocument::add_text_change_callback()]

    给出删除的字符数和添加的字符数,以及光标位置的引用。

  • [TextDocument::add_element_change_callback()]

    提供修改后的元素及其原因。如果有两个直接子元素同时更改。

示例

use text_document::{TextDocument, ChangeReason, MoveMode};

let mut document = TextDocument::new();

document.add_text_change_callback(|position, removed_characters, added_characters|{
  println!("position: {}, removed_characters: {}, added_characters: {}", position, removed_characters, added_characters);
} );

document.add_element_change_callback(|element, reason|{
  assert_eq!(element.uuid(), 0);
  assert_eq!(reason, ChangeReason::ChildrenChanged );
} );
document.set_plain_text("beginningend").unwrap();

let mut cursor = document.create_cursor();
cursor.set_position(9, MoveMode::MoveAnchor);
cursor.insert_plain_text("new\nplain_text\ntest");

  

许可证

根据以下任一许可证授权:

由您选择。

贡献

除非您明确声明,否则您提交的任何有意包含在本作品中的贡献(根据Apache-2.0许可证定义),应如上所述双重授权,不附加任何额外的条款或条件。

依赖项

~0.8–1.4MB
~28K SLoC