From 185dbd5e87e35a625ceaaea7fd36a35e948e44b1 Mon Sep 17 00:00:00 2001 From: Dan Davison Date: Mon, 2 Mar 2020 06:32:55 -0600 Subject: Use ansi_term crate and bat's helpers for painting text --- src/bat/mod.rs | 1 + src/bat/terminal.rs | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 src/bat/terminal.rs (limited to 'src/bat') diff --git a/src/bat/mod.rs b/src/bat/mod.rs index 88673f26..04f6dbf7 100644 --- a/src/bat/mod.rs +++ b/src/bat/mod.rs @@ -1,3 +1,4 @@ pub mod assets; pub mod dirs; pub mod output; +pub mod terminal; diff --git a/src/bat/terminal.rs b/src/bat/terminal.rs new file mode 100644 index 00000000..50351c48 --- /dev/null +++ b/src/bat/terminal.rs @@ -0,0 +1,53 @@ +extern crate ansi_colours; + +use ansi_term::Colour::{Fixed, RGB}; +use ansi_term::{self, Style}; + +use syntect::highlighting::{self, FontStyle}; + +pub fn to_ansi_color(color: highlighting::Color, true_color: bool) -> ansi_term::Colour { + if color.a == 0 { + // Themes can specify one of the user-configurable terminal colors by + // encoding them as #RRGGBBAA with AA set to 00 (transparent) and RR set + // to the color palette number. The built-in themes ansi-light, + // ansi-dark, and base16 use this. + Fixed(color.r) + } else if true_color { + RGB(color.r, color.g, color.b) + } else { + Fixed(ansi_colours::ansi256_from_rgb((color.r, color.g, color.b))) + } +} + +#[allow(dead_code)] +pub fn as_terminal_escaped( + style: highlighting::Style, + text: &str, + true_color: bool, + colored: bool, + italics: bool, + background_color: Option, +) -> String { + if text.is_empty() { + return text.to_string(); + } + + let mut style = if !colored { + Style::default() + } else { + let color = to_ansi_color(style.foreground, true_color); + + if style.font_style.contains(FontStyle::BOLD) { + color.bold() + } else if style.font_style.contains(FontStyle::UNDERLINE) { + color.underline() + } else if italics && style.font_style.contains(FontStyle::ITALIC) { + color.italic() + } else { + color.normal() + } + }; + + style.background = background_color.map(|c| to_ansi_color(c, true_color)); + style.paint(text).to_string() +} -- cgit v1.2.3