const MC_ESCAPE: char = 'ยง';
const ANSI_ESCAPE: char = '\x1b';
#[derive(Default)]
pub struct Transformer {
buf: String,
disable_color: bool,
}
impl Transformer {
pub fn new(disable_color: bool) -> Self {
Self {
disable_color,
..Default::default()
}
}
pub fn transform(&mut self, v: &str) -> &str {
let mut split = v.split(MC_ESCAPE);
let Some(first) = split.next() else {
return "";
};
self.buf.clear();
self.buf.push_str(first);
for e in split {
let Some(clr) = e.chars().next() else {
break;
};
if let Some(ansi_clr) = mc_to_ansi(clr) {
if !self.disable_color {
self.buf.push(ANSI_ESCAPE);
self.buf.push_str(ansi_clr);
}
} else {
self.buf.push(MC_ESCAPE);
}
self.buf.push_str(&e[1..]);
}
return self.buf.as_str();
}
}
fn mc_to_ansi(clr: char) -> Option<&'static str> {
match clr {
'4' => Some("[38;5;160m"), 'c' => Some("[38;5;203m"), '6' => Some("[38;5;208m"), 'e' => Some("[38;5;220m"), '2' => Some("[38;5;34m"), 'a' => Some("[38;5;82m"), 'b' => Some("[38;5;51m"), '3' => Some("[38;5;38m"), '1' => Some("[38;5;26m"), '9' => Some("[38;5;33m"), 'd' => Some("[38;5;200m"), '5' => Some("[38;5;171m"), 'f' => Some("[0m"), '7' => Some("[38;5;248m"), '8' => Some("[38;5;242m"), '0' => Some("[38;5;235m"), _ => None,
}
}