"""WizardKit: ANSI control/escape functions""" # vim: sts=2 sw=2 ts=2 import itertools import logging from typing import Iterable # STATIC VARIABLES LOG = logging.getLogger(__name__) COLORS = { 'CLEAR': '\033[0m', 'RED': '\033[31m', 'RED_BLINK': '\033[31;5m', 'ORANGE': '\033[31;1m', 'ORANGE_RED': '\033[1;31;41m', 'GREEN': '\033[32m', 'YELLOW': '\033[33m', 'YELLOW_BLINK': '\033[33;5m', 'BLUE': '\033[34m', 'PURPLE': '\033[35m', 'CYAN': '\033[36m', } # Functions def clear_screen() -> None: """Clear screen using ANSI escape.""" print('\033c', end='', flush=True) def color_string( strings: Iterable[str] | str, colors: Iterable[str | None] | str, sep=' ', ) -> str: """Build colored string using ANSI escapes, returns str.""" data = {'strings': strings, 'colors': colors} msg = [] # Convert input to tuples of strings for k, v in data.items(): if isinstance(v, str): # Avoid splitting string into a list of characters data[k] = (v,) try: iter(v) except TypeError: # Assuming single element passed, convert to string data[k] = (str(v),) # Build new string with color escapes added for string, color in itertools.zip_longest(data['strings'], data['colors']): color_code = COLORS.get(str(color), COLORS['CLEAR']) msg.append(f'{color_code}{string}{COLORS["CLEAR"]}') # Done return sep.join(msg) def strip_colors(string: str) -> str: """Strip known ANSI color escapes from string, returns str.""" LOG.debug('string: %s', string) for color in COLORS.values(): string = string.replace(color, '') return string if __name__ == '__main__': print("This file is not meant to be called directly.")