diff options
author | Dan Davison <dandavison7@gmail.com> | 2020-05-27 15:26:08 -0400 |
---|---|---|
committer | Dan Davison <dandavison7@gmail.com> | 2020-05-27 15:58:47 -0400 |
commit | 284392c7580e082070e0b9c05d712da65d52c943 (patch) | |
tree | 798df4207d09aa1d600345c9a455e579d9364ddc /src/color.rs | |
parent | 327792f4bc67d05d03785fe127df9990d2ffce37 (diff) |
Refactor: Create color and theme modules, consolidate style code
Diffstat (limited to 'src/color.rs')
-rw-r--r-- | src/color.rs | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/src/color.rs b/src/color.rs new file mode 100644 index 00000000..4d0d2813 --- /dev/null +++ b/src/color.rs @@ -0,0 +1,134 @@ +use std::process; +use std::str::FromStr; + +use ansi_term::Color; +use syntect::highlighting::Color as SyntectColor; + +use crate::bat::terminal::to_ansi_color; +use crate::syntect_color; + +pub fn color_from_rgb_or_ansi_code(s: &str, true_color: bool) -> Color { + let die = || { + eprintln!("Invalid color: {}", s); + process::exit(1); + }; + let syntect_color = if s.starts_with("#") { + SyntectColor::from_str(s).unwrap_or_else(|_| die()) + } else { + s.parse::<u8>() + .ok() + .and_then(syntect_color::syntect_color_from_ansi_number) + .or_else(|| syntect_color::syntect_color_from_ansi_name(s)) + .unwrap_or_else(die) + }; + to_ansi_color(syntect_color, true_color) +} + +pub fn color_from_rgb_or_ansi_code_with_default( + arg: &str, + default: Option<Color>, + true_color: bool, +) -> Option<Color> { + let arg = arg.to_lowercase(); + if arg == "normal" { + None + } else if arg == "auto" { + default + } else { + Some(color_from_rgb_or_ansi_code(&arg, true_color)) + } +} + +// See +// https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit +pub fn ansi_color_name_to_number(name: &str) -> Option<u8> { + match name.to_lowercase().as_ref() { + "black" => Some(0), + "red" => Some(1), + "green" => Some(2), + "yellow" => Some(3), + "blue" => Some(4), + "magenta" => Some(5), + "purple" => Some(5), + "cyan" => Some(6), + "white" => Some(7), + "bright-black" => Some(8), + "bright-red" => Some(9), + "bright-green" => Some(10), + "bright-yellow" => Some(11), + "bright-blue" => Some(12), + "bright-magenta" => Some(13), + "bright-purple" => Some(13), + "bright-cyan" => Some(14), + "bright-white" => Some(15), + _ => None, + } +} + +pub fn get_minus_background_color_default(is_light_mode: bool, is_true_color: bool) -> Color { + match (is_light_mode, is_true_color) { + (true, true) => LIGHT_THEME_MINUS_COLOR, + (true, false) => LIGHT_THEME_MINUS_COLOR_256, + (false, true) => DARK_THEME_MINUS_COLOR, + (false, false) => DARK_THEME_MINUS_COLOR_256, + } +} + +pub fn get_minus_emph_background_color_default(is_light_mode: bool, is_true_color: bool) -> Color { + match (is_light_mode, is_true_color) { + (true, true) => LIGHT_THEME_MINUS_EMPH_COLOR, + (true, false) => LIGHT_THEME_MINUS_EMPH_COLOR_256, + (false, true) => DARK_THEME_MINUS_EMPH_COLOR, + (false, false) => DARK_THEME_MINUS_EMPH_COLOR_256, + } +} + +pub fn get_plus_background_color_default(is_light_mode: bool, is_true_color: bool) -> Color { + match (is_light_mode, is_true_color) { + (true, true) => LIGHT_THEME_PLUS_COLOR, + (true, false) => LIGHT_THEME_PLUS_COLOR_256, + (false, true) => DARK_THEME_PLUS_COLOR, + (false, false) => DARK_THEME_PLUS_COLOR_256, + } +} + +pub fn get_plus_emph_background_color_default(is_light_mode: bool, is_true_color: bool) -> Color { + match (is_light_mode, is_true_color) { + (true, true) => LIGHT_THEME_PLUS_EMPH_COLOR, + (true, false) => LIGHT_THEME_PLUS_EMPH_COLOR_256, + (false, true) => DARK_THEME_PLUS_EMPH_COLOR, + (false, false) => DARK_THEME_PLUS_EMPH_COLOR_256, + } +} + +const LIGHT_THEME_MINUS_COLOR: Color = Color::RGB(0xff, 0xe0, 0xe0); + +const LIGHT_THEME_MINUS_COLOR_256: Color = Color::Fixed(224); + +const LIGHT_THEME_MINUS_EMPH_COLOR: Color = Color::RGB(0xff, 0xc0, 0xc0); + +const LIGHT_THEME_MINUS_EMPH_COLOR_256: Color = Color::Fixed(217); + +const LIGHT_THEME_PLUS_COLOR: Color = Color::RGB(0xd0, 0xff, 0xd0); + +const LIGHT_THEME_PLUS_COLOR_256: Color = Color::Fixed(194); + +const LIGHT_THEME_PLUS_EMPH_COLOR: Color = Color::RGB(0xa0, 0xef, 0xa0); + +const LIGHT_THEME_PLUS_EMPH_COLOR_256: Color = Color::Fixed(157); + +const DARK_THEME_MINUS_COLOR: Color = Color::RGB(0x3f, 0x00, 0x01); + +const DARK_THEME_MINUS_COLOR_256: Color = Color::Fixed(52); + +const DARK_THEME_MINUS_EMPH_COLOR: Color = Color::RGB(0x90, 0x10, 0x11); + +const DARK_THEME_MINUS_EMPH_COLOR_256: Color = Color::Fixed(124); + +const DARK_THEME_PLUS_COLOR: Color = Color::RGB(0x00, 0x28, 0x00); + +const DARK_THEME_PLUS_COLOR_256: Color = Color::Fixed(22); + +const DARK_THEME_PLUS_EMPH_COLOR: Color = Color::RGB(0x00, 0x60, 0x00); + +const DARK_THEME_PLUS_EMPH_COLOR_256: Color = Color::Fixed(28); |