| // Copyright 2016 Canonical Ltd. |
| // Licensed under the LGPLv3, see LICENCE file for details. |
| |
| package ansiterm |
| |
| import ( |
| "fmt" |
| "io" |
| ) |
| |
| // Context provides a way to specify both foreground and background colors |
| // along with other styles and write text to a Writer with those colors and |
| // styles. |
| type Context struct { |
| Foreground Color |
| Background Color |
| Styles []Style |
| } |
| |
| // Foreground is a convenience function that creates a Context with the |
| // specified color as the foreground color. |
| func Foreground(color Color) *Context { |
| return &Context{Foreground: color} |
| } |
| |
| // Background is a convenience function that creates a Context with the |
| // specified color as the background color. |
| func Background(color Color) *Context { |
| return &Context{Background: color} |
| } |
| |
| // Styles is a convenience function that creates a Context with the |
| // specified styles set. |
| func Styles(styles ...Style) *Context { |
| return &Context{Styles: styles} |
| } |
| |
| // SetForeground sets the foreground to the specified color. |
| func (c *Context) SetForeground(color Color) *Context { |
| c.Foreground = color |
| return c |
| } |
| |
| // SetBackground sets the background to the specified color. |
| func (c *Context) SetBackground(color Color) *Context { |
| c.Background = color |
| return c |
| } |
| |
| // SetStyle replaces the styles with the new values. |
| func (c *Context) SetStyle(styles ...Style) *Context { |
| c.Styles = styles |
| return c |
| } |
| |
| type sgrWriter interface { |
| io.Writer |
| writeSGR(value sgr) |
| } |
| |
| // Fprintf will set the sgr values of the writer to the specified |
| // foreground, background and styles, then write the formatted string, |
| // then reset the writer. |
| func (c *Context) Fprintf(w sgrWriter, format string, args ...interface{}) { |
| w.writeSGR(c) |
| fmt.Fprintf(w, format, args...) |
| w.writeSGR(reset) |
| } |
| |
| // Fprint will set the sgr values of the writer to the specified foreground, |
| // background and styles, then formats using the default formats for its |
| // operands and writes to w. Spaces are added between operands when neither is |
| // a string. It returns the number of bytes written and any write error |
| // encountered. |
| func (c *Context) Fprint(w sgrWriter, args ...interface{}) { |
| w.writeSGR(c) |
| fmt.Fprint(w, args...) |
| w.writeSGR(reset) |
| } |
| |
| func (c *Context) sgr() string { |
| var values attributes |
| if foreground := c.Foreground.foreground(); foreground != unknownAttribute { |
| values = append(values, foreground) |
| } |
| if background := c.Background.background(); background != unknownAttribute { |
| values = append(values, background) |
| } |
| for _, style := range c.Styles { |
| if value := style.enable(); value != unknownAttribute { |
| values = append(values, value) |
| } |
| } |
| return values.sgr() |
| } |