diff options
| author | historia <[not public]> | 2026-06-16 01:59:27 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-06-16 01:59:27 -0400 |
| commit | 43f21aabae8924f35c12c8485e690aeefe0089fb (patch) | |
| tree | b5fbadb89df3cf4ffec86503bb8e2d7e52b27454 /internal/color | |
| parent | 4cc1ddcd185509080b4b3e15d1646567edd51c9d (diff) | |
| download | thehouseoficarus-43f21aabae8924f35c12c8485e690aeefe0089fb.tar.gz | |
feat: overhauled ansi color, added prompt options
Diffstat (limited to 'internal/color')
| -rw-r--r-- | internal/color/color.go | 116 |
1 files changed, 51 insertions, 65 deletions
diff --git a/internal/color/color.go b/internal/color/color.go index c09a1db..4ef66b8 100644 --- a/internal/color/color.go +++ b/internal/color/color.go @@ -122,79 +122,65 @@ func Style(name string) string { return "" } -func Wrap(mode, name, text string) string { - if mode == "none" || mode == "" { - return text - } - return Fg(mode, name) + text + Reset +type ColorSpec struct { + Fg string + Bg string + Bold bool + Dim bool + Italic bool + Underline bool } -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 Parse(input string) ColorSpec { + var spec ColorSpec + for _, token := range strings.Fields(input) { + switch { + case token == "bold": + spec.Bold = true + case token == "dim": + spec.Dim = true + case token == "italic": + spec.Italic = true + case token == "underline": + spec.Underline = true + case strings.HasPrefix(token, "fg="): + spec.Fg = strings.TrimPrefix(token, "fg=") + case strings.HasPrefix(token, "bg="): + spec.Bg = strings.TrimPrefix(token, "bg=") } } + return spec } -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 (s ColorSpec) Empty() bool { + return s.Fg == "" && s.Bg == "" && !s.Bold && !s.Dim && !s.Italic && !s.Underline } -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):] +func Render(mode string, spec ColorSpec, text string) string { + if mode == "none" || mode == "" || spec.Empty() { + return text } - return s -} - -func cleanTags(text string) string { - result := text - for _, name := range knownColors { - result = strings.ReplaceAll(result, "<"+name+">", "") - result = strings.ReplaceAll(result, "</"+name+">", "") + var codes []string + if spec.Bold { + codes = append(codes, Style("bold")) + } + if spec.Dim { + codes = append(codes, Style("dim")) + } + if spec.Italic { + codes = append(codes, Style("italic")) + } + if spec.Underline { + codes = append(codes, Style("underline")) + } + if spec.Fg != "" { + codes = append(codes, Fg(mode, spec.Fg)) + } + if spec.Bg != "" { + codes = append(codes, Bg(mode, spec.Bg)) + } + if len(codes) == 0 { + return text } - return result + return strings.Join(codes, "") + text + Reset } |
