8000 Merge branch 'master' into prev_boundary · unicode-rs/unicode-segmentation@832d958 · GitHub
[go: up one dir, main page]

Skip to content

Commit 832d958

Browse files
committed
Merge branch 'master' into prev_boundary
2 parents fb5d7b6 + c3db7a7 commit 832d958

File tree

1 file changed

+23
-1
lines changed

1 file changed

+23
-1
lines changed

src/grapheme.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,10 @@ impl GraphemeCursor {
360360
match self.state {
361361
GraphemeState::Regional => self.handle_regional(chunk, chunk_start),
362362
GraphemeState::Emoji => self.handle_emoji(chunk, chunk_start),
363-
_ => panic!("invalid state")
363+
_ => if self.cat_before.is_none() && self.offset == chunk.len() + chunk_start {
364+
let ch = chunk.chars().rev().next().unwrap();
365+
self.cat_before = Some(gr::grapheme_category(ch));
366+
},
364367
}
365368
}
366369

@@ -406,6 +409,7 @@ impl GraphemeCursor {
406409
return;
407410
}
408411
self.pre_context_offset = Some(chunk_start);
412+
self.state = GraphemeState::Regional;
409413
}
410414

411415
fn handle_emoji(&mut self, chunk: &str, chunk_start: usize) {
@@ -428,6 +432,7 @@ impl GraphemeCursor {
428432
return;
429433
}
430434
self.pre_context_offset = Some(chunk_start);
435+
self.state = GraphemeState::Emoji;
431436
}
432437

433438
/// Determine whether the current cursor location is a grapheme cluster boundary.
@@ -664,6 +669,23 @@ impl GraphemeCursor {
664669
}
665670
}
666671

672+
fn test_grapheme_cursor_ris_precontext() {
673+
let s = "\u{1f1fa}\u{1f1f8}\u{1f1fa}\u{1f1f8}\u{1f1fa}\u{1f1f8}";
674+
let mut c = GraphemeCursor::new(8, s.len(), true);
675+
assert_eq!(c.is_boundary(&s[4..], 4), Err(GraphemeIncomplete::PreContext(4)));
676+
c.provide_context(&s[..4], 0);
677+
assert_eq!(c.is_boundary(&s[4..], 4), Ok(true));
678+
}
679+
680+
#[test]
681+
fn test_grapheme_cursor_chunk_start_require_precontext() {
682+
let s = "\r\n";
683+
let mut c = GraphemeCursor::new(1, s.len(), true);
684+
assert_eq!(c.is_boundary(&s[1..], 1), Err(GraphemeIncomplete::PreContext(1)));
685+
c.provide_context(&s[..1], 0);
686+
assert_eq!(c.is_boundary(&s[1..], 1), Ok(false));
687+
}
688+
667689
#[test]
668690
fn test_grapheme_cursor_prev_boundary() {
669691
let s = "abcd";

0 commit comments

Comments
 (0)
0