# -*- coding: utf-8 -*- # Copyright (c) 2020 Georgios Verigakis # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. from functools import partial COLORS = ('black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white') STYLES = ('bold', 'faint', 'italic', 'underline', 'blink', 'blink2', 'negative', 'concealed', 'crossed') def color(s, fg=None, bg=None, style=None): sgr = [] if fg: if fg in COLORS: sgr.append(str(30 + COLORS.index(fg))) elif isinstance(fg, int) and 0 <= fg <= 255: sgr.append('38;5;%d' % int(fg)) else: raise Exception('Invalid color "%s"' % fg) if bg: if bg in COLORS: sgr.append(str(40 + COLORS.index(bg))) elif isinstance(bg, int) and 0 <= bg <= 255: sgr.append('48;5;%d' % bg) else: raise Exception('Invalid color "%s"' % bg) if style: for st in style.split('+'): if st in STYLES: sgr.append(str(1 + STYLES.index(st))) else: raise Exception('Invalid style "%s"' % st) if sgr: prefix = '\x1b[' + ';'.join(sgr) + 'm' suffix = '\x1b[0m' return prefix + s + suffix else: return s # Foreground shortcuts black = partial(color, fg='black') red = partial(color, fg='red') green = partial(color, fg='green') yellow = partial(color, fg='yellow') blue = partial(color, fg='blue') magenta = partial(color, fg='magenta') cyan = partial(color, fg='cyan') white = partial(color, fg='white') # Style shortcuts bold = partial(color, style='bold') faint = partial(color, style='faint') italic = partial(color, style='italic') underline = partial(color, style='underline') blink = partial(color, style='blink') blink2 = partial(color, style='blink2') negative = partial(color, style='negative') concealed = partial(color, style='concealed') crossed = partial(color, style='crossed')