summaryrefslogtreecommitdiffstats
path: root/src/term.rs
diff options
context:
space:
mode:
authorrabite <rabite@posteo.de>2019-03-20 13:58:59 +0100
committerrabite <rabite@posteo.de>2019-03-20 13:58:59 +0100
commit9a711bbe96d753d0dbf70007adc0ff89823aa9ad (patch)
treef8c0fc8cf12967a5c1a5409b37f6800a050a5c27 /src/term.rs
parentc2297ab4945d010d4106d35a34ec83314891c34f (diff)
handle long lines in status/footer
Diffstat (limited to 'src/term.rs')
-rw-r--r--src/term.rs19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/term.rs b/src/term.rs
index abedbba..81c1feb 100644
--- a/src/term.rs
+++ b/src/term.rs
@@ -163,9 +163,13 @@ fn is_ansi(ansi_pos: &Vec<(usize, usize)>, char_pos: &usize) -> bool {
fn ansi_len_at(ansi_pos: &Vec<(usize, usize)>, char_pos: &usize) -> usize {
ansi_pos.iter().fold(0, |len, (start, end)| {
- if char_pos >= end {
- len + (end-start)
- } else { len }
+ if char_pos >= start && char_pos <= end {
+ len + (char_pos - start)
+ } else if char_pos >= end {
+ len + (end - start)
+ } else {
+ len
+ }
})
}
@@ -174,18 +178,19 @@ pub fn sized_string_u(string: &str, xsize: usize) -> String {
(m.start(), m.end())
}).collect();
- let sized = string.chars().enumerate().fold("".to_string(), |acc, (i, ch)| {
+ let sized = string.chars().fold(String::new(), |acc, ch| {
let width: usize = unicode_width::UnicodeWidthStr::width_cjk(acc.as_str());
- let ansi_len = ansi_len_at(&ansi_pos, &i);
+ let ansi_len = ansi_len_at(&ansi_pos, &acc.len());
+ let unprinted = acc.len() - width;
- if width >= xsize as usize + ansi_len {
+ if width + unprinted >= xsize + ansi_len + 1{
acc
} else {
acc + &ch.to_string()
}
});
- let ansi_len = ansi_len_at(&ansi_pos, &(sized.len().saturating_sub(1)));
+ let ansi_len = ansi_len_at(&ansi_pos, &sized.len());
let padded = format!("{:padding$}", sized, padding=xsize + ansi_len + 1);
padded
}