Got it fully working again except for graphemes.

This commit is contained in:
Nathan Vegdahl 2017-12-31 00:39:02 -08:00
parent 47ed45aae6
commit 2da187ff5d

View File

@ -181,8 +181,22 @@ impl Buffer {
} }
// All other cases // All other cases
else { else {
let a = self.text.line_to_char(line_a); let a = if line_a == 0 {
let b = self.text.line_to_char(line_b); 0
} else if line_a == self.text.len_lines() {
self.text.len_chars()
} else {
self.text.line_to_char(line_a) - 1
};
let b = if line_b == 0 {
0
} else if line_b == self.text.len_lines() {
self.text.len_chars()
} else if line_a == 0 {
self.text.line_to_char(line_b)
} else {
self.text.line_to_char(line_b) - 1
};
self.text.remove(a, b); self.text.remove(a, b);
} }
@ -279,7 +293,7 @@ impl Buffer {
let line = self.text.len_lines() - 1; let line = self.text.len_lines() - 1;
let line_pos = self.text.line_to_char(line); let line_pos = self.text.line_to_char(line);
return (line, pos - line_pos); return (line, self.text.len_chars() - line_pos);
} }
} }
@ -292,8 +306,11 @@ impl Buffer {
/// valid position. /// valid position.
pub fn line_col_to_index(&self, pos: (usize, usize)) -> usize { pub fn line_col_to_index(&self, pos: (usize, usize)) -> usize {
if pos.0 < self.text.len_lines() { if pos.0 < self.text.len_lines() {
let l_begin_pos = self.text.line_to_char(pos.0); let l_start = self.text.line_to_char(pos.0);
return (l_begin_pos + pos.1).min(self.text.len_chars()); let l_end = self.text.line_to_char(pos.0 + 1);
return (l_start + pos.1)
.min(l_start.max(l_end - 1))
.min(self.text.len_chars());
} else { } else {
return self.text.len_chars(); return self.text.len_chars();
} }
@ -630,7 +647,7 @@ mod tests {
assert!(buf.grapheme_count() == 29); assert!(buf.grapheme_count() == 29);
assert!(buf.line_count() == 6); assert!(buf.line_count() == 6);
buf._remove_text(0, 3); buf.text.remove(0, 3);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
@ -673,7 +690,7 @@ mod tests {
assert!(buf.grapheme_count() == 29); assert!(buf.grapheme_count() == 29);
assert!(buf.line_count() == 6); assert!(buf.line_count() == 6);
buf._remove_text(0, 12); buf.text.remove(0, 12);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
@ -707,7 +724,7 @@ mod tests {
assert!(buf.grapheme_count() == 29); assert!(buf.grapheme_count() == 29);
assert!(buf.line_count() == 6); assert!(buf.line_count() == 6);
buf._remove_text(5, 17); buf.text.remove(5, 17);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
@ -741,7 +758,7 @@ mod tests {
assert!(buf.grapheme_count() == 29); assert!(buf.grapheme_count() == 29);
assert!(buf.line_count() == 6); assert!(buf.line_count() == 6);
buf._remove_text(23, 29); buf.text.remove(23, 29);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
@ -781,7 +798,7 @@ mod tests {
assert!(buf.grapheme_count() == 29); assert!(buf.grapheme_count() == 29);
assert!(buf.line_count() == 6); assert!(buf.line_count() == 6);
buf._remove_text(17, 29); buf.text.remove(17, 29);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
@ -815,7 +832,7 @@ mod tests {
assert!(buf.grapheme_count() == 12); assert!(buf.grapheme_count() == 12);
assert!(buf.line_count() == 2); assert!(buf.line_count() == 2);
buf._remove_text(3, 12); buf.text.remove(3, 12);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
@ -835,7 +852,7 @@ mod tests {
assert!(buf.grapheme_count() == 15); assert!(buf.grapheme_count() == 15);
assert!(buf.line_count() == 3); assert!(buf.line_count() == 3);
buf._remove_text(5, 15); buf.text.remove(5, 15);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
@ -857,7 +874,7 @@ mod tests {
assert!(buf.grapheme_count() == 12); assert!(buf.grapheme_count() == 12);
assert!(buf.line_count() == 2); assert!(buf.line_count() == 2);
buf._remove_text(3, 11); buf.text.remove(3, 11);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
@ -878,7 +895,7 @@ mod tests {
assert!(buf.grapheme_count() == 12); assert!(buf.grapheme_count() == 12);
assert!(buf.line_count() == 2); assert!(buf.line_count() == 2);
buf._remove_text(8, 12); buf.text.remove(8, 12);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
@ -903,7 +920,7 @@ mod tests {
assert!(buf.grapheme_count() == 11); assert!(buf.grapheme_count() == 11);
assert!(buf.line_count() == 4); assert!(buf.line_count() == 4);
buf._remove_text(4, 11); buf.text.remove(4, 11);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
@ -924,7 +941,7 @@ mod tests {
assert!(buf.grapheme_count() == 10); assert!(buf.grapheme_count() == 10);
assert!(buf.line_count() == 1); assert!(buf.line_count() == 1);
buf._remove_text(9, 10); buf.text.remove(9, 10);
let mut iter = buf.grapheme_iter(); let mut iter = buf.grapheme_iter();
@ -1167,29 +1184,29 @@ 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_eq!(buf.grapheme_count(), 29);
assert!(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!(buf.grapheme_count() == 13); assert_eq!(buf.grapheme_count(), 13);
assert!(buf.line_count() == 3); assert_eq!(buf.line_count(), 3);
assert!(Some("o") == iter.next()); assert_eq!(Some("o"), iter.next());
assert!(Some("f") == iter.next()); assert_eq!(Some("f"), iter.next());
assert!(Some("\n") == iter.next()); assert_eq!(Some("\n"), iter.next());
assert!(Some("t") == iter.next()); assert_eq!(Some("t"), 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("\n") == iter.next()); assert_eq!(Some("\n"), iter.next());
assert!(Some("w") == iter.next()); assert_eq!(Some("w"), iter.next());
assert!(Some("o") == iter.next()); assert_eq!(Some("o"), iter.next());
assert!(Some("r") == iter.next()); assert_eq!(Some("r"), iter.next());
assert!(Some("l") == iter.next()); assert_eq!(Some("l"), iter.next());
assert!(Some("d") == iter.next()); assert_eq!(Some("d"), iter.next());
assert!(Some("!") == iter.next()); assert_eq!(Some("!"), iter.next());
assert!(None == iter.next()); assert_eq!(None, iter.next());
} }
#[test] #[test]
@ -1197,29 +1214,29 @@ 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_eq!(buf.grapheme_count(), 29);
assert!(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!(buf.grapheme_count() == 13); assert_eq!(buf.grapheme_count(), 13);
assert!(buf.line_count() == 3); assert_eq!(buf.line_count(), 3);
assert!(Some("H") == iter.next()); assert_eq!(Some("H"), 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("t") == iter.next()); assert_eq!(Some("t"), 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("\n") == iter.next()); assert_eq!(Some("\n"), iter.next());
assert!(Some("w") == iter.next()); assert_eq!(Some("w"), iter.next());
assert!(Some("o") == iter.next()); assert_eq!(Some("o"), iter.next());
assert!(Some("r") == iter.next()); assert_eq!(Some("r"), iter.next());
assert!(Some("l") == iter.next()); assert_eq!(Some("l"), iter.next());
assert!(Some("d") == iter.next()); assert_eq!(Some("d"), iter.next());
assert!(Some("!") == iter.next()); assert_eq!(Some("!"), iter.next());
assert!(None == iter.next()); assert_eq!(None, iter.next());
} }
#[test] #[test]
@ -1230,28 +1247,30 @@ mod tests {
assert_eq!(buf.grapheme_count(), 29); assert_eq!(buf.grapheme_count(), 29);
assert_eq!(buf.line_count(), 6); assert_eq!(buf.line_count(), 6);
// "Hi\nthere\npeople\nof\nthe\nworld!"
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.grapheme_count(), 15);
assert_eq!(buf.line_count(), 3); assert_eq!(buf.line_count(), 3);
assert!(Some("H") == iter.next()); assert_eq!(Some("H"), 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("t") == iter.next()); assert_eq!(Some("t"), 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("r") == iter.next()); assert_eq!(Some("r"), 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("p") == iter.next()); assert_eq!(Some("p"), iter.next());
assert!(Some("e") == iter.next()); assert_eq!(Some("e"), iter.next());
assert!(Some("o") == iter.next()); assert_eq!(Some("o"), iter.next());
assert!(Some("p") == iter.next()); assert_eq!(Some("p"), iter.next());
assert!(Some("l") == iter.next()); assert_eq!(Some("l"), iter.next());
assert!(Some("e") == iter.next()); assert_eq!(Some("e"), iter.next());
assert!(None == iter.next()); assert_eq!(None, iter.next());
} }
#[test] #[test]
@ -1268,22 +1287,22 @@ mod tests {
assert_eq!(buf.grapheme_count(), 15); assert_eq!(buf.grapheme_count(), 15);
assert_eq!(buf.line_count(), 3); assert_eq!(buf.line_count(), 3);
assert!(Some("H") == iter.next()); assert_eq!(Some("H"), 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("t") == iter.next()); assert_eq!(Some("t"), 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("r") == iter.next()); assert_eq!(Some("r"), 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("p") == iter.next()); assert_eq!(Some("p"), iter.next());
assert!(Some("e") == iter.next()); assert_eq!(Some("e"), iter.next());
assert!(Some("o") == iter.next()); assert_eq!(Some("o"), iter.next());
assert!(Some("p") == iter.next()); assert_eq!(Some("p"), iter.next());
assert!(Some("l") == iter.next()); assert_eq!(Some("l"), iter.next());
assert!(Some("e") == iter.next()); assert_eq!(Some("e"), iter.next());
assert!(None == iter.next()); assert_eq!(None, iter.next());
} }
#[test] #[test]
@ -1300,7 +1319,7 @@ mod tests {
assert_eq!(buf.grapheme_count(), 0); assert_eq!(buf.grapheme_count(), 0);
assert_eq!(buf.line_count(), 1); assert_eq!(buf.line_count(), 1);
assert!(None == iter.next()); assert_eq!(None, iter.next());
} }
#[test] #[test]
@ -1317,7 +1336,7 @@ mod tests {
assert_eq!(buf.grapheme_count(), 0); assert_eq!(buf.grapheme_count(), 0);
assert_eq!(buf.line_count(), 1); assert_eq!(buf.line_count(), 1);
assert!(None == iter.next()); assert_eq!(None, iter.next());
} }
#[test] #[test]
@ -1337,7 +1356,7 @@ mod tests {
let pos = buf.line_col_to_index((2, 10)); let pos = buf.line_col_to_index((2, 10));
assert!(pos == 15); assert_eq!(pos, 15);
} }
#[test] #[test]
@ -1384,7 +1403,7 @@ mod tests {
let pos = buf.index_to_line_col(50); let pos = buf.index_to_line_col(50);
assert!(pos == (5, 6)); assert_eq!(pos, (5, 6));
} }
#[test] #[test]