mod ansi;
pub mod highlighting;
mod size;
mod iterm2;
mod kitty;
mod osc;
mod terminology;
pub use self::ansi::AnsiStyle;
pub use self::size::Size as TerminalSize;
pub enum StyleCapability {
None,
Ansi(AnsiStyle),
}
pub enum LinkCapability {
None,
OSC8(self::osc::OSC8Links),
}
pub enum MarkCapability {
None,
ITerm2(self::iterm2::ITerm2Marks),
}
pub enum ImageCapability {
None,
Terminology(self::terminology::TerminologyImages),
ITerm2(self::iterm2::ITerm2Images),
Kitty(self::kitty::KittyImages),
}
pub struct TerminalCapabilities {
pub name: String,
pub style: StyleCapability,
pub links: LinkCapability,
pub image: ImageCapability,
pub marks: MarkCapability,
}
fn get_vte_version() -> Option<(u8, u8)> {
std::env::var("VTE_VERSION").ok().and_then(|value| {
value[..2]
.parse::<u8>()
.into_iter()
.zip(value[2..4].parse::<u8>())
.next()
})
}
impl TerminalCapabilities {
pub fn none() -> TerminalCapabilities {
TerminalCapabilities {
name: "dumb".to_string(),
style: StyleCapability::None,
links: LinkCapability::None,
image: ImageCapability::None,
marks: MarkCapability::None,
}
}
pub fn ansi() -> TerminalCapabilities {
TerminalCapabilities {
name: "Ansi".to_string(),
style: StyleCapability::Ansi(AnsiStyle),
links: LinkCapability::None,
image: ImageCapability::None,
marks: MarkCapability::None,
}
}
pub fn detect() -> TerminalCapabilities {
if self::iterm2::is_iterm2() {
TerminalCapabilities {
name: "iTerm2".to_string(),
style: StyleCapability::Ansi(AnsiStyle),
links: LinkCapability::OSC8(self::osc::OSC8Links::for_localhost()),
image: ImageCapability::ITerm2(self::iterm2::ITerm2Images),
marks: MarkCapability::ITerm2(self::iterm2::ITerm2Marks),
}
} else if self::terminology::is_terminology() {
TerminalCapabilities {
name: "Terminology".to_string(),
style: StyleCapability::Ansi(AnsiStyle),
links: LinkCapability::OSC8(self::osc::OSC8Links::for_localhost()),
image: ImageCapability::Terminology(self::terminology::TerminologyImages),
marks: MarkCapability::None,
}
} else if self::kitty::is_kitty() {
TerminalCapabilities {
name: "Kitty".to_string(),
style: StyleCapability::Ansi(AnsiStyle),
links: LinkCapability::None,
image: ImageCapability::Kitty(self::kitty::KittyImages),
marks: MarkCapability::None,
}
} else if get_vte_version().filter(|&v| v >= (50, 0)).is_some() {
TerminalCapabilities {
name: "VTE 50".to_string(),
style: StyleCapability::Ansi(AnsiStyle),
links: LinkCapability::OSC8(self::osc::OSC8Links::for_localhost()),
image: ImageCapability::None,
marks: MarkCapability::None,
}
} else {
TerminalCapabilities::ansi()
}
}
}