from os import linesep # we can also do print(colored('green', msg), end='') for example... # printc helps if You have a global color_enabled flag in Your program def printc(color, msg, no_newline=False, enable_color=False): """like print but with color support (if enabled!)""" ret = str() if enable_color: ret += colored(color, msg) else: ret += msg if no_newline: end = '' else: end = linesep print(ret, end=end, flush=True) return ret def colored(color, msg): """returns msg in ANSI color""" ret = str() if color.startswith("#"): ret += '\033[38;2;' ret += str(int(color[1:3], 16)) + ';' \ + str(int(color[3:5], 16)) + ';' \ + str(int(color[5:7], 16)) ret += 'm' else: c = 'default' if color == 'red': c = '31' elif color == 'green': c = '32' elif color == 'yellow': c = '33' elif color == 'blue': c = '34' elif color == 'magenta': c = '35' elif color == 'cyan': c = '36' if c is not 'default': # set color ret += '\033[0;' + c + 'm' ret += msg # reset color ret += '\033[0m' return ret # When data contains ANSI color escape codes convert them to BBcode format # e.g.: Foo bar baz [\033[0;31m + text + [\033[0m # where 31 can be 31..36 31=red, 32=green, # 33=yellow, 34=blue, 35=magenta, 36-cyan # 0 resets back to standard # we can map those three parts to [color=#abcdef] + text + [/color] def convert_ansi_to_bbcode_colors(instr): """convert ansi escape sequences in a string to bbcode tags""" ansi_red = '\033[0;31m' ansi_green = '\033[0;32m' ansi_yellow = '\033[0;33m' ansi_blue = '\033[0;34m' ansi_magenta = '\033[0;35m' ansi_cyan = '\033[0;36m' ansi_end = '\033[0m' bb_red = '[color=#FF0000]' bb_green = '[color=#00FF00]' bb_yellow = '[color=#FFFF00]' bb_blue = '[color=#0000FF]' bb_magenta = '[color=#FF00FF]' bb_cyan = '[color=#00FFFF]' bb_end = '[/color]' return instr.replace(ansi_red, bb_red) \ .replace(ansi_green, bb_green) \ .replace(ansi_yellow, bb_yellow) \ .replace(ansi_blue, bb_blue) \ .replace(ansi_magenta, bb_magenta) \ .replace(ansi_cyan, bb_cyan) \ .replace(ansi_end, bb_end)