diff options
author | rabite <rabite@posteo.de> | 2020-01-28 01:29:58 +0100 |
---|---|---|
committer | rabite <rabite@posteo.de> | 2020-01-28 01:29:58 +0100 |
commit | 049b1d1c7425f2ae1b08e97c8abae58d24715a7f (patch) | |
tree | a100b12b8bf247abfcafe23c623ed2cfd09a241a | |
parent | 025a40044c5336b4dda5c0df126bc5cd009140f3 (diff) |
fix sized_string chopping string at wrong boundaries
-rw-r--r-- | src/term.rs | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/src/term.rs b/src/term.rs index b35dc37..1dd4a7b 100644 --- a/src/term.rs +++ b/src/term.rs @@ -221,24 +221,25 @@ pub fn cell_ratio() -> HResult<f32> { } pub fn sized_string(string: &str, xsize: u16) -> &str { - let len = string.char_indices() - .map(|(i, ch)| { + let len = string.chars() + .map(|ch| { if ch.is_ascii() { - (i, 1) + (1, 1) } else { - (i, UnicodeWidthChar::width(ch).unwrap_or(0)) + (UnicodeWidthChar::width(ch).unwrap_or(0), ch.len_utf8()) } }) - .scan(0, |slen, (i, chlen)| { - *slen += chlen; - Some((i, *slen)) + .scan((0,0), |(str_width, str_len), (ch_width, ch_len)| { + *str_width += ch_width; + *str_len += ch_len; + Some((*str_width, *str_len)) }) - .take_while(|(_, slen)| slen < &(xsize as usize)) - .map(|(i,_)| i) + .take_while(|(str_width, _)| *str_width < xsize as usize) + .map(|(_, str_len)| str_len) .last() .unwrap_or(0); - &string[0..len+1] + &string[0..len] } #[derive(Debug)] |