diff --git a/color.go b/color.go index 1818a11..740572a 100644 --- a/color.go +++ b/color.go @@ -3,17 +3,15 @@ package color import ( "fmt" "os" + "strings" ) -// Whether the terminal supports true color -var TrueColor = os.Getenv("COLORTERM") == "truecolor" - -// Color code -type Code int +// Color type +type Color int // Color codes const ( - Black Code = iota + 30 + Black Color = iota + 30 Red Green Yellow @@ -23,33 +21,55 @@ const ( White ) -func (code Code) String(args ...any) string { - return fmt.Sprintf("\x1b[%dm%s\x1b[0m", code, fmt.Sprint(args...)) +func (c Color) String(args ...any) string { + return fmt.Sprintf("\x1b[%dm%s\x1b[0m", c, fmt.Sprint(args...)) } -func (code Code) Print(args ...any) { - if !TrueColor { +func (c Color) Print(args ...any) { + if !supportsColors() { fmt.Print(args...) return } - fmt.Printf("\x1b[%dm%s\x1b[0m", code, fmt.Sprint(args...)) + fmt.Printf("\x1b[%dm%s\x1b[0m", c, fmt.Sprint(args...)) } -func (code Code) Printf(format string, args ...any) { - if !TrueColor { +func (c Color) Printf(format string, args ...any) { + if !supportsColors() { fmt.Printf(format, args...) return } - fmt.Printf("\x1b[%dm%s\x1b[0m", code, fmt.Sprintf(format, args...)) + fmt.Printf("\x1b[%dm%s\x1b[0m", c, fmt.Sprintf(format, args...)) } -func (code Code) Println(args ...any) { - if !TrueColor { +func (c Color) Println(args ...any) { + if !supportsColors() { fmt.Println(args...) return } - fmt.Printf("\x1b[%dm%s\x1b[0m\n", code, fmt.Sprint(args...)) + fmt.Printf("\x1b[%dm%s\x1b[0m\n", c, fmt.Sprint(args...)) +} + +func supportsColors() bool { + colorterm := os.Getenv("COLORTERM") + term := os.Getenv("TERM") + + // Check for true color (24-bit support) + if strings.Contains(colorterm, "truecolor") || strings.Contains(colorterm, "24bit") { + return true + } + + // Check for 256 colors support + if strings.Contains(term, "256color") { + return true + } + + // Check for basic color support + if term == "xterm" || term == "screen" || term == "vt100" || strings.Contains(term, "color") { + return true + } + + return false }