// This code is adapted from https://github.com/devblackops/Terminal-Icons (which also uses the MIT license). using System.Diagnostics.CodeAnalysis; using System.IO.Abstractions; namespace Terminal.Gui; /// Provides a way to get the color of a file or directory. public class FileSystemColorProvider { /// Mapping of file extension to color. public Dictionary ExtensionToColor = new () { { ".7z", StringToColor ("#DAA520") }, { ".bz", StringToColor ("#DAA520") }, { ".tar", StringToColor ("#DAA520") }, { ".zip", StringToColor ("#DAA520") }, { ".gz", StringToColor ("#DAA520") }, { ".xz", StringToColor ("#DAA520") }, { ".br", StringToColor ("#DAA520") }, { ".bzip2", StringToColor ("#DAA520") }, { ".gzip", StringToColor ("#DAA520") }, { ".brotli", StringToColor ("#DAA520") }, { ".rar", StringToColor ("#DAA520") }, { ".tgz", StringToColor ("#DAA520") }, { ".bat", StringToColor ("#008000") }, { ".cmd", StringToColor ("#008000") }, { ".exe", StringToColor ("#00FA9A") }, { ".pl", StringToColor ("#8A2BE2") }, { ".sh", StringToColor ("#FF4500") }, { ".msi", StringToColor ("#FFC77A") }, { ".msix", StringToColor ("#FFC77A") }, { ".msixbundle", StringToColor ("#FFC77A") }, { ".appx", StringToColor ("#FFC77A") }, { ".AppxBundle", StringToColor ("#FFC77A") }, { ".deb", StringToColor ("#FFC77A") }, { ".rpm", StringToColor ("#FFC77A") }, { ".ps1", StringToColor ("#00BFFF") }, { ".psm1", StringToColor ("#00BFFF") }, { ".psd1", StringToColor ("#00BFFF") }, { ".ps1xml", StringToColor ("#00BFFF") }, { ".psc1", StringToColor ("#00BFFF") }, { ".pssc", StringToColor ("#00BFFF") }, { ".js", StringToColor ("#F0E68C") }, { ".esx", StringToColor ("#F0E68C") }, { ".mjs", StringToColor ("#F0E68C") }, { ".java", StringToColor ("#F89820") }, { ".jar", StringToColor ("#F89820") }, { ".gradle", StringToColor ("#39D52D") }, { ".py", StringToColor ("#4B8BBE") }, { ".ipynb", StringToColor ("#4B8BBE") }, { ".jsx", StringToColor ("#20B2AA") }, { ".tsx", StringToColor ("#20B2AA") }, { ".ts", StringToColor ("#F0E68C") }, { ".dll", StringToColor ("#87CEEB") }, { ".clixml", StringToColor ("#00BFFF") }, { ".csv", StringToColor ("#9ACD32") }, { ".tsv", StringToColor ("#9ACD32") }, { ".ini", StringToColor ("#6495ED") }, { ".dlc", StringToColor ("#6495ED") }, { ".config", StringToColor ("#6495ED") }, { ".conf", StringToColor ("#6495ED") }, { ".properties", StringToColor ("#6495ED") }, { ".prop", StringToColor ("#6495ED") }, { ".settings", StringToColor ("#6495ED") }, { ".option", StringToColor ("#6495ED") }, { ".reg", StringToColor ("#6495ED") }, { ".props", StringToColor ("#6495ED") }, { ".toml", StringToColor ("#6495ED") }, { ".prefs", StringToColor ("#6495ED") }, { ".sln.dotsettings", StringToColor ("#6495ED") }, { ".sln.dotsettings.user", StringToColor ("#6495ED") }, { ".cfg", StringToColor ("#6495ED") }, { ".c", StringToColor ("#A9A9A9") }, { ".cpp", StringToColor ("#A9A9A9") }, { ".go", StringToColor ("#20B2AA") }, { ".php", StringToColor ("#6A5ACD") }, { ".csproj", StringToColor ("#EE82EE") }, { ".ruleset", StringToColor ("#EE82EE") }, { ".sln", StringToColor ("#EE82EE") }, { ".slnf", StringToColor ("#EE82EE") }, { ".suo", StringToColor ("#EE82EE") }, { ".vb", StringToColor ("#EE82EE") }, { ".vbs", StringToColor ("#EE82EE") }, { ".vcxitems", StringToColor ("#EE82EE") }, { ".vcxitems.filters", StringToColor ("#EE82EE") }, { ".vcxproj", StringToColor ("#EE82EE") }, { ".vsxproj.filters", StringToColor ("#EE82EE") }, { ".cs", StringToColor ("#7B68EE") }, { ".csx", StringToColor ("#7B68EE") }, { ".hs", StringToColor ("#9932CC") }, { ".xaml", StringToColor ("#87CEFA") }, { ".rs", StringToColor ("#FF4500") }, { ".pdb", StringToColor ("#FFD700") }, { ".sql", StringToColor ("#FFD700") }, { ".pks", StringToColor ("#FFD700") }, { ".pkb", StringToColor ("#FFD700") }, { ".accdb", StringToColor ("#FFD700") }, { ".mdb", StringToColor ("#FFD700") }, { ".sqlite", StringToColor ("#FFD700") }, { ".pgsql", StringToColor ("#FFD700") }, { ".postgres", StringToColor ("#FFD700") }, { ".psql", StringToColor ("#FFD700") }, { ".patch", StringToColor ("#FF4500") }, { ".user", StringToColor ("#00BFFF") }, { ".code-workspace", StringToColor ("#00BFFF") }, { ".log", StringToColor ("#F0E68C") }, { ".txt", StringToColor ("#00CED1") }, { ".srt", StringToColor ("#00CED1") }, { ".lrc", StringToColor ("#00CED1") }, { ".ass", StringToColor ("#C50000") }, { ".html", StringToColor ("#CD5C5C") }, { ".htm", StringToColor ("#CD5C5C") }, { ".xhtml", StringToColor ("#CD5C5C") }, { ".html_vm", StringToColor ("#CD5C5C") }, { ".asp", StringToColor ("#CD5C5C") }, { ".css", StringToColor ("#87CEFA") }, { ".sass", StringToColor ("#FF00FF") }, { ".scss", StringToColor ("#FF00FF") }, { ".less", StringToColor ("#6B8E23") }, { ".md", StringToColor ("#00BFFF") }, { ".markdown", StringToColor ("#00BFFF") }, { ".rst", StringToColor ("#00BFFF") }, { ".hbs", StringToColor ("#E37933") }, { ".json", StringToColor ("#FFD700") }, { ".tsbuildinfo", StringToColor ("#FFD700") }, { ".yml", StringToColor ("#FF6347") }, { ".yaml", StringToColor ("#FF6347") }, { ".lua", StringToColor ("#87CEFA") }, { ".clj", StringToColor ("#00FF7F") }, { ".cljs", StringToColor ("#00FF7F") }, { ".cljc", StringToColor ("#00FF7F") }, { ".groovy", StringToColor ("#87CEFA") }, { ".vue", StringToColor ("#20B2AA") }, { ".dart", StringToColor ("#4682B4") }, { ".ex", StringToColor ("#8B4513") }, { ".exs", StringToColor ("#8B4513") }, { ".eex", StringToColor ("#8B4513") }, { ".leex", StringToColor ("#8B4513") }, { ".erl", StringToColor ("#FF6347") }, { ".elm", StringToColor ("#9932CC") }, { ".applescript", StringToColor ("#4682B4") }, { ".xml", StringToColor ("#98FB98") }, { ".plist", StringToColor ("#98FB98") }, { ".xsd", StringToColor ("#98FB98") }, { ".dtd", StringToColor ("#98FB98") }, { ".xsl", StringToColor ("#98FB98") }, { ".xslt", StringToColor ("#98FB98") }, { ".resx", StringToColor ("#98FB98") }, { ".iml", StringToColor ("#98FB98") }, { ".xquery", StringToColor ("#98FB98") }, { ".tmLanguage", StringToColor ("#98FB98") }, { ".manifest", StringToColor ("#98FB98") }, { ".project", StringToColor ("#98FB98") }, { ".chm", StringToColor ("#87CEEB") }, { ".pdf", StringToColor ("#CD5C5C") }, { ".xls", StringToColor ("#9ACD32") }, { ".xlsx", StringToColor ("#9ACD32") }, { ".pptx", StringToColor ("#DC143C") }, { ".ppt", StringToColor ("#DC143C") }, { ".pptm", StringToColor ("#DC143C") }, { ".potx", StringToColor ("#DC143C") }, { ".potm", StringToColor ("#DC143C") }, { ".ppsx", StringToColor ("#DC143C") }, { ".ppsm", StringToColor ("#DC143C") }, { ".pps", StringToColor ("#DC143C") }, { ".ppam", StringToColor ("#DC143C") }, { ".ppa", StringToColor ("#DC143C") }, { ".doc", StringToColor ("#00BFFF") }, { ".docx", StringToColor ("#00BFFF") }, { ".rtf", StringToColor ("#00BFFF") }, { ".mp3", StringToColor ("#DB7093") }, { ".flac", StringToColor ("#DB7093") }, { ".m4a", StringToColor ("#DB7093") }, { ".wma", StringToColor ("#DB7093") }, { ".aiff", StringToColor ("#DB7093") }, { ".wav", StringToColor ("#DB7093") }, { ".aac", StringToColor ("#DB7093") }, { ".opus", StringToColor ("#DB7093") }, { ".png", StringToColor ("#20B2AA") }, { ".jpeg", StringToColor ("#20B2AA") }, { ".jpg", StringToColor ("#20B2AA") }, { ".gif", StringToColor ("#20B2AA") }, { ".ico", StringToColor ("#20B2AA") }, { ".tif", StringToColor ("#20B2AA") }, { ".tiff", StringToColor ("#20B2AA") }, { ".psd", StringToColor ("#20B2AA") }, { ".psb", StringToColor ("#20B2AA") }, { ".ami", StringToColor ("#20B2AA") }, { ".apx", StringToColor ("#20B2AA") }, { ".bmp", StringToColor ("#20B2AA") }, { ".bpg", StringToColor ("#20B2AA") }, { ".brk", StringToColor ("#20B2AA") }, { ".cur", StringToColor ("#20B2AA") }, { ".dds", StringToColor ("#20B2AA") }, { ".dng", StringToColor ("#20B2AA") }, { ".eps", StringToColor ("#20B2AA") }, { ".exr", StringToColor ("#20B2AA") }, { ".fpx", StringToColor ("#20B2AA") }, { ".gbr", StringToColor ("#20B2AA") }, { ".jbig2", StringToColor ("#20B2AA") }, { ".jb2", StringToColor ("#20B2AA") }, { ".jng", StringToColor ("#20B2AA") }, { ".jxr", StringToColor ("#20B2AA") }, { ".pbm", StringToColor ("#20B2AA") }, { ".pgf", StringToColor ("#20B2AA") }, { ".pic", StringToColor ("#20B2AA") }, { ".raw", StringToColor ("#20B2AA") }, { ".webp", StringToColor ("#20B2AA") }, { ".svg", StringToColor ("#F4A460") }, { ".webm", StringToColor ("#FFA500") }, { ".mkv", StringToColor ("#FFA500") }, { ".flv", StringToColor ("#FFA500") }, { ".vob", StringToColor ("#FFA500") }, { ".ogv", StringToColor ("#FFA500") }, { ".ogg", StringToColor ("#FFA500") }, { ".gifv", StringToColor ("#FFA500") }, { ".avi", StringToColor ("#FFA500") }, { ".mov", StringToColor ("#FFA500") }, { ".qt", StringToColor ("#FFA500") }, { ".wmv", StringToColor ("#FFA500") }, { ".yuv", StringToColor ("#FFA500") }, { ".rm", StringToColor ("#FFA500") }, { ".rmvb", StringToColor ("#FFA500") }, { ".mp4", StringToColor ("#FFA500") }, { ".mpg", StringToColor ("#FFA500") }, { ".mp2", StringToColor ("#FFA500") }, { ".mpeg", StringToColor ("#FFA500") }, { ".mpe", StringToColor ("#FFA500") }, { ".mpv", StringToColor ("#FFA500") }, { ".m2v", StringToColor ("#FFA500") }, { ".ics", StringToColor ("#00CED1") }, { ".cer", StringToColor ("#FF6347") }, { ".cert", StringToColor ("#FF6347") }, { ".crt", StringToColor ("#FF6347") }, { ".pfx", StringToColor ("#FF6347") }, { ".pem", StringToColor ("#66CDAA") }, { ".pub", StringToColor ("#66CDAA") }, { ".key", StringToColor ("#66CDAA") }, { ".asc", StringToColor ("#66CDAA") }, { ".gpg", StringToColor ("#66CDAA") }, { ".woff", StringToColor ("#DC143C") }, { ".woff2", StringToColor ("#DC143C") }, { ".ttf", StringToColor ("#DC143C") }, { ".eot", StringToColor ("#DC143C") }, { ".suit", StringToColor ("#DC143C") }, { ".otf", StringToColor ("#DC143C") }, { ".bmap", StringToColor ("#DC143C") }, { ".fnt", StringToColor ("#DC143C") }, { ".odttf", StringToColor ("#DC143C") }, { ".ttc", StringToColor ("#DC143C") }, { ".font", StringToColor ("#DC143C") }, { ".fonts", StringToColor ("#DC143C") }, { ".sui", StringToColor ("#DC143C") }, { ".ntf", StringToColor ("#DC143C") }, { ".mrg", StringToColor ("#DC143C") }, { ".rb", StringToColor ("#FF0000") }, { ".erb", StringToColor ("#FF0000") }, { ".gemfile", StringToColor ("#FF0000") }, { "Rakefile", StringToColor ("#FF0000") }, { ".fs", StringToColor ("#00BFFF") }, { ".fsx", StringToColor ("#00BFFF") }, { ".fsi", StringToColor ("#00BFFF") }, { ".fsproj", StringToColor ("#00BFFF") }, { ".dockerignore", StringToColor ("#4682B4") }, { ".dockerfile", StringToColor ("#4682B4") }, { ".vscodeignore", StringToColor ("#6495ED") }, { ".vsixmanifest", StringToColor ("#6495ED") }, { ".vsix", StringToColor ("#6495ED") }, { ".code-workplace", StringToColor ("#6495ED") }, { ".sublime-project", StringToColor ("#F4A460") }, { ".sublime-workspace", StringToColor ("#F4A460") }, { ".lock", StringToColor ("#DAA520") }, { ".tf", StringToColor ("#948EEC") }, { ".tfvars", StringToColor ("#948EEC") }, { ".auto.tfvars", StringToColor ("#948EEC") }, { ".bicep", StringToColor ("#00BFFF") }, { ".vmdk", StringToColor ("#E1E3E6") }, { ".vhd", StringToColor ("#E1E3E6") }, { ".vhdx", StringToColor ("#E1E3E6") }, { ".img", StringToColor ("#E1E3E6") }, { ".iso", StringToColor ("#E1E3E6") }, { ".R", StringToColor ("#276DC3") }, { ".Rmd", StringToColor ("#276DC3") }, { ".Rproj", StringToColor ("#276DC3") }, { ".jl", StringToColor ("#9259a3") }, { ".vim", StringToColor ("#019833") }, { ".pp", StringToColor ("#FFA61A") }, { ".epp", StringToColor ("#FFA61A") }, { ".scala", StringToColor ("#DE3423") }, { ".sc", StringToColor ("#DE3423") }, { ".iLogicVb", StringToColor ("#A63B22") } }; /// Mapping of file/dir name to color. public Dictionary FilenameToColor { get; set; } = new () { { "docs", StringToColor ("#00BFFF") }, { "documents", StringToColor ("#00BFFF") }, { "desktop", StringToColor ("#00FBFF") }, { "benchmark", StringToColor ("#F08519") }, { "demo", StringToColor ("#5F3EC3") }, { "samples", StringToColor ("#5F3EC3") }, { "contacts", StringToColor ("#00FBFF") }, { "apps", StringToColor ("#FF143C") }, { "applications", StringToColor ("#FF143C") }, { "artifacts", StringToColor ("#D49653") }, { "shortcuts", StringToColor ("#FF143C") }, { "links", StringToColor ("#FF143C") }, { "fonts", StringToColor ("#DC143C") }, { "images", StringToColor ("#9ACD32") }, { "photos", StringToColor ("#9ACD32") }, { "pictures", StringToColor ("#9ACD32") }, { "videos", StringToColor ("#FFA500") }, { "movies", StringToColor ("#FFA500") }, { "media", StringToColor ("#D3D3D3") }, { "music", StringToColor ("#DB7093") }, { "songs", StringToColor ("#DB7093") }, { "onedrive", StringToColor ("#D3D3D3") }, { "downloads", StringToColor ("#D3D3D3") }, { "src", StringToColor ("#00FF7F") }, { "development", StringToColor ("#00FF7F") }, { "projects", StringToColor ("#00FF7F") }, { "bin", StringToColor ("#00FFF7") }, { "tests", StringToColor ("#87CEEB") }, { "windows", StringToColor ("#00A8E8") }, { "users", StringToColor ("#F4F4F4") }, { "favorites", StringToColor ("#F7D72C") }, { "output", StringToColor ("#00FF7F") }, { ".config", StringToColor ("#87CEAF") }, { ".cache", StringToColor ("#87ECAF") }, { ".vscode", StringToColor ("#87CEFA") }, { ".vscode-insiders", StringToColor ("#24BFA5") }, { ".git", StringToColor ("#FF4500") }, { ".github", StringToColor ("#C0C0C0") }, { "github", StringToColor ("#C0C0C0") }, { "node_modules", StringToColor ("#6B8E23") }, { ".terraform", StringToColor ("#948EEC") }, { ".azure", StringToColor ("#00BFFF") }, { ".aws", StringToColor ("#EC912D") }, { ".kube", StringToColor ("#326DE6") }, { ".docker", StringToColor ("#2391E6") }, { ".gitattributes", StringToColor ("#FF4500") }, { ".gitconfig", StringToColor ("#FF4500") }, { ".gitignore", StringToColor ("#FF4500") }, { ".gitmodules", StringToColor ("#FF4500") }, { ".gitkeep", StringToColor ("#FF4500") }, { "git-history", StringToColor ("#FF4500") }, { "LICENSE", StringToColor ("#CD5C5C") }, { "LICENSE.md", StringToColor ("#CD5C5C") }, { "LICENSE.txt", StringToColor ("#CD5C5C") }, { "CHANGELOG.md", StringToColor ("#98FB98") }, { "CHANGELOG.txt", StringToColor ("#98FB98") }, { "CHANGELOG", StringToColor ("#98FB98") }, { "README.md", StringToColor ("#00FFFF") }, { "README.txt", StringToColor ("#00FFFF") }, { "README", StringToColor ("#00FFFF") }, { ".DS_Store", StringToColor ("#696969") }, { ".tsbuildinfo", StringToColor ("#F4A460") }, { ".jscsrc", StringToColor ("#F4A460") }, { ".jshintrc", StringToColor ("#F4A460") }, { "tsconfig.json", StringToColor ("#F4A460") }, { "tslint.json", StringToColor ("#F4A460") }, { "composer.lock", StringToColor ("#F4A460") }, { ".jsbeautifyrc", StringToColor ("#F4A460") }, { ".esformatter", StringToColor ("#F4A460") }, { "cdp.pid", StringToColor ("#F4A460") }, { ".htaccess", StringToColor ("#9ACD32") }, { ".jshintignore", StringToColor ("#87CEEB") }, { ".buildignore", StringToColor ("#87CEEB") }, { ".mrconfig", StringToColor ("#87CEEB") }, { ".yardopts", StringToColor ("#87CEEB") }, { "manifest.mf", StringToColor ("#87CEEB") }, { ".clang-format", StringToColor ("#87CEEB") }, { ".clang-tidy", StringToColor ("#87CEEB") }, { "favicon.ico", StringToColor ("#FFD700") }, { ".travis.yml", StringToColor ("#FFE4B5") }, { ".gitlab-ci.yml", StringToColor ("#FF4500") }, { ".jenkinsfile", StringToColor ("#6495ED") }, { "bitbucket-pipelines.yml", StringToColor ("#87CEFA") }, { "bitbucket-pipelines.yaml", StringToColor ("#87CEFA") }, { ".azure-pipelines.yml", StringToColor ("#00BFFF") }, { "firebase.json", StringToColor ("#FFA500") }, { ".firebaserc", StringToColor ("#FFA500") }, { ".bowerrc", StringToColor ("#CD5C5C") }, { "bower.json", StringToColor ("#CD5C5C") }, { "code_of_conduct.md", StringToColor ("#FFFFE0") }, { "code_of_conduct.txt", StringToColor ("#FFFFE0") }, { "Dockerfile", StringToColor ("#4682B4") }, { "docker-compose.yml", StringToColor ("#4682B4") }, { "docker-compose.yaml", StringToColor ("#4682B4") }, { "docker-compose.dev.yml", StringToColor ("#4682B4") }, { "docker-compose.local.yml", StringToColor ("#4682B4") }, { "docker-compose.ci.yml", StringToColor ("#4682B4") }, { "docker-compose.override.yml", StringToColor ("#4682B4") }, { "docker-compose.staging.yml", StringToColor ("#4682B4") }, { "docker-compose.prod.yml", StringToColor ("#4682B4") }, { "docker-compose.production.yml", StringToColor ("#4682B4") }, { "docker-compose.test.yml", StringToColor ("#4682B4") }, { "vue.config.js", StringToColor ("#778899") }, { "vue.config.ts", StringToColor ("#778899") }, { "gulpfile.js", StringToColor ("#CD5C5C") }, { "gulpfile.ts", StringToColor ("#CD5C5C") }, { "gulpfile.babel.js", StringToColor ("#CD5C5C") }, { "gruntfile.js", StringToColor ("#CD5C5C") }, { "package.json", StringToColor ("#6B8E23") }, { "package-lock.json", StringToColor ("#6B8E23") }, { ".nvmrc", StringToColor ("#6B8E23") }, { ".esmrc", StringToColor ("#6B8E23") }, { ".nmpignore", StringToColor ("#00BFFF") }, { ".npmrc", StringToColor ("#00BFFF") }, { "authors", StringToColor ("#FF6347") }, { "authors.md", StringToColor ("#FF6347") }, { "authors.txt", StringToColor ("#FF6347") }, { ".terraform.lock.hcl", StringToColor ("#948EEC") }, { "gradlew", StringToColor ("#39D52D") } }; /// Gets the color to use. /// /// public Color? GetColor (IFileSystemInfo file) { if (FilenameToColor.TryGetValue (file.Name, out Color nameColor)) { return nameColor; } if (ExtensionToColor.TryGetValue (file.Extension, out Color extColor)) { return extColor; } return null; } private static Color StringToColor (string str) { if (!Color.TryParse (str, out Color? c)) { ThrowFormatException (str); } return c.Value; [DoesNotReturn] static void ThrowFormatException (string s) { throw new FormatException ($"Failed to parse Color from {s}"); } } }