package util import ( "io" "regexp" ) // Strip ansi control characters from source // // The source reader is automatically closed when stripper reader is type AnsiStripper struct { regex regexp.Regexp source io.ReadCloser } func NewAnsiStripper(source io.ReadCloser) *AnsiStripper { striper := new(AnsiStripper) striper.regex = *regexp.MustCompile(`\x1b[[0-9;]*m`) striper.source = source return striper } func (rc AnsiStripper) Read(p []byte) (int, error) { n, err := rc.source.Read(p) if err != io.EOF && err != nil { return n, err } stripped := rc.regex.ReplaceAll(p[:n], []byte("")) n = copy(p, stripped) return n, err } func (rc AnsiStripper) Close() error { return rc.source.Close() }