def uncolored(u): return ''.join([chr(ord(c) & 255) for c in u]) def ansi(u): result = [] currentcolor = 0 for c in u: a = ord(c) & ATTR_MASK if a != currentcolor: diff = a ^ currentcolor if diff & FG_MASK: result.append('\x1b[%dm' % (39 - ((a>>8)&15))) if diff & BOLD: if a & BOLD: result.append('\x1b[1m') else: result.append('\x1b[22m') currentcolor = a result.append(chr(ord(c) & 255)) if currentcolor: result.append('\x1b[0m') return ''.join(result) ##def ansi(u): ## result = [] ## for c in u: ## a = ord(c) & ATTR_MASK ## if a & FG_MASK: ## result.append('\x1b[%dm' % (30 + ((a>>8)&7))) #### if a & BG_MASK: #### result.append('\x1b[%dm' % (40 + ((a>>12)&7))) ## if a & BOLD: ## result.append('\x1b[1m') ## result.append(chr(ord(c) & 255)) ## if a & ATTR_MASK: ## result.append('\x1b[0m') ## return ''.join(result) def colorstr(s, color, mask=0xff): return u''.join([unichr((ord(c) & mask) | color) for c in s]) def black(s): return colorstr(s, FG_BLACK, FG_SET) def red(s): return colorstr(s, FG_RED, FG_SET) def green(s): return colorstr(s, FG_GREEN, FG_SET) def yellow(s): return colorstr(s, FG_YELLOW, FG_SET) def blue(s): return colorstr(s, FG_BLUE, FG_SET) def purple(s): return colorstr(s, FG_PURPLE, FG_SET) def cyan(s): return colorstr(s, FG_CYAN, FG_SET) def white(s): return colorstr(s, FG_WHITE, FG_SET) def bold(s): return colorstr(s, BOLD, BOLD_SET) ##def blackbg(s): return colorstr(s, BG_BLACK, BG_SET) ##def redbg(s): return colorstr(s, BG_RED, BG_SET) ##def greenbg(s): return colorstr(s, BG_GREEN, BG_SET) ##def yellowbg(s): return colorstr(s, BG_YELLOW, BG_SET) ##def bluebg(s): return colorstr(s, BG_BLUE, BG_SET) ##def purplebg(s): return colorstr(s, BG_PURPLE, BG_SET) ##def cyanbg(s): return colorstr(s, BG_CYAN, BG_SET) ##def whitebg(s): return colorstr(s, BG_WHITE, BG_SET) # ____________________________________________________________ FG_MASK = 0x00F00 #BG_MASK = 0x0F000 BOLD = 0x01000 ATTR_MASK = FG_MASK | BOLD # | BG_MASK FG_DEFAULT= 0x0000 FG_BLACK = 0x0900 FG_RED = 0x0800 FG_GREEN = 0x0700 FG_YELLOW = 0x0600 FG_BLUE = 0x0500 FG_PURPLE = 0x0400 FG_CYAN = 0x0300 FG_WHITE = 0x0200 FG_SET = ~FG_MASK ##BG_BLACK = 0x8000 ##BG_RED = 0x9000 ##BG_GREEN = 0xA000 ##BG_YELLOW = 0xB000 ##BG_BLUE = 0xC000 ##BG_PURPLE = 0xD000 ##BG_CYAN = 0xE000 ##BG_WHITE = 0xF000 ##BG_SET = ~BG_MASK BOLD_SET = ~BOLD # ____________________________________________________________ class EncodingFile: def __init__(self, output, encode): self._output = output self._encode = encode def write(self, s): self._output.write(self._encode(s)) def writelines(self, lines): self._output.writelines(map(self._encode, lines)) def invoke(): import sys if sys.stdout.isatty(): encode = ansi else: encode = uncolored sys.stdout = EncodingFile(sys.stdout, encode) sys.stderr = EncodingFile(sys.stderr, encode) if __name__ == '__main__': invoke()