package main import ( "os" "path/filepath" "strings" "github.com/fatih/color" ) // File type → colour, after the file_type roles of the eza theme // (~/src/mwxcol/themes/eza/theme.yml), so that the same file has the same // colour in eza and in dx. var byExt = map[string]*color.Color{} func register(c *color.Color, exts ...string) { for _, e := range exts { byExt[e] = c } } func init() { // source — blue register(cBlue, "go", "c", "h", "cc", "cpp", "cxx", "hpp", "rs", "py", "pl", "pm", "t", "sh", "bash", "zsh", "fish", "js", "mjs", "cjs", "ts", "jsx", "tsx", "rb", "java", "kt", "swift", "m", "mm", "php", "lua", "sql", "r", "jl", "hs", "el", "vim", "scala", "cs", "dart", "zig", "asm", "s", "f90", "html", "htm", "css", "scss", "sass", "less", "vue", "svelte", "json", "yml", "yaml", "toml", "ini", "conf", "cfg", "xml", "plist", "md", "markdown", "tex", "awk", "sed") // compressed — orange register(cOrange, "zip", "tar", "gz", "tgz", "bz2", "tbz", "xz", "txz", "zst", "7z", "rar", "lz", "lzma", "z", "jar", "war", "dmg", "iso", "pkg", "deb", "rpm") // image — violet register(cViolet, "jpg", "jpeg", "png", "gif", "bmp", "tif", "tiff", "svg", "webp", "heic", "heif", "ico", "psd", "ai", "eps", "raw", "cr2", "nef", "dng", "stl", "obj3d") // video — pink register(cPink, "mp4", "mov", "avi", "mkv", "webm", "m4v", "mpg", "mpeg", "wmv", "flv", "m2ts") // music / lossless — green register(cGreen, "mp3", "aac", "m4a", "ogg", "opus", "wma", "flac", "wav", "aiff", "aif", "alac") // crypto — red register(cRed, "asc", "gpg", "pgp", "sig", "key", "pem", "crt", "cer", "p12", "kdbx") // document — white register(cWhite, "pdf", "doc", "docx", "odt", "xls", "xlsx", "ods", "ppt", "pptx", "odp", "epub", "rtf", "txt", "csv", "pages", "numbers") // compiled — grey register(cGrey, "o", "a", "so", "dylib", "obj", "lib", "class", "pyc", "pyo", "wasm", "d") // temp — dark register(cDarker, "tmp", "temp", "swp", "swo", "bak", "old", "orig", "rej", "lock", "part", "crdownload", "log") } // build — yellow (README, Makefile, …) var byName = map[string]*color.Color{ "makefile": cYellow, "gnumakefile": cYellow, "cmakelists.txt": cYellow, "dockerfile": cYellow, "justfile": cYellow, "rakefile": cYellow, "go.mod": cYellow, "go.sum": cYellow, "package.json": cYellow, "package-lock.json": cYellow, "cargo.toml": cYellow, "cargo.lock": cYellow, "license": cYellow, "copying": cYellow, ".ds_store": cDarker, ".gitignore": cDark, ".gitattributes": cDark, } func fileColor(name string, mode os.FileMode) *color.Color { if mode&0o111 != 0 { // executable beats everything else, as in eza return cExecB } low := strings.ToLower(name) if c, ok := byName[low]; ok { return c } if strings.HasPrefix(low, "readme") || strings.HasPrefix(low, "makefile") { return cYellow } if strings.HasSuffix(name, "~") { return cDarker } if ext := strings.TrimPrefix(filepath.Ext(low), "."); ext != "" { if c, ok := byExt[ext]; ok { return c } } return cWhite }