yazi/yazi-tty/src/sequence/style.rs
2026-06-18 16:23:26 +08:00

126 lines
4.1 KiB
Rust

use std::fmt::{self, Display};
use ratatui_core::style::Color;
/// Set foreground color from a `Color`.
pub struct SetFg(pub Color);
impl Display for SetFg {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self.0 {
Color::Reset => f.write_str("\x1b[39m"),
Color::Black => f.write_str("\x1b[30m"),
Color::Red => f.write_str("\x1b[31m"),
Color::Green => f.write_str("\x1b[32m"),
Color::Yellow => f.write_str("\x1b[33m"),
Color::Blue => f.write_str("\x1b[34m"),
Color::Magenta => f.write_str("\x1b[35m"),
Color::Cyan => f.write_str("\x1b[36m"),
Color::Gray => f.write_str("\x1b[37m"),
Color::DarkGray => f.write_str("\x1b[90m"),
Color::LightRed => f.write_str("\x1b[91m"),
Color::LightGreen => f.write_str("\x1b[92m"),
Color::LightYellow => f.write_str("\x1b[93m"),
Color::LightBlue => f.write_str("\x1b[94m"),
Color::LightMagenta => f.write_str("\x1b[95m"),
Color::LightCyan => f.write_str("\x1b[96m"),
Color::White => f.write_str("\x1b[97m"),
Color::Rgb(r, g, b) => write!(f, "\x1b[38;2;{r};{g};{b}m"),
Color::Indexed(n) => write!(f, "\x1b[38;5;{n}m"),
}
}
}
/// Set background color from a `Color`.
pub struct SetBg(pub Color);
impl Display for SetBg {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self.0 {
Color::Reset => f.write_str("\x1b[49m"),
Color::Black => f.write_str("\x1b[40m"),
Color::Red => f.write_str("\x1b[41m"),
Color::Green => f.write_str("\x1b[42m"),
Color::Yellow => f.write_str("\x1b[43m"),
Color::Blue => f.write_str("\x1b[44m"),
Color::Magenta => f.write_str("\x1b[45m"),
Color::Cyan => f.write_str("\x1b[46m"),
Color::Gray => f.write_str("\x1b[47m"),
Color::DarkGray => f.write_str("\x1b[100m"),
Color::LightRed => f.write_str("\x1b[101m"),
Color::LightGreen => f.write_str("\x1b[102m"),
Color::LightYellow => f.write_str("\x1b[103m"),
Color::LightBlue => f.write_str("\x1b[104m"),
Color::LightMagenta => f.write_str("\x1b[105m"),
Color::LightCyan => f.write_str("\x1b[106m"),
Color::White => f.write_str("\x1b[107m"),
Color::Rgb(r, g, b) => write!(f, "\x1b[48;2;{r};{g};{b}m"),
Color::Indexed(n) => write!(f, "\x1b[48;5;{n}m"),
}
}
}
/// Set underline color from a `Color`.
pub struct SetUnderlineColor(pub Color);
impl Display for SetUnderlineColor {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self.0 {
Color::Reset => f.write_str("\x1b[59m"),
Color::Black => write!(f, "\x1b[58;5;0m"),
Color::Red => write!(f, "\x1b[58;5;1m"),
Color::Green => write!(f, "\x1b[58;5;2m"),
Color::Yellow => write!(f, "\x1b[58;5;3m"),
Color::Blue => write!(f, "\x1b[58;5;4m"),
Color::Magenta => write!(f, "\x1b[58;5;5m"),
Color::Cyan => write!(f, "\x1b[58;5;6m"),
Color::Gray => write!(f, "\x1b[58;5;7m"),
Color::DarkGray => write!(f, "\x1b[58;5;8m"),
Color::LightRed => write!(f, "\x1b[58;5;9m"),
Color::LightGreen => write!(f, "\x1b[58;5;10m"),
Color::LightYellow => write!(f, "\x1b[58;5;11m"),
Color::LightBlue => write!(f, "\x1b[58;5;12m"),
Color::LightMagenta => write!(f, "\x1b[58;5;13m"),
Color::LightCyan => write!(f, "\x1b[58;5;14m"),
Color::White => write!(f, "\x1b[58;5;15m"),
Color::Rgb(r, g, b) => write!(f, "\x1b[58;2;{r};{g};{b}m"),
Color::Indexed(n) => write!(f, "\x1b[58;5;{n}m"),
}
}
}
/// SGR text attribute.
#[derive(Clone, Copy)]
#[repr(u8)]
pub enum SetSgr {
Reset = 0,
Bold = 1,
Dim = 2,
Italic = 3,
Underlined = 4,
SlowBlink = 5,
RapidBlink = 6,
Reverse = 7,
Hidden = 8,
CrossedOut = 9,
NormalIntensity = 22,
NoItalic = 23,
NoUnderline = 24,
NoBlink = 25,
NoReverse = 27,
NoHidden = 28,
NotCrossedOut = 29,
}
impl Display for SetSgr {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "\x1b[{}m", *self as u8) }
}
/// Reset all colors and SGR attributes
pub struct ResetAttrs;
impl Display for ResetAttrs {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}{}{}", SetFg(Color::Reset), SetBg(Color::Reset), SetSgr::Reset)
}
}