noncolorable.go 978 B

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