From 161ddd7ea195f2a63be8bfa06efe46158ed336d2 Mon Sep 17 00:00:00 2001 From: sharkdp Date: Tue, 8 Oct 2019 19:53:26 +0200 Subject: [PATCH] Only print to buffer if line is not squeezed --- src/lib.rs | 108 +++++++++++++++++++++++++----------------------- src/squeezer.rs | 32 ++++++++++++-- 2 files changed, 85 insertions(+), 55 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index c97ae5c..a4dcc7f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -309,62 +309,66 @@ impl<'a, Writer: Write> Printer<'a, Writer> { return Ok(()); } - if len < 8 { - let _ = write!( - &mut self.buffer_line, - "{0:1$}{3}{0:2$}{4}", - "", - 3 * (8 - len), - 1 + 3 * 8, - self.border_style.inner_sep(), - self.border_style.outer_sep(), - ); - } else { - let _ = write!( - &mut self.buffer_line, - "{0:1$}{2}", - "", - 3 * (16 - len), - self.border_style.outer_sep() - ); - } + let squeeze_action = self.squeezer.action(); - let mut idx = 1; - for &b in self.raw_line.iter() { - let _ = write!( - &mut self.buffer_line, - "{}", - self.byte_char_table[b as usize] - ); - - if idx == 8 { - let _ = write!(&mut self.buffer_line, "{}", self.border_style.inner_sep()); + if squeeze_action != SqueezeAction::Delete { + if len < 8 { + let _ = write!( + &mut self.buffer_line, + "{0:1$}{3}{0:2$}{4}", + "", + 3 * (8 - len), + 1 + 3 * 8, + self.border_style.inner_sep(), + self.border_style.outer_sep(), + ); + } else { + let _ = write!( + &mut self.buffer_line, + "{0:1$}{2}", + "", + 3 * (16 - len), + self.border_style.outer_sep() + ); } - idx += 1; + let mut idx = 1; + for &b in self.raw_line.iter() { + let _ = write!( + &mut self.buffer_line, + "{}", + self.byte_char_table[b as usize] + ); + + if idx == 8 { + let _ = write!(&mut self.buffer_line, "{}", self.border_style.inner_sep()); + } + + idx += 1; + } + + if len < 8 { + let _ = writeln!( + &mut self.buffer_line, + "{0:1$}{3}{0:2$}{4}", + "", + 8 - len, + 8, + self.border_style.inner_sep(), + self.border_style.outer_sep(), + ); + } else { + let _ = writeln!( + &mut self.buffer_line, + "{0:1$}{2}", + "", + 16 - len, + self.border_style.outer_sep() + ); + } } - if len < 8 { - let _ = writeln!( - &mut self.buffer_line, - "{0:1$}{3}{0:2$}{4}", - "", - 8 - len, - 8, - self.border_style.inner_sep(), - self.border_style.outer_sep(), - ); - } else { - let _ = writeln!( - &mut self.buffer_line, - "{0:1$}{2}", - "", - 16 - len, - self.border_style.outer_sep() - ); - } - - match self.squeezer.action() { + match squeeze_action { SqueezeAction::Print => { self.buffer_line.clear(); let style = COLOR_OFFSET.normal(); @@ -394,6 +398,8 @@ impl<'a, Writer: Write> Printer<'a, Writer> { self.raw_line.clear(); self.buffer_line.clear(); + self.squeezer.advance(); + Ok(()) } diff --git a/src/squeezer.rs b/src/squeezer.rs index 701637c..d1d93d5 100644 --- a/src/squeezer.rs +++ b/src/squeezer.rs @@ -86,17 +86,23 @@ impl Squeezer { } } - pub fn action(&mut self) -> SqueezeAction { + pub fn action(&self) -> SqueezeAction { + match self.state { + SqueezeState::SqueezeFirstLine => SqueezeAction::Print, + SqueezeState::Squeeze => SqueezeAction::Delete, + _ => SqueezeAction::Ignore, + } + } + + pub fn advance(&mut self) { match self.state { SqueezeState::SqueezeFirstLine => { self.state = SqueezeState::SqueezeActive; - SqueezeAction::Print } SqueezeState::Squeeze => { self.state = SqueezeState::SqueezeActive; - SqueezeAction::Delete } - _ => SqueezeAction::Ignore, + _ => {} } } } @@ -112,6 +118,7 @@ mod tests { let mut s = Squeezer::new(true); // just initialized assert_eq!(s.action(), SqueezeAction::Ignore); + s.advance(); let exp = vec![ SqueezeAction::Ignore, // first line, print as is @@ -127,6 +134,7 @@ mod tests { idx += 1; } let action = s.action(); + s.advance(); assert_eq!(action, exp[line]); line += 1; } @@ -139,6 +147,7 @@ mod tests { let mut s = Squeezer::new(true); // just initialized assert_eq!(s.action(), SqueezeAction::Ignore); + s.advance(); let exp = vec![ SqueezeAction::Ignore, // first line, print as is @@ -155,6 +164,7 @@ mod tests { idx += 1; } assert_eq!(s.action(), exp[line]); + s.advance(); line += 1; } } @@ -170,6 +180,7 @@ mod tests { let mut s = Squeezer::new(true); // just initialized assert_eq!(s.action(), SqueezeAction::Ignore); + s.advance(); let exp = vec![ SqueezeAction::Ignore, // first line, print as is @@ -186,6 +197,7 @@ mod tests { } let action = s.action(); assert_eq!(action, exp[line]); + s.advance(); line += 1; } } @@ -201,6 +213,7 @@ mod tests { let mut s = Squeezer::new(true); // just initialized assert_eq!(s.action(), SqueezeAction::Ignore); + s.advance(); let exp = vec![ SqueezeAction::Ignore, // first line, print as is @@ -216,6 +229,7 @@ mod tests { idx += 1; } let action = s.action(); + s.advance(); assert_eq!(action, exp[line]); line += 1; } @@ -232,6 +246,7 @@ mod tests { let mut s = Squeezer::new(true); // just initialized assert_eq!(s.action(), SqueezeAction::Ignore); + s.advance(); let exp = vec![ SqueezeAction::Ignore, // first line, print as is @@ -246,6 +261,7 @@ mod tests { idx += 1; } let action = s.action(); + s.advance(); assert_eq!(action, exp[line]); line += 1; } @@ -265,6 +281,7 @@ mod tests { let mut s = Squeezer::new(true); // just initialized assert_eq!(s.action(), SqueezeAction::Ignore); + s.advance(); let exp = vec![ SqueezeAction::Ignore, // first line, print as is @@ -280,6 +297,7 @@ mod tests { idx += 1; } let action = s.action(); + s.advance(); assert_eq!(action, exp[line]); line += 1; } @@ -304,6 +322,7 @@ mod tests { let mut s = Squeezer::new(true); // just initialized assert_eq!(s.action(), SqueezeAction::Ignore); + s.advance(); let exp = vec![ SqueezeAction::Ignore, @@ -328,6 +347,7 @@ mod tests { idx += 1; } let action = s.action(); + s.advance(); assert_eq!(action, exp[line]); line += 1; } @@ -346,6 +366,7 @@ mod tests { let mut s = Squeezer::new(true); // just initialized assert_eq!(s.action(), SqueezeAction::Ignore); + s.advance(); let exp = vec![ SqueezeAction::Ignore, // print as is @@ -362,6 +383,7 @@ mod tests { idx += 1; } assert_eq!(s.action(), exp[line]); + s.advance(); line += 1; } } @@ -378,6 +400,7 @@ mod tests { let mut s = Squeezer::new(true); // just initialized assert_eq!(s.action(), SqueezeAction::Ignore); + s.advance(); let exp = vec![ SqueezeAction::Ignore, // print as is @@ -393,6 +416,7 @@ mod tests { idx += 1; } assert_eq!(s.action(), exp[line]); + s.advance(); line += 1; } }