diff options
| author | historia <[not public]> | 2026-06-15 02:57:35 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-06-15 02:58:50 -0400 |
| commit | 4cc1ddcd185509080b4b3e15d1646567edd51c9d (patch) | |
| tree | 2a564846ad4fd159a2d7e55451bfa9569fe8c0b8 /internal/color | |
| parent | 445c4612cc5cf2c226f85894b6ad1e2419a374e2 (diff) | |
| download | thehouseoficarus-4cc1ddcd185509080b4b3e15d1646567edd51c9d.tar.gz | |
removed game speed for being broken and an antifeature anyway. added color support.
Diffstat (limited to 'internal/color')
| -rw-r--r-- | internal/color/color.go | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/internal/color/color.go b/internal/color/color.go new file mode 100644 index 0000000..c09a1db --- /dev/null +++ b/internal/color/color.go @@ -0,0 +1,200 @@ +package color + +import ( + "fmt" + "strings" +) + +const Reset = "\033[0m" + +var ansiFg = map[string]int{ + "black": 30, + "red": 31, + "green": 32, + "yellow": 33, + "blue": 34, + "magenta": 35, + "cyan": 36, + "white": 37, +} + +var ansiBg = map[string]int{ + "black": 40, + "red": 41, + "green": 42, + "yellow": 43, + "blue": 44, + "magenta": 45, + "cyan": 46, + "white": 47, +} + +var ansiBrightFg = map[string]int{ + "bright_black": 90, + "bright_red": 91, + "bright_green": 92, + "bright_yellow": 93, + "bright_blue": 94, + "bright_magenta": 95, + "bright_cyan": 96, + "bright_white": 97, +} + +var ansiBrightBg = map[string]int{ + "bright_black": 100, + "bright_red": 101, + "bright_green": 102, + "bright_yellow": 103, + "bright_blue": 104, + "bright_magenta": 105, + "bright_cyan": 106, + "bright_white": 107, +} + +var xtermFg = map[string]int{ + "black": 0, + "red": 1, + "green": 2, + "yellow": 3, + "blue": 4, + "magenta": 5, + "cyan": 6, + "white": 7, + "bright_black": 8, + "bright_red": 9, + "bright_green": 10, + "bright_yellow": 11, + "bright_blue": 12, + "bright_magenta": 13, + "bright_cyan": 14, + "bright_white": 15, +} + +var ansiStyles = map[string]string{ + "bold": "\033[1m", + "dim": "\033[2m", + "italic": "\033[3m", + "underline": "\033[4m", +} + +func Fg(mode, name string) string { + if mode == "none" || mode == "" { + return "" + } + if mode == "xterm256" { + if c, ok := xtermFg[name]; ok { + return fmt.Sprintf("\033[38;5;%dm", c) + } + return "" + } + if c, ok := ansiFg[name]; ok { + return fmt.Sprintf("\033[%dm", c) + } + if c, ok := ansiBrightFg[name]; ok { + return fmt.Sprintf("\033[%dm", c) + } + return "" +} + +func Bg(mode, name string) string { + if mode == "none" || mode == "" { + return "" + } + if mode == "xterm256" { + if c, ok := xtermFg[name]; ok { + return fmt.Sprintf("\033[48;5;%dm", c) + } + return "" + } + if c, ok := ansiBg[name]; ok { + return fmt.Sprintf("\033[%dm", c) + } + if c, ok := ansiBrightBg[name]; ok { + return fmt.Sprintf("\033[%dm", c) + } + return "" +} + +func Style(name string) string { + if s, ok := ansiStyles[name]; ok { + return s + } + return "" +} + +func Wrap(mode, name, text string) string { + if mode == "none" || mode == "" { + return text + } + return Fg(mode, name) + text + Reset +} + +var knownColors []string + +func init() { + seen := make(map[string]bool) + for name := range ansiFg { + if !seen[name] { + knownColors = append(knownColors, name) + seen[name] = true + } + } + for name := range ansiBrightFg { + if !seen[name] { + knownColors = append(knownColors, name) + seen[name] = true + } + } + for name := range ansiStyles { + if !seen[name] { + knownColors = append(knownColors, name) + seen[name] = true + } + } +} + +func KnownColors() []string { return knownColors } + +func Tag(mode, text string) string { + if mode == "none" || mode == "" { + return cleanTags(text) + } + result := text + for _, name := range knownColors { + if _, isStyle := ansiStyles[name]; isStyle { + result = replaceTag(result, name, Style(name), Reset) + } else { + result = replaceTag(result, name, Fg(mode, name), Reset) + } + } + return result +} + +func replaceTag(s, name, open, close string) string { + tag := "<" + name + ">" + end := "</" + name + ">" + for { + start := strings.Index(s, tag) + if start < 0 { + break + } + closeIdx := strings.Index(s[start+len(tag):], end) + if closeIdx < 0 { + break + } + closeIdx += start + len(tag) + inner := s[start+len(tag) : closeIdx] + replacement := open + inner + close + s = s[:start] + replacement + s[closeIdx+len(end):] + } + return s +} + +func cleanTags(text string) string { + result := text + for _, name := range knownColors { + result = strings.ReplaceAll(result, "<"+name+">", "") + result = strings.ReplaceAll(result, "</"+name+">", "") + } + return result +} |
