exa/src/output/icons.rs
Benjamin Sago 976db01b3e Prefer background colour when painting icons
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.
2020-10-24 18:29:28 +01:00

201 lines
6.7 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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, its 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}'
}
}