try to wrap on - , . : ; or space

pull/21/head
chris west 4 years ago
parent bfdd01e22a
commit ba7d527165

@ -254,6 +254,9 @@ impl Text {
}
}
/// Splits a chunk of text into a vector of strings with at most
/// `wrap` characters each. Tries to be smart and wrap at punctuation,
/// otherwise just wraps at `wrap`.
fn wrap_text(lines: &str, wrap: usize) -> Vec<&str> {
if wrap == 0 {
return lines.split('\n').collect();
@ -265,6 +268,24 @@ fn wrap_text(lines: &str, wrap: usize) -> Vec<&str> {
if len > wrap {
while len > wrap {
let (end, _) = line.char_indices().take(wrap + 1).last().unwrap();
if !matches!(&line[end - 1..end], " " | "-" | "," | "." | ":") {
if let Some(&(end, _)) = line
.char_indices()
.take(wrap + 1)
.collect::<Vec<_>>()
.iter()
.rev()
.skip(1)
.find(|(_, c)| matches!(c, ' ' | '-' | ',' | '.' | ':'))
{
out.push(&line[..=end]);
line = &line[end + 1..];
len -= end;
continue;
}
}
out.push(&line[..end]);
line = &line[end..];
len -= wrap;
@ -321,7 +342,11 @@ another regular line
lines[1].trim()
);
assert_eq!("long line", lines[2].trim());
assert_eq!("very very long line", lines[4].trim());
assert_eq!(
"super duper extra scooper hoopa loopa double doopa maxi paxi giga",
lines[3].trim()
);
assert_eq!("baxi very very long line", lines[4].trim());
assert_eq!(
"Qua nova re oblata omnis administratio belliconsistit militesque",

Loading…
Cancel
Save