Skip to main content

codesnap/
ansi.rs

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    // Parse Cansi categories to Cosmic Text span Attrs
20    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
37// Parse Cansi color to string
38pub 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}