forked from toolshed/abra
179 lines
5.0 KiB
Go
179 lines
5.0 KiB
Go
package ansi
|
|
|
|
import (
|
|
"fmt"
|
|
"image/color"
|
|
|
|
"github.com/lucasb-eyer/go-colorful"
|
|
)
|
|
|
|
// HexColor is a [color.Color] that can be formatted as a hex string.
|
|
type HexColor string
|
|
|
|
// RGBA returns the RGBA values of the color.
|
|
func (h HexColor) RGBA() (r, g, b, a uint32) {
|
|
hex := h.color()
|
|
if hex == nil {
|
|
return 0, 0, 0, 0
|
|
}
|
|
return hex.RGBA()
|
|
}
|
|
|
|
// Hex returns the hex representation of the color. If the color is invalid, it
|
|
// returns an empty string.
|
|
func (h HexColor) Hex() string {
|
|
hex := h.color()
|
|
if hex == nil {
|
|
return ""
|
|
}
|
|
return hex.Hex()
|
|
}
|
|
|
|
// String returns the color as a hex string. If the color is nil, an empty
|
|
// string is returned.
|
|
func (h HexColor) String() string {
|
|
return h.Hex()
|
|
}
|
|
|
|
// color returns the underlying color of the HexColor.
|
|
func (h HexColor) color() *colorful.Color {
|
|
hex, err := colorful.Hex(string(h))
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return &hex
|
|
}
|
|
|
|
// XRGBColor is a [color.Color] that can be formatted as an XParseColor
|
|
// rgb: string.
|
|
//
|
|
// See: https://linux.die.net/man/3/xparsecolor
|
|
type XRGBColor struct {
|
|
color.Color
|
|
}
|
|
|
|
// RGBA returns the RGBA values of the color.
|
|
func (x XRGBColor) RGBA() (r, g, b, a uint32) {
|
|
if x.Color == nil {
|
|
return 0, 0, 0, 0
|
|
}
|
|
return x.Color.RGBA()
|
|
}
|
|
|
|
// String returns the color as an XParseColor rgb: string. If the color is nil,
|
|
// an empty string is returned.
|
|
func (x XRGBColor) String() string {
|
|
if x.Color == nil {
|
|
return ""
|
|
}
|
|
r, g, b, _ := x.Color.RGBA()
|
|
// Get the lower 8 bits
|
|
return fmt.Sprintf("rgb:%04x/%04x/%04x", r, g, b)
|
|
}
|
|
|
|
// XRGBAColor is a [color.Color] that can be formatted as an XParseColor
|
|
// rgba: string.
|
|
//
|
|
// See: https://linux.die.net/man/3/xparsecolor
|
|
type XRGBAColor struct {
|
|
color.Color
|
|
}
|
|
|
|
// RGBA returns the RGBA values of the color.
|
|
func (x XRGBAColor) RGBA() (r, g, b, a uint32) {
|
|
if x.Color == nil {
|
|
return 0, 0, 0, 0
|
|
}
|
|
return x.Color.RGBA()
|
|
}
|
|
|
|
// String returns the color as an XParseColor rgba: string. If the color is nil,
|
|
// an empty string is returned.
|
|
func (x XRGBAColor) 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. Most terminals support hex,
|
|
// XParseColor rgb: and rgba: strings. You could use [HexColor], [XRGBColor],
|
|
// or [XRGBAColor] to format the color.
|
|
//
|
|
// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
|
|
func SetForegroundColor(s string) 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. Most terminals support hex,
|
|
// XParseColor rgb: and rgba: strings. You could use [HexColor], [XRGBColor],
|
|
// or [XRGBAColor] to format the color.
|
|
//
|
|
// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
|
|
func SetBackgroundColor(s string) 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. Most terminals support hex,
|
|
// XParseColor rgb: and rgba: strings. You could use [HexColor], [XRGBColor],
|
|
// or [XRGBAColor] to format the color.
|
|
//
|
|
// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
|
|
func SetCursorColor(s string) 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"
|