noncolorable.go 981 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package colorable
  2. import (
  3. "bytes"
  4. "io"
  5. )
  6. type NonColorable struct {
  7. out io.Writer
  8. lastbuf bytes.Buffer
  9. }
  10. func NewNonColorable(w io.Writer) io.Writer {
  11. return &NonColorable{out: w}
  12. }
  13. func (w *NonColorable) Write(data []byte) (n int, err error) {
  14. er := bytes.NewReader(data)
  15. var bw [1]byte
  16. loop:
  17. for {
  18. c1, err := er.ReadByte()
  19. if err != nil {
  20. break loop
  21. }
  22. if c1 != 0x1b {
  23. bw[0] = c1
  24. w.out.Write(bw[:])
  25. continue
  26. }
  27. c2, err := er.ReadByte()
  28. if err != nil {
  29. w.lastbuf.WriteByte(c1)
  30. break loop
  31. }
  32. if c2 != 0x5b {
  33. w.lastbuf.WriteByte(c1)
  34. w.lastbuf.WriteByte(c2)
  35. continue
  36. }
  37. var buf bytes.Buffer
  38. for {
  39. c, err := er.ReadByte()
  40. if err != nil {
  41. w.lastbuf.WriteByte(c1)
  42. w.lastbuf.WriteByte(c2)
  43. w.lastbuf.Write(buf.Bytes())
  44. break loop
  45. }
  46. if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' {
  47. break
  48. }
  49. buf.Write([]byte(string(c)))
  50. }
  51. }
  52. return len(data) - w.lastbuf.Len(), nil
  53. }