func (o *TextOutput) DarkTags(colors ...string) string {
	return o.darkReplacer.Replace(strings.Join(colors, ""))
}
Replace <blue> with starting a light blue color attribute and <off> with using the default attributes.
</blue> can also be used for using the default attributes.
package textoutput
import (
	"fmt"
	"os"
	"strconv"
	"strings"
	"github.com/xyproto/vt100"
)
type CharAttribute struct {
	R rune
	A vt100.AttributeColor
}
type TextOutput struct {
	color   bool
	enabled bool
	lightReplacer *strings.Replacer
	darkReplacer  *strings.Replacer
}
func NewTextOutput(color, enabled bool) *TextOutput {
	if os.Getenv("NO_COLOR") != "" {
		color = false
	}
	o := &TextOutput{color, enabled, nil, nil}
	o.initializeTagReplacers()
	return o
}
func (o *TextOutput) OutputTags(colors ...string) {
	if o.enabled {
		fmt.Println(o.Tags(colors...))
	}
}
func (o *TextOutput) OutputWords(line string, colors ...string) {
	if o.enabled {
		fmt.Println(o.Words(line, colors...))
	}
}
func (o *TextOutput) Println(msg ...interface{}) {
	if o.enabled {
		fmt.Println(msg...)
	}
}
func (o *TextOutput) Err(msg string) {
	if o.enabled {
		if o.color {
			vt100.Red.Error(msg)
		} else {
			vt100.Default.Error(msg)
		}
	}
}
func (o *TextOutput) ErrExit(msg string) {
	o.Err(msg)
	os.Exit(1)
}
func (o *TextOutput) IsEnabled() bool {
	return o.enabled
}
func (o *TextOutput) DarkRed(s string) string {
	if o.color {
		return vt100.Red.Get(s)
	}
	return s
}
func (o *TextOutput) DarkGreen(s string) string {
	if o.color {
		return vt100.Green.Get(s)
	}
	return s
}
func (o *TextOutput) DarkYellow(s string) string {
	if o.color {
		return vt100.Yellow.Get(s)
	}
	return s
}
func (o *TextOutput) DarkBlue(s string) string {
	if o.color {
		return vt100.Blue.Get(s)
	}
	return s
}
func (o *TextOutput) DarkPurple(s string) string {
	if o.color {
		return vt100.Magenta.Get(s)
	}
	return s
}
func (o *TextOutput) DarkCyan(s string) string {
	if o.color {
		return vt100.Cyan.Get(s)
	}
	return s
}
func (o *TextOutput) DarkGray(s string) string {
	if o.color {
		return vt100.DarkGray.Get(s)
	}
	return s
}
func (o *TextOutput) LightRed(s string) string {
	if o.color {
		return vt100.LightRed.Get(s)
	}
	return s
}
func (o *TextOutput) LightGreen(s string) string {
	if o.color {
		return vt100.LightGreen.Get(s)
	}
	return s
}
func (o *TextOutput) LightYellow(s string) string {
	if o.color {
		return vt100.LightYellow.Get(s)
	}
	return s
}
func (o *TextOutput) LightBlue(s string) string {
	if o.color {
		return vt100.LightBlue.Get(s)
	}
	return s
}
func (o *TextOutput) LightPurple(s string) string {
	if o.color {
		return vt100.LightMagenta.Get(s)
	}
	return s
}
func (o *TextOutput) LightCyan(s string) string {
	if o.color {
		return vt100.LightCyan.Get(s)
	}
	return s
}
func (o *TextOutput) White(s string) string {
	if o.color {
		return vt100.White.Get(s)
	}
	return s
}
func (o *TextOutput) Words(line string, colors ...string) string {
	if o.color {
		return vt100.Words(line, colors...)
	}
	return line
}
func (o *TextOutput) ColorOn(attribute1, attribute2 int) string {
	if !o.color {
		return ""
	}
	return fmt.Sprintf("\033[%d;%dm", attribute1, attribute2)
}
func (o *TextOutput) ColorOff() string {
	if !o.color {
		return ""
	}
	return "\033[0m"
}
func (o *TextOutput) LightTags(colors ...string) string {
	return o.lightReplacer.Replace(strings.Join(colors, ""))
}
func (o *TextOutput) Tags(colors ...string) string {
	return o.LightTags(colors...)
}