137 lines
2.5 KiB
Go
137 lines
2.5 KiB
Go
|
package tablewriter
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
const ESC = "\033"
|
||
|
const SEP = ";"
|
||
|
|
||
|
const (
|
||
|
BgBlackColor int = iota + 40
|
||
|
BgRedColor
|
||
|
BgGreenColor
|
||
|
BgYellowColor
|
||
|
BgBlueColor
|
||
|
BgMagentaColor
|
||
|
BgCyanColor
|
||
|
BgWhiteColor
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
FgBlackColor int = iota + 30
|
||
|
FgRedColor
|
||
|
FgGreenColor
|
||
|
FgYellowColor
|
||
|
FgBlueColor
|
||
|
FgMagentaColor
|
||
|
FgCyanColor
|
||
|
FgWhiteColor
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
BgHiBlackColor int = iota + 100
|
||
|
BgHiRedColor
|
||
|
BgHiGreenColor
|
||
|
BgHiYellowColor
|
||
|
BgHiBlueColor
|
||
|
BgHiMagentaColor
|
||
|
BgHiCyanColor
|
||
|
BgHiWhiteColor
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
FgHiBlackColor int = iota + 90
|
||
|
FgHiRedColor
|
||
|
FgHiGreenColor
|
||
|
FgHiYellowColor
|
||
|
FgHiBlueColor
|
||
|
FgHiMagentaColor
|
||
|
FgHiCyanColor
|
||
|
FgHiWhiteColor
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
Normal = 0
|
||
|
Bold = 1
|
||
|
UnderlineSingle = 4
|
||
|
Italic
|
||
|
)
|
||
|
|
||
|
type Colors []int
|
||
|
|
||
|
func startFormat(seq string) string {
|
||
|
return fmt.Sprintf("%s[%sm", ESC, seq)
|
||
|
}
|
||
|
|
||
|
func stopFormat() string {
|
||
|
return fmt.Sprintf("%s[%dm", ESC, Normal)
|
||
|
}
|
||
|
|
||
|
// Making the SGR (Select Graphic Rendition) sequence.
|
||
|
func makeSequence(codes []int) string {
|
||
|
codesInString := []string{}
|
||
|
for _, code := range codes {
|
||
|
codesInString = append(codesInString, strconv.Itoa(code))
|
||
|
}
|
||
|
return strings.Join(codesInString, SEP)
|
||
|
}
|
||
|
|
||
|
// Adding ANSI escape sequences before and after string
|
||
|
func format(s string, codes interface{}) string {
|
||
|
var seq string
|
||
|
|
||
|
switch v := codes.(type) {
|
||
|
|
||
|
case string:
|
||
|
seq = v
|
||
|
case []int:
|
||
|
seq = makeSequence(v)
|
||
|
case Colors:
|
||
|
seq = makeSequence(v)
|
||
|
default:
|
||
|
return s
|
||
|
}
|
||
|
|
||
|
if len(seq) == 0 {
|
||
|
return s
|
||
|
}
|
||
|
return startFormat(seq) + s + stopFormat()
|
||
|
}
|
||
|
|
||
|
// Adding header colors (ANSI codes)
|
||
|
func (t *Table) SetHeaderColor(colors ...Colors) {
|
||
|
if t.colSize != len(colors) {
|
||
|
panic("Number of header colors must be equal to number of headers.")
|
||
|
}
|
||
|
for i := 0; i < len(colors); i++ {
|
||
|
t.headerParams = append(t.headerParams, makeSequence(colors[i]))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Adding column colors (ANSI codes)
|
||
|
func (t *Table) SetColumnColor(colors ...Colors) {
|
||
|
if t.colSize != len(colors) {
|
||
|
panic("Number of column colors must be equal to number of headers.")
|
||
|
}
|
||
|
for i := 0; i < len(colors); i++ {
|
||
|
t.columnsParams = append(t.columnsParams, makeSequence(colors[i]))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Adding column colors (ANSI codes)
|
||
|
func (t *Table) SetFooterColor(colors ...Colors) {
|
||
|
if len(t.footers) != len(colors) {
|
||
|
panic("Number of footer colors must be equal to number of footer.")
|
||
|
}
|
||
|
for i := 0; i < len(colors); i++ {
|
||
|
t.footerParams = append(t.footerParams, makeSequence(colors[i]))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func Color(colors ...int) []int {
|
||
|
return colors
|
||
|
}
|