// 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 { /// /// 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; } /// /// 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")}, }; /// /// 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")}, }; private static Color StringToColor (string str) { if ( !Color.TryParse (str, out var c) ) { ThrowFormatException (str); } return c.Value; [DoesNotReturn] static void ThrowFormatException (string s) { throw new FormatException ($"Failed to parse Color from {s}"); } } } }