1use cansi::v3::{categorise_text, Color};
2use cosmic_text::{Attrs, Family};
3
4use crate::utils::color::parse_hex_to_cosmic_color;
5
6pub struct ANSI {
7 raw_text: String,
8 font_family: String,
9}
10
11impl ANSI {
12 pub fn from(text: &str, font_family: String) -> Self {
13 Self {
14 raw_text: text.to_string(),
15 font_family,
16 }
17 }
18
19 pub fn colorize(&self) -> Vec<(&str, Attrs)> {
21 categorise_text(&self.raw_text)
22 .into_iter()
23 .map(|category| {
24 let hex_color = parse_color_to_hex(category.fg.unwrap_or(Color::White));
25
26 (
27 category.text,
28 Attrs::new()
29 .color(parse_hex_to_cosmic_color(hex_color))
30 .family(Family::Name(self.font_family.as_str())),
31 )
32 })
33 .collect::<Vec<(&str, Attrs)>>()
34 }
35}
36
37pub fn parse_color_to_hex(color: Color) -> &'static str {
39 match color {
40 Color::Black => "#4B4B4B",
41 Color::Red => "#FF6F61",
42 Color::Green => "#77DD77",
43 Color::Yellow => "#FFEB3B",
44 Color::Blue => "#89CFF0",
45 Color::Magenta => "#FF77FF",
46 Color::Cyan => "#00FFFF",
47 Color::White => "#979EAB",
48 Color::BrightBlack => "#696969",
49 Color::BrightRed => "#FF9999",
50 Color::BrightGreen => "#99FF99",
51 Color::BrightYellow => "#FFFF99",
52 Color::BrightBlue => "#ADD8E6",
53 Color::BrightMagenta => "#FFB6C1",
54 Color::BrightCyan => "#E0FFFF",
55 Color::BrightWhite => "#F5F5F5",
56 }
57}