12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- package colorable
- import (
- "bytes"
- "io"
- )
- // NonColorable hold writer but remove escape sequence.
- type NonColorable struct {
- out io.Writer
- lastbuf bytes.Buffer
- }
- // NewNonColorable return new instance of Writer which remove escape sequence from Writer.
- func NewNonColorable(w io.Writer) io.Writer {
- return &NonColorable{out: w}
- }
- // Write write data on console
- 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
- }
|