// Copyright 2016 Canonical Ltd. // Licensed under the LGPLv3, see LICENCE file for details. package ansiterm import ( "fmt" "io" ) // Writer allows colors and styles to be specified. If the io.Writer // is not a terminal capable of color, all attempts to set colors or // styles are no-ops. type Writer struct { io.Writer noColor bool } // NewWriter returns a Writer that allows the caller to specify colors and // styles. If the io.Writer is not a terminal capable of color, all attempts // to set colors or styles are no-ops. func NewWriter(w io.Writer) *Writer { writer, colorCapable := colorEnabledWriter(w) return &Writer{ Writer: writer, noColor: !colorCapable, } } // SetColorCapable forces the writer to either write the ANSI escape color // if capable is true, or to not write them if capable is false. func (w *Writer) SetColorCapable(capable bool) { w.noColor = !capable } // SetForeground sets the foreground color. func (w *Writer) SetForeground(c Color) { w.writeSGR(c.foreground()) } // SetBackground sets the background color. func (w *Writer) SetBackground(c Color) { w.writeSGR(c.background()) } // SetStyle sets the text style. func (w *Writer) SetStyle(s Style) { w.writeSGR(s.enable()) } // ClearStyle clears the text style. func (w *Writer) ClearStyle(s Style) { w.writeSGR(s.disable()) } // Reset returns the default foreground and background colors with no styles. func (w *Writer) Reset() { w.writeSGR(reset) } type sgr interface { // sgr returns the combined escape sequence for the Select Graphic Rendition. sgr() string } // writeSGR takes the appropriate integer SGR parameters // and writes out the ANIS escape code. func (w *Writer) writeSGR(value sgr) { if w.noColor { return } fmt.Fprint(w, value.sgr()) }