diff --git a/examples/simple.rs b/examples/simple.rs index 6ceb208a..12fd3b47 100644 --- a/examples/simple.rs +++ b/examples/simple.rs @@ -3,7 +3,7 @@ use bat::{ config::Config, controller::Controller, inputfile::InputFile, - style::{OutputComponent, OutputComponents}, + style::{StyleComponent, StyleComponents}, }; use console::Term; use std::process; @@ -20,10 +20,10 @@ fn main() { term_width: Term::stdout().size().1 as usize, colored_output: true, true_color: true, - output_components: OutputComponents::new(&[ - OutputComponent::Header, - OutputComponent::Grid, - OutputComponent::Numbers, + style_components: StyleComponents::new(&[ + StyleComponent::Header, + StyleComponent::Grid, + StyleComponent::Numbers, ]), files: files.iter().map(|file| InputFile::Ordinary(file)).collect(), theme: "1337".into(), diff --git a/src/bin/bat/app.rs b/src/bin/bat/app.rs index 281882a7..9ff6efea 100644 --- a/src/bin/bat/app.rs +++ b/src/bin/bat/app.rs @@ -22,8 +22,9 @@ use bat::{ errors::*, inputfile::InputFile, line_range::{HighlightedLineRanges, LineRange, LineRanges}, - style::{OutputComponent, OutputComponents, OutputWrap}, + style::{StyleComponent, StyleComponents}, syntax_mapping::SyntaxMapping, + wrap::OutputWrap, }; fn is_truecolor_terminal() -> bool { @@ -79,7 +80,7 @@ impl App { pub fn config(&self) -> Result { let files = self.files(); - let output_components = self.output_components()?; + let style_components = self.style_components()?; let paging_mode = match self.matches.value_of("paging") { Some("always") => PagingMode::Always, @@ -152,7 +153,7 @@ impl App { Some("character") => OutputWrap::Character, Some("never") => OutputWrap::None, Some("auto") | _ => { - if output_components.plain() { + if style_components.plain() { OutputWrap::None } else { OutputWrap::Character @@ -182,7 +183,7 @@ impl App { .or_else(|| env::var("BAT_TABS").ok()) .and_then(|t| t.parse().ok()) .unwrap_or( - if output_components.plain() && paging_mode == PagingMode::Never { + if style_components.plain() && paging_mode == PagingMode::Never { 0 } else { 4 @@ -208,7 +209,7 @@ impl App { .transpose()? .map(LineRanges::from) .unwrap_or_default(), - output_components, + style_components, syntax_mapping, pager: self.matches.value_of("pager"), use_italic_text: match self.matches.value_of("italic-text") { @@ -243,23 +244,23 @@ impl App { .unwrap_or_else(|| vec![InputFile::StdIn]) } - fn output_components(&self) -> Result { + fn style_components(&self) -> Result { let matches = &self.matches; - Ok(OutputComponents( + Ok(StyleComponents( if matches.value_of("decorations") == Some("never") { HashSet::new() } else if matches.is_present("number") { - [OutputComponent::Numbers].iter().cloned().collect() + [StyleComponent::Numbers].iter().cloned().collect() } else if matches.is_present("plain") { - [OutputComponent::Plain].iter().cloned().collect() + [StyleComponent::Plain].iter().cloned().collect() } else { - let env_style_components: Option> = env::var("BAT_STYLE") + let env_style_components: Option> = env::var("BAT_STYLE") .ok() .map(|style_str| { style_str .split(',') - .map(|x| OutputComponent::from_str(&x)) - .collect::>>() + .map(|x| StyleComponent::from_str(&x)) + .collect::>>() }) .transpose()?; @@ -268,12 +269,12 @@ impl App { .map(|styles| { styles .split(',') - .map(|style| style.parse::()) + .map(|style| style.parse::()) .filter_map(|style| style.ok()) .collect::>() }) .or(env_style_components) - .unwrap_or_else(|| vec![OutputComponent::Full]) + .unwrap_or_else(|| vec![StyleComponent::Full]) .into_iter() .map(|style| style.components(self.interactive_output)) .fold(HashSet::new(), |mut acc, components| { diff --git a/src/bin/bat/main.rs b/src/bin/bat/main.rs index be9697e6..57a31992 100644 --- a/src/bin/bat/main.rs +++ b/src/bin/bat/main.rs @@ -32,7 +32,7 @@ use bat::{ config::Config, errors::*, inputfile::InputFile, - style::{OutputComponent, OutputComponents}, + style::{StyleComponent, StyleComponents}, }; fn run_cache_subcommand(matches: &clap::ArgMatches) -> Result<()> { @@ -123,9 +123,9 @@ pub fn list_themes(cfg: &Config) -> Result<()> { let assets = assets_from_cache_or_binary(); let mut config = cfg.clone(); let mut style = HashSet::new(); - style.insert(OutputComponent::Plain); + style.insert(StyleComponent::Plain); config.files = vec![InputFile::ThemePreviewFile]; - config.output_components = OutputComponents(style); + config.style_components = StyleComponents(style); let stdout = io::stdout(); let mut stdout = stdout.lock(); diff --git a/src/config.rs b/src/config.rs index de2a2619..4efa77fb 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,7 +1,8 @@ use crate::inputfile::InputFile; use crate::line_range::{HighlightedLineRanges, LineRanges}; -use crate::style::{OutputComponents, OutputWrap}; +use crate::style::StyleComponents; use crate::syntax_mapping::SyntaxMapping; +use crate::wrap::OutputWrap; #[derive(Debug, Clone, Copy, PartialEq)] pub enum PagingMode { @@ -44,7 +45,7 @@ pub struct Config<'a> { pub true_color: bool, /// Style elements (grid, line numbers, ...) - pub output_components: OutputComponents, + pub style_components: StyleComponents, /// Text wrapping mode pub output_wrap: OutputWrap, diff --git a/src/controller.rs b/src/controller.rs index b0458333..ee1a1be3 100644 --- a/src/controller.rs +++ b/src/controller.rs @@ -83,7 +83,7 @@ impl<'b> Controller<'b> { writer: &mut dyn Write, input_file: InputFile<'a>, ) -> Result<()> { - if !reader.first_line.is_empty() || self.config.output_components.header() { + if !reader.first_line.is_empty() || self.config.style_components.header() { printer.print_header(writer, input_file)?; } @@ -118,7 +118,7 @@ impl<'b> Controller<'b> { } RangeCheckResult::InRange => { - if self.config.output_components.snip() { + if self.config.style_components.snip() { if first_range { first_range = false; mid_range = true; diff --git a/src/lib.rs b/src/lib.rs index 52856576..afc0a975 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -27,3 +27,4 @@ mod printer; pub mod style; pub mod syntax_mapping; mod terminal; +pub mod wrap; diff --git a/src/printer.rs b/src/printer.rs index bae55bea..629b11da 100644 --- a/src/printer.rs +++ b/src/printer.rs @@ -30,8 +30,8 @@ use crate::errors::*; use crate::inputfile::{InputFile, InputFileReader}; use crate::line_range::RangeCheckResult; use crate::preprocessor::{expand_tabs, replace_nonprintable}; -use crate::style::OutputWrap; use crate::terminal::{as_terminal_escaped, to_ansi_color}; +use crate::wrap::OutputWrap; pub trait Printer { fn print_header(&mut self, handle: &mut dyn Write, file: InputFile) -> Result<()>; @@ -116,11 +116,11 @@ impl<'a> InteractivePrinter<'a> { // Create decorations. let mut decorations: Vec> = Vec::new(); - if config.output_components.numbers() { + if config.style_components.numbers() { decorations.push(Box::new(LineNumberDecoration::new(&colors))); } - if config.output_components.changes() { + if config.style_components.changes() { decorations.push(Box::new(LineChangesDecoration::new(&colors))); } @@ -130,7 +130,7 @@ impl<'a> InteractivePrinter<'a> { // The grid border decoration isn't added until after the panel_width calculation, since the // print_horizontal_line, print_header, and print_footer functions all assume the panel // width is without the grid border. - if config.output_components.grid() && !decorations.is_empty() { + if config.style_components.grid() && !decorations.is_empty() { decorations.push(Box::new(GridBorderDecoration::new(&colors))); } @@ -152,7 +152,7 @@ impl<'a> InteractivePrinter<'a> { None } else { // Get the Git modifications - line_changes = if config.output_components.changes() { + line_changes = if config.style_components.changes() { match file { InputFile::Ordinary(filename) => get_git_diff(filename), _ => None, @@ -206,7 +206,7 @@ impl<'a> InteractivePrinter<'a> { text_truncated, " ".repeat(self.panel_width - 1 - text_truncated.len()) ); - if self.config.output_components.grid() { + if self.config.style_components.grid() { format!("{} │ ", text_filled) } else { format!("{}", text_filled) @@ -225,7 +225,7 @@ impl<'a> InteractivePrinter<'a> { impl<'a> Printer for InteractivePrinter<'a> { fn print_header(&mut self, handle: &mut dyn Write, file: InputFile) -> Result<()> { - if !self.config.output_components.header() { + if !self.config.style_components.header() { if Some(ContentType::BINARY) == self.content_type && !self.config.show_nonprintable { let input = match file { InputFile::Ordinary(filename) => { @@ -243,14 +243,14 @@ impl<'a> Printer for InteractivePrinter<'a> { input )?; } else { - if self.config.output_components.grid() { + if self.config.style_components.grid() { self.print_horizontal_line(handle, '┬')?; } } return Ok(()); } - if self.config.output_components.grid() { + if self.config.style_components.grid() { self.print_horizontal_line(handle, '┬')?; write!( @@ -286,7 +286,7 @@ impl<'a> Printer for InteractivePrinter<'a> { mode )?; - if self.config.output_components.grid() { + if self.config.style_components.grid() { if self.content_type.map_or(false, |c| c.is_text()) || self.config.show_nonprintable { self.print_horizontal_line(handle, '┼')?; } else { @@ -298,7 +298,7 @@ impl<'a> Printer for InteractivePrinter<'a> { } fn print_footer(&mut self, handle: &mut dyn Write) -> Result<()> { - if self.config.output_components.grid() + if self.config.style_components.grid() && (self.content_type.map_or(false, |c| c.is_text()) || self.config.show_nonprintable) { self.print_horizontal_line(handle, '┴') diff --git a/src/style.rs b/src/style.rs index e06bba79..a906553a 100644 --- a/src/style.rs +++ b/src/style.rs @@ -4,7 +4,7 @@ use std::str::FromStr; use crate::errors::*; #[derive(Debug, Eq, PartialEq, Copy, Clone, Hash)] -pub enum OutputComponent { +pub enum StyleComponent { Auto, Changes, Grid, @@ -15,92 +15,80 @@ pub enum OutputComponent { Plain, } -#[derive(Debug, Eq, PartialEq, Copy, Clone, Hash)] -pub enum OutputWrap { - Character, - None, -} - -impl Default for OutputWrap { - fn default() -> Self { - OutputWrap::None - } -} - -impl OutputComponent { - pub fn components(self, interactive_terminal: bool) -> &'static [OutputComponent] { +impl StyleComponent { + pub fn components(self, interactive_terminal: bool) -> &'static [StyleComponent] { match self { - OutputComponent::Auto => { + StyleComponent::Auto => { if interactive_terminal { - OutputComponent::Full.components(interactive_terminal) + StyleComponent::Full.components(interactive_terminal) } else { - OutputComponent::Plain.components(interactive_terminal) + StyleComponent::Plain.components(interactive_terminal) } } - OutputComponent::Changes => &[OutputComponent::Changes], - OutputComponent::Grid => &[OutputComponent::Grid], - OutputComponent::Header => &[OutputComponent::Header], - OutputComponent::Numbers => &[OutputComponent::Numbers], - OutputComponent::Snip => &[OutputComponent::Snip], - OutputComponent::Full => &[ - OutputComponent::Changes, - OutputComponent::Grid, - OutputComponent::Header, - OutputComponent::Numbers, - OutputComponent::Snip, + StyleComponent::Changes => &[StyleComponent::Changes], + StyleComponent::Grid => &[StyleComponent::Grid], + StyleComponent::Header => &[StyleComponent::Header], + StyleComponent::Numbers => &[StyleComponent::Numbers], + StyleComponent::Snip => &[StyleComponent::Snip], + StyleComponent::Full => &[ + StyleComponent::Changes, + StyleComponent::Grid, + StyleComponent::Header, + StyleComponent::Numbers, + StyleComponent::Snip, ], - OutputComponent::Plain => &[], + StyleComponent::Plain => &[], } } } -impl FromStr for OutputComponent { +impl FromStr for StyleComponent { type Err = Error; fn from_str(s: &str) -> Result { match s { - "auto" => Ok(OutputComponent::Auto), - "changes" => Ok(OutputComponent::Changes), - "grid" => Ok(OutputComponent::Grid), - "header" => Ok(OutputComponent::Header), - "numbers" => Ok(OutputComponent::Numbers), - "snip" => Ok(OutputComponent::Snip), - "full" => Ok(OutputComponent::Full), - "plain" => Ok(OutputComponent::Plain), + "auto" => Ok(StyleComponent::Auto), + "changes" => Ok(StyleComponent::Changes), + "grid" => Ok(StyleComponent::Grid), + "header" => Ok(StyleComponent::Header), + "numbers" => Ok(StyleComponent::Numbers), + "snip" => Ok(StyleComponent::Snip), + "full" => Ok(StyleComponent::Full), + "plain" => Ok(StyleComponent::Plain), _ => Err(format!("Unknown style '{}'", s).into()), } } } #[derive(Debug, Clone, Default)] -pub struct OutputComponents(pub HashSet); +pub struct StyleComponents(pub HashSet); -impl OutputComponents { - pub fn new(components: &[OutputComponent]) -> OutputComponents { - OutputComponents(components.iter().cloned().collect()) +impl StyleComponents { + pub fn new(components: &[StyleComponent]) -> StyleComponents { + StyleComponents(components.iter().cloned().collect()) } pub fn changes(&self) -> bool { - self.0.contains(&OutputComponent::Changes) + self.0.contains(&StyleComponent::Changes) } pub fn grid(&self) -> bool { - self.0.contains(&OutputComponent::Grid) + self.0.contains(&StyleComponent::Grid) } pub fn header(&self) -> bool { - self.0.contains(&OutputComponent::Header) + self.0.contains(&StyleComponent::Header) } pub fn numbers(&self) -> bool { - self.0.contains(&OutputComponent::Numbers) + self.0.contains(&StyleComponent::Numbers) } pub fn snip(&self) -> bool { - self.0.contains(&OutputComponent::Snip) + self.0.contains(&StyleComponent::Snip) } pub fn plain(&self) -> bool { - self.0.iter().all(|c| c == &OutputComponent::Plain) + self.0.iter().all(|c| c == &StyleComponent::Plain) } } diff --git a/src/wrap.rs b/src/wrap.rs new file mode 100644 index 00000000..211469ab --- /dev/null +++ b/src/wrap.rs @@ -0,0 +1,11 @@ +#[derive(Debug, Eq, PartialEq, Copy, Clone, Hash)] +pub enum OutputWrap { + Character, + None, +} + +impl Default for OutputWrap { + fn default() -> Self { + OutputWrap::None + } +}