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 }