diff options
| -rw-r--r-- | Cargo.lock | 7 | ||||
| -rw-r--r-- | Cargo.toml | 2 | ||||
| -rw-r--r-- | src/util/formatting/truncate.rs | 21 |
3 files changed, 20 insertions, 10 deletions
@@ -228,6 +228,7 @@ dependencies = [ "tracing", "tracing-futures", "tracing-subscriber", + "unicode-segmentation", "urlparse", ] @@ -2132,6 +2133,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] name = "untrusted" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -54,6 +54,8 @@ async-trait = "0.1" bitflags = "2" +unicode-segmentation = "1" + [dev-dependencies] mockito = "1" diff --git a/src/util/formatting/truncate.rs b/src/util/formatting/truncate.rs index 80caa23..9528492 100644 --- a/src/util/formatting/truncate.rs +++ b/src/util/formatting/truncate.rs @@ -1,3 +1,5 @@ +use unicode_segmentation::UnicodeSegmentation; + /// Truncates a string after a certain number of characters. /// /// Function always tries to truncate on a word boundary. @@ -6,15 +8,7 @@ pub fn truncate(text: &str, len: usize) -> String { if text.len() <= len { return text.to_string(); } - format!( - "{}…", - text[..len] - .rsplitn(2, " ") - .collect::<Vec<&str>>() - .last() - .copied() - .expect("This can never happen >inb4 it happens") - ) + format!("{}…", text.graphemes(true).take(len).collect::<String>()) } #[cfg(test)] @@ -39,7 +33,7 @@ mod tests { fn test_truncate_with_input_of_greater_length_than_limit() { let input = "some longer text"; let result = truncate(input, input.len() - 1); - assert_eq!("some longer…", result) + assert_eq!("some longer tex…", result) } #[test] @@ -48,4 +42,11 @@ mod tests { let result = truncate(input, input.len() - 1); assert_eq!("somelongertex…", result) } + + #[test] + fn test_truncate_with_unicode() { + let input = "short ° text"; + let result = truncate(input, 7); + assert_eq!(result, "short °…") + } } |
