| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- package color
- import (
- "bytes"
- "fmt"
- "io"
- "os"
- "github.com/mattn/go-colorable"
- "github.com/mattn/go-isatty"
- )
- type (
- inner func(interface{}, []string, *Color) string
- )
- // Color styles
- const (
- // Blk Black text style
- Blk = "30"
- // Rd red text style
- Rd = "31"
- // Grn green text style
- Grn = "32"
- // Yel yellow text style
- Yel = "33"
- // Blu blue text style
- Blu = "34"
- // Mgn magenta text style
- Mgn = "35"
- // Cyn cyan text style
- Cyn = "36"
- // Wht white text style
- Wht = "37"
- // Gry grey text style
- Gry = "90"
- // BlkBg black background style
- BlkBg = "40"
- // RdBg red background style
- RdBg = "41"
- // GrnBg green background style
- GrnBg = "42"
- // YelBg yellow background style
- YelBg = "43"
- // BluBg blue background style
- BluBg = "44"
- // MgnBg magenta background style
- MgnBg = "45"
- // CynBg cyan background style
- CynBg = "46"
- // WhtBg white background style
- WhtBg = "47"
- // R reset emphasis style
- R = "0"
- // B bold emphasis style
- B = "1"
- // D dim emphasis style
- D = "2"
- // I italic emphasis style
- I = "3"
- // U underline emphasis style
- U = "4"
- // In inverse emphasis style
- In = "7"
- // H hidden emphasis style
- H = "8"
- // S strikeout emphasis style
- S = "9"
- )
- var (
- black = outer(Blk)
- red = outer(Rd)
- green = outer(Grn)
- yellow = outer(Yel)
- blue = outer(Blu)
- magenta = outer(Mgn)
- cyan = outer(Cyn)
- white = outer(Wht)
- grey = outer(Gry)
- blackBg = outer(BlkBg)
- redBg = outer(RdBg)
- greenBg = outer(GrnBg)
- yellowBg = outer(YelBg)
- blueBg = outer(BluBg)
- magentaBg = outer(MgnBg)
- cyanBg = outer(CynBg)
- whiteBg = outer(WhtBg)
- reset = outer(R)
- bold = outer(B)
- dim = outer(D)
- italic = outer(I)
- underline = outer(U)
- inverse = outer(In)
- hidden = outer(H)
- strikeout = outer(S)
- global = New()
- )
- func outer(n string) inner {
- return func(msg interface{}, styles []string, c *Color) string {
- // TODO: Drop fmt to boost performance?
- if c.disabled {
- return fmt.Sprintf("%v", msg)
- }
- b := new(bytes.Buffer)
- b.WriteString("\x1b[")
- b.WriteString(n)
- for _, s := range styles {
- b.WriteString(";")
- b.WriteString(s)
- }
- b.WriteString("m")
- return fmt.Sprintf("%s%v\x1b[0m", b.String(), msg)
- }
- }
- type (
- Color struct {
- output io.Writer
- disabled bool
- }
- )
- // New creates a Color instance.
- func New() (c *Color) {
- c = new(Color)
- c.SetOutput(colorable.NewColorableStdout())
- return
- }
- // Output returns the output.
- func (c *Color) Output() io.Writer {
- return c.output
- }
- // SetOutput sets the output.
- func (c *Color) SetOutput(w io.Writer) {
- c.output = w
- if w, ok := w.(*os.File); !ok || !isatty.IsTerminal(w.Fd()) {
- c.disabled = true
- }
- }
- // Disable disables the colors and styles.
- func (c *Color) Disable() {
- c.disabled = true
- }
- // Enable enables the colors and styles.
- func (c *Color) Enable() {
- c.disabled = false
- }
- // Print is analogous to `fmt.Print` with termial detection.
- func (c *Color) Print(args ...interface{}) {
- fmt.Fprint(c.output, args...)
- }
- // Println is analogous to `fmt.Println` with termial detection.
- func (c *Color) Println(args ...interface{}) {
- fmt.Fprintln(c.output, args...)
- }
- // Printf is analogous to `fmt.Printf` with termial detection.
- func (c *Color) Printf(format string, args ...interface{}) {
- fmt.Fprintf(c.output, format, args...)
- }
- func (c *Color) Black(msg interface{}, styles ...string) string {
- return black(msg, styles, c)
- }
- func (c *Color) Red(msg interface{}, styles ...string) string {
- return red(msg, styles, c)
- }
- func (c *Color) Green(msg interface{}, styles ...string) string {
- return green(msg, styles, c)
- }
- func (c *Color) Yellow(msg interface{}, styles ...string) string {
- return yellow(msg, styles, c)
- }
- func (c *Color) Blue(msg interface{}, styles ...string) string {
- return blue(msg, styles, c)
- }
- func (c *Color) Magenta(msg interface{}, styles ...string) string {
- return magenta(msg, styles, c)
- }
- func (c *Color) Cyan(msg interface{}, styles ...string) string {
- return cyan(msg, styles, c)
- }
- func (c *Color) White(msg interface{}, styles ...string) string {
- return white(msg, styles, c)
- }
- func (c *Color) Grey(msg interface{}, styles ...string) string {
- return grey(msg, styles, c)
- }
- func (c *Color) BlackBg(msg interface{}, styles ...string) string {
- return blackBg(msg, styles, c)
- }
- func (c *Color) RedBg(msg interface{}, styles ...string) string {
- return redBg(msg, styles, c)
- }
- func (c *Color) GreenBg(msg interface{}, styles ...string) string {
- return greenBg(msg, styles, c)
- }
- func (c *Color) YellowBg(msg interface{}, styles ...string) string {
- return yellowBg(msg, styles, c)
- }
- func (c *Color) BlueBg(msg interface{}, styles ...string) string {
- return blueBg(msg, styles, c)
- }
- func (c *Color) MagentaBg(msg interface{}, styles ...string) string {
- return magentaBg(msg, styles, c)
- }
- func (c *Color) CyanBg(msg interface{}, styles ...string) string {
- return cyanBg(msg, styles, c)
- }
- func (c *Color) WhiteBg(msg interface{}, styles ...string) string {
- return whiteBg(msg, styles, c)
- }
- func (c *Color) Reset(msg interface{}, styles ...string) string {
- return reset(msg, styles, c)
- }
- func (c *Color) Bold(msg interface{}, styles ...string) string {
- return bold(msg, styles, c)
- }
- func (c *Color) Dim(msg interface{}, styles ...string) string {
- return dim(msg, styles, c)
- }
- func (c *Color) Italic(msg interface{}, styles ...string) string {
- return italic(msg, styles, c)
- }
- func (c *Color) Underline(msg interface{}, styles ...string) string {
- return underline(msg, styles, c)
- }
- func (c *Color) Inverse(msg interface{}, styles ...string) string {
- return inverse(msg, styles, c)
- }
- func (c *Color) Hidden(msg interface{}, styles ...string) string {
- return hidden(msg, styles, c)
- }
- func (c *Color) Strikeout(msg interface{}, styles ...string) string {
- return strikeout(msg, styles, c)
- }
- // Output returns the output.
- func Output() io.Writer {
- return global.output
- }
- // SetOutput sets the output.
- func SetOutput(w io.Writer) {
- global.SetOutput(w)
- }
- func Disable() {
- global.Disable()
- }
- func Enable() {
- global.Enable()
- }
- // Print is analogous to `fmt.Print` with termial detection.
- func Print(args ...interface{}) {
- global.Print(args...)
- }
- // Println is analogous to `fmt.Println` with termial detection.
- func Println(args ...interface{}) {
- global.Println(args...)
- }
- // Printf is analogous to `fmt.Printf` with termial detection.
- func Printf(format string, args ...interface{}) {
- global.Printf(format, args...)
- }
- func Black(msg interface{}, styles ...string) string {
- return global.Black(msg, styles...)
- }
- func Red(msg interface{}, styles ...string) string {
- return global.Red(msg, styles...)
- }
- func Green(msg interface{}, styles ...string) string {
- return global.Green(msg, styles...)
- }
- func Yellow(msg interface{}, styles ...string) string {
- return global.Yellow(msg, styles...)
- }
- func Blue(msg interface{}, styles ...string) string {
- return global.Blue(msg, styles...)
- }
- func Magenta(msg interface{}, styles ...string) string {
- return global.Magenta(msg, styles...)
- }
- func Cyan(msg interface{}, styles ...string) string {
- return global.Cyan(msg, styles...)
- }
- func White(msg interface{}, styles ...string) string {
- return global.White(msg, styles...)
- }
- func Grey(msg interface{}, styles ...string) string {
- return global.Grey(msg, styles...)
- }
- func BlackBg(msg interface{}, styles ...string) string {
- return global.BlackBg(msg, styles...)
- }
- func RedBg(msg interface{}, styles ...string) string {
- return global.RedBg(msg, styles...)
- }
- func GreenBg(msg interface{}, styles ...string) string {
- return global.GreenBg(msg, styles...)
- }
- func YellowBg(msg interface{}, styles ...string) string {
- return global.YellowBg(msg, styles...)
- }
- func BlueBg(msg interface{}, styles ...string) string {
- return global.BlueBg(msg, styles...)
- }
- func MagentaBg(msg interface{}, styles ...string) string {
- return global.MagentaBg(msg, styles...)
- }
- func CyanBg(msg interface{}, styles ...string) string {
- return global.CyanBg(msg, styles...)
- }
- func WhiteBg(msg interface{}, styles ...string) string {
- return global.WhiteBg(msg, styles...)
- }
- func Reset(msg interface{}, styles ...string) string {
- return global.Reset(msg, styles...)
- }
- func Bold(msg interface{}, styles ...string) string {
- return global.Bold(msg, styles...)
- }
- func Dim(msg interface{}, styles ...string) string {
- return global.Dim(msg, styles...)
- }
- func Italic(msg interface{}, styles ...string) string {
- return global.Italic(msg, styles...)
- }
- func Underline(msg interface{}, styles ...string) string {
- return global.Underline(msg, styles...)
- }
- func Inverse(msg interface{}, styles ...string) string {
- return global.Inverse(msg, styles...)
- }
- func Hidden(msg interface{}, styles ...string) string {
- return global.Hidden(msg, styles...)
- }
- func Strikeout(msg interface{}, styles ...string) string {
- return global.Strikeout(msg, styles...)
- }
|