summaryrefslogtreecommitdiffstats
path: root/src/color.rs
diff options
context:
space:
mode:
authorDan Davison <dandavison7@gmail.com>2020-05-27 15:26:08 -0400
committerDan Davison <dandavison7@gmail.com>2020-05-27 15:58:47 -0400
commit284392c7580e082070e0b9c05d712da65d52c943 (patch)
tree798df4207d09aa1d600345c9a455e579d9364ddc /src/color.rs
parent327792f4bc67d05d03785fe127df9990d2ffce37 (diff)
Refactor: Create color and theme modules, consolidate style code
Diffstat (limited to 'src/color.rs')
-rw-r--r--src/color.rs134
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);