| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- package colorable
- import (
- "bytes"
- "fmt"
- "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.NewBuffer(data)
- loop:
- for {
- c1, _, err := er.ReadRune()
- if err != nil {
- break loop
- }
- if c1 != 0x1b {
- fmt.Fprint(w.out, string(c1))
- continue
- }
- c2, _, err := er.ReadRune()
- if err != nil {
- w.lastbuf.WriteRune(c1)
- break loop
- }
- if c2 != 0x5b {
- w.lastbuf.WriteRune(c1)
- w.lastbuf.WriteRune(c2)
- continue
- }
- var buf bytes.Buffer
- for {
- c, _, err := er.ReadRune()
- if err != nil {
- w.lastbuf.WriteRune(c1)
- w.lastbuf.WriteRune(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
- }
|