| # -*- coding: utf-8 -*- |
| |
| # Copyright (c) 2020 Georgios Verigakis <verigak@gmail.com> |
| # |
| # 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') |