use super::core::display_width; #[derive(Debug)] pub(crate) struct LineWrapper { line_width: usize, hard_width: usize, } impl LineWrapper { pub(crate) fn new(hard_width: usize) -> Self { Self { line_width: 0, hard_width, } } pub(crate) fn reset(&mut self) { self.line_width = 0; } pub(crate) fn wrap<'w>(&mut self, mut words: Vec<&'w str>) -> Vec<&'w str> { let mut i = 0; while i < words.len() { let word = &words[i]; let trimmed = word.trim_end(); let word_width = display_width(trimmed); let trimmed_delta = word.len() - trimmed.len(); if i != 0 && self.hard_width < self.line_width + word_width { if 0 < i { let last = i - 1; let trimmed = words[last].trim_end(); words[last] = trimmed; } words.insert(i, "\n"); i += 1; self.reset(); } self.line_width += word_width + trimmed_delta; i += 1; } words } }