noncolorable.go 1.1 KB

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