aboutsummaryrefslogtreecommitdiff
path: root/internal/color
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-06-16 01:59:27 -0400
committerhistoria <[not public]>2026-06-16 01:59:27 -0400
commit43f21aabae8924f35c12c8485e690aeefe0089fb (patch)
treeb5fbadb89df3cf4ffec86503bb8e2d7e52b27454 /internal/color
parent4cc1ddcd185509080b4b3e15d1646567edd51c9d (diff)
downloadthehouseoficarus-43f21aabae8924f35c12c8485e690aeefe0089fb.tar.gz
feat: overhauled ansi color, added prompt options
Diffstat (limited to 'internal/color')
-rw-r--r--internal/color/color.go116
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
}