background.go

  1package ansi
  2
  3import (
  4	"fmt"
  5	"image/color"
  6
  7	"github.com/lucasb-eyer/go-colorful"
  8)
  9
 10// HexColor is a [color.Color] that can be formatted as a hex string.
 11type HexColor string
 12
 13// RGBA returns the RGBA values of the color.
 14func (h HexColor) RGBA() (r, g, b, a uint32) {
 15	hex := h.color()
 16	if hex == nil {
 17		return 0, 0, 0, 0
 18	}
 19	return hex.RGBA()
 20}
 21
 22// Hex returns the hex representation of the color. If the color is invalid, it
 23// returns an empty string.
 24func (h HexColor) Hex() string {
 25	hex := h.color()
 26	if hex == nil {
 27		return ""
 28	}
 29	return hex.Hex()
 30}
 31
 32// String returns the color as a hex string. If the color is nil, an empty
 33// string is returned.
 34func (h HexColor) String() string {
 35	return h.Hex()
 36}
 37
 38// color returns the underlying color of the HexColor.
 39func (h HexColor) color() *colorful.Color {
 40	hex, err := colorful.Hex(string(h))
 41	if err != nil {
 42		return nil
 43	}
 44	return &hex
 45}
 46
 47// XRGBColor is a [color.Color] that can be formatted as an XParseColor
 48// rgb: string.
 49//
 50// See: https://linux.die.net/man/3/xparsecolor
 51type XRGBColor struct {
 52	color.Color
 53}
 54
 55// RGBA returns the RGBA values of the color.
 56func (x XRGBColor) RGBA() (r, g, b, a uint32) {
 57	if x.Color == nil {
 58		return 0, 0, 0, 0
 59	}
 60	return x.Color.RGBA()
 61}
 62
 63// String returns the color as an XParseColor rgb: string. If the color is nil,
 64// an empty string is returned.
 65func (x XRGBColor) String() string {
 66	if x.Color == nil {
 67		return ""
 68	}
 69	r, g, b, _ := x.Color.RGBA()
 70	// Get the lower 8 bits
 71	return fmt.Sprintf("rgb:%04x/%04x/%04x", r, g, b)
 72}
 73
 74// XRGBAColor is a [color.Color] that can be formatted as an XParseColor
 75// rgba: string.
 76//
 77// See: https://linux.die.net/man/3/xparsecolor
 78type XRGBAColor struct {
 79	color.Color
 80}
 81
 82// RGBA returns the RGBA values of the color.
 83func (x XRGBAColor) RGBA() (r, g, b, a uint32) {
 84	if x.Color == nil {
 85		return 0, 0, 0, 0
 86	}
 87	return x.Color.RGBA()
 88}
 89
 90// String returns the color as an XParseColor rgba: string. If the color is nil,
 91// an empty string is returned.
 92func (x XRGBAColor) String() string {
 93	if x.Color == nil {
 94		return ""
 95	}
 96	r, g, b, a := x.RGBA()
 97	// Get the lower 8 bits
 98	return fmt.Sprintf("rgba:%04x/%04x/%04x/%04x", r, g, b, a)
 99}
100
101// SetForegroundColor returns a sequence that sets the default terminal
102// foreground color.
103//
104//	OSC 10 ; color ST
105//	OSC 10 ; color BEL
106//
107// Where color is the encoded color number. Most terminals support hex,
108// XParseColor rgb: and rgba: strings. You could use [HexColor], [XRGBColor],
109// or [XRGBAColor] to format the color.
110//
111// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
112func SetForegroundColor(s string) string {
113	return "\x1b]10;" + s + "\x07"
114}
115
116// RequestForegroundColor is a sequence that requests the current default
117// terminal foreground color.
118//
119// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
120const RequestForegroundColor = "\x1b]10;?\x07"
121
122// ResetForegroundColor is a sequence that resets the default terminal
123// foreground color.
124//
125// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
126const ResetForegroundColor = "\x1b]110\x07"
127
128// SetBackgroundColor returns a sequence that sets the default terminal
129// background color.
130//
131//	OSC 11 ; color ST
132//	OSC 11 ; color BEL
133//
134// Where color is the encoded color number. Most terminals support hex,
135// XParseColor rgb: and rgba: strings. You could use [HexColor], [XRGBColor],
136// or [XRGBAColor] to format the color.
137//
138// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
139func SetBackgroundColor(s string) string {
140	return "\x1b]11;" + s + "\x07"
141}
142
143// RequestBackgroundColor is a sequence that requests the current default
144// terminal background color.
145//
146// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
147const RequestBackgroundColor = "\x1b]11;?\x07"
148
149// ResetBackgroundColor is a sequence that resets the default terminal
150// background color.
151//
152// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
153const ResetBackgroundColor = "\x1b]111\x07"
154
155// SetCursorColor returns a sequence that sets the terminal cursor color.
156//
157//	OSC 12 ; color ST
158//	OSC 12 ; color BEL
159//
160// Where color is the encoded color number. Most terminals support hex,
161// XParseColor rgb: and rgba: strings. You could use [HexColor], [XRGBColor],
162// or [XRGBAColor] to format the color.
163//
164// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
165func SetCursorColor(s string) string {
166	return "\x1b]12;" + s + "\x07"
167}
168
169// RequestCursorColor is a sequence that requests the current terminal cursor
170// color.
171//
172// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
173const RequestCursorColor = "\x1b]12;?\x07"
174
175// ResetCursorColor is a sequence that resets the terminal cursor color.
176//
177// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
178const ResetCursorColor = "\x1b]112\x07"