term.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. """
  2. term utils.
  3. >>> c = colored(enabled=True)
  4. >>> print(str(c.red("the quick "), c.blue("brown ", c.bold("fox ")),
  5. c.magenta(c.underline("jumps over")),
  6. c.yellow(" the lazy "),
  7. c.green("dog ")))
  8. """
  9. BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8)
  10. OP_SEQ = "\033[%dm"
  11. RESET_SEQ = "\033[0m"
  12. COLOR_SEQ = "\033[1;%dm"
  13. fg = lambda s: COLOR_SEQ % s
  14. class colored(object):
  15. def __init__(self, *s, **kwargs):
  16. self.s = s
  17. self.enabled = kwargs.get("enabled", True)
  18. self.op = kwargs.get("op", "")
  19. self.names = {"black": self.black,
  20. "red": self.red,
  21. "green": self.green,
  22. "yellow": self.yellow,
  23. "blue": self.blue,
  24. "magenta": self.magenta,
  25. "cyan": self.cyan,
  26. "white": self.white}
  27. def _add(self, a, b):
  28. return str(a) + str(b)
  29. def _fold_no_color(self, a, b):
  30. try:
  31. A = a.no_color()
  32. except AttributeError:
  33. A = str(a)
  34. try:
  35. B = b.no_color()
  36. except AttributeError:
  37. B = str(b)
  38. return A + B
  39. def no_color(self):
  40. return reduce(self._fold_no_color, self.s)
  41. def __str__(self):
  42. prefix, suffix = "", ""
  43. if self.enabled:
  44. prefix, suffix = self.op, RESET_SEQ
  45. return prefix + reduce(self._add, self.s) + suffix
  46. def node(self, s, op):
  47. return self.__class__(enabled=self.enabled, op=op, *s)
  48. def black(self, *s):
  49. return self.node(s, fg(30 + BLACK))
  50. def red(self, *s):
  51. return self.node(s, fg(30 + RED))
  52. def green(self, *s):
  53. return self.node(s, fg(30 + GREEN))
  54. def yellow(self, *s):
  55. return self.node(s, fg(30 + YELLOW))
  56. def blue(self, *s):
  57. return self.node(s, fg(30 + BLUE))
  58. def magenta(self, *s):
  59. return self.node(s, fg(30 + MAGENTA))
  60. def cyan(self, *s):
  61. return self.node(s, fg(30 + CYAN))
  62. def white(self, *s):
  63. return self.node(s, fg(30 + WHITE))
  64. def __repr__(self):
  65. return repr(self.no_color())
  66. def bold(self, *s):
  67. return self.node(s, OP_SEQ % 1)
  68. def underline(self, *s):
  69. return self.node(s, OP_SEQ % 4)
  70. def blink(self, *s):
  71. return self.node(s, OP_SEQ % 5)
  72. def reverse(self, *s):
  73. return self.node(s, OP_SEQ % 7)
  74. def bright(self, *s):
  75. return self.node(s, OP_SEQ % 8)
  76. def ired(self, *s):
  77. return self.node(s, fg(40 + RED))
  78. def igreen(self, *s):
  79. return self.node(s, fg(40 + GREEN))
  80. def iyellow(self, *s):
  81. return self.node(s, fg(40 + YELLOW))
  82. def iblue(self, *s):
  83. return self.node(s, fg(40, BLUE))
  84. def imagenta(self, *s):
  85. return self.node(s, fg(40 + MAGENTA))
  86. def icyan(self, *s):
  87. return self.node(s, fg(40 + CYAN))
  88. def iwhite(self, *s):
  89. return self.node(s, fg(40 + WHITE))
  90. def reset(self, *s):
  91. return self.node(s, RESET_SEQ)
  92. def __add__(self, other):
  93. return str(self) + str(other)