| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- package ansi
- import (
- "fmt"
- "image/color"
- )
- // Colorizer is a [color.Color] interface that can be formatted as a string.
- type Colorizer interface {
- color.Color
- fmt.Stringer
- }
- // HexColorizer is a [color.Color] that can be formatted as a hex string.
- type HexColorizer struct{ color.Color }
- var _ Colorizer = HexColorizer{}
- // String returns the color as a hex string. If the color is nil, an empty
- // string is returned.
- func (h HexColorizer) String() string {
- if h.Color == nil {
- return ""
- }
- r, g, b, _ := h.RGBA()
- // Get the lower 8 bits
- r &= 0xff
- g &= 0xff
- b &= 0xff
- return fmt.Sprintf("#%02x%02x%02x", uint8(r), uint8(g), uint8(b)) //nolint:gosec
- }
- // XRGBColorizer is a [color.Color] that can be formatted as an XParseColor
- // rgb: string.
- //
- // See: https://linux.die.net/man/3/xparsecolor
- type XRGBColorizer struct{ color.Color }
- var _ Colorizer = XRGBColorizer{}
- // String returns the color as an XParseColor rgb: string. If the color is nil,
- // an empty string is returned.
- func (x XRGBColorizer) String() string {
- if x.Color == nil {
- return ""
- }
- r, g, b, _ := x.RGBA()
- // Get the lower 8 bits
- return fmt.Sprintf("rgb:%04x/%04x/%04x", r, g, b)
- }
- // XRGBAColorizer is a [color.Color] that can be formatted as an XParseColor
- // rgba: string.
- //
- // See: https://linux.die.net/man/3/xparsecolor
- type XRGBAColorizer struct{ color.Color }
- var _ Colorizer = XRGBAColorizer{}
- // String returns the color as an XParseColor rgba: string. If the color is nil,
- // an empty string is returned.
- func (x XRGBAColorizer) String() string {
- if x.Color == nil {
- return ""
- }
- r, g, b, a := x.RGBA()
- // Get the lower 8 bits
- return fmt.Sprintf("rgba:%04x/%04x/%04x/%04x", r, g, b, a)
- }
- // SetForegroundColor returns a sequence that sets the default terminal
- // foreground color.
- //
- // OSC 10 ; color ST
- // OSC 10 ; color BEL
- //
- // Where color is the encoded color number.
- //
- // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
- func SetForegroundColor(c color.Color) string {
- var s string
- switch c := c.(type) {
- case Colorizer:
- s = c.String()
- case fmt.Stringer:
- s = c.String()
- default:
- s = HexColorizer{c}.String()
- }
- return "\x1b]10;" + s + "\x07"
- }
- // RequestForegroundColor is a sequence that requests the current default
- // terminal foreground color.
- //
- // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
- const RequestForegroundColor = "\x1b]10;?\x07"
- // ResetForegroundColor is a sequence that resets the default terminal
- // foreground color.
- //
- // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
- const ResetForegroundColor = "\x1b]110\x07"
- // SetBackgroundColor returns a sequence that sets the default terminal
- // background color.
- //
- // OSC 11 ; color ST
- // OSC 11 ; color BEL
- //
- // Where color is the encoded color number.
- //
- // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
- func SetBackgroundColor(c color.Color) string {
- var s string
- switch c := c.(type) {
- case Colorizer:
- s = c.String()
- case fmt.Stringer:
- s = c.String()
- default:
- s = HexColorizer{c}.String()
- }
- return "\x1b]11;" + s + "\x07"
- }
- // RequestBackgroundColor is a sequence that requests the current default
- // terminal background color.
- //
- // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
- const RequestBackgroundColor = "\x1b]11;?\x07"
- // ResetBackgroundColor is a sequence that resets the default terminal
- // background color.
- //
- // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
- const ResetBackgroundColor = "\x1b]111\x07"
- // SetCursorColor returns a sequence that sets the terminal cursor color.
- //
- // OSC 12 ; color ST
- // OSC 12 ; color BEL
- //
- // Where color is the encoded color number.
- //
- // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
- func SetCursorColor(c color.Color) string {
- var s string
- switch c := c.(type) {
- case Colorizer:
- s = c.String()
- case fmt.Stringer:
- s = c.String()
- default:
- s = HexColorizer{c}.String()
- }
- return "\x1b]12;" + s + "\x07"
- }
- // RequestCursorColor is a sequence that requests the current terminal cursor
- // color.
- //
- // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
- const RequestCursorColor = "\x1b]12;?\x07"
- // ResetCursorColor is a sequence that resets the terminal cursor color.
- //
- // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
- const ResetCursorColor = "\x1b]112\x07"
|