mirror of
https://github.com/Llewellynvdm/exa.git
synced 2024-05-31 22:50:48 +00:00
976db01b3e
The rationale here is that there's more of a background colour than the foreground colour when painting text, and having a gap of no background colour in between the icon and the file name looks weird. Fixes GH-561.
201 lines
6.7 KiB
Rust
201 lines
6.7 KiB
Rust
use ansi_term::Style;
|
||
|
||
use crate::fs::File;
|
||
use crate::info::filetype::FileExtensions;
|
||
|
||
|
||
pub trait FileIcon {
|
||
fn icon_file(&self, file: &File<'_>) -> Option<char>;
|
||
}
|
||
|
||
|
||
#[derive(Copy, Clone)]
|
||
pub enum Icons {
|
||
Audio,
|
||
Image,
|
||
Video,
|
||
}
|
||
|
||
impl Icons {
|
||
pub fn value(self) -> char {
|
||
match self {
|
||
Self::Audio => '\u{f001}',
|
||
Self::Image => '\u{f1c5}',
|
||
Self::Video => '\u{f03d}',
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
/// Converts the style used to paint a file name into the style that should be
|
||
/// used to paint an icon.
|
||
///
|
||
/// - The background colour should be preferred to the foreground colour, as
|
||
/// if one is set, it’s the more “obvious” colour choice.
|
||
/// - If neither is set, just use the default style.
|
||
/// - Attributes such as bold or underline should not be used to paint the
|
||
/// icon, as they can make it look weird.
|
||
pub fn iconify_style<'a>(style: Style) -> Style {
|
||
style.background.or(style.foreground)
|
||
.map(Style::from)
|
||
.unwrap_or_default()
|
||
}
|
||
|
||
|
||
pub fn icon_for_file(file: &File<'_>) -> char {
|
||
let extensions = Box::new(FileExtensions);
|
||
|
||
if file.points_to_directory() {
|
||
'\u{f115}'
|
||
}
|
||
else if let Some(icon) = extensions.icon_file(file) {
|
||
icon
|
||
}
|
||
else if let Some(ext) = file.ext.as_ref() {
|
||
match ext.as_str() {
|
||
"ai" => '\u{e7b4}',
|
||
"android" => '\u{e70e}',
|
||
"apple" => '\u{f179}',
|
||
"avro" => '\u{e60b}',
|
||
"clj" => '\u{e768}',
|
||
"coffee" => '\u{f0f4}',
|
||
"cpp" => '\u{e61d}',
|
||
"hpp" => '\u{e61d}',
|
||
"c" => '\u{e61e}',
|
||
"h" => '\u{e61e}',
|
||
"cs" => '\u{f81a}',
|
||
"css" => '\u{e749}',
|
||
"d" => '\u{e7af}',
|
||
"dart" => '\u{e798}',
|
||
"db" => '\u{f1c0}',
|
||
"diff" => '\u{f440}',
|
||
"patch" => '\u{f440}',
|
||
"rtf" => '\u{f1c2}',
|
||
"doc" => '\u{f1c2}',
|
||
"docx" => '\u{f1c2}',
|
||
"odt" => '\u{f1c2}',
|
||
"ebook" => '\u{e28b}',
|
||
"env" => '\u{f462}',
|
||
"epub" => '\u{e28a}',
|
||
"erl" => '\u{e7b1}',
|
||
"font" => '\u{f031}',
|
||
"gform" => '\u{f298}',
|
||
"git" => '\u{f1d3}',
|
||
"go" => '\u{e626}',
|
||
"hs" => '\u{e777}',
|
||
"htm" => '\u{f13b}',
|
||
"html" => '\u{f13b}',
|
||
"xhtml" => '\u{f13b}',
|
||
"iml" => '\u{e7b5}',
|
||
"java" => '\u{e204}',
|
||
"js" => '\u{e74e}',
|
||
"mjs" => '\u{e74e}',
|
||
"json" => '\u{e60b}',
|
||
"jsx" => '\u{e7ba}',
|
||
"vue" => '\u{fd42}',
|
||
"node" => '\u{f898}',
|
||
"less" => '\u{e758}',
|
||
"log" => '\u{f18d}',
|
||
"lua" => '\u{e620}',
|
||
"md" => '\u{f48a}',
|
||
"markdown" => '\u{f48a}',
|
||
"mustache" => '\u{e60f}',
|
||
"npmignore" => '\u{e71e}',
|
||
"pdf" => '\u{f1c1}',
|
||
"djvu" => '\u{f02d}',
|
||
"mobi" => '\u{f02d}',
|
||
"php" => '\u{e73d}',
|
||
"pl" => '\u{e769}',
|
||
"ppt" => '\u{f1c4}',
|
||
"pptx" => '\u{f1c4}',
|
||
"odp" => '\u{f1c4}',
|
||
"psd" => '\u{e7b8}',
|
||
"py" => '\u{e606}',
|
||
"r" => '\u{f25d}',
|
||
"rb" => '\u{e21e}',
|
||
"ru" => '\u{e21e}',
|
||
"erb" => '\u{e21e}',
|
||
"gem" => '\u{e21e}',
|
||
"rdb" => '\u{e76d}',
|
||
"rs" => '\u{e7a8}',
|
||
"rss" => '\u{f09e}',
|
||
"rubydoc" => '\u{e73b}',
|
||
"sass" => '\u{e74b}',
|
||
"stylus" => '\u{e759}',
|
||
"scala" => '\u{e737}',
|
||
"shell" => '\u{f489}',
|
||
"sqlite3" => '\u{e7c4}',
|
||
"styl" => '\u{e600}',
|
||
"latex" => '\u{e600}',
|
||
"tex" => '\u{e600}',
|
||
"ts" => '\u{e628}',
|
||
"tsx" => '\u{e628}',
|
||
"twig" => '\u{e61c}',
|
||
"txt" => '\u{f15c}',
|
||
"video" => '\u{f03d}',
|
||
"vim" => '\u{e62b}',
|
||
"xml" => '\u{e619}',
|
||
"yml" => '\u{f481}',
|
||
"yaml" => '\u{f481}',
|
||
"rar" => '\u{f410}',
|
||
"zip" => '\u{f410}',
|
||
"bz" => '\u{f410}',
|
||
"bz2" => '\u{f410}',
|
||
"xz" => '\u{f410}',
|
||
"taz" => '\u{f410}',
|
||
"tbz" => '\u{f410}',
|
||
"tbz2" => '\u{f410}',
|
||
"tz" => '\u{f410}',
|
||
"tar" => '\u{f410}',
|
||
"tzo" => '\u{f410}',
|
||
"lz" => '\u{f410}',
|
||
"lzh" => '\u{f410}',
|
||
"lzma" => '\u{f410}',
|
||
"lzo" => '\u{f410}',
|
||
"gz" => '\u{f410}',
|
||
"deb" => '\u{e77d}',
|
||
"rpm" => '\u{e7bb}',
|
||
"exe" => '\u{e70f}',
|
||
"msi" => '\u{e70f}',
|
||
"dll" => '\u{e70f}',
|
||
"cab" => '\u{e70f}',
|
||
"bat" => '\u{e70f}',
|
||
"cmd" => '\u{e70f}',
|
||
"sh" => '\u{f489}',
|
||
"bash" => '\u{f489}',
|
||
"zsh" => '\u{f489}',
|
||
"fish" => '\u{f489}',
|
||
"csh" => '\u{f489}',
|
||
"ini" => '\u{e615}',
|
||
"toml" => '\u{e615}',
|
||
"cfg" => '\u{e615}',
|
||
"conf" => '\u{e615}',
|
||
"apk" => '\u{e70e}',
|
||
"ttf" => '\u{f031}',
|
||
"woff" => '\u{f031}',
|
||
"woff2" => '\u{f031}',
|
||
"otf" => '\u{f031}',
|
||
"csv" => '\u{f1c3}',
|
||
"tsv" => '\u{f1c3}',
|
||
"xls" => '\u{f1c3}',
|
||
"xlsx" => '\u{f1c3}',
|
||
"ods" => '\u{f1c3}',
|
||
"so" => '\u{f17c}',
|
||
"sql" => '\u{f1c0}',
|
||
"jar" => '\u{e256}',
|
||
"jad" => '\u{e256}',
|
||
"class" => '\u{e256}',
|
||
"war" => '\u{e256}',
|
||
"groovy" => '\u{e775}',
|
||
"iso" => '\u{e271}',
|
||
"lock" => '\u{f023}',
|
||
"swift" => '\u{e755}',
|
||
"nix" => '\u{f313}',
|
||
_ => '\u{f016}'
|
||
}
|
||
}
|
||
else {
|
||
'\u{f016}'
|
||
}
|
||
}
|