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 在 文本编辑器
160KB
3.5K SLoC
text-document
Rust 的文本文档结构和管理
该模型被视为文本 UI 的后端。 TextDocument
不能直接由用户修改,只能通过 set_plain_text(...)
来设置整个文档。用户必须使用 TextCursor
,通过 document.create_cursor()
来进行任何更改。
文档结构
元素
Frame
:包含 Block 元素和其他 Frame 元素,可以格式化为 FrameFormatBlock
:包含 Text 元素或 Image 元素,可以格式化为 BlockFormatText
:包含实际文本,可以格式化为 TextFormatImage
:表示图像的位置,可以格式化为 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(《LICENSE-APACHE》或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(《LICENSE-MIT》或http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则您提交的任何有意包含在本作品中的贡献(根据Apache-2.0许可证定义),应如上所述双重授权,不附加任何额外的条款或条件。
依赖项
~0.8–1.4MB
~28K SLoC