You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

62 lines
1.1 KiB

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