From 384cbe093909710ba11728a4f49dae6ce8da7278 Mon Sep 17 00:00:00 2001 From: chris west Date: Thu, 14 May 2020 15:10:20 -0700 Subject: [PATCH] only run through lines that have colors --- src/menu.rs | 47 +++++++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/src/menu.rs b/src/menu.rs index 7b897a8..9f5bcc6 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -917,29 +917,36 @@ pub fn parse_line(start: usize, raw: &str) -> Option { }; let typ = Type::from(line.chars().nth(0)?)?; - // calculate the visible length of this line as well as where to - // truncate it when abiding by `MAX_COLS` - let mut is_color = false; - let mut truncated_len = 0; - let mut visible_len = 0; - let mut iter = raw[start..text_end].char_indices().peekable(); - - while let Some((i, c)) = iter.next() { - if is_color { - if c == 'm' { - is_color = false; - } - } else { - if c == '\x1b' { - if let Some((_, '[')) = iter.peek() { - iter.next(); // skip [ - is_color = true; + let mut truncated_len = text_end; + let mut visible_len = text_end - start; + + // if this line contains colors, calculate the visible length and + // where to truncate when abidibg by `MAX_COLS` + if *&raw[start..text_end].contains("\x1b[") { + let mut is_color = false; + let mut iter = raw[start..text_end].char_indices().peekable(); + visible_len = 0; + + while let Some((i, c)) = iter.next() { + if is_color { + if c == 'm' { + is_color = false; } } else { - if visible_len < MAX_COLS { - truncated_len = i; + if c == '\x1b' { + if let Some((_, '[')) = iter.peek() { + iter.next(); // skip [ + is_color = true; + } + } else { + if visible_len < MAX_COLS { + truncated_len = i; + visible_len += 1; + } else { + visible_len = MAX_COLS + 1; + break; + } } - visible_len += 1; } } }