diff options
| author | JP Appel <jeanpierre.appel01@gmail.com> | 2024-10-08 13:17:03 -0400 |
|---|---|---|
| committer | JP Appel <jeanpierre.appel01@gmail.com> | 2024-10-08 13:17:03 -0400 |
| commit | 13c771c84e6b86cebe6df14d0e92001f940581ba (patch) | |
| tree | 4b76f90de9c783dc3cb5da633bfc8434964e039d /util/util.go | |
| parent | 3b0e5c790ff51756c1317f4af83a2f0b0e66efd9 (diff) | |
Move ansi stripper to util package
Diffstat (limited to 'util/util.go')
| -rw-r--r-- | util/util.go | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/util/util.go b/util/util.go new file mode 100644 index 0000000..deb528b --- /dev/null +++ b/util/util.go @@ -0,0 +1,38 @@ +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() +} |
