icons.rs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. use ansi_term::Style;
  2. use phf::{phf_map, Map};
  3. use crate::fs::File;
  4. #[non_exhaustive]
  5. struct Icons;
  6. impl Icons {
  7. const AUDIO: char = '\u{f001}'; // ๏€
  8. const BINARY: char = '\u{eae8}'; // ๎ซจ
  9. const BOOK: char = '\u{e28b}'; // ๎Š‹
  10. const CALENDAR: char = '\u{eab0}'; // ๎ชฐ
  11. const COMPRESSED: char = '\u{f410}'; // ๏
  12. const CONFIG: char = '\u{e615}'; // ๎˜•
  13. const CONFIG_FOLDER: char = '\u{e5fc}'; // ๎—ผ
  14. const CSS3: char = '\u{e749}'; // ๎‰
  15. const DATABASE: char = '\u{f1c0}'; // ๎œ†
  16. const DIFF: char = '\u{f440}'; // ๏‘€
  17. const DISK_IMAGE: char = '\u{e271}'; // ๎‰ฑ
  18. const DOCKER: char = '\u{e650}'; // ๎™
  19. const DOCUMENT: char = '\u{f1c2}'; // ๏‡‚
  20. const EMACS: char = '\u{e632}'; // ๎˜ฒ
  21. const FONT: char = '\u{f031}'; // ๏€ฑ
  22. const GIST_SECRET: char = '\u{eafa}'; // ๎ซบ
  23. const GIT: char = '\u{f1d3}'; // ๏‡“
  24. const GRADLE: char = '\u{e660}'; // ๎™ 
  25. const GRUNT: char = '\u{e611}'; // ๎˜‘
  26. const GULP: char = '\u{e610}'; // ๎˜
  27. const HEADER: char = '\u{f0fd}'; // ๏ƒฝ
  28. const HTML5: char = '\u{f13b}'; // ๏„ป
  29. const IMAGE: char = '\u{f1c5}'; // ๏‡…
  30. const INTELLIJ: char = '\u{e7b5}'; // ๎žต
  31. const KEY: char = '\u{eb11}'; // ๎ฌ‘
  32. const KEYPASS: char = '\u{f23e}'; // ๏ˆพ
  33. const JSON: char = '\u{e60b}'; // ๎˜‹
  34. const LANG_ASSEMBLY: char = '\u{e637}'; // ๎˜ท
  35. const LANG_C: char = '\u{e61e}'; // ๎˜ž
  36. const LANG_CPP: char = '\u{e61d}'; // ๎˜
  37. const LANG_CSHARP: char = '\u{f031b}'; // ๓ฐŒ›
  38. const LANG_ELIXIR: char = '\u{e62d}'; // ๎˜ญ
  39. const LANG_FSHARP: char = '\u{e7a7}'; // ๎žง
  40. const LANG_GO: char = '\u{e724}'; // ๎œค
  41. const LANG_HASKELL: char = '\u{e777}'; // ๎ท
  42. const LANG_JAVA: char = '\u{e256}'; // ๎‰–
  43. const LANG_JAVASCRIPT: char = '\u{e74e}'; // ๎Ž
  44. const LANG_OCAML: char = '\u{e67a}'; // ๎™บ
  45. const LANG_PERL: char = '\u{e769}'; // ๎ฉ
  46. const LANG_PHP: char = '\u{e73d}'; // ๎œฝ
  47. const LANG_PYTHON: char = '\u{e606}'; // ๎˜†
  48. const LANG_R: char = '\u{f25d}'; // ๏‰
  49. const LANG_RUBY: char = '\u{e21e}'; // ๎ˆž
  50. const LANG_RUBYRAILS: char = '\u{e73b}'; // ๎œป
  51. const LANG_RUST: char = '\u{e7a8}'; // ๎žจ
  52. const LANG_STYLUS: char = '\u{e600}'; // ๎˜€
  53. const LANG_TEX: char = '\u{e69b}'; // ๎š›
  54. const LANG_TYPESCRIPT: char = '\u{e628}'; // ๎˜จ
  55. const LOCK: char = '\u{f023}'; // ๏€ฃ
  56. const LICENSE: char = '\u{f02d}'; // ๏€ญ
  57. const MARKDOWN: char = '\u{f48a}'; // ๏’Š
  58. const MUSTACHE: char = '\u{e60f}'; // ๎˜
  59. const NODEJS: char = '\u{e718}'; // ๎œ˜
  60. const NPM: char = '\u{e71e}'; // ๎œž
  61. const OS_APPLE: char = '\u{f179}'; // ๏…น
  62. const OS_ANDROID: char = '\u{e70e}'; // ๎œŽ
  63. const OS_LINUX: char = '\u{f17c}'; // ๏…ผ
  64. const OS_WINDOWS: char = '\u{f17a}'; // ๏…บ
  65. const OS_WINDOWS_CMD: char = '\u{ebc4}'; // ๎ฏ„
  66. const POWERSHELL: char = '\u{ebc7}'; // ๎ฏ‡
  67. const REACT: char = '\u{e7ba}'; // ๎žบ
  68. const RAZOR: char = '\u{f1fa}'; // ๏‡บ
  69. const SHEET: char = '\u{f1c3}'; // ๏‡ƒ
  70. const SHELL: char = '\u{f489}'; // ๏’‰
  71. const SLIDE: char = '\u{f1c4}'; // ๏‡„
  72. const TEXT: char = '\u{f15c}'; // ๏…œ
  73. const UNITY: char = '\u{e721}'; // ๎œก
  74. const VIDEO: char = '\u{f03d}'; // ๏€ฝ
  75. const VIM: char = '\u{e7c5}'; // ๎Ÿ…
  76. const XML: char = '\u{f05c0}'; // ๓ฐ—€
  77. const YAML: char = '\u{f481}'; // ๏’ - Find better icon
  78. }
  79. /// Mapping from full filenames to file type. This mapping should also contain all the "dot"
  80. /// files/directories that have a custom icon.
  81. const FILENAME_ICONS: Map<&'static str, char> = phf_map! {
  82. ".atom" => '\u{e764}', // ๎ค
  83. ".bashprofile" => Icons::CONFIG, // ๎˜•
  84. ".bashrc" => Icons::SHELL, // ๏’‰
  85. ".emacs" => Icons::EMACS, // ๎˜ฒ
  86. ".git" => Icons::GIT, // ๏‡“
  87. ".gitattributes" => Icons::GIT, // ๏‡“
  88. ".gitconfig" => Icons::GIT, // ๏‡“
  89. ".github" => '\u{f408}', // ๏ˆ
  90. ".gitignore" => Icons::GIT, // ๏‡“
  91. ".gitignore_global" => Icons::GIT, // ๏‡“
  92. ".gitmodules" => Icons::GIT, // ๏‡“
  93. ".idea" => Icons::INTELLIJ, // ๎žต
  94. ".rvm" => Icons::LANG_RUBY, // ๎ˆž
  95. ".Trash" => '\u{f1f8}', // ๏‡ธ
  96. ".vimrc" => Icons::VIM, // ๎Ÿ…
  97. ".vscode" => '\u{f0a1e}', // ๓ฐจž
  98. ".zshrc" => Icons::SHELL, // ๏’‰
  99. "bin" => Icons::CONFIG_FOLDER, // ๎—ผ
  100. "Cargo.lock" => Icons::LANG_RUST, // ๎žจ
  101. "config" => Icons::CONFIG_FOLDER, // ๎—ผ
  102. "docker-compose.yml" => Icons::DOCKER, // ๎™
  103. "Dockerfile" => Icons::DOCKER, // ๎™
  104. "ds_store" => Icons::OS_APPLE, // ๏…น
  105. "Earthfile" => '\u{f0ac}', // ๏‚ฌ
  106. "gitignore_global" => Icons::GIT, // ๏‡“
  107. "gitlab-ci.yml" => '\u{f296}', // ๏Š–
  108. "go.mod" => Icons::LANG_GO, // ๎œค
  109. "go.sum" => Icons::LANG_GO, // ๎œค
  110. "gradle" => Icons::GRADLE, // ๎™ 
  111. "gruntfile.coffee" => Icons::GRUNT, // ๎˜‘
  112. "gruntfile.js" => Icons::GRUNT, // ๎˜‘
  113. "gruntfile.ls" => Icons::GRUNT, // ๎˜‘
  114. "gulpfile.coffee" => Icons::GULP, // ๎˜
  115. "gulpfile.js" => Icons::GULP, // ๎˜
  116. "gulpfile.ls" => Icons::GULP, // ๎˜
  117. "hidden" => Icons::LOCK, // ๏€ฃ
  118. "include" => Icons::CONFIG_FOLDER, // ๎—ผ
  119. "lib" => '\u{f121}', // ๏„ก
  120. "LICENSE" => Icons::LICENSE, // ๏€ญ
  121. "localized" => Icons::OS_APPLE, // ๏…น
  122. "Makefile" => Icons::SHELL, // ๏’‰
  123. "node_modules" => Icons::NODEJS, // ๎œ˜
  124. "npmignore" => Icons::NPM, // ๎œž
  125. "PKGBUILD" => '\u{f303}', // ๏Œƒ
  126. "rubydoc" => Icons::LANG_RUBYRAILS, // ๎œป
  127. "Vagrantfile" => '\u{2371}', // โฑ
  128. "yarn.lock" => '\u{e6a7}', // ๎šง
  129. };
  130. /// Mapping from lowercase file extension to icons. If an image, video, or audio extension is add
  131. /// also update the extension filetype map.
  132. const EXTENSION_ICONS: Map<&'static str, char> = phf_map! {
  133. "7z" => Icons::COMPRESSED, // ๏
  134. "a" => Icons::OS_LINUX, // ๏…ผ
  135. "acc" => Icons::AUDIO, // ๏€
  136. "acf" => '\u{f1b6}', // ๏†ถ
  137. "ai" => '\u{e7b4}', // ๎žด
  138. "alac" => Icons::AUDIO, // ๏€
  139. "android" => Icons::OS_ANDROID, // ๎œŽ
  140. "ape" => Icons::AUDIO, // ๏€
  141. "apk" => Icons::OS_ANDROID, // ๎œŽ
  142. "apple" => Icons::OS_APPLE, // ๏…น
  143. "ar" => Icons::COMPRESSED, // ๏
  144. "arw" => Icons::IMAGE, // ๏‡…
  145. "asm" => Icons::LANG_ASSEMBLY, // ๎˜ท
  146. "avi" => Icons::VIDEO, // ๏€ฝ
  147. "avif" => Icons::IMAGE, // ๏‡…
  148. "avro" => Icons::JSON, // ๎˜‹
  149. "awk" => Icons::SHELL, // ๏’‰
  150. "bash" => Icons::SHELL, // ๏’‰
  151. "bashrc" => Icons::SHELL, // ๏’‰
  152. "bash_history" => Icons::SHELL, // ๏’‰
  153. "bash_profile" => Icons::SHELL, // ๏’‰
  154. "bat" => Icons::OS_WINDOWS_CMD, // ๎ฏ„
  155. "bats" => Icons::SHELL, // ๏’‰
  156. "bib" => Icons::LANG_TEX, // ๎š›
  157. "bin" => Icons::BINARY, // ๎ซจ
  158. "bmp" => Icons::IMAGE, // ๏‡…
  159. "bst" => Icons::LANG_TEX, // ๎š›
  160. "bz" => Icons::COMPRESSED, // ๏
  161. "bz2" => Icons::COMPRESSED, // ๏
  162. "c" => Icons::LANG_C, // ๎˜ž
  163. "c++" => Icons::LANG_CPP, // ๎˜
  164. "cab" => Icons::OS_WINDOWS, // ๏…บ
  165. "cbr" => Icons::IMAGE, // ๏‡…
  166. "cbz" => Icons::IMAGE, // ๏‡…
  167. "cc" => Icons::LANG_CPP, // ๎˜
  168. "cert" => Icons::GIST_SECRET, // ๎ซบ
  169. "cfg" => Icons::CONFIG, // ๎˜•
  170. "cjs" => Icons::LANG_JAVASCRIPT, // ๎Ž
  171. "class" => Icons::LANG_JAVA, // ๎‰–
  172. "clj" => '\u{e768}', // ๎จ
  173. "cljs" => '\u{e76a}', // ๎ช
  174. "cls" => Icons::LANG_TEX, // ๎š›
  175. "cmd" => Icons::OS_WINDOWS, // ๏…บ
  176. "coffee" => '\u{f0f4}', // ๏ƒด
  177. "conf" => Icons::CONFIG, // ๎˜•
  178. "config" => Icons::CONFIG, // ๎˜•
  179. "cp" => Icons::LANG_CPP, // ๎˜
  180. "cpio" => Icons::COMPRESSED, // ๏
  181. "cpp" => Icons::LANG_CPP, // ๎˜
  182. "cr2" => Icons::IMAGE, // ๏‡…
  183. "crt" => Icons::GIST_SECRET, // ๎ซบ
  184. "cs" => Icons::LANG_CSHARP, // ๓ฐŒ›
  185. "csh" => Icons::SHELL, // ๏’‰
  186. "cshtml" => Icons::RAZOR, // ๏‡บ
  187. "csproj" => Icons::LANG_CSHARP, // ๓ฐŒ›
  188. "css" => Icons::CSS3, // ๎‰
  189. "csv" => Icons::SHEET, // ๏‡ƒ
  190. "csx" => Icons::LANG_CSHARP, // ๓ฐŒ›
  191. "cts" => Icons::LANG_TYPESCRIPT, // ๎˜จ
  192. "cu" => '\u{e64b}', // ๎™‹
  193. "cxx" => Icons::LANG_CPP, // ๎˜
  194. "d" => '\u{e7af}', // ๎žฏ
  195. "dart" => '\u{e798}', // ๎ž˜
  196. "db" => Icons::DATABASE, // ๏‡€
  197. "deb" => '\u{e77d}', // ๎ฝ
  198. "desktop" => '\u{ebd1}', // ๎ฏ‘
  199. "diff" => Icons::DIFF, // ๏‘€
  200. "djv" => Icons::DOCUMENT, // ๏‡‚
  201. "djvu" => Icons::DOCUMENT, // ๏‡‚
  202. "dll" => Icons::OS_WINDOWS, // ๏…บ
  203. "dmg" => Icons::DISK_IMAGE, // ๎‰ฑ
  204. "doc" => Icons::DOCUMENT, // ๏‡‚
  205. "docx" => Icons::DOCUMENT, // ๏‡‚
  206. "drawio" => '\u{ebba}', // ๎ฎบ
  207. "ds_store" => Icons::OS_APPLE, // ๏…น
  208. "dump" => Icons::DATABASE, // ๎œ†
  209. "dvi" => Icons::IMAGE, // ๏‡…
  210. "ebook" => Icons::BOOK, // ๎Š‹
  211. "ebuild" => '\u{f30d}', // ๏Œ
  212. "editorconfig" => Icons::CONFIG, // ๎˜•
  213. "ejs" => '\u{e618}', // ๎˜˜
  214. "el" => Icons::EMACS, // ๎˜ฒ
  215. "elm" => '\u{e62c}', // ๎˜ฌ
  216. "eml" => '\u{f003}', // ๏€ƒ
  217. "env" => '\u{f462}', // ๏‘ข
  218. "eot" => Icons::FONT, // ๏€ฑ
  219. "eps" => Icons::IMAGE, // ๏‡…
  220. "epub" => Icons::BOOK, // ๎Š‹
  221. "erb" => Icons::LANG_RUBYRAILS, // ๎œป
  222. "erl" => '\u{e7b1}', // ๎žฑ
  223. "ex" => Icons::LANG_ELIXIR, // ๎˜ญ
  224. "exe" => Icons::OS_WINDOWS, // ๏…บ
  225. "exs" => Icons::LANG_ELIXIR, // ๎˜ญ
  226. "fish" => Icons::SHELL, // ๏’‰
  227. "flac" => Icons::AUDIO, // ๏€
  228. "flv" => Icons::VIDEO, // ๏€ฝ
  229. "font" => Icons::FONT, // ๏€ฑ
  230. "fs" => Icons::LANG_FSHARP, // ๎žง
  231. "fsi" => Icons::LANG_FSHARP, // ๎žง
  232. "fsx" => Icons::LANG_FSHARP, // ๎žง
  233. "gdoc" => Icons::DOCUMENT, // ๏‡‚
  234. "gem" => Icons::LANG_RUBY, // ๎ˆž
  235. "gemfile" => Icons::LANG_RUBY, // ๎ˆž
  236. "gemspec" => Icons::LANG_RUBY, // ๎ˆž
  237. "gform" => '\u{f298}', // ๏Š˜
  238. "gif" => Icons::IMAGE, // ๏‡…
  239. "git" => Icons::GIT, // ๏‡“
  240. "gitattributes" => Icons::GIT, // ๏‡“
  241. "gitignore" => Icons::GIT, // ๏‡“
  242. "gitmodules" => Icons::GIT, // ๏‡“
  243. "go" => Icons::LANG_GO, // ๎œค
  244. "gpg" => '\u{e60a}', // ๎˜Š
  245. "gradle" => Icons::GRADLE, // ๎™ 
  246. "groovy" => '\u{e775}', // ๎ต
  247. "gsheet" => Icons::SHEET, // ๏‡ƒ
  248. "gslides" => Icons::SLIDE, // ๏‡„
  249. "guardfile" => Icons::LANG_RUBY, // ๎ˆž
  250. "gz" => Icons::COMPRESSED, // ๏
  251. "h" => Icons::HEADER, // ๏ƒฝ
  252. "hbs" => Icons::MUSTACHE, // ๎˜
  253. "heic" => Icons::VIDEO, // ๏€ฝ
  254. "heif" => Icons::IMAGE, // ๏‡…
  255. "hpp" => Icons::HEADER, // ๏ƒฝ
  256. "hs" => Icons::LANG_HASKELL, // ๎ท
  257. "htm" => Icons::HTML5, // ๏„ป
  258. "html" => Icons::HTML5, // ๏„ป
  259. "hxx" => Icons::HEADER, // ๏ƒฝ
  260. "ical" => Icons::CALENDAR, // ๏ณ
  261. "icalendar" => Icons::CALENDAR, // ๏ณ
  262. "ico" => Icons::IMAGE, // ๏‡…
  263. "ics" => Icons::CALENDAR, // ๏ณ
  264. "ifb" => Icons::CALENDAR, // ๏ณ
  265. "image" => Icons::IMAGE, // ๏‡…
  266. "img" => Icons::DISK_IMAGE, // ๎‰ฑ
  267. "iml" => Icons::INTELLIJ, // ๎žต
  268. "ini" => Icons::OS_WINDOWS, // ๏…บ
  269. "ipynb" => '\u{e678}', // ๎™ธ
  270. "iso" => Icons::DISK_IMAGE, // ๎‰ฑ
  271. "j2c" => Icons::IMAGE, // ๏‡…
  272. "j2k" => Icons::IMAGE, // ๏‡…
  273. "jad" => Icons::LANG_JAVA, // ๎‰–
  274. "jar" => Icons::LANG_JAVA, // ๎‰–
  275. "java" => Icons::LANG_JAVA, // ๎‰–
  276. "jfi" => Icons::IMAGE, // ๏‡…
  277. "jfif" => Icons::IMAGE, // ๏‡…
  278. "jif" => Icons::IMAGE, // ๏‡…
  279. "jl" => '\u{e624}', // ๎˜ค
  280. "jmd" => Icons::MARKDOWN, // ๏’Š
  281. "jp2" => Icons::IMAGE, // ๏‡…
  282. "jpe" => Icons::IMAGE, // ๏‡…
  283. "jpeg" => Icons::IMAGE, // ๏‡…
  284. "jpf" => Icons::IMAGE, // ๏‡…
  285. "jpg" => Icons::IMAGE, // ๏‡…
  286. "jpx" => Icons::IMAGE, // ๏‡…
  287. "js" => Icons::LANG_JAVASCRIPT, // ๎Ž
  288. "json" => Icons::JSON, // ๎˜‹
  289. "jsx" => Icons::REACT, // ๎žบ
  290. "jxl" => Icons::IMAGE, // ๏‡…
  291. "kdb" => Icons::KEYPASS, // ๏ˆพ
  292. "kdbx" => Icons::KEYPASS, // ๏ˆพ
  293. "key" => Icons::KEY, // ๎ฌ‘
  294. "ko" => Icons::OS_LINUX, // ๏…ผ
  295. "ksh" => Icons::SHELL, // ๏’‰
  296. "latex" => Icons::LANG_TEX, // ๎š›
  297. "less" => '\u{e758}', // ๎˜
  298. "lhs" => Icons::LANG_HASKELL, // ๎ท
  299. "license" => Icons::LICENSE, // ๏€ญ
  300. "localized" => Icons::OS_APPLE, // ๏…น
  301. "lock" => Icons::LOCK, // ๏€ฃ
  302. "log" => '\u{f18d}', // ๏†
  303. "lua" => '\u{e620}', // ๎˜ 
  304. "lz" => Icons::COMPRESSED, // ๏
  305. "lz4" => Icons::COMPRESSED, // ๏
  306. "lzh" => Icons::COMPRESSED, // ๏
  307. "lzma" => Icons::COMPRESSED, // ๏
  308. "lzo" => Icons::COMPRESSED, // ๏
  309. "m" => Icons::LANG_C, // ๎˜ž
  310. "m2ts" => Icons::VIDEO, // ๏€ฝ
  311. "m2v" => Icons::VIDEO, // ๏€ฝ
  312. "m4a" => Icons::AUDIO, // ๏€
  313. "m4v" => Icons::VIDEO, // ๏€ฝ
  314. "magnet" => '\u{f076}', // ๏ถ
  315. "markdown" => Icons::MARKDOWN, // ๏’Š
  316. "md" => Icons::MARKDOWN, // ๏’Š
  317. "mjs" => Icons::LANG_JAVASCRIPT, // ๎Ž
  318. "mk" => Icons::SHELL, // ๏’‰
  319. "mka" => Icons::AUDIO, // ๏€
  320. "mkd" => Icons::MARKDOWN, // ๏’Š
  321. "mkv" => Icons::VIDEO, // ๏€ฝ
  322. "ml" => Icons::LANG_OCAML, // ๎™บ
  323. "mli" => Icons::LANG_OCAML, // ๎™บ
  324. "mll" => Icons::LANG_OCAML, // ๎™บ
  325. "mly" => Icons::LANG_OCAML, // ๎™บ
  326. "mm" => Icons::LANG_CPP, // ๎˜
  327. "mobi" => Icons::BOOK, // ๎Š‹
  328. "mov" => Icons::VIDEO, // ๏€ฝ
  329. "mp2" => Icons::AUDIO, // ๏€
  330. "mp3" => Icons::AUDIO, // ๏€
  331. "mp4" => Icons::VIDEO, // ๏€ฝ
  332. "mpeg" => Icons::VIDEO, // ๏€ฝ
  333. "mpg" => Icons::VIDEO, // ๏€ฝ
  334. "msi" => Icons::OS_WINDOWS, // ๏…บ
  335. "mts" => Icons::LANG_TYPESCRIPT, // ๎˜จ
  336. "mustache" => Icons::MUSTACHE, // ๎˜
  337. "nef" => Icons::IMAGE, // ๏‡…
  338. "ninja" => '\u{f0774}', // ๓ฐด
  339. "nix" => '\u{f313}', // ๏Œ“
  340. "node" => '\u{f0399}', // ๓ฐŽ™
  341. "npmignore" => Icons::NPM, // ๎œž
  342. "o" => Icons::BINARY, // ๎ซจ
  343. "odp" => Icons::SLIDE, // ๏‡„
  344. "ods" => Icons::SHEET, // ๏‡ƒ
  345. "odt" => Icons::DOCUMENT, // ๏‡‚
  346. "ogg" => Icons::AUDIO, // ๏€
  347. "ogm" => Icons::VIDEO, // ๏€ฝ
  348. "ogv" => Icons::VIDEO, // ๏€ฝ
  349. "opus" => Icons::AUDIO, // ๏€
  350. "orf" => Icons::IMAGE, // ๏‡…
  351. "org" => '\u{e633}', // ๎˜ณ
  352. "otf" => Icons::FONT, // ๏€ฑ
  353. "out" => '\u{eb2c}', // ๎ฌฌ
  354. "par" => Icons::COMPRESSED, // ๏
  355. "part" => '\u{f43a}', // ๏บ
  356. "patch" => Icons::DIFF, // ๏‘€
  357. "pbm" => Icons::IMAGE, // ๏‡…
  358. "pdf" => '\u{f1c1}', // ๏‡
  359. "pem" => Icons::KEY, // ๎ฌ‘
  360. "pgm" => Icons::IMAGE, // ๏‡…
  361. "php" => Icons::LANG_PHP, // ๎œฝ
  362. "pl" => Icons::LANG_PERL, // ๎ฉ
  363. "plx" => Icons::LANG_PERL, // ๎ฉ
  364. "pm" => Icons::LANG_PERL, // ๎ฉ
  365. "png" => Icons::IMAGE, // ๏‡…
  366. "pnm" => Icons::IMAGE, // ๏‡…
  367. "pod" => Icons::LANG_PERL, // ๎ฉ
  368. "ppm" => Icons::IMAGE, // ๏‡…
  369. "ppt" => Icons::SLIDE, // ๏‡„
  370. "pptx" => Icons::SLIDE, // ๏‡„
  371. "procfile" => Icons::LANG_RUBY, // ๎ˆž - Can not find a reference to procfile being Ruby
  372. "properties" => Icons::JSON, // ๎˜‹
  373. "ps" => Icons::IMAGE, // ๏‡…
  374. "ps1" => Icons::POWERSHELL, // ๎ฏ‡
  375. "psd" => '\u{e7b8}', // ๎žธ
  376. "psd1" => Icons::POWERSHELL, // ๎ฏ‡
  377. "psm1" => Icons::POWERSHELL, // ๎ฏ‡
  378. "pxm" => Icons::IMAGE, // ๏‡…
  379. "py" => Icons::LANG_PYTHON, // ๎˜†
  380. "pyc" => Icons::LANG_PYTHON, // ๎˜†
  381. "qcow2" => Icons::DISK_IMAGE, // ๎‰ฑ
  382. "r" => Icons::LANG_R, // ๏‰
  383. "rakefile" => Icons::LANG_RUBY, // ๎ˆž
  384. "rar" => Icons::COMPRESSED, // ๏
  385. "raw" => Icons::IMAGE, // ๏‡…
  386. "razor" => Icons::RAZOR, // ๏‡บ
  387. "rb" => Icons::LANG_RUBY, // ๎ˆž
  388. "rdata" => Icons::LANG_R, // ๏‰
  389. "rdb" => '\u{e76d}', // ๎ญ
  390. "rdoc" => Icons::MARKDOWN, // ๏’Š
  391. "rds" => Icons::LANG_R, // ๏‰
  392. "readme" => Icons::MARKDOWN, // ๏’Š
  393. "rlib" => Icons::LANG_RUST, // ๎žจ
  394. "rmd" => Icons::MARKDOWN, // ๏’Š
  395. "rmeta" => Icons::LANG_RUST, // ๎žจ
  396. "rpm" => '\u{e7bb}', // ๎žป
  397. "rs" => Icons::LANG_RUST, // ๎žจ
  398. "rspec" => Icons::LANG_RUBY, // ๎ˆž
  399. "rspec_parallel" => Icons::LANG_RUBY, // ๎ˆž
  400. "rspec_status" => Icons::LANG_RUBY, // ๎ˆž
  401. "rss" => '\u{f09e}', // ๏‚ž
  402. "rst" => Icons::TEXT, // ๏…œ
  403. "rtf" => Icons::TEXT, // ๏…œ
  404. "ru" => Icons::LANG_RUBY, // ๎ˆž
  405. "rubydoc" => Icons::LANG_RUBYRAILS, // ๎œป
  406. "s" => Icons::LANG_ASSEMBLY, // ๎˜ท
  407. "sass" => '\u{e603}', // ๎˜ƒ
  408. "scala" => '\u{e737}', // ๎œท
  409. "scss" => Icons::CSS3, // ๎‰
  410. "service" => '\u{eba2}', // ๎ฎข
  411. "sh" => Icons::SHELL, // ๏’‰
  412. "shell" => Icons::SHELL, // ๏’‰
  413. "slim" => Icons::LANG_RUBYRAILS, // ๎œป
  414. "sln" => '\u{e70c}', // ๎œŒ
  415. "so" => Icons::OS_LINUX, // ๏…ผ
  416. "sql" => Icons::DATABASE, // ๎œ†
  417. "sqlite3" => '\u{e7c4}', // ๎Ÿ„
  418. "stl" => Icons::IMAGE, // ๏‡…
  419. "sty" => Icons::LANG_TEX, // ๎š›
  420. "styl" => Icons::LANG_STYLUS, // ๎˜€
  421. "stylus" => Icons::LANG_STYLUS, // ๎˜€
  422. "svelte" => '\u{e697}', // ๎š—
  423. "svg" => Icons::IMAGE, // ๏‡…
  424. "swift" => '\u{e755}', // ๎•
  425. "t" => Icons::LANG_PERL, // ๎ฉ
  426. "tar" => Icons::COMPRESSED, // ๏
  427. "taz" => Icons::COMPRESSED, // ๏
  428. "tbz" => Icons::COMPRESSED, // ๏
  429. "tbz2" => Icons::COMPRESSED, // ๏
  430. "tc" => Icons::COMPRESSED, // ๏
  431. "tex" => Icons::LANG_TEX, // ๎š›
  432. "tgz" => Icons::COMPRESSED, // ๏
  433. "tif" => Icons::IMAGE, // ๏‡…
  434. "tiff" => Icons::IMAGE, // ๏‡…
  435. "tlz" => Icons::COMPRESSED, // ๏
  436. "toml" => Icons::CONFIG, // ๎˜•
  437. "torrent" => '\u{e275}', // ๎‰ต
  438. "ts" => Icons::LANG_TYPESCRIPT, // ๎˜จ
  439. "tsv" => Icons::SHEET, // ๏‡ƒ
  440. "tsx" => Icons::REACT, // ๎žบ
  441. "ttf" => Icons::FONT, // ๏€ฑ
  442. "twig" => '\u{e61c}', // ๎˜œ
  443. "txt" => Icons::TEXT, // ๏…œ
  444. "txz" => Icons::COMPRESSED, // ๏
  445. "tz" => Icons::COMPRESSED, // ๏
  446. "tzo" => Icons::COMPRESSED, // ๏
  447. "unity" => Icons::UNITY, // ๎œก
  448. "unity3d" => Icons::UNITY, // ๎œก
  449. "vdi" => Icons::DISK_IMAGE, // ๎‰ฑ
  450. "vhd" => Icons::DISK_IMAGE, // ๎‰ฑ
  451. "video" => Icons::VIDEO, // ๏€ฝ
  452. "vim" => Icons::VIM, // ๎Ÿ…
  453. "vmdk" => Icons::DISK_IMAGE, // ๎‰ฑ
  454. "vob" => Icons::VIDEO, // ๏€ฝ
  455. "vue" => '\u{f0844}', // ๓ฐก„
  456. "war" => Icons::LANG_JAVA, // ๎‰–
  457. "wav" => Icons::AUDIO, // ๏€
  458. "webm" => Icons::VIDEO, // ๏€ฝ
  459. "webp" => Icons::IMAGE, // ๏‡…
  460. "windows" => Icons::OS_WINDOWS, // ๏…บ
  461. "wma" => Icons::AUDIO, // ๏€
  462. "wmv" => Icons::VIDEO, // ๏€ฝ
  463. "woff" => Icons::FONT, // ๏€ฑ
  464. "woff2" => Icons::FONT, // ๏€ฑ
  465. "xhtml" => Icons::HTML5, // ๏„ป
  466. "xls" => Icons::SHEET, // ๏‡ƒ
  467. "xlsm" => Icons::SHEET, // ๏‡ƒ
  468. "xlsx" => Icons::SHEET, // ๏‡ƒ
  469. "xml" => Icons::XML, // ๓ฐ—€
  470. "xpm" => Icons::IMAGE, // ๏‡…
  471. "xul" => Icons::XML, // ๓ฐ—€
  472. "xz" => Icons::COMPRESSED, // ๏
  473. "yaml" => Icons::YAML, // ๏’
  474. "yml" => Icons::YAML, // ๏’
  475. "z" => Icons::COMPRESSED, // ๏
  476. "zig" => '\u{21af}', // โ†ฏ
  477. "zip" => Icons::COMPRESSED, // ๏
  478. "zsh" => Icons::SHELL, // ๏’‰
  479. "zsh-theme" => Icons::SHELL, // ๏’‰
  480. "zshrc" => Icons::SHELL, // ๏’‰
  481. "zst" => Icons::COMPRESSED, // ๏
  482. };
  483. /// Converts the style used to paint a file name into the style that should be
  484. /// used to paint an icon.
  485. ///
  486. /// - The background colour should be preferred to the foreground colour, as
  487. /// if one is set, itโ€™s the more โ€œobviousโ€ colour choice.
  488. /// - If neither is set, just use the default style.
  489. /// - Attributes such as bold or underline should not be used to paint the
  490. /// icon, as they can make it look weird.
  491. pub fn iconify_style(style: Style) -> Style {
  492. style.background.or(style.foreground)
  493. .map(Style::from)
  494. .unwrap_or_default()
  495. }
  496. /// Lookup the icon for a file based on the file's name, if the entry is a
  497. /// directory, or by the lowercase file extension.
  498. pub fn icon_for_file(file: &File<'_>) -> char {
  499. if let Some(icon) = FILENAME_ICONS.get(file.name.as_str()) {
  500. *icon
  501. } else if file.points_to_directory() {
  502. if file.is_empty_dir() {
  503. '\u{f115}' // ๏„•
  504. } else {
  505. '\u{f07b}' // ๏ป
  506. }
  507. } else if let Some(ext) = file.ext.as_ref() {
  508. *EXTENSION_ICONS.get(ext.as_str()).unwrap_or(&'\u{f15b}') // ๏…›
  509. } else {
  510. '\u{f016}' // ๏€–
  511. }
  512. }