Ropey is a utf8 text buffer for Rust, designed to be the backing text buffer for applications such as text editors. Ropey is fast, Unicode-safe, has low memory overhead, and can handle huge texts and memory-incoherent edits without trouble.
Internally it's implemented as a b-tree rope.
```Rust // Load a text file. let mut text = ropey::Rope::fromreader( File::open("mygreat_book.txt")? )?;
// Print the 516th line (zero-indexed). println!("{}", text.line(515));
// Get the start/end char indices of the line. let startidx = text.linetochar(515); let endidx = text.linetochar(516);
// Remove the line... text.remove(startidx..endidx);
// ...and replace it with something better. text.insert(start_idx, "The flowers are... so... dunno.\n");
// Print the changes, along with the previous few lines for context. let startidx = text.linetochar(511); let endidx = text.linetochar(516); println!("{}", text.slice(startidx..endidx));
// Write the file back out to disk using the efficient Chunks
iterator.
let mut file = File::create("mygreatbook.txt")?;
for chunk in text.chunks() {
file.write(chunk.as_bytes())?;
}
```
Ropey is fast and minimizes memory usage:
Ropey treats Unicode scalar values
(char
s in Rust) as the
atomic unit of text. Indexing and edits are all done in terms of Unicode
scalar values, making the APIs intuitive and making it impossible to
accidentally create invalid utf8 data.
Ropey also ensures that grapheme clusters
are never split in its internal representation, and thus can always be
accessed as &str
slices. This is particularly helpful when printing text
to screen because consuming code doesn't have to worry about finding split
graphemes that should be printed as single visual characters. Moreover, Ropey
provides APIs for iterating over graphemes and querying about grapheme
boundaries.
Ropey knows about line breaks, allowing you to index into and iterate over lines of text.
Ropey also recognizes all eight Unicode-specified line breaks: line feed, carriage return, carriage return + line feed, vertical tab, form feed, next line, line separator, and paragraph separator.
Ropey has rope slices that allow you to work with just parts of a rope, using any of the read-only operations of a full rope including iterators and making sub-slices.
Ropey provides APIs for efficiently streaming text data to and from ropes. This is primarily intended for efficiently saving and loading text data from disk, but the APIs are flexible, and can be used for whatever you like.
Ropey ensures that even though clones share memory, everything is thread-safe. Clones can be sent to other threads for both reading and writing.
Ropey is licensed under the MIT license (LICENSE.md or http://opensource.org/licenses/MIT)
Contributions are absolutely welcome! However, please open an issue or email me to discuss larger changes, to avoid doing a lot of work that may get rejected.
An overview of Ropey's design can be found here.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Ropey by you will be licensed as above, without any additional terms or conditions.