1
0

icons.rs 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794
  1. use ansiterm::Style;
  2. use phf::{phf_map, Map};
  3. use crate::fs::File;
  4. #[non_exhaustive]
  5. struct Icons;
  6. #[rustfmt::skip]
  7. impl Icons {
  8. const AUDIO: char = '\u{f001}'; // 
  9. const BINARY: char = '\u{eae8}'; // 
  10. const BOOK: char = '\u{e28b}'; // 
  11. const CALENDAR: char = '\u{eab0}'; // 
  12. const CLOCK: char = '\u{f43a}'; // 
  13. const COMPRESSED: char = '\u{f410}'; // 
  14. const CONFIG: char = '\u{e615}'; // 
  15. const CSS3: char = '\u{e749}'; // 
  16. const DATABASE: char = '\u{f1c0}'; // 
  17. const DIFF: char = '\u{f440}'; // 
  18. const DISK_IMAGE: char = '\u{e271}'; // 
  19. const DOCKER: char = '\u{e650}'; // 
  20. const DOCUMENT: char = '\u{f1c2}'; // 
  21. const DOWNLOAD: char = '\u{f01da}'; // 󰇚
  22. const EMACS: char = '\u{e632}'; // 
  23. const ESLINT: char = '\u{e655}'; // 
  24. const FILE: char = '\u{f15b}'; // 
  25. const FILE_OUTLINE: char = '\u{f016}'; // 
  26. const FOLDER: char = '\u{e5ff}'; // 
  27. const FOLDER_CONFIG: char = '\u{e5fc}'; // 
  28. const FOLDER_GIT: char = '\u{e5fb}'; // 
  29. const FOLDER_GITHUB: char = '\u{e5fd}'; // 
  30. const FOLDER_HIDDEN: char = '\u{f179e}'; // 󱞞
  31. const FOLDER_KEY: char = '\u{f08ac}'; // 󰢬
  32. const FOLDER_NPM: char = '\u{e5fa}'; // 
  33. const FOLDER_OPEN: char = '\u{f115}'; // 
  34. const FONT: char = '\u{f031}'; // 
  35. const GIST_SECRET: char = '\u{eafa}'; // 
  36. const GIT: char = '\u{f1d3}'; // 
  37. const GRADLE: char = '\u{e660}'; // 
  38. const GRUNT: char = '\u{e611}'; // 
  39. const GULP: char = '\u{e610}'; // 
  40. const HTML5: char = '\u{f13b}'; // 
  41. const IMAGE: char = '\u{f1c5}'; // 
  42. const INTELLIJ: char = '\u{e7b5}'; // 
  43. const JSON: char = '\u{e60b}'; // 
  44. const KEY: char = '\u{eb11}'; // 
  45. const KEYPASS: char = '\u{f23e}'; // 
  46. const LANG_ASSEMBLY: char = '\u{e637}'; // 
  47. const LANG_C: char = '\u{e61e}'; // 
  48. const LANG_CPP: char = '\u{e61d}'; // 
  49. const LANG_CSHARP: char = '\u{f031b}'; // 󰌛
  50. const LANG_D: char = '\u{e7af}'; // 
  51. const LANG_ELIXIR: char = '\u{e62d}'; // 
  52. const LANG_FSHARP: char = '\u{e7a7}'; // 
  53. const LANG_FORTRAN: char = '\u{f121a}'; // 󱈚
  54. const LANG_GO: char = '\u{e65e}'; // 
  55. const LANG_GROOVY: char = '\u{e775}'; // 
  56. const LANG_HASKELL: char = '\u{e777}'; // 
  57. const LANG_JAVA: char = '\u{e256}'; // 
  58. const LANG_JAVASCRIPT: char = '\u{e74e}'; // 
  59. const LANG_KOTLIN: char = '\u{e634}'; // 
  60. const LANG_OCAML: char = '\u{e67a}'; // 
  61. const LANG_PERL: char = '\u{e67e}'; // 
  62. const LANG_PHP: char = '\u{e73d}'; // 
  63. const LANG_PYTHON: char = '\u{e606}'; // 
  64. const LANG_R: char = '\u{e68a}'; // 
  65. const LANG_RUBY: char = '\u{e21e}'; // 
  66. const LANG_RUBYRAILS: char = '\u{e73b}'; // 
  67. const LANG_RUST: char = '\u{e68b}'; // 
  68. const LANG_SASS: char = '\u{e603}'; // 
  69. const LANG_STYLUS: char = '\u{e600}'; // 
  70. const LANG_TEX: char = '\u{e69b}'; // 
  71. const LANG_TYPESCRIPT: char = '\u{e628}'; // 
  72. const LANG_V: char = '\u{e6ac}'; // 
  73. const LIBRARY: char = '\u{eb9c}'; // 
  74. const LICENSE: char = '\u{f02d}'; // 
  75. const LOCK: char = '\u{f023}'; // 
  76. const MAKE: char = '\u{e673}'; // 
  77. const MARKDOWN: char = '\u{f48a}'; // 
  78. const MUSTACHE: char = '\u{e60f}'; // 
  79. const NODEJS: char = '\u{e718}'; // 
  80. const NPM: char = '\u{e71e}'; // 
  81. const OS_ANDROID: char = '\u{e70e}'; // 
  82. const OS_APPLE: char = '\u{f179}'; // 
  83. const OS_LINUX: char = '\u{f17c}'; // 
  84. const OS_WINDOWS: char = '\u{f17a}'; // 
  85. const OS_WINDOWS_CMD: char = '\u{ebc4}'; // 
  86. const PLAYLIST: char = '\u{f0cb9}'; // 󰲹
  87. const POWERSHELL: char = '\u{ebc7}'; // 
  88. const PRIVATE_KEY: char = '\u{f0306}'; // 󰌆
  89. const PUBLIC_KEY: char = '\u{f0dd6}'; // 󰷖
  90. const RAZOR: char = '\u{f1fa}'; // 
  91. const REACT: char = '\u{e7ba}'; // 
  92. const README: char = '\u{f00ba}'; // 󰂺
  93. const SHEET: char = '\u{f1c3}'; // 
  94. const SHELL: char = '\u{f1183}'; // 󱆃
  95. const SHELL_CMD: char = '\u{f489}'; // 
  96. const SHIELD_CHECK: char = '\u{f0565}'; // 󰕥
  97. const SHIELD_KEY: char = '\u{f0bc4}'; // 󰯄
  98. const SHIELD_LOCK: char = '\u{f099d}'; // 󰦝
  99. const SIGNED_FILE: char = '\u{f19c3}'; // 󱧃
  100. const SLIDE: char = '\u{f1c4}'; // 
  101. const SUBLIME: char = '\u{e7aa}'; // 
  102. const SUBTITLE: char = '\u{f0a16}'; // 󰨖
  103. const TERRAFORM: char = '\u{f1062}'; // 󱁢
  104. const TEXT: char = '\u{f15c}'; // 
  105. const TYPST: char = '\u{1D42D}'; // 𝐭
  106. const UNITY: char = '\u{e721}'; // 
  107. const VECTOR: char = '\u{f0559}'; // 󰕙
  108. const VIDEO: char = '\u{f03d}'; // 
  109. const VIM: char = '\u{e7c5}'; // 
  110. const WRENCH: char = '\u{f0ad}'; // 
  111. const XML: char = '\u{f05c0}'; // 󰗀
  112. const YAML: char = '\u{e6a8}'; // 
  113. const YARN: char = '\u{e6a7}'; // 
  114. }
  115. /// Mapping from full filenames to directory icon. This mapping should contain
  116. /// all the directories that have a custom icon.
  117. const DIRECTORY_ICONS: Map<&'static str, char> = phf_map! {
  118. ".config" => Icons::FOLDER_CONFIG, // 
  119. ".git" => Icons::FOLDER_GIT, // 
  120. ".github" => Icons::FOLDER_GITHUB, // 
  121. ".npm" => Icons::FOLDER_NPM, // 
  122. ".ssh" => Icons::FOLDER_KEY, // 󰢬
  123. ".Trash" => '\u{f1f8}', // 
  124. "config" => Icons::FOLDER_CONFIG, // 
  125. "Contacts" => '\u{f024c}', // 󰉌
  126. "cron.d" => Icons::FOLDER_CONFIG, // 
  127. "cron.daily" => Icons::FOLDER_CONFIG, // 
  128. "cron.hourly" => Icons::FOLDER_CONFIG, // 
  129. "cron.monthly" => Icons::FOLDER_CONFIG, // 
  130. "cron.weekly" => Icons::FOLDER_CONFIG, // 
  131. "Desktop" => '\u{f108}', // 
  132. "Downloads" => '\u{f024d}', // 󰉍
  133. "etc" => Icons::FOLDER_CONFIG, // 
  134. "Favorites" => '\u{f069d}', // 󰚝
  135. "hidden" => Icons::FOLDER_HIDDEN, // 󱞞
  136. "home" => '\u{f10b5}', // 󱂵
  137. "include" => Icons::FOLDER_CONFIG, // 
  138. "Mail" => '\u{f01f0}', // 󰇰
  139. "Movies" => '\u{f0fce}', // 󰿎
  140. "Music" => '\u{f1359}', // 󱍙
  141. "node_modules" => Icons::FOLDER_NPM, // 
  142. "npm_cache" => Icons::FOLDER_NPM, // 
  143. "pam.d" => Icons::FOLDER_KEY, // 󰢬
  144. "Pictures" => '\u{f024f}', // 󰉏
  145. "ssh" => Icons::FOLDER_KEY, // 󰢬
  146. "sudoers.d" => Icons::FOLDER_KEY, // 󰢬
  147. "Videos" => '\u{f03d}', // 
  148. "xbps.d" => Icons::FOLDER_CONFIG, // 
  149. "xorg.conf.d" => Icons::FOLDER_CONFIG, // 
  150. };
  151. /// Mapping from full filenames to file icon. This mapping should also contain
  152. /// all the "dot" files that have a custom icon.
  153. const FILENAME_ICONS: Map<&'static str, char> = phf_map! {
  154. ".atom" => '\u{e764}', // 
  155. ".bashrc" => Icons::SHELL, // 󱆃
  156. ".bash_history" => Icons::SHELL, // 󱆃
  157. ".bash_logout" => Icons::SHELL, // 󱆃
  158. ".bash_profile" => Icons::SHELL, // 󱆃
  159. ".CFUserTextEncoding" => Icons::OS_APPLE, // 
  160. ".clang-format" => Icons::CONFIG, // 
  161. ".cshrc" => Icons::SHELL, // 󱆃
  162. ".DS_Store" => Icons::OS_APPLE, // 
  163. ".emacs" => Icons::EMACS, // 
  164. ".eslintrc.cjs" => Icons::ESLINT, // 
  165. ".eslintrc.js" => Icons::ESLINT, // 
  166. ".eslintrc.json" => Icons::ESLINT, // 
  167. ".eslintrc.yaml" => Icons::ESLINT, // 
  168. ".eslintrc.yml" => Icons::ESLINT, // 
  169. ".gitattributes" => Icons::GIT, // 
  170. ".gitconfig" => Icons::GIT, // 
  171. ".gitignore" => Icons::GIT, // 
  172. ".gitignore_global" => Icons::GIT, // 
  173. ".gitlab-ci.yml" => '\u{f296}', // 
  174. ".gitmodules" => Icons::GIT, // 
  175. ".htaccess" => Icons::CONFIG, // 
  176. ".htpasswd" => Icons::CONFIG, // 
  177. ".idea" => Icons::INTELLIJ, // 
  178. ".ideavimrc" => Icons::VIM, // 
  179. ".inputrc" => Icons::CONFIG, // 
  180. ".kshrc" => Icons::SHELL, // 󱆃
  181. ".login" => Icons::SHELL, // 󱆃
  182. ".logout" => Icons::SHELL, // 󱆃
  183. ".mailmap" => Icons::GIT, // 
  184. ".node_repl_history" => Icons::NODEJS, // 
  185. ".npmignore" => Icons::NPM, // 
  186. ".npmrc" => Icons::NPM, // 
  187. ".profile" => Icons::SHELL, // 󱆃
  188. ".python_history" => Icons::LANG_PYTHON, // 
  189. ".rustfmt.toml" => Icons::LANG_RUST, // 
  190. ".rvm" => Icons::LANG_RUBY, // 
  191. ".rvmrc" => Icons::LANG_RUBY, // 
  192. ".tcshrc" => Icons::SHELL, // 󱆃
  193. ".viminfo" => Icons::VIM, // 
  194. ".vimrc" => Icons::VIM, // 
  195. ".Xauthority" => Icons::CONFIG, // 
  196. ".xinitrc" => Icons::CONFIG, // 
  197. ".Xresources" => Icons::CONFIG, // 
  198. ".yarnrc" => Icons::YARN, // 
  199. ".zlogin" => Icons::SHELL, // 󱆃
  200. ".zlogout" => Icons::SHELL, // 󱆃
  201. ".zprofile" => Icons::SHELL, // 󱆃
  202. ".zshenv" => Icons::SHELL, // 󱆃
  203. ".zshrc" => Icons::SHELL, // 󱆃
  204. ".zsh_history" => Icons::SHELL, // 󱆃
  205. ".zsh_sessions" => Icons::SHELL, // 󱆃
  206. "._DS_Store" => Icons::OS_APPLE, // 
  207. "a.out" => Icons::SHELL_CMD, // 
  208. "authorized_keys" => '\u{f08c0}', // 󰣀
  209. "bashrc" => Icons::SHELL, // 󱆃
  210. "bspwmrc" => Icons::CONFIG, // 
  211. "build.gradle.kts" => Icons::GRADLE, // 
  212. "Cargo.lock" => Icons::LANG_RUST, // 
  213. "Cargo.toml" => Icons::LANG_RUST, // 
  214. "CMakeLists.txt" => Icons::MAKE, // 
  215. "composer.json" => Icons::LANG_PHP, // 
  216. "composer.lock" => Icons::LANG_PHP, // 
  217. "config" => Icons::CONFIG, // 
  218. "config.status" => Icons::CONFIG, // 
  219. "configure" => Icons::WRENCH, // 
  220. "configure.ac" => Icons::CONFIG, // 
  221. "configure.in" => Icons::CONFIG, // 
  222. "constraints.txt" => Icons::LANG_PYTHON, // 
  223. "COPYING" => Icons::LICENSE, // 
  224. "COPYRIGHT" => Icons::LICENSE, // 
  225. "crontab" => Icons::CONFIG, // 
  226. "crypttab" => Icons::CONFIG, // 
  227. "csh.cshrc" => Icons::SHELL, // 󱆃
  228. "csh.login" => Icons::SHELL, // 󱆃
  229. "csh.logout" => Icons::SHELL, // 󱆃
  230. "docker-compose.yml" => Icons::DOCKER, // 
  231. "Dockerfile" => Icons::DOCKER, // 
  232. "dune" => Icons::LANG_OCAML, // 
  233. "dune-project" => Icons::WRENCH, // 
  234. "Earthfile" => '\u{f0ac}', // 
  235. "environment" => Icons::CONFIG, // 
  236. "GNUmakefile" => Icons::MAKE, // 
  237. "go.mod" => Icons::LANG_GO, // 
  238. "go.sum" => Icons::LANG_GO, // 
  239. "go.work" => Icons::LANG_GO, // 
  240. "gradle" => Icons::GRADLE, // 
  241. "gradle.properties" => Icons::GRADLE, // 
  242. "gradlew" => Icons::GRADLE, // 
  243. "gradlew.bat" => Icons::GRADLE, // 
  244. "group" => Icons::LOCK, // 
  245. "gruntfile.coffee" => Icons::GRUNT, // 
  246. "gruntfile.js" => Icons::GRUNT, // 
  247. "gruntfile.ls" => Icons::GRUNT, // 
  248. "gshadow" => Icons::LOCK, // 
  249. "gulpfile.coffee" => Icons::GULP, // 
  250. "gulpfile.js" => Icons::GULP, // 
  251. "gulpfile.ls" => Icons::GULP, // 
  252. "heroku.yml" => '\u{e77b}', // 
  253. "hostname" => Icons::CONFIG, // 
  254. "id_dsa" => Icons::PRIVATE_KEY, // 󰌆
  255. "id_ecdsa" => Icons::PRIVATE_KEY, // 󰌆
  256. "id_ecdsa_sk" => Icons::PRIVATE_KEY, // 󰌆
  257. "id_ed25519" => Icons::PRIVATE_KEY, // 󰌆
  258. "id_ed25519_sk" => Icons::PRIVATE_KEY, // 󰌆
  259. "id_rsa" => Icons::PRIVATE_KEY, // 󰌆
  260. "inputrc" => Icons::CONFIG, // 
  261. "Jenkinsfile" => '\u{e66e}', // 
  262. "jsconfig.json" => Icons::LANG_JAVASCRIPT,// 
  263. "Justfile" => Icons::WRENCH, // 
  264. "known_hosts" => '\u{f08c0}', // 󰣀
  265. "LICENCE" => Icons::LICENSE, // 
  266. "LICENCE.md" => Icons::LICENSE, // 
  267. "LICENCE.txt" => Icons::LICENSE, // 
  268. "LICENSE" => Icons::LICENSE, // 
  269. "LICENSE-APACHE" => Icons::LICENSE, // 
  270. "LICENSE-MIT" => Icons::LICENSE, // 
  271. "LICENSE.md" => Icons::LICENSE, // 
  272. "LICENSE.txt" => Icons::LICENSE, // 
  273. "localized" => Icons::OS_APPLE, // 
  274. "localtime" => Icons::CLOCK, // 
  275. "Makefile" => Icons::MAKE, // 
  276. "makefile" => Icons::MAKE, // 
  277. "Makefile.ac" => Icons::MAKE, // 
  278. "Makefile.am" => Icons::MAKE, // 
  279. "Makefile.in" => Icons::MAKE, // 
  280. "MANIFEST" => Icons::LANG_PYTHON, // 
  281. "MANIFEST.in" => Icons::LANG_PYTHON, // 
  282. "npm-shrinkwrap.json" => Icons::NPM, // 
  283. "npmrc" => Icons::NPM, // 
  284. "package-lock.json" => Icons::NPM, // 
  285. "package.json" => Icons::NPM, // 
  286. "passwd" => Icons::LOCK, // 
  287. "php.ini" => Icons::LANG_PHP, // 
  288. "PKGBUILD" => '\u{f303}', // 
  289. "pom.xml" => '\u{e674}', // 
  290. "Procfile" => '\u{e77b}', // 
  291. "profile" => Icons::SHELL, // 󱆃
  292. "pyproject.toml" => Icons::LANG_PYTHON, // 
  293. "Rakefile" => Icons::LANG_RUBY, // 
  294. "README" => Icons::README, // 󰂺
  295. "release.toml" => Icons::LANG_RUST, // 
  296. "requirements.txt" => Icons::LANG_PYTHON, // 
  297. "robots.txt" => '\u{f06a9}', // 󰚩
  298. "rubydoc" => Icons::LANG_RUBYRAILS, // 
  299. "rvmrc" => Icons::LANG_RUBY, // 
  300. "settings.gradle.kts" => Icons::GRADLE, // 
  301. "shadow" => Icons::LOCK, // 
  302. "shells" => Icons::CONFIG, // 
  303. "sudoers" => Icons::LOCK, // 
  304. "timezone" => Icons::CLOCK, // 
  305. "tsconfig.json" => Icons::LANG_TYPESCRIPT,// 
  306. "Vagrantfile" => '\u{2371}', // ⍱
  307. "webpack.config.js" => '\u{f072b}', // 󰜫
  308. "yarn.lock" => Icons::YARN, // 
  309. "zlogin" => Icons::SHELL, // 󱆃
  310. "zlogout" => Icons::SHELL, // 󱆃
  311. "zprofile" => Icons::SHELL, // 󱆃
  312. "zshenv" => Icons::SHELL, // 󱆃
  313. "zshrc" => Icons::SHELL, // 󱆃
  314. };
  315. /// Mapping from lowercase file extension to icons. If an image, video, or audio extension is add
  316. /// also update the extension filetype map.
  317. const EXTENSION_ICONS: Map<&'static str, char> = phf_map! {
  318. "7z" => Icons::COMPRESSED, // 
  319. "a" => Icons::OS_LINUX, // 
  320. "acc" => Icons::AUDIO, // 
  321. "acf" => '\u{f1b6}', // 
  322. "ai" => '\u{e7b4}', // 
  323. "aif" => Icons::AUDIO, // 
  324. "aifc" => Icons::AUDIO, // 
  325. "aiff" => Icons::AUDIO, // 
  326. "alac" => Icons::AUDIO, // 
  327. "android" => Icons::OS_ANDROID, // 
  328. "ape" => Icons::AUDIO, // 
  329. "apk" => Icons::OS_ANDROID, // 
  330. "apple" => Icons::OS_APPLE, // 
  331. "ar" => Icons::COMPRESSED, // 
  332. "arj" => Icons::COMPRESSED, // 
  333. "arw" => Icons::IMAGE, // 
  334. "asc" => Icons::SHIELD_LOCK, // 󰦝
  335. "asm" => Icons::LANG_ASSEMBLY, // 
  336. "asp" => '\u{f121}', // 
  337. "avi" => Icons::VIDEO, // 
  338. "avif" => Icons::IMAGE, // 
  339. "avro" => Icons::JSON, // 
  340. "awk" => Icons::SHELL_CMD, // 
  341. "bash" => Icons::SHELL_CMD, // 
  342. "bat" => Icons::OS_WINDOWS_CMD, // 
  343. "bats" => Icons::SHELL_CMD, // 
  344. "bdf" => Icons::FONT, // 
  345. "bib" => Icons::LANG_TEX, // 
  346. "bin" => Icons::BINARY, // 
  347. "bmp" => Icons::IMAGE, // 
  348. "br" => Icons::COMPRESSED, // 
  349. "bst" => Icons::LANG_TEX, // 
  350. "bundle" => Icons::OS_APPLE, // 
  351. "bz" => Icons::COMPRESSED, // 
  352. "bz2" => Icons::COMPRESSED, // 
  353. "bz3" => Icons::COMPRESSED, // 
  354. "c" => Icons::LANG_C, // 
  355. "c++" => Icons::LANG_CPP, // 
  356. "cab" => Icons::OS_WINDOWS, // 
  357. "cbr" => Icons::IMAGE, // 
  358. "cbz" => Icons::IMAGE, // 
  359. "cc" => Icons::LANG_CPP, // 
  360. "cert" => Icons::GIST_SECRET, // 
  361. "cfg" => Icons::CONFIG, // 
  362. "cjs" => Icons::LANG_JAVASCRIPT, // 
  363. "class" => Icons::LANG_JAVA, // 
  364. "clj" => '\u{e768}', // 
  365. "cljs" => '\u{e76a}', // 
  366. "cls" => Icons::LANG_TEX, // 
  367. "cmake" => Icons::MAKE, // 
  368. "cmd" => Icons::OS_WINDOWS, // 
  369. "coffee" => '\u{f0f4}', // 
  370. "com" => Icons::OS_WINDOWS_CMD, // 
  371. "conf" => Icons::CONFIG, // 
  372. "config" => Icons::CONFIG, // 
  373. "cp" => Icons::LANG_CPP, // 
  374. "cpio" => Icons::COMPRESSED, // 
  375. "cpp" => Icons::LANG_CPP, // 
  376. "cr" => '\u{e62f}', // 
  377. "cr2" => Icons::IMAGE, // 
  378. "crdownload" => Icons::DOWNLOAD, // 󰇚
  379. "crt" => Icons::GIST_SECRET, // 
  380. "cs" => Icons::LANG_CSHARP, // 󰌛
  381. "csh" => Icons::SHELL_CMD, // 
  382. "cshtml" => Icons::RAZOR, // 
  383. "csproj" => Icons::LANG_CSHARP, // 󰌛
  384. "css" => Icons::CSS3, // 
  385. "csv" => Icons::SHEET, // 
  386. "csx" => Icons::LANG_CSHARP, // 󰌛
  387. "cts" => Icons::LANG_TYPESCRIPT, // 
  388. "cu" => '\u{e64b}', // 
  389. "cue" => Icons::PLAYLIST, // 󰲹
  390. "cxx" => Icons::LANG_CPP, // 
  391. "d" => Icons::LANG_D, // 
  392. "dart" => '\u{e798}', // 
  393. "db" => Icons::DATABASE, // 
  394. "deb" => '\u{e77d}', // 
  395. "desktop" => '\u{ebd1}', // 
  396. "di" => Icons::LANG_D, // 
  397. "diff" => Icons::DIFF, // 
  398. "djv" => Icons::DOCUMENT, // 
  399. "djvu" => Icons::DOCUMENT, // 
  400. "dll" => Icons::LIBRARY, // 
  401. "dmg" => Icons::DISK_IMAGE, // 
  402. "doc" => Icons::DOCUMENT, // 
  403. "docx" => Icons::DOCUMENT, // 
  404. "dot" => '\u{f1049}', // 󱁉
  405. "download" => Icons::DOWNLOAD, // 󰇚
  406. "drawio" => '\u{ebba}', // 
  407. "dump" => Icons::DATABASE, // 
  408. "dvi" => Icons::IMAGE, // 
  409. "dylib" => Icons::OS_APPLE, // 
  410. "ebook" => Icons::BOOK, // 
  411. "ebuild" => '\u{f30d}', // 
  412. "editorconfig" => Icons::CONFIG, // 
  413. "ejs" => '\u{e618}', // 
  414. "el" => Icons::EMACS, // 
  415. "elc" => Icons::EMACS, // 
  416. "elm" => '\u{e62c}', // 
  417. "eml" => '\u{f003}', // 
  418. "env" => '\u{f462}', // 
  419. "eot" => Icons::FONT, // 
  420. "eps" => Icons::VECTOR, // 󰕙
  421. "epub" => Icons::BOOK, // 
  422. "erb" => Icons::LANG_RUBYRAILS, // 
  423. "erl" => '\u{e7b1}', // 
  424. "ex" => Icons::LANG_ELIXIR, // 
  425. "exe" => Icons::OS_WINDOWS_CMD, // 
  426. "exs" => Icons::LANG_ELIXIR, // 
  427. "f" => Icons::LANG_FORTRAN, // 󱈚
  428. "f90" => Icons::LANG_FORTRAN, // 󱈚
  429. "fdmdownload" => Icons::DOWNLOAD, // 󰇚
  430. "fish" => Icons::SHELL_CMD, // 
  431. "flac" => Icons::AUDIO, // 
  432. "flv" => Icons::VIDEO, // 
  433. "fnt" => Icons::FONT, // 
  434. "fon" => Icons::FONT, // 
  435. "font" => Icons::FONT, // 
  436. "for" => Icons::LANG_FORTRAN, // 󱈚
  437. "fs" => Icons::LANG_FSHARP, // 
  438. "fsi" => Icons::LANG_FSHARP, // 
  439. "fsx" => Icons::LANG_FSHARP, // 
  440. "gdoc" => Icons::DOCUMENT, // 
  441. "gem" => Icons::LANG_RUBY, // 
  442. "gemfile" => Icons::LANG_RUBY, // 
  443. "gemspec" => Icons::LANG_RUBY, // 
  444. "gform" => '\u{f298}', // 
  445. "gif" => Icons::IMAGE, // 
  446. "git" => Icons::GIT, // 
  447. "go" => Icons::LANG_GO, // 
  448. "gpg" => Icons::SHIELD_LOCK, // 󰦝
  449. "gradle" => Icons::GRADLE, // 
  450. "groovy" => Icons::LANG_GROOVY, // 
  451. "gsheet" => Icons::SHEET, // 
  452. "gslides" => Icons::SLIDE, // 
  453. "guardfile" => Icons::LANG_RUBY, // 
  454. "gv" => '\u{f1049}', // 󱁉
  455. "gvy" => Icons::LANG_GROOVY, // 
  456. "gz" => Icons::COMPRESSED, // 
  457. "h" => Icons::LANG_C, // 
  458. "h++" => Icons::LANG_CPP, // 
  459. "h264" => Icons::VIDEO, // 
  460. "haml" => '\u{e664}', // 
  461. "hbs" => Icons::MUSTACHE, // 
  462. "heic" => Icons::IMAGE, // 
  463. "heics" => Icons::VIDEO, // 
  464. "heif" => Icons::IMAGE, // 
  465. "hpp" => Icons::LANG_CPP, // 
  466. "hs" => Icons::LANG_HASKELL, // 
  467. "htm" => Icons::HTML5, // 
  468. "html" => Icons::HTML5, // 
  469. "hxx" => Icons::LANG_CPP, // 
  470. "ical" => Icons::CALENDAR, // 
  471. "icalendar" => Icons::CALENDAR, // 
  472. "ico" => Icons::IMAGE, // 
  473. "ics" => Icons::CALENDAR, // 
  474. "ifb" => Icons::CALENDAR, // 
  475. "image" => Icons::DISK_IMAGE, // 
  476. "img" => Icons::DISK_IMAGE, // 
  477. "iml" => Icons::INTELLIJ, // 
  478. "inl" => Icons::LANG_C, // 
  479. "ini" => Icons::CONFIG, // 
  480. "ipynb" => '\u{e678}', // 
  481. "iso" => Icons::DISK_IMAGE, // 
  482. "j2c" => Icons::IMAGE, // 
  483. "j2k" => Icons::IMAGE, // 
  484. "jad" => Icons::LANG_JAVA, // 
  485. "jar" => Icons::LANG_JAVA, // 
  486. "java" => Icons::LANG_JAVA, // 
  487. "jfi" => Icons::IMAGE, // 
  488. "jfif" => Icons::IMAGE, // 
  489. "jif" => Icons::IMAGE, // 
  490. "jl" => '\u{e624}', // 
  491. "jmd" => Icons::MARKDOWN, // 
  492. "jp2" => Icons::IMAGE, // 
  493. "jpe" => Icons::IMAGE, // 
  494. "jpeg" => Icons::IMAGE, // 
  495. "jpf" => Icons::IMAGE, // 
  496. "jpg" => Icons::IMAGE, // 
  497. "jpx" => Icons::IMAGE, // 
  498. "js" => Icons::LANG_JAVASCRIPT, // 
  499. "json" => Icons::JSON, // 
  500. "jsx" => Icons::REACT, // 
  501. "jxl" => Icons::IMAGE, // 
  502. "kbx" => Icons::SHIELD_KEY, // 󰯄
  503. "kdb" => Icons::KEYPASS, // 
  504. "kdbx" => Icons::KEYPASS, // 
  505. "key" => Icons::KEY, // 
  506. "ko" => Icons::OS_LINUX, // 
  507. "ksh" => Icons::SHELL_CMD, // 
  508. "kt" => Icons::LANG_KOTLIN, // 
  509. "kts" => Icons::LANG_KOTLIN, // 
  510. "latex" => Icons::LANG_TEX, // 
  511. "ldb" => Icons::DATABASE, // 
  512. "less" => '\u{e758}', // 
  513. "lhs" => Icons::LANG_HASKELL, // 
  514. "lib" => Icons::LIBRARY, // 
  515. "license" => Icons::LICENSE, // 
  516. "lisp" => '\u{f0172}', // 󰅲
  517. "localized" => Icons::OS_APPLE, // 
  518. "lock" => Icons::LOCK, // 
  519. "log" => '\u{f18d}', // 
  520. "ltx" => Icons::LANG_TEX, // 
  521. "lua" => '\u{e620}', // 
  522. "lz" => Icons::COMPRESSED, // 
  523. "lz4" => Icons::COMPRESSED, // 
  524. "lzh" => Icons::COMPRESSED, // 
  525. "lzma" => Icons::COMPRESSED, // 
  526. "lzo" => Icons::COMPRESSED, // 
  527. "m" => Icons::LANG_C, // 
  528. "m2ts" => Icons::VIDEO, // 
  529. "m2v" => Icons::VIDEO, // 
  530. "m3u" => Icons::PLAYLIST, // 󰲹
  531. "m3u8" => Icons::PLAYLIST, // 󰲹
  532. "m4a" => Icons::AUDIO, // 
  533. "m4v" => Icons::VIDEO, // 
  534. "magnet" => '\u{f076}', // 
  535. "markdown" => Icons::MARKDOWN, // 
  536. "md" => Icons::MARKDOWN, // 
  537. "md5" => Icons::SHIELD_CHECK, // 󰕥
  538. "mdb" => Icons::DATABASE, // 
  539. "mid" => '\u{f08f2}', // 󰣲
  540. "mjs" => Icons::LANG_JAVASCRIPT, // 
  541. "mk" => Icons::MAKE, // 
  542. "mka" => Icons::AUDIO, // 
  543. "mkd" => Icons::MARKDOWN, // 
  544. "mkv" => Icons::VIDEO, // 
  545. "ml" => Icons::LANG_OCAML, // 
  546. "mli" => Icons::LANG_OCAML, // 
  547. "mll" => Icons::LANG_OCAML, // 
  548. "mly" => Icons::LANG_OCAML, // 
  549. "mm" => Icons::LANG_CPP, // 
  550. "mobi" => Icons::BOOK, // 
  551. "mov" => Icons::VIDEO, // 
  552. "mp2" => Icons::AUDIO, // 
  553. "mp3" => Icons::AUDIO, // 
  554. "mp4" => Icons::VIDEO, // 
  555. "mpeg" => Icons::VIDEO, // 
  556. "mpg" => Icons::VIDEO, // 
  557. "msi" => Icons::OS_WINDOWS, // 
  558. "mts" => Icons::LANG_TYPESCRIPT, // 
  559. "mustache" => Icons::MUSTACHE, // 
  560. "nef" => Icons::IMAGE, // 
  561. "ninja" => '\u{f0774}', // 󰝴
  562. "nix" => '\u{f313}', // 
  563. "node" => Icons::NODEJS, // 
  564. "o" => Icons::BINARY, // 
  565. "odp" => Icons::SLIDE, // 
  566. "ods" => Icons::SHEET, // 
  567. "odt" => Icons::DOCUMENT, // 
  568. "ogg" => Icons::AUDIO, // 
  569. "ogm" => Icons::VIDEO, // 
  570. "ogv" => Icons::VIDEO, // 
  571. "opus" => Icons::AUDIO, // 
  572. "orf" => Icons::IMAGE, // 
  573. "org" => '\u{e633}', // 
  574. "otf" => Icons::FONT, // 
  575. "out" => '\u{eb2c}', // 
  576. "p12" => Icons::KEY, // 
  577. "par" => Icons::COMPRESSED, // 
  578. "part" => Icons::DOWNLOAD, // 󰇚
  579. "patch" => Icons::DIFF, // 
  580. "pbm" => Icons::IMAGE, // 
  581. "pcm" => Icons::AUDIO, // 
  582. "pdf" => '\u{f1c1}', // 
  583. "pem" => Icons::KEY, // 
  584. "pfx" => Icons::KEY, // 
  585. "pgm" => Icons::IMAGE, // 
  586. "phar" => Icons::LANG_PHP, // 
  587. "php" => Icons::LANG_PHP, // 
  588. "pkg" => '\u{eb29}', // 
  589. "pl" => Icons::LANG_PERL, // 
  590. "plist" => Icons::OS_APPLE, // 
  591. "plx" => Icons::LANG_PERL, // 
  592. "pm" => Icons::LANG_PERL, // 
  593. "png" => Icons::IMAGE, // 
  594. "pnm" => Icons::IMAGE, // 
  595. "pod" => Icons::LANG_PERL, // 
  596. "pp" => '\u{e631}', // 
  597. "ppm" => Icons::IMAGE, // 
  598. "pps" => Icons::SLIDE, // 
  599. "ppsx" => Icons::SLIDE, // 
  600. "ppt" => Icons::SLIDE, // 
  601. "pptx" => Icons::SLIDE, // 
  602. "properties" => Icons::JSON, // 
  603. "prql" => Icons::DATABASE, // 
  604. "ps" => Icons::VECTOR, // 󰕙
  605. "ps1" => Icons::POWERSHELL, // 
  606. "psd" => '\u{e7b8}', // 
  607. "psd1" => Icons::POWERSHELL, // 
  608. "psf" => Icons::FONT, // 
  609. "psm1" => Icons::POWERSHELL, // 
  610. "pub" => Icons::PUBLIC_KEY, // 󰷖
  611. "purs" => '\u{e630}', // 
  612. "pxm" => Icons::IMAGE, // 
  613. "py" => Icons::LANG_PYTHON, // 
  614. "pyc" => Icons::LANG_PYTHON, // 
  615. "pyd" => Icons::LANG_PYTHON, // 
  616. "pyi" => Icons::LANG_PYTHON, // 
  617. "pyo" => Icons::LANG_PYTHON, // 
  618. "qcow" => Icons::DISK_IMAGE, // 
  619. "qcow2" => Icons::DISK_IMAGE, // 
  620. "r" => Icons::LANG_R, // 
  621. "rar" => Icons::COMPRESSED, // 
  622. "raw" => Icons::IMAGE, // 
  623. "razor" => Icons::RAZOR, // 
  624. "rb" => Icons::LANG_RUBY, // 
  625. "rdata" => Icons::LANG_R, // 
  626. "rdb" => '\u{e76d}', // 
  627. "rdoc" => Icons::MARKDOWN, // 
  628. "rds" => Icons::LANG_R, // 
  629. "readme" => Icons::README, // 󰂺
  630. "rlib" => Icons::LANG_RUST, // 
  631. "rmd" => Icons::MARKDOWN, // 
  632. "rmeta" => Icons::LANG_RUST, // 
  633. "rpm" => '\u{e7bb}', // 
  634. "rs" => Icons::LANG_RUST, // 
  635. "rspec" => Icons::LANG_RUBY, // 
  636. "rspec_parallel" => Icons::LANG_RUBY, // 
  637. "rspec_status" => Icons::LANG_RUBY, // 
  638. "rss" => '\u{f09e}', // 
  639. "rst" => Icons::TEXT, // 
  640. "rtf" => Icons::TEXT, // 
  641. "ru" => Icons::LANG_RUBY, // 
  642. "rubydoc" => Icons::LANG_RUBYRAILS, // 
  643. "s" => Icons::LANG_ASSEMBLY, // 
  644. "sass" => Icons::LANG_SASS, // 
  645. "sbt" => Icons::SUBTITLE, // 󰨖
  646. "scala" => '\u{e737}', // 
  647. "scss" => Icons::LANG_SASS, // 
  648. "service" => '\u{eba2}', // 
  649. "sh" => Icons::SHELL_CMD, // 
  650. "sha1" => Icons::SHIELD_CHECK, // 󰕥
  651. "sha224" => Icons::SHIELD_CHECK, // 󰕥
  652. "sha256" => Icons::SHIELD_CHECK, // 󰕥
  653. "sha384" => Icons::SHIELD_CHECK, // 󰕥
  654. "sha512" => Icons::SHIELD_CHECK, // 󰕥
  655. "shell" => Icons::SHELL_CMD, // 
  656. "shtml" => Icons::HTML5, // 
  657. "sig" => Icons::SIGNED_FILE, // 󱧃
  658. "signature" => Icons::SIGNED_FILE, // 󱧃
  659. "slim" => Icons::LANG_RUBYRAILS, // 
  660. "sln" => '\u{e70c}', // 
  661. "so" => Icons::OS_LINUX, // 
  662. "sql" => Icons::DATABASE, // 
  663. "sqlite3" => '\u{e7c4}', // 
  664. "srt" => Icons::SUBTITLE, // 󰨖
  665. "ssa" => Icons::SUBTITLE, // 󰨖
  666. "stl" => Icons::IMAGE, // 
  667. "sty" => Icons::LANG_TEX, // 
  668. "styl" => Icons::LANG_STYLUS, // 
  669. "stylus" => Icons::LANG_STYLUS, // 
  670. "sub" => Icons::SUBTITLE, // 󰨖
  671. "sublime-build" => Icons::SUBLIME, // 
  672. "sublime-keymap" => Icons::SUBLIME, // 
  673. "sublime-menu" => Icons::SUBLIME, // 
  674. "sublime-options"=> Icons::SUBLIME, // 
  675. "sublime-package"=> Icons::SUBLIME, // 
  676. "sublime-project"=> Icons::SUBLIME, // 
  677. "sublime-session"=> Icons::SUBLIME, // 
  678. "sublime-settings"=>Icons::SUBLIME, // 
  679. "sublime-snippet"=> Icons::SUBLIME, // 
  680. "sublime-theme" => Icons::SUBLIME, // 
  681. "svelte" => '\u{e697}', // 
  682. "svg" => Icons::VECTOR, // 󰕙
  683. "swift" => '\u{e755}', // 
  684. "t" => Icons::LANG_PERL, // 
  685. "tar" => Icons::COMPRESSED, // 
  686. "taz" => Icons::COMPRESSED, // 
  687. "tbz" => Icons::COMPRESSED, // 
  688. "tbz2" => Icons::COMPRESSED, // 
  689. "tc" => Icons::DISK_IMAGE, // 
  690. "tex" => Icons::LANG_TEX, // 
  691. "tf" => Icons::TERRAFORM, // 󱁢
  692. "tfstate" => Icons::TERRAFORM, // 󱁢
  693. "tfvars" => Icons::TERRAFORM, // 󱁢
  694. "tgz" => Icons::COMPRESSED, // 
  695. "tif" => Icons::IMAGE, // 
  696. "tiff" => Icons::IMAGE, // 
  697. "tlz" => Icons::COMPRESSED, // 
  698. "tml" => Icons::CONFIG, // 
  699. "toml" => Icons::CONFIG, // 
  700. "torrent" => '\u{e275}', // 
  701. "ts" => Icons::LANG_TYPESCRIPT, // 
  702. "tsv" => Icons::SHEET, // 
  703. "tsx" => Icons::REACT, // 
  704. "ttc" => Icons::FONT, // 
  705. "ttf" => Icons::FONT, // 
  706. "twig" => '\u{e61c}', // 
  707. "txt" => Icons::TEXT, // 
  708. "typ" => Icons::TYPST, // 𝐭
  709. "txz" => Icons::COMPRESSED, // 
  710. "tz" => Icons::COMPRESSED, // 
  711. "tzo" => Icons::COMPRESSED, // 
  712. "unity" => Icons::UNITY, // 
  713. "unity3d" => Icons::UNITY, // 
  714. "v" => Icons::LANG_V, // 
  715. "vdi" => Icons::DISK_IMAGE, // 
  716. "vhd" => Icons::DISK_IMAGE, // 
  717. "video" => Icons::VIDEO, // 
  718. "vim" => Icons::VIM, // 
  719. "vmdk" => Icons::DISK_IMAGE, // 
  720. "vob" => Icons::VIDEO, // 
  721. "vue" => '\u{f0844}', // 󰡄
  722. "war" => Icons::LANG_JAVA, // 
  723. "wav" => Icons::AUDIO, // 
  724. "webm" => Icons::VIDEO, // 
  725. "webmanifest" => Icons::JSON, // 
  726. "webp" => Icons::IMAGE, // 
  727. "whl" => Icons::LANG_PYTHON, // 
  728. "windows" => Icons::OS_WINDOWS, // 
  729. "wma" => Icons::AUDIO, // 
  730. "wmv" => Icons::VIDEO, // 
  731. "woff" => Icons::FONT, // 
  732. "woff2" => Icons::FONT, // 
  733. "wv" => Icons::AUDIO, // 
  734. "xcf" => Icons::IMAGE, // 
  735. "xhtml" => Icons::HTML5, // 
  736. "xlr" => Icons::SHEET, // 
  737. "xls" => Icons::SHEET, // 
  738. "xlsm" => Icons::SHEET, // 
  739. "xlsx" => Icons::SHEET, // 
  740. "xml" => Icons::XML, // 󰗀
  741. "xpm" => Icons::IMAGE, // 
  742. "xul" => Icons::XML, // 󰗀
  743. "xz" => Icons::COMPRESSED, // 
  744. "yaml" => Icons::YAML, // 
  745. "yml" => Icons::YAML, // 
  746. "z" => Icons::COMPRESSED, // 
  747. "zig" => '\u{e6a9}', // 
  748. "zip" => Icons::COMPRESSED, // 
  749. "zsh" => Icons::SHELL_CMD, // 
  750. "zsh-theme" => Icons::SHELL, // 󱆃
  751. "zst" => Icons::COMPRESSED, // 
  752. };
  753. /// Converts the style used to paint a file name into the style that should be
  754. /// used to paint an icon.
  755. ///
  756. /// - The background colour should be preferred to the foreground colour, as
  757. /// if one is set, it’s the more “obvious” colour choice.
  758. /// - If neither is set, just use the default style.
  759. /// - Attributes such as bold or underline should not be used to paint the
  760. /// icon, as they can make it look weird.
  761. pub fn iconify_style(style: Style) -> Style {
  762. style
  763. .background
  764. .or(style.foreground)
  765. .map(Style::from)
  766. .unwrap_or_default()
  767. }
  768. /// Lookup the icon for a file based on the file's name, if the entry is a
  769. /// directory, or by the lowercase file extension.
  770. pub fn icon_for_file(file: &File<'_>) -> char {
  771. if file.points_to_directory() {
  772. *DIRECTORY_ICONS.get(file.name.as_str()).unwrap_or_else(|| {
  773. if file.is_empty_dir() {
  774. &Icons::FOLDER_OPEN // 
  775. } else {
  776. &Icons::FOLDER // 
  777. }
  778. })
  779. } else if let Some(icon) = FILENAME_ICONS.get(file.name.as_str()) {
  780. *icon
  781. } else if let Some(ext) = file.ext.as_ref() {
  782. *EXTENSION_ICONS.get(ext.as_str()).unwrap_or(&Icons::FILE) // 
  783. } else {
  784. Icons::FILE_OUTLINE // 
  785. }
  786. }