Files
dx/filetypes.go
T
2026-08-10 21:51:53 +02:00

94 lines
3.0 KiB
Go

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
}