term.py 3.2 KB

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