diff --git a/color.go b/color.go index da41997..a1e6b63 100644 --- a/color.go +++ b/color.go @@ -1,36 +1,85 @@ package main -import "github.com/fatih/color" +import ( + "fmt" + "strings" + + "github.com/fatih/color" +) var colorCache = map[string]*color.Color{} -func makeColor(name string) (c *color.Color) { +func makeColor(colorSpec string) (c *color.Color) { // caching - if c, ok := colorCache[name]; ok { + if c, ok := colorCache[colorSpec]; ok { return c } - defer func() { colorCache[name] = c }() + defer func() { colorCache[colorSpec] = c }() + + splits := strings.Split(colorSpec, ",") + name := strings.TrimSpace(splits[0]) + + c = color.New() switch name { case "black": - return color.New(color.FgBlack) + c.Add(color.FgBlack) case "red": - return color.New(color.FgRed) + c.Add(color.FgRed) case "green": - return color.New(color.FgGreen) + c.Add(color.FgGreen) case "yellow": - return color.New(color.FgYellow) + c.Add(color.FgYellow) case "blue": - return color.New(color.FgBlue) + c.Add(color.FgBlue) case "magenta": - return color.New(color.FgMagenta) + c.Add(color.FgMagenta) case "cyan": - return color.New(color.FgCyan) + c.Add(color.FgCyan) case "white": - return color.New(color.FgWhite) + c.Add(color.FgWhite) case "": - return color.New() default: panic("unknown color name. valid color names: black, red, green, yellow, blue, magenta, cyan, white") } + + if len(splits) >= 2 { + attr := splits[1] + + switch attr { + case "bold": + fmt.Println("bold") + c.Add(color.Bold) + case "faint": + fmt.Println("faint") + c.Add(color.Faint) + case "italic": + fmt.Println("italic") + c.Add(color.Italic) + case "underline": + fmt.Println("underline") + c.Add(color.Underline) + case "blink_slow": + fmt.Println("blink_slow") + c.Add(color.BlinkSlow) + case "blink_rapid": + fmt.Println("blink_rapid") + c.Add(color.BlinkRapid) + case "reverse_video": + fmt.Println("reverse_video") + c.Add(color.ReverseVideo) + case "concealed": + fmt.Println("concealed") + c.Add(color.Concealed) + case "crossed_out": + fmt.Println("crossed_out") + c.Add(color.CrossedOut) + case "": + fmt.Println("") + default: + panic("unknown attribute. valid attributes: bold, faint, italic, underline, blink_slow, blink_rapid, reverse_video, concealed, crossed_out") + } + } + + return c } diff --git a/main.go b/main.go index d4855dd..8c237a0 100644 --- a/main.go +++ b/main.go @@ -14,6 +14,10 @@ import ( "github.com/fatih/color" ) +const ( + DefaultOutput = "{0}" +) + var ( // regex with sub groups input = flag.String("i", `^(.|\n)*?$`, "input pattern") @@ -36,7 +40,7 @@ var ( // // The following number mutators (integers and floats) are allowed: // + - * / ^ % - output = flag.String("o", "{0}", "output pattern") + output = flag.String("o", DefaultOutput, "output pattern") // don't ignore lines which do not match against input. // they will be copied without any changes @@ -60,19 +64,19 @@ func main() { panic(err) } - matchesWholeLine := strings.HasPrefix(*input, "^") && strings.HasSuffix(*input, "$") + reformatting := strings.HasPrefix(*input, "^") && strings.HasSuffix(*input, "$") && *output != DefaultOutput - if matchesWholeLine { + if reformatting { escapedOutput := EscSeqReplacer.Replace(*output) - handleWholeLineRegex(pattern, escapedOutput) + reformatLine(pattern, escapedOutput) } else { - handleInlineRegex(pattern) + colorCodeMatches(pattern) } } -// handleWholeLineRegex is using input pattern ot replace +// reformatLine is using input pattern to replace // placeholders in output pattern with the given subgroups -func handleWholeLineRegex(pattern *regexp.Regexp, output string) { +func reformatLine(pattern *regexp.Regexp, output string) { for line := range readLines(os.Stdin) { matches := pattern.FindStringSubmatch(line) if len(matches) == 0 { @@ -85,9 +89,9 @@ func handleWholeLineRegex(pattern *regexp.Regexp, output string) { } } -// handleInlineRegex is using input pattern +// colorCodeMatches is using input pattern // and color-codes all matches within input -func handleInlineRegex(pattern *regexp.Regexp) { +func colorCodeMatches(pattern *regexp.Regexp) { c := color.New(color.FgRed, color.Bold) for line := range readLines(os.Stdin) { matches := pattern.FindAllStringIndex(line, -1)