Got cursor movement working with graphemes, and fixed unit tests.

This commit is contained in:
Nathan Vegdahl 2017-12-31 02:41:07 -08:00
parent f221b90a82
commit 76bd98e5ae
3 changed files with 202 additions and 188 deletions

View File

@ -69,6 +69,10 @@ impl Buffer {
self.text.len_chars() 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 { pub fn nth_next_grapheme(&self, char_idx: usize, n: usize) -> usize {
let mut char_idx = char_idx; let mut char_idx = char_idx;
for _ in 0..n { for _ in 0..n {
@ -389,7 +393,7 @@ mod tests {
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 9); assert!(buf.char_count() == 9);
assert!(buf.line_count() == 1); assert!(buf.line_count() == 1);
assert!(Some("H") == iter.next()); assert!(Some("H") == iter.next());
assert!(Some("e") == iter.next()); assert!(Some("e") == iter.next());
@ -411,7 +415,7 @@ mod tests {
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 11); assert!(buf.char_count() == 12);
assert!(buf.line_count() == 3); assert!(buf.line_count() == 3);
assert!(Some("H") == iter.next()); assert!(Some("H") == iter.next());
assert!(Some("e") == iter.next()); assert!(Some("e") == iter.next());
@ -436,26 +440,26 @@ mod tests {
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 17); assert_eq!(buf.char_count(), 18);
assert!(buf.line_count() == 3); assert_eq!(buf.line_count(), 3);
assert!(Some("A") == iter.next()); assert_eq!(Some("A"), iter.next());
assert!(Some("g") == iter.next()); assert_eq!(Some("g"), iter.next());
assert!(Some("a") == iter.next()); assert_eq!(Some("a"), iter.next());
assert!(Some("i") == iter.next()); assert_eq!(Some("i"), iter.next());
assert!(Some("n") == iter.next()); assert_eq!(Some("n"), iter.next());
assert!(Some(" ") == iter.next()); assert_eq!(Some(" "), iter.next());
assert!(Some("H") == iter.next()); assert_eq!(Some("H"), iter.next());
assert!(Some("e") == iter.next()); assert_eq!(Some("e"), iter.next());
assert!(Some("l") == iter.next()); assert_eq!(Some("l"), iter.next());
assert!(Some("l") == iter.next()); assert_eq!(Some("l"), iter.next());
assert!(Some("o") == iter.next()); assert_eq!(Some("o"), iter.next());
assert!(Some("\n") == iter.next()); assert_eq!(Some("\n"), iter.next());
assert!(Some(" ") == iter.next()); assert_eq!(Some(" "), iter.next());
assert!(Some("") == iter.next()); assert_eq!(Some(""), iter.next());
assert!(Some("") == iter.next()); assert_eq!(Some(""), iter.next());
assert!(Some("\r\n") == iter.next()); assert_eq!(Some("\r\n"), iter.next());
assert!(Some("!") == iter.next()); assert_eq!(Some("!"), iter.next());
assert!(None == iter.next()); assert_eq!(None, iter.next());
} }
#[test] #[test]
@ -467,26 +471,26 @@ mod tests {
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 17); assert_eq!(buf.char_count(), 18);
assert!(buf.line_count() == 3); assert_eq!(buf.line_count(), 3);
assert!(Some("H") == iter.next()); assert_eq!(Some("H"), iter.next());
assert!(Some("e") == iter.next()); assert_eq!(Some("e"), iter.next());
assert!(Some("l") == iter.next()); assert_eq!(Some("l"), iter.next());
assert!(Some("l") == iter.next()); assert_eq!(Some("l"), iter.next());
assert!(Some("o") == iter.next()); assert_eq!(Some("o"), iter.next());
assert!(Some(" ") == iter.next()); assert_eq!(Some(" "), iter.next());
assert!(Some("a") == iter.next()); assert_eq!(Some("a"), iter.next());
assert!(Some("g") == iter.next()); assert_eq!(Some("g"), iter.next());
assert!(Some("a") == iter.next()); assert_eq!(Some("a"), iter.next());
assert!(Some("i") == iter.next()); assert_eq!(Some("i"), iter.next());
assert!(Some("n") == iter.next()); assert_eq!(Some("n"), iter.next());
assert!(Some("\n") == iter.next()); assert_eq!(Some("\n"), iter.next());
assert!(Some(" ") == iter.next()); assert_eq!(Some(" "), iter.next());
assert!(Some("") == iter.next()); assert_eq!(Some(""), iter.next());
assert!(Some("") == iter.next()); assert_eq!(Some(""), iter.next());
assert!(Some("\r\n") == iter.next()); assert_eq!(Some("\r\n"), iter.next());
assert!(Some("!") == iter.next()); assert_eq!(Some("!"), iter.next());
assert!(None == iter.next()); assert_eq!(None, iter.next());
} }
#[test] #[test]
@ -498,25 +502,25 @@ mod tests {
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 16); assert_eq!(buf.char_count(), 17);
assert!(buf.line_count() == 3); assert_eq!(buf.line_count(), 3);
assert!(Some("H") == iter.next()); assert_eq!(Some("H"), iter.next());
assert!(Some("e") == iter.next()); assert_eq!(Some("e"), iter.next());
assert!(Some("l") == iter.next()); assert_eq!(Some("l"), iter.next());
assert!(Some("l") == iter.next()); assert_eq!(Some("l"), iter.next());
assert!(Some("o") == iter.next()); assert_eq!(Some("o"), iter.next());
assert!(Some("\n") == iter.next()); assert_eq!(Some("\n"), iter.next());
assert!(Some("a") == iter.next()); assert_eq!(Some("a"), iter.next());
assert!(Some("g") == iter.next()); assert_eq!(Some("g"), iter.next());
assert!(Some("a") == iter.next()); assert_eq!(Some("a"), iter.next());
assert!(Some("i") == iter.next()); assert_eq!(Some("i"), iter.next());
assert!(Some("n") == iter.next()); assert_eq!(Some("n"), iter.next());
assert!(Some(" ") == iter.next()); assert_eq!(Some(" "), iter.next());
assert!(Some("") == iter.next()); assert_eq!(Some(""), iter.next());
assert!(Some("") == iter.next()); assert_eq!(Some(""), iter.next());
assert!(Some("\r\n") == iter.next()); assert_eq!(Some("\r\n"), iter.next());
assert!(Some("!") == iter.next()); assert_eq!(Some("!"), iter.next());
assert!(None == iter.next()); assert_eq!(None, iter.next());
} }
#[test] #[test]
@ -524,29 +528,29 @@ mod tests {
let mut buf = Buffer::new(); let mut buf = Buffer::new();
buf.insert_text("Hello\n 世界\r\n!", 0); buf.insert_text("Hello\n 世界\r\n!", 0);
buf.insert_text("again", 11); buf.insert_text("again", 12);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 16); assert_eq!(buf.char_count(), 17);
assert!(buf.line_count() == 3); assert_eq!(buf.line_count(), 3);
assert!(Some("H") == iter.next()); assert_eq!(Some("H"), iter.next());
assert!(Some("e") == iter.next()); assert_eq!(Some("e"), iter.next());
assert!(Some("l") == iter.next()); assert_eq!(Some("l"), iter.next());
assert!(Some("l") == iter.next()); assert_eq!(Some("l"), iter.next());
assert!(Some("o") == iter.next()); assert_eq!(Some("o"), iter.next());
assert!(Some("\n") == iter.next()); assert_eq!(Some("\n"), iter.next());
assert!(Some(" ") == iter.next()); assert_eq!(Some(" "), iter.next());
assert!(Some("") == iter.next()); assert_eq!(Some(""), iter.next());
assert!(Some("") == iter.next()); assert_eq!(Some(""), iter.next());
assert!(Some("\r\n") == iter.next()); assert_eq!(Some("\r\n"), iter.next());
assert!(Some("!") == iter.next()); assert_eq!(Some("!"), iter.next());
assert!(Some("a") == iter.next()); assert_eq!(Some("a"), iter.next());
assert!(Some("g") == iter.next()); assert_eq!(Some("g"), iter.next());
assert!(Some("a") == iter.next()); assert_eq!(Some("a"), iter.next());
assert!(Some("i") == iter.next()); assert_eq!(Some("i"), iter.next());
assert!(Some("n") == iter.next()); assert_eq!(Some("n"), iter.next());
assert!(None == iter.next()); assert_eq!(None, iter.next());
} }
#[test] #[test]
@ -558,26 +562,26 @@ mod tests {
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 16); assert_eq!(buf.char_count(), 17);
assert!(buf.line_count() == 3); assert_eq!(buf.line_count(), 3);
assert!(Some("H") == iter.next()); assert_eq!(Some("H"), iter.next());
assert!(Some("e") == iter.next()); assert_eq!(Some("e"), iter.next());
assert!(Some("a") == iter.next()); assert_eq!(Some("a"), iter.next());
assert!(Some("g") == iter.next()); assert_eq!(Some("g"), iter.next());
assert!(Some("a") == iter.next()); assert_eq!(Some("a"), iter.next());
assert!(Some("i") == iter.next()); assert_eq!(Some("i"), iter.next());
assert!(Some("n") == iter.next()); assert_eq!(Some("n"), iter.next());
assert!(Some("l") == iter.next()); assert_eq!(Some("l"), iter.next());
assert!(Some("l") == iter.next()); assert_eq!(Some("l"), iter.next());
assert!(Some("o") == iter.next()); assert_eq!(Some("o"), iter.next());
assert!(Some("\n") == iter.next()); assert_eq!(Some("\n"), iter.next());
assert!(Some(" ") == iter.next()); assert_eq!(Some(" "), iter.next());
assert!(Some("") == iter.next()); assert_eq!(Some(""), iter.next());
assert!(Some("") == iter.next()); assert_eq!(Some(""), iter.next());
assert!(Some("\r\n") == iter.next()); assert_eq!(Some("\r\n"), iter.next());
assert!(Some("!") == iter.next()); assert_eq!(Some("!"), iter.next());
assert!(None == iter.next()); assert_eq!(None, iter.next());
} }
#[test] #[test]
@ -589,26 +593,26 @@ mod tests {
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 16); assert_eq!(buf.char_count(), 17);
assert!(buf.line_count() == 3); assert_eq!(buf.line_count(), 3);
assert!(Some("H") == iter.next()); assert_eq!(Some("H"), iter.next());
assert!(Some("e") == iter.next()); assert_eq!(Some("e"), iter.next());
assert!(Some("l") == iter.next()); assert_eq!(Some("l"), iter.next());
assert!(Some("l") == iter.next()); assert_eq!(Some("l"), iter.next());
assert!(Some("o") == iter.next()); assert_eq!(Some("o"), iter.next());
assert!(Some("\n") == iter.next()); assert_eq!(Some("\n"), iter.next());
assert!(Some(" ") == iter.next()); assert_eq!(Some(" "), iter.next());
assert!(Some("") == iter.next()); assert_eq!(Some(""), iter.next());
assert!(Some("a") == iter.next()); assert_eq!(Some("a"), iter.next());
assert!(Some("g") == iter.next()); assert_eq!(Some("g"), iter.next());
assert!(Some("a") == iter.next()); assert_eq!(Some("a"), iter.next());
assert!(Some("i") == iter.next()); assert_eq!(Some("i"), iter.next());
assert!(Some("n") == iter.next()); assert_eq!(Some("n"), iter.next());
assert!(Some("") == iter.next()); assert_eq!(Some(""), iter.next());
assert!(Some("\r\n") == iter.next()); assert_eq!(Some("\r\n"), iter.next());
assert!(Some("!") == iter.next()); assert_eq!(Some("!"), iter.next());
assert!(None == iter.next()); assert_eq!(None, iter.next());
} }
#[test] #[test]
@ -620,30 +624,30 @@ mod tests {
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 20); assert_eq!(buf.char_count(), 21);
assert!(buf.line_count() == 7); assert_eq!(buf.line_count(), 7);
assert!(Some("H") == iter.next()); assert_eq!(Some("H"), iter.next());
assert!(Some("e") == iter.next()); assert_eq!(Some("e"), iter.next());
assert!(Some("\n") == iter.next()); assert_eq!(Some("\n"), iter.next());
assert!(Some("a") == iter.next()); assert_eq!(Some("a"), iter.next());
assert!(Some("g") == iter.next()); assert_eq!(Some("g"), iter.next());
assert!(Some("\n") == iter.next()); assert_eq!(Some("\n"), iter.next());
assert!(Some("\n") == iter.next()); assert_eq!(Some("\n"), iter.next());
assert!(Some("a") == iter.next()); assert_eq!(Some("a"), iter.next());
assert!(Some("i") == iter.next()); assert_eq!(Some("i"), iter.next());
assert!(Some("n") == iter.next()); assert_eq!(Some("n"), iter.next());
assert!(Some("\n") == iter.next()); assert_eq!(Some("\n"), iter.next());
assert!(Some("l") == iter.next()); assert_eq!(Some("l"), iter.next());
assert!(Some("l") == iter.next()); assert_eq!(Some("l"), iter.next());
assert!(Some("o") == iter.next()); assert_eq!(Some("o"), iter.next());
assert!(Some("\n") == iter.next()); assert_eq!(Some("\n"), iter.next());
assert!(Some(" ") == iter.next()); assert_eq!(Some(" "), iter.next());
assert!(Some("") == iter.next()); assert_eq!(Some(""), iter.next());
assert!(Some("") == iter.next()); assert_eq!(Some(""), iter.next());
assert!(Some("\r\n") == iter.next()); assert_eq!(Some("\r\n"), iter.next());
assert!(Some("!") == iter.next()); assert_eq!(Some("!"), iter.next());
assert!(None == iter.next()); assert_eq!(None, iter.next());
} }
#[test] #[test]
@ -651,14 +655,14 @@ mod tests {
let mut buf = Buffer::new(); let mut buf = Buffer::new();
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); 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); assert!(buf.line_count() == 6);
buf.text.remove(0, 3); buf.text.remove(0, 3);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 26); assert!(buf.char_count() == 26);
assert!(buf.line_count() == 5); assert!(buf.line_count() == 5);
assert!(Some("t") == iter.next()); assert!(Some("t") == iter.next());
assert!(Some("h") == iter.next()); assert!(Some("h") == iter.next());
@ -694,14 +698,14 @@ mod tests {
let mut buf = Buffer::new(); let mut buf = Buffer::new();
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); 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); assert!(buf.line_count() == 6);
buf.text.remove(0, 12); buf.text.remove(0, 12);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 17); assert!(buf.char_count() == 17);
assert!(buf.line_count() == 4); assert!(buf.line_count() == 4);
assert!(Some("p") == iter.next()); assert!(Some("p") == iter.next());
assert!(Some("l") == iter.next()); assert!(Some("l") == iter.next());
@ -728,14 +732,14 @@ mod tests {
let mut buf = Buffer::new(); let mut buf = Buffer::new();
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); 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); assert!(buf.line_count() == 6);
buf.text.remove(5, 17); buf.text.remove(5, 17);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 17); assert!(buf.char_count() == 17);
assert!(buf.line_count() == 4); assert!(buf.line_count() == 4);
assert!(Some("H") == iter.next()); assert!(Some("H") == iter.next());
assert!(Some("i") == iter.next()); assert!(Some("i") == iter.next());
@ -762,14 +766,14 @@ mod tests {
let mut buf = Buffer::new(); let mut buf = Buffer::new();
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); 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); assert!(buf.line_count() == 6);
buf.text.remove(23, 29); buf.text.remove(23, 29);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 23); assert!(buf.char_count() == 23);
assert!(buf.line_count() == 6); assert!(buf.line_count() == 6);
assert!(Some("H") == iter.next()); assert!(Some("H") == iter.next());
assert!(Some("i") == iter.next()); assert!(Some("i") == iter.next());
@ -802,14 +806,14 @@ mod tests {
let mut buf = Buffer::new(); let mut buf = Buffer::new();
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); 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); assert!(buf.line_count() == 6);
buf.text.remove(17, 29); buf.text.remove(17, 29);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 17); assert!(buf.char_count() == 17);
assert!(buf.line_count() == 4); assert!(buf.line_count() == 4);
assert!(Some("H") == iter.next()); assert!(Some("H") == iter.next());
assert!(Some("i") == iter.next()); assert!(Some("i") == iter.next());
@ -836,14 +840,14 @@ mod tests {
let mut buf = Buffer::new(); let mut buf = Buffer::new();
buf.insert_text("Hello\nworld!", 0); buf.insert_text("Hello\nworld!", 0);
assert!(buf.grapheme_count() == 12); assert!(buf.char_count() == 12);
assert!(buf.line_count() == 2); assert!(buf.line_count() == 2);
buf.text.remove(3, 12); buf.text.remove(3, 12);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 3); assert!(buf.char_count() == 3);
assert!(buf.line_count() == 1); assert!(buf.line_count() == 1);
assert!(Some("H") == iter.next()); assert!(Some("H") == iter.next());
assert!(Some("e") == iter.next()); assert!(Some("e") == iter.next());
@ -856,14 +860,14 @@ mod tests {
let mut buf = Buffer::new(); let mut buf = Buffer::new();
buf.insert_text("Hi\nthere\nworld!", 0); buf.insert_text("Hi\nthere\nworld!", 0);
assert!(buf.grapheme_count() == 15); assert!(buf.char_count() == 15);
assert!(buf.line_count() == 3); assert!(buf.line_count() == 3);
buf.text.remove(5, 15); buf.text.remove(5, 15);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 5); assert!(buf.char_count() == 5);
assert!(buf.line_count() == 2); assert!(buf.line_count() == 2);
assert!(Some("H") == iter.next()); assert!(Some("H") == iter.next());
assert!(Some("i") == iter.next()); assert!(Some("i") == iter.next());
@ -878,14 +882,14 @@ mod tests {
let mut buf = Buffer::new(); let mut buf = Buffer::new();
buf.insert_text("Hello\nworld!", 0); buf.insert_text("Hello\nworld!", 0);
assert!(buf.grapheme_count() == 12); assert!(buf.char_count() == 12);
assert!(buf.line_count() == 2); assert!(buf.line_count() == 2);
buf.text.remove(3, 11); buf.text.remove(3, 11);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 4); assert!(buf.char_count() == 4);
assert!(buf.line_count() == 1); assert!(buf.line_count() == 1);
assert!(Some("H") == iter.next()); assert!(Some("H") == iter.next());
assert!(Some("e") == iter.next()); assert!(Some("e") == iter.next());
@ -899,14 +903,14 @@ mod tests {
let mut buf = Buffer::new(); let mut buf = Buffer::new();
buf.insert_text("Hello\nworld!", 0); buf.insert_text("Hello\nworld!", 0);
assert!(buf.grapheme_count() == 12); assert!(buf.char_count() == 12);
assert!(buf.line_count() == 2); assert!(buf.line_count() == 2);
buf.text.remove(8, 12); buf.text.remove(8, 12);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 8); assert!(buf.char_count() == 8);
assert!(buf.line_count() == 2); assert!(buf.line_count() == 2);
assert!(Some("H") == iter.next()); assert!(Some("H") == iter.next());
assert!(Some("e") == iter.next()); assert!(Some("e") == iter.next());
@ -924,14 +928,14 @@ mod tests {
let mut buf = Buffer::new(); let mut buf = Buffer::new();
buf.insert_text("12\n34\n56\n78", 0); buf.insert_text("12\n34\n56\n78", 0);
assert!(buf.grapheme_count() == 11); assert!(buf.char_count() == 11);
assert!(buf.line_count() == 4); assert!(buf.line_count() == 4);
buf.text.remove(4, 11); buf.text.remove(4, 11);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 4); assert!(buf.char_count() == 4);
assert!(buf.line_count() == 2); assert!(buf.line_count() == 2);
assert!(Some("1") == iter.next()); assert!(Some("1") == iter.next());
assert!(Some("2") == iter.next()); assert!(Some("2") == iter.next());
@ -945,14 +949,14 @@ mod tests {
let mut buf = Buffer::new(); let mut buf = Buffer::new();
buf.insert_text("1234567890", 0); buf.insert_text("1234567890", 0);
assert!(buf.grapheme_count() == 10); assert!(buf.char_count() == 10);
assert!(buf.line_count() == 1); assert!(buf.line_count() == 1);
buf.text.remove(9, 10); buf.text.remove(9, 10);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 9); assert!(buf.char_count() == 9);
assert!(buf.line_count() == 1); assert!(buf.line_count() == 1);
assert!(Some("1") == iter.next()); assert!(Some("1") == iter.next());
assert!(Some("2") == iter.next()); assert!(Some("2") == iter.next());
@ -976,7 +980,7 @@ mod tests {
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 29); assert!(buf.char_count() == 29);
assert!(buf.line_count() == 6); assert!(buf.line_count() == 6);
assert!(Some("t") == iter.next()); assert!(Some("t") == iter.next());
assert!(Some("h") == iter.next()); assert!(Some("h") == iter.next());
@ -1020,7 +1024,7 @@ mod tests {
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 29); assert!(buf.char_count() == 29);
assert!(buf.line_count() == 6); assert!(buf.line_count() == 6);
assert!(Some("H") == iter.next()); assert!(Some("H") == iter.next());
assert!(Some("i") == iter.next()); assert!(Some("i") == iter.next());
@ -1064,7 +1068,7 @@ mod tests {
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 29); assert!(buf.char_count() == 29);
assert!(buf.line_count() == 6); assert!(buf.line_count() == 6);
assert!(Some("H") == iter.next()); assert!(Some("H") == iter.next());
assert!(Some("i") == iter.next()); assert!(Some("i") == iter.next());
@ -1108,7 +1112,7 @@ mod tests {
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 29); assert!(buf.char_count() == 29);
assert!(buf.line_count() == 6); assert!(buf.line_count() == 6);
assert!(Some("H") == iter.next()); assert!(Some("H") == iter.next());
assert!(Some("i") == iter.next()); assert!(Some("i") == iter.next());
@ -1152,7 +1156,7 @@ mod tests {
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
assert!(buf.grapheme_count() == 29); assert!(buf.char_count() == 29);
assert!(buf.line_count() == 6); assert!(buf.line_count() == 6);
assert!(Some("H") == iter.next()); assert!(Some("H") == iter.next());
assert!(Some("i") == iter.next()); assert!(Some("i") == iter.next());
@ -1191,14 +1195,14 @@ mod tests {
let mut buf = Buffer::new(); let mut buf = Buffer::new();
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); 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); assert_eq!(buf.line_count(), 6);
buf.remove_lines(0, 3); buf.remove_lines(0, 3);
let mut iter = buf.grapheme_iter(); 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!(buf.line_count(), 3);
assert_eq!(Some("o"), iter.next()); assert_eq!(Some("o"), iter.next());
assert_eq!(Some("f"), iter.next()); assert_eq!(Some("f"), iter.next());
@ -1221,14 +1225,14 @@ mod tests {
let mut buf = Buffer::new(); let mut buf = Buffer::new();
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); 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); assert_eq!(buf.line_count(), 6);
buf.remove_lines(1, 4); buf.remove_lines(1, 4);
let mut iter = buf.grapheme_iter(); 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!(buf.line_count(), 3);
assert_eq!(Some("H"), iter.next()); assert_eq!(Some("H"), iter.next());
assert_eq!(Some("i"), iter.next()); assert_eq!(Some("i"), iter.next());
@ -1251,7 +1255,7 @@ mod tests {
let mut buf = Buffer::new(); let mut buf = Buffer::new();
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); 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); assert_eq!(buf.line_count(), 6);
// "Hi\nthere\npeople\nof\nthe\nworld!" // "Hi\nthere\npeople\nof\nthe\nworld!"
@ -1260,7 +1264,7 @@ mod tests {
let mut iter = buf.grapheme_iter(); 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!(buf.line_count(), 3);
assert_eq!(Some("H"), iter.next()); assert_eq!(Some("H"), iter.next());
assert_eq!(Some("i"), iter.next()); assert_eq!(Some("i"), iter.next());
@ -1285,14 +1289,14 @@ mod tests {
let mut buf = Buffer::new(); let mut buf = Buffer::new();
buf.insert_text("Hi\nthere\npeople\nof\nthe\n", 0); 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); assert_eq!(buf.line_count(), 6);
buf.remove_lines(3, 6); buf.remove_lines(3, 6);
let mut iter = buf.grapheme_iter(); 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!(buf.line_count(), 3);
assert_eq!(Some("H"), iter.next()); assert_eq!(Some("H"), iter.next());
assert_eq!(Some("i"), iter.next()); assert_eq!(Some("i"), iter.next());
@ -1317,14 +1321,14 @@ mod tests {
let mut buf = Buffer::new(); let mut buf = Buffer::new();
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); 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); assert_eq!(buf.line_count(), 6);
buf.remove_lines(0, 6); buf.remove_lines(0, 6);
let mut iter = buf.grapheme_iter(); 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!(buf.line_count(), 1);
assert_eq!(None, iter.next()); assert_eq!(None, iter.next());
} }
@ -1334,14 +1338,14 @@ mod tests {
let mut buf = Buffer::new(); let mut buf = Buffer::new();
buf.insert_text("Hi\nthere\npeople\nof\nthe\n", 0); 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); assert_eq!(buf.line_count(), 6);
buf.remove_lines(0, 6); buf.remove_lines(0, 6);
let mut iter = buf.grapheme_iter(); 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!(buf.line_count(), 1);
assert_eq!(None, iter.next()); assert_eq!(None, iter.next());
} }

View File

@ -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.0 = temp_index;
c.range.1 = 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.0 = temp_index;
c.range.1 = temp_index; c.range.1 = temp_index;
} }

View File

@ -81,7 +81,7 @@ impl LineFormatter for ConsoleLineFormatter {
return dim; 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 where
T: Iterator<Item = &'a str>, T: Iterator<Item = &'a str>,
{ {
@ -89,12 +89,12 @@ impl LineFormatter for ConsoleLineFormatter {
let mut i = 0; let mut i = 0;
let mut last_width = 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; pos = _pos;
last_width = width; last_width = width;
i += 1; i += g.chars().count();
if i > index { if i > char_idx {
return pos; return pos;
} }
} }
@ -112,17 +112,19 @@ impl LineFormatter for ConsoleLineFormatter {
T: Iterator<Item = &'a str>, T: Iterator<Item = &'a str>,
{ {
// TODO: handle rounding modes // TODO: handle rounding modes
let mut prev_i = 0;
let mut 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 { if pos.0 > v2d.0 {
i -= 1; i = prev_i;
break; break;
} else if pos.0 == v2d.0 && pos.1 >= v2d.1 { } else if pos.0 == v2d.0 && pos.1 >= v2d.1 {
break; break;
} }
i += 1; prev_i = i;
i += g.chars().count();
} }
return i; return i;