Got cursor movement working with graphemes, and fixed unit tests.
This commit is contained in:
parent
f221b90a82
commit
76bd98e5ae
|
@ -69,6 +69,10 @@ impl Buffer {
|
|||
self.text.len_chars()
|
||||
}
|
||||
|
||||
pub fn is_grapheme(&self, char_idx: usize) -> bool {
|
||||
self.text.is_grapheme_boundary(char_idx)
|
||||
}
|
||||
|
||||
pub fn nth_next_grapheme(&self, char_idx: usize, n: usize) -> usize {
|
||||
let mut char_idx = char_idx;
|
||||
for _ in 0..n {
|
||||
|
@ -389,7 +393,7 @@ mod tests {
|
|||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 9);
|
||||
assert!(buf.char_count() == 9);
|
||||
assert!(buf.line_count() == 1);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("e") == iter.next());
|
||||
|
@ -411,7 +415,7 @@ mod tests {
|
|||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 11);
|
||||
assert!(buf.char_count() == 12);
|
||||
assert!(buf.line_count() == 3);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("e") == iter.next());
|
||||
|
@ -436,26 +440,26 @@ mod tests {
|
|||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 17);
|
||||
assert!(buf.line_count() == 3);
|
||||
assert!(Some("A") == iter.next());
|
||||
assert!(Some("g") == iter.next());
|
||||
assert!(Some("a") == iter.next());
|
||||
assert!(Some("i") == iter.next());
|
||||
assert!(Some("n") == iter.next());
|
||||
assert!(Some(" ") == iter.next());
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("e") == iter.next());
|
||||
assert!(Some("l") == iter.next());
|
||||
assert!(Some("l") == iter.next());
|
||||
assert!(Some("o") == iter.next());
|
||||
assert!(Some("\n") == iter.next());
|
||||
assert!(Some(" ") == iter.next());
|
||||
assert!(Some("世") == iter.next());
|
||||
assert!(Some("界") == iter.next());
|
||||
assert!(Some("\r\n") == iter.next());
|
||||
assert!(Some("!") == iter.next());
|
||||
assert!(None == iter.next());
|
||||
assert_eq!(buf.char_count(), 18);
|
||||
assert_eq!(buf.line_count(), 3);
|
||||
assert_eq!(Some("A"), iter.next());
|
||||
assert_eq!(Some("g"), iter.next());
|
||||
assert_eq!(Some("a"), iter.next());
|
||||
assert_eq!(Some("i"), iter.next());
|
||||
assert_eq!(Some("n"), iter.next());
|
||||
assert_eq!(Some(" "), iter.next());
|
||||
assert_eq!(Some("H"), iter.next());
|
||||
assert_eq!(Some("e"), iter.next());
|
||||
assert_eq!(Some("l"), iter.next());
|
||||
assert_eq!(Some("l"), iter.next());
|
||||
assert_eq!(Some("o"), iter.next());
|
||||
assert_eq!(Some("\n"), iter.next());
|
||||
assert_eq!(Some(" "), iter.next());
|
||||
assert_eq!(Some("世"), iter.next());
|
||||
assert_eq!(Some("界"), iter.next());
|
||||
assert_eq!(Some("\r\n"), iter.next());
|
||||
assert_eq!(Some("!"), iter.next());
|
||||
assert_eq!(None, iter.next());
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -467,26 +471,26 @@ mod tests {
|
|||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 17);
|
||||
assert!(buf.line_count() == 3);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("e") == iter.next());
|
||||
assert!(Some("l") == iter.next());
|
||||
assert!(Some("l") == iter.next());
|
||||
assert!(Some("o") == iter.next());
|
||||
assert!(Some(" ") == iter.next());
|
||||
assert!(Some("a") == iter.next());
|
||||
assert!(Some("g") == iter.next());
|
||||
assert!(Some("a") == iter.next());
|
||||
assert!(Some("i") == iter.next());
|
||||
assert!(Some("n") == iter.next());
|
||||
assert!(Some("\n") == iter.next());
|
||||
assert!(Some(" ") == iter.next());
|
||||
assert!(Some("世") == iter.next());
|
||||
assert!(Some("界") == iter.next());
|
||||
assert!(Some("\r\n") == iter.next());
|
||||
assert!(Some("!") == iter.next());
|
||||
assert!(None == iter.next());
|
||||
assert_eq!(buf.char_count(), 18);
|
||||
assert_eq!(buf.line_count(), 3);
|
||||
assert_eq!(Some("H"), iter.next());
|
||||
assert_eq!(Some("e"), iter.next());
|
||||
assert_eq!(Some("l"), iter.next());
|
||||
assert_eq!(Some("l"), iter.next());
|
||||
assert_eq!(Some("o"), iter.next());
|
||||
assert_eq!(Some(" "), iter.next());
|
||||
assert_eq!(Some("a"), iter.next());
|
||||
assert_eq!(Some("g"), iter.next());
|
||||
assert_eq!(Some("a"), iter.next());
|
||||
assert_eq!(Some("i"), iter.next());
|
||||
assert_eq!(Some("n"), iter.next());
|
||||
assert_eq!(Some("\n"), iter.next());
|
||||
assert_eq!(Some(" "), iter.next());
|
||||
assert_eq!(Some("世"), iter.next());
|
||||
assert_eq!(Some("界"), iter.next());
|
||||
assert_eq!(Some("\r\n"), iter.next());
|
||||
assert_eq!(Some("!"), iter.next());
|
||||
assert_eq!(None, iter.next());
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -498,25 +502,25 @@ mod tests {
|
|||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 16);
|
||||
assert!(buf.line_count() == 3);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("e") == iter.next());
|
||||
assert!(Some("l") == iter.next());
|
||||
assert!(Some("l") == iter.next());
|
||||
assert!(Some("o") == iter.next());
|
||||
assert!(Some("\n") == iter.next());
|
||||
assert!(Some("a") == iter.next());
|
||||
assert!(Some("g") == iter.next());
|
||||
assert!(Some("a") == iter.next());
|
||||
assert!(Some("i") == iter.next());
|
||||
assert!(Some("n") == iter.next());
|
||||
assert!(Some(" ") == iter.next());
|
||||
assert!(Some("世") == iter.next());
|
||||
assert!(Some("界") == iter.next());
|
||||
assert!(Some("\r\n") == iter.next());
|
||||
assert!(Some("!") == iter.next());
|
||||
assert!(None == iter.next());
|
||||
assert_eq!(buf.char_count(), 17);
|
||||
assert_eq!(buf.line_count(), 3);
|
||||
assert_eq!(Some("H"), iter.next());
|
||||
assert_eq!(Some("e"), iter.next());
|
||||
assert_eq!(Some("l"), iter.next());
|
||||
assert_eq!(Some("l"), iter.next());
|
||||
assert_eq!(Some("o"), iter.next());
|
||||
assert_eq!(Some("\n"), iter.next());
|
||||
assert_eq!(Some("a"), iter.next());
|
||||
assert_eq!(Some("g"), iter.next());
|
||||
assert_eq!(Some("a"), iter.next());
|
||||
assert_eq!(Some("i"), iter.next());
|
||||
assert_eq!(Some("n"), iter.next());
|
||||
assert_eq!(Some(" "), iter.next());
|
||||
assert_eq!(Some("世"), iter.next());
|
||||
assert_eq!(Some("界"), iter.next());
|
||||
assert_eq!(Some("\r\n"), iter.next());
|
||||
assert_eq!(Some("!"), iter.next());
|
||||
assert_eq!(None, iter.next());
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -524,29 +528,29 @@ mod tests {
|
|||
let mut buf = Buffer::new();
|
||||
|
||||
buf.insert_text("Hello\n 世界\r\n!", 0);
|
||||
buf.insert_text("again", 11);
|
||||
buf.insert_text("again", 12);
|
||||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 16);
|
||||
assert!(buf.line_count() == 3);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("e") == iter.next());
|
||||
assert!(Some("l") == iter.next());
|
||||
assert!(Some("l") == iter.next());
|
||||
assert!(Some("o") == iter.next());
|
||||
assert!(Some("\n") == iter.next());
|
||||
assert!(Some(" ") == iter.next());
|
||||
assert!(Some("世") == iter.next());
|
||||
assert!(Some("界") == iter.next());
|
||||
assert!(Some("\r\n") == iter.next());
|
||||
assert!(Some("!") == iter.next());
|
||||
assert!(Some("a") == iter.next());
|
||||
assert!(Some("g") == iter.next());
|
||||
assert!(Some("a") == iter.next());
|
||||
assert!(Some("i") == iter.next());
|
||||
assert!(Some("n") == iter.next());
|
||||
assert!(None == iter.next());
|
||||
assert_eq!(buf.char_count(), 17);
|
||||
assert_eq!(buf.line_count(), 3);
|
||||
assert_eq!(Some("H"), iter.next());
|
||||
assert_eq!(Some("e"), iter.next());
|
||||
assert_eq!(Some("l"), iter.next());
|
||||
assert_eq!(Some("l"), iter.next());
|
||||
assert_eq!(Some("o"), iter.next());
|
||||
assert_eq!(Some("\n"), iter.next());
|
||||
assert_eq!(Some(" "), iter.next());
|
||||
assert_eq!(Some("世"), iter.next());
|
||||
assert_eq!(Some("界"), iter.next());
|
||||
assert_eq!(Some("\r\n"), iter.next());
|
||||
assert_eq!(Some("!"), iter.next());
|
||||
assert_eq!(Some("a"), iter.next());
|
||||
assert_eq!(Some("g"), iter.next());
|
||||
assert_eq!(Some("a"), iter.next());
|
||||
assert_eq!(Some("i"), iter.next());
|
||||
assert_eq!(Some("n"), iter.next());
|
||||
assert_eq!(None, iter.next());
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -558,26 +562,26 @@ mod tests {
|
|||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 16);
|
||||
assert!(buf.line_count() == 3);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("e") == iter.next());
|
||||
assert!(Some("a") == iter.next());
|
||||
assert!(Some("g") == iter.next());
|
||||
assert!(Some("a") == iter.next());
|
||||
assert!(Some("i") == iter.next());
|
||||
assert!(Some("n") == iter.next());
|
||||
assert!(Some("l") == iter.next());
|
||||
assert!(Some("l") == iter.next());
|
||||
assert!(Some("o") == iter.next());
|
||||
assert!(Some("\n") == iter.next());
|
||||
assert!(Some(" ") == iter.next());
|
||||
assert!(Some("世") == iter.next());
|
||||
assert!(Some("界") == iter.next());
|
||||
assert!(Some("\r\n") == iter.next());
|
||||
assert!(Some("!") == iter.next());
|
||||
assert_eq!(buf.char_count(), 17);
|
||||
assert_eq!(buf.line_count(), 3);
|
||||
assert_eq!(Some("H"), iter.next());
|
||||
assert_eq!(Some("e"), iter.next());
|
||||
assert_eq!(Some("a"), iter.next());
|
||||
assert_eq!(Some("g"), iter.next());
|
||||
assert_eq!(Some("a"), iter.next());
|
||||
assert_eq!(Some("i"), iter.next());
|
||||
assert_eq!(Some("n"), iter.next());
|
||||
assert_eq!(Some("l"), iter.next());
|
||||
assert_eq!(Some("l"), iter.next());
|
||||
assert_eq!(Some("o"), iter.next());
|
||||
assert_eq!(Some("\n"), iter.next());
|
||||
assert_eq!(Some(" "), iter.next());
|
||||
assert_eq!(Some("世"), iter.next());
|
||||
assert_eq!(Some("界"), iter.next());
|
||||
assert_eq!(Some("\r\n"), iter.next());
|
||||
assert_eq!(Some("!"), iter.next());
|
||||
|
||||
assert!(None == iter.next());
|
||||
assert_eq!(None, iter.next());
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -589,26 +593,26 @@ mod tests {
|
|||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 16);
|
||||
assert!(buf.line_count() == 3);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("e") == iter.next());
|
||||
assert!(Some("l") == iter.next());
|
||||
assert!(Some("l") == iter.next());
|
||||
assert!(Some("o") == iter.next());
|
||||
assert!(Some("\n") == iter.next());
|
||||
assert!(Some(" ") == iter.next());
|
||||
assert!(Some("世") == iter.next());
|
||||
assert!(Some("a") == iter.next());
|
||||
assert!(Some("g") == iter.next());
|
||||
assert!(Some("a") == iter.next());
|
||||
assert!(Some("i") == iter.next());
|
||||
assert!(Some("n") == iter.next());
|
||||
assert!(Some("界") == iter.next());
|
||||
assert!(Some("\r\n") == iter.next());
|
||||
assert!(Some("!") == iter.next());
|
||||
assert_eq!(buf.char_count(), 17);
|
||||
assert_eq!(buf.line_count(), 3);
|
||||
assert_eq!(Some("H"), iter.next());
|
||||
assert_eq!(Some("e"), iter.next());
|
||||
assert_eq!(Some("l"), iter.next());
|
||||
assert_eq!(Some("l"), iter.next());
|
||||
assert_eq!(Some("o"), iter.next());
|
||||
assert_eq!(Some("\n"), iter.next());
|
||||
assert_eq!(Some(" "), iter.next());
|
||||
assert_eq!(Some("世"), iter.next());
|
||||
assert_eq!(Some("a"), iter.next());
|
||||
assert_eq!(Some("g"), iter.next());
|
||||
assert_eq!(Some("a"), iter.next());
|
||||
assert_eq!(Some("i"), iter.next());
|
||||
assert_eq!(Some("n"), iter.next());
|
||||
assert_eq!(Some("界"), iter.next());
|
||||
assert_eq!(Some("\r\n"), iter.next());
|
||||
assert_eq!(Some("!"), iter.next());
|
||||
|
||||
assert!(None == iter.next());
|
||||
assert_eq!(None, iter.next());
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -620,30 +624,30 @@ mod tests {
|
|||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 20);
|
||||
assert!(buf.line_count() == 7);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("e") == iter.next());
|
||||
assert!(Some("\n") == iter.next());
|
||||
assert!(Some("a") == iter.next());
|
||||
assert!(Some("g") == iter.next());
|
||||
assert!(Some("\n") == iter.next());
|
||||
assert!(Some("\n") == iter.next());
|
||||
assert!(Some("a") == iter.next());
|
||||
assert!(Some("i") == iter.next());
|
||||
assert!(Some("n") == iter.next());
|
||||
assert!(Some("\n") == iter.next());
|
||||
assert!(Some("l") == iter.next());
|
||||
assert!(Some("l") == iter.next());
|
||||
assert!(Some("o") == iter.next());
|
||||
assert!(Some("\n") == iter.next());
|
||||
assert!(Some(" ") == iter.next());
|
||||
assert!(Some("世") == iter.next());
|
||||
assert!(Some("界") == iter.next());
|
||||
assert!(Some("\r\n") == iter.next());
|
||||
assert!(Some("!") == iter.next());
|
||||
assert_eq!(buf.char_count(), 21);
|
||||
assert_eq!(buf.line_count(), 7);
|
||||
assert_eq!(Some("H"), iter.next());
|
||||
assert_eq!(Some("e"), iter.next());
|
||||
assert_eq!(Some("\n"), iter.next());
|
||||
assert_eq!(Some("a"), iter.next());
|
||||
assert_eq!(Some("g"), iter.next());
|
||||
assert_eq!(Some("\n"), iter.next());
|
||||
assert_eq!(Some("\n"), iter.next());
|
||||
assert_eq!(Some("a"), iter.next());
|
||||
assert_eq!(Some("i"), iter.next());
|
||||
assert_eq!(Some("n"), iter.next());
|
||||
assert_eq!(Some("\n"), iter.next());
|
||||
assert_eq!(Some("l"), iter.next());
|
||||
assert_eq!(Some("l"), iter.next());
|
||||
assert_eq!(Some("o"), iter.next());
|
||||
assert_eq!(Some("\n"), iter.next());
|
||||
assert_eq!(Some(" "), iter.next());
|
||||
assert_eq!(Some("世"), iter.next());
|
||||
assert_eq!(Some("界"), iter.next());
|
||||
assert_eq!(Some("\r\n"), iter.next());
|
||||
assert_eq!(Some("!"), iter.next());
|
||||
|
||||
assert!(None == iter.next());
|
||||
assert_eq!(None, iter.next());
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -651,14 +655,14 @@ mod tests {
|
|||
let mut buf = Buffer::new();
|
||||
|
||||
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0);
|
||||
assert!(buf.grapheme_count() == 29);
|
||||
assert!(buf.char_count() == 29);
|
||||
assert!(buf.line_count() == 6);
|
||||
|
||||
buf.text.remove(0, 3);
|
||||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 26);
|
||||
assert!(buf.char_count() == 26);
|
||||
assert!(buf.line_count() == 5);
|
||||
assert!(Some("t") == iter.next());
|
||||
assert!(Some("h") == iter.next());
|
||||
|
@ -694,14 +698,14 @@ mod tests {
|
|||
let mut buf = Buffer::new();
|
||||
|
||||
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0);
|
||||
assert!(buf.grapheme_count() == 29);
|
||||
assert!(buf.char_count() == 29);
|
||||
assert!(buf.line_count() == 6);
|
||||
|
||||
buf.text.remove(0, 12);
|
||||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 17);
|
||||
assert!(buf.char_count() == 17);
|
||||
assert!(buf.line_count() == 4);
|
||||
assert!(Some("p") == iter.next());
|
||||
assert!(Some("l") == iter.next());
|
||||
|
@ -728,14 +732,14 @@ mod tests {
|
|||
let mut buf = Buffer::new();
|
||||
|
||||
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0);
|
||||
assert!(buf.grapheme_count() == 29);
|
||||
assert!(buf.char_count() == 29);
|
||||
assert!(buf.line_count() == 6);
|
||||
|
||||
buf.text.remove(5, 17);
|
||||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 17);
|
||||
assert!(buf.char_count() == 17);
|
||||
assert!(buf.line_count() == 4);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("i") == iter.next());
|
||||
|
@ -762,14 +766,14 @@ mod tests {
|
|||
let mut buf = Buffer::new();
|
||||
|
||||
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0);
|
||||
assert!(buf.grapheme_count() == 29);
|
||||
assert!(buf.char_count() == 29);
|
||||
assert!(buf.line_count() == 6);
|
||||
|
||||
buf.text.remove(23, 29);
|
||||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 23);
|
||||
assert!(buf.char_count() == 23);
|
||||
assert!(buf.line_count() == 6);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("i") == iter.next());
|
||||
|
@ -802,14 +806,14 @@ mod tests {
|
|||
let mut buf = Buffer::new();
|
||||
|
||||
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0);
|
||||
assert!(buf.grapheme_count() == 29);
|
||||
assert!(buf.char_count() == 29);
|
||||
assert!(buf.line_count() == 6);
|
||||
|
||||
buf.text.remove(17, 29);
|
||||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 17);
|
||||
assert!(buf.char_count() == 17);
|
||||
assert!(buf.line_count() == 4);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("i") == iter.next());
|
||||
|
@ -836,14 +840,14 @@ mod tests {
|
|||
let mut buf = Buffer::new();
|
||||
|
||||
buf.insert_text("Hello\nworld!", 0);
|
||||
assert!(buf.grapheme_count() == 12);
|
||||
assert!(buf.char_count() == 12);
|
||||
assert!(buf.line_count() == 2);
|
||||
|
||||
buf.text.remove(3, 12);
|
||||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 3);
|
||||
assert!(buf.char_count() == 3);
|
||||
assert!(buf.line_count() == 1);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("e") == iter.next());
|
||||
|
@ -856,14 +860,14 @@ mod tests {
|
|||
let mut buf = Buffer::new();
|
||||
|
||||
buf.insert_text("Hi\nthere\nworld!", 0);
|
||||
assert!(buf.grapheme_count() == 15);
|
||||
assert!(buf.char_count() == 15);
|
||||
assert!(buf.line_count() == 3);
|
||||
|
||||
buf.text.remove(5, 15);
|
||||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 5);
|
||||
assert!(buf.char_count() == 5);
|
||||
assert!(buf.line_count() == 2);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("i") == iter.next());
|
||||
|
@ -878,14 +882,14 @@ mod tests {
|
|||
let mut buf = Buffer::new();
|
||||
|
||||
buf.insert_text("Hello\nworld!", 0);
|
||||
assert!(buf.grapheme_count() == 12);
|
||||
assert!(buf.char_count() == 12);
|
||||
assert!(buf.line_count() == 2);
|
||||
|
||||
buf.text.remove(3, 11);
|
||||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 4);
|
||||
assert!(buf.char_count() == 4);
|
||||
assert!(buf.line_count() == 1);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("e") == iter.next());
|
||||
|
@ -899,14 +903,14 @@ mod tests {
|
|||
let mut buf = Buffer::new();
|
||||
|
||||
buf.insert_text("Hello\nworld!", 0);
|
||||
assert!(buf.grapheme_count() == 12);
|
||||
assert!(buf.char_count() == 12);
|
||||
assert!(buf.line_count() == 2);
|
||||
|
||||
buf.text.remove(8, 12);
|
||||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 8);
|
||||
assert!(buf.char_count() == 8);
|
||||
assert!(buf.line_count() == 2);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("e") == iter.next());
|
||||
|
@ -924,14 +928,14 @@ mod tests {
|
|||
let mut buf = Buffer::new();
|
||||
|
||||
buf.insert_text("12\n34\n56\n78", 0);
|
||||
assert!(buf.grapheme_count() == 11);
|
||||
assert!(buf.char_count() == 11);
|
||||
assert!(buf.line_count() == 4);
|
||||
|
||||
buf.text.remove(4, 11);
|
||||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 4);
|
||||
assert!(buf.char_count() == 4);
|
||||
assert!(buf.line_count() == 2);
|
||||
assert!(Some("1") == iter.next());
|
||||
assert!(Some("2") == iter.next());
|
||||
|
@ -945,14 +949,14 @@ mod tests {
|
|||
let mut buf = Buffer::new();
|
||||
|
||||
buf.insert_text("1234567890", 0);
|
||||
assert!(buf.grapheme_count() == 10);
|
||||
assert!(buf.char_count() == 10);
|
||||
assert!(buf.line_count() == 1);
|
||||
|
||||
buf.text.remove(9, 10);
|
||||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 9);
|
||||
assert!(buf.char_count() == 9);
|
||||
assert!(buf.line_count() == 1);
|
||||
assert!(Some("1") == iter.next());
|
||||
assert!(Some("2") == iter.next());
|
||||
|
@ -976,7 +980,7 @@ mod tests {
|
|||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 29);
|
||||
assert!(buf.char_count() == 29);
|
||||
assert!(buf.line_count() == 6);
|
||||
assert!(Some("t") == iter.next());
|
||||
assert!(Some("h") == iter.next());
|
||||
|
@ -1020,7 +1024,7 @@ mod tests {
|
|||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 29);
|
||||
assert!(buf.char_count() == 29);
|
||||
assert!(buf.line_count() == 6);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("i") == iter.next());
|
||||
|
@ -1064,7 +1068,7 @@ mod tests {
|
|||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 29);
|
||||
assert!(buf.char_count() == 29);
|
||||
assert!(buf.line_count() == 6);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("i") == iter.next());
|
||||
|
@ -1108,7 +1112,7 @@ mod tests {
|
|||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 29);
|
||||
assert!(buf.char_count() == 29);
|
||||
assert!(buf.line_count() == 6);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("i") == iter.next());
|
||||
|
@ -1152,7 +1156,7 @@ mod tests {
|
|||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert!(buf.grapheme_count() == 29);
|
||||
assert!(buf.char_count() == 29);
|
||||
assert!(buf.line_count() == 6);
|
||||
assert!(Some("H") == iter.next());
|
||||
assert!(Some("i") == iter.next());
|
||||
|
@ -1191,14 +1195,14 @@ mod tests {
|
|||
let mut buf = Buffer::new();
|
||||
|
||||
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0);
|
||||
assert_eq!(buf.grapheme_count(), 29);
|
||||
assert_eq!(buf.char_count(), 29);
|
||||
assert_eq!(buf.line_count(), 6);
|
||||
|
||||
buf.remove_lines(0, 3);
|
||||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert_eq!(buf.grapheme_count(), 13);
|
||||
assert_eq!(buf.char_count(), 13);
|
||||
assert_eq!(buf.line_count(), 3);
|
||||
assert_eq!(Some("o"), iter.next());
|
||||
assert_eq!(Some("f"), iter.next());
|
||||
|
@ -1221,14 +1225,14 @@ mod tests {
|
|||
let mut buf = Buffer::new();
|
||||
|
||||
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0);
|
||||
assert_eq!(buf.grapheme_count(), 29);
|
||||
assert_eq!(buf.char_count(), 29);
|
||||
assert_eq!(buf.line_count(), 6);
|
||||
|
||||
buf.remove_lines(1, 4);
|
||||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert_eq!(buf.grapheme_count(), 13);
|
||||
assert_eq!(buf.char_count(), 13);
|
||||
assert_eq!(buf.line_count(), 3);
|
||||
assert_eq!(Some("H"), iter.next());
|
||||
assert_eq!(Some("i"), iter.next());
|
||||
|
@ -1251,7 +1255,7 @@ mod tests {
|
|||
let mut buf = Buffer::new();
|
||||
|
||||
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0);
|
||||
assert_eq!(buf.grapheme_count(), 29);
|
||||
assert_eq!(buf.char_count(), 29);
|
||||
assert_eq!(buf.line_count(), 6);
|
||||
|
||||
// "Hi\nthere\npeople\nof\nthe\nworld!"
|
||||
|
@ -1260,7 +1264,7 @@ mod tests {
|
|||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert_eq!(buf.grapheme_count(), 15);
|
||||
assert_eq!(buf.char_count(), 15);
|
||||
assert_eq!(buf.line_count(), 3);
|
||||
assert_eq!(Some("H"), iter.next());
|
||||
assert_eq!(Some("i"), iter.next());
|
||||
|
@ -1285,14 +1289,14 @@ mod tests {
|
|||
let mut buf = Buffer::new();
|
||||
|
||||
buf.insert_text("Hi\nthere\npeople\nof\nthe\n", 0);
|
||||
assert_eq!(buf.grapheme_count(), 23);
|
||||
assert_eq!(buf.char_count(), 23);
|
||||
assert_eq!(buf.line_count(), 6);
|
||||
|
||||
buf.remove_lines(3, 6);
|
||||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert_eq!(buf.grapheme_count(), 15);
|
||||
assert_eq!(buf.char_count(), 15);
|
||||
assert_eq!(buf.line_count(), 3);
|
||||
assert_eq!(Some("H"), iter.next());
|
||||
assert_eq!(Some("i"), iter.next());
|
||||
|
@ -1317,14 +1321,14 @@ mod tests {
|
|||
let mut buf = Buffer::new();
|
||||
|
||||
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0);
|
||||
assert_eq!(buf.grapheme_count(), 29);
|
||||
assert_eq!(buf.char_count(), 29);
|
||||
assert_eq!(buf.line_count(), 6);
|
||||
|
||||
buf.remove_lines(0, 6);
|
||||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert_eq!(buf.grapheme_count(), 0);
|
||||
assert_eq!(buf.char_count(), 0);
|
||||
assert_eq!(buf.line_count(), 1);
|
||||
assert_eq!(None, iter.next());
|
||||
}
|
||||
|
@ -1334,14 +1338,14 @@ mod tests {
|
|||
let mut buf = Buffer::new();
|
||||
|
||||
buf.insert_text("Hi\nthere\npeople\nof\nthe\n", 0);
|
||||
assert_eq!(buf.grapheme_count(), 23);
|
||||
assert_eq!(buf.char_count(), 23);
|
||||
assert_eq!(buf.line_count(), 6);
|
||||
|
||||
buf.remove_lines(0, 6);
|
||||
|
||||
let mut iter = buf.grapheme_iter();
|
||||
|
||||
assert_eq!(buf.grapheme_count(), 0);
|
||||
assert_eq!(buf.char_count(), 0);
|
||||
assert_eq!(buf.line_count(), 1);
|
||||
assert_eq!(None, iter.next());
|
||||
}
|
||||
|
|
|
@ -589,6 +589,10 @@ impl<T: LineFormatter> Editor<T> {
|
|||
);
|
||||
}
|
||||
|
||||
if !self.buffer.is_grapheme(temp_index) {
|
||||
temp_index = self.buffer.nth_prev_grapheme(temp_index, 1);
|
||||
}
|
||||
|
||||
c.range.0 = temp_index;
|
||||
c.range.1 = temp_index;
|
||||
}
|
||||
|
@ -618,6 +622,10 @@ impl<T: LineFormatter> Editor<T> {
|
|||
);
|
||||
}
|
||||
|
||||
if !self.buffer.is_grapheme(temp_index) {
|
||||
temp_index = self.buffer.nth_prev_grapheme(temp_index, 1);
|
||||
}
|
||||
|
||||
c.range.0 = temp_index;
|
||||
c.range.1 = temp_index;
|
||||
}
|
||||
|
|
|
@ -81,7 +81,7 @@ impl LineFormatter for ConsoleLineFormatter {
|
|||
return dim;
|
||||
}
|
||||
|
||||
fn index_to_v2d<'a, T>(&'a self, g_iter: T, index: usize) -> (usize, usize)
|
||||
fn index_to_v2d<'a, T>(&'a self, g_iter: T, char_idx: usize) -> (usize, usize)
|
||||
where
|
||||
T: Iterator<Item = &'a str>,
|
||||
{
|
||||
|
@ -89,12 +89,12 @@ impl LineFormatter for ConsoleLineFormatter {
|
|||
let mut i = 0;
|
||||
let mut last_width = 0;
|
||||
|
||||
for (_, _pos, width) in self.iter(g_iter) {
|
||||
for (g, _pos, width) in self.iter(g_iter) {
|
||||
pos = _pos;
|
||||
last_width = width;
|
||||
i += 1;
|
||||
i += g.chars().count();
|
||||
|
||||
if i > index {
|
||||
if i > char_idx {
|
||||
return pos;
|
||||
}
|
||||
}
|
||||
|
@ -112,17 +112,19 @@ impl LineFormatter for ConsoleLineFormatter {
|
|||
T: Iterator<Item = &'a str>,
|
||||
{
|
||||
// TODO: handle rounding modes
|
||||
let mut prev_i = 0;
|
||||
let mut i = 0;
|
||||
|
||||
for (_, pos, _) in self.iter(g_iter) {
|
||||
for (g, pos, _) in self.iter(g_iter) {
|
||||
if pos.0 > v2d.0 {
|
||||
i -= 1;
|
||||
i = prev_i;
|
||||
break;
|
||||
} else if pos.0 == v2d.0 && pos.1 >= v2d.1 {
|
||||
break;
|
||||
}
|
||||
|
||||
i += 1;
|
||||
prev_i = i;
|
||||
i += g.chars().count();
|
||||
}
|
||||
|
||||
return i;
|
||||
|
|
Loading…
Reference in New Issue
Block a user