mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
126 lines
4.1 KiB
Rust
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)
|
|
}
|
|
}
|