| package colorable |
| |
| import ( |
| "bytes" |
| "io" |
| ) |
| |
| type NonColorable struct { |
| out io.Writer |
| lastbuf bytes.Buffer |
| } |
| |
| func NewNonColorable(w io.Writer) io.Writer { |
| return &NonColorable{out: w} |
| } |
| |
| func (w *NonColorable) Write(data []byte) (n int, err error) { |
| er := bytes.NewReader(data) |
| var bw [1]byte |
| loop: |
| for { |
| c1, err := er.ReadByte() |
| if err != nil { |
| break loop |
| } |
| if c1 != 0x1b { |
| bw[0] = c1 |
| w.out.Write(bw[:]) |
| continue |
| } |
| c2, err := er.ReadByte() |
| if err != nil { |
| w.lastbuf.WriteByte(c1) |
| break loop |
| } |
| if c2 != 0x5b { |
| w.lastbuf.WriteByte(c1) |
| w.lastbuf.WriteByte(c2) |
| continue |
| } |
| |
| var buf bytes.Buffer |
| for { |
| c, err := er.ReadByte() |
| if err != nil { |
| w.lastbuf.WriteByte(c1) |
| w.lastbuf.WriteByte(c2) |
| w.lastbuf.Write(buf.Bytes()) |
| break loop |
| } |
| if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' { |
| break |
| } |
| buf.Write([]byte(string(c))) |
| } |
| } |
| return len(data) - w.lastbuf.Len(), nil |
| } |