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))) } } 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 mut color = Style::from(to_ansi_color(style.foreground, true_color)); if style.font_style.contains(FontStyle::BOLD) { color = color.bold(); } if style.font_style.contains(FontStyle::UNDERLINE) { color = color.underline(); } if italics && style.font_style.contains(FontStyle::ITALIC) { color = color.italic(); } color }; style.background = background_color.map(|c| to_ansi_color(c, true_color)); style.paint(text).to_string() }