X-Git-Url: https://wannabe.guru.org/gitweb/?a=blobdiff_plain;f=ansi.py;h=769b29c46b21c705f8c8ad09906f9dd7239cfaa2;hb=b10d30a46e601c9ee1f843241f2d69a1f90f7a94;hp=476f0a4dd9f80c111567a6b8c5395ac17f2686a2;hpb=497fb9e21f45ec08e1486abaee6dfa7b20b8a691;p=python_utils.git diff --git a/ansi.py b/ansi.py index 476f0a4..769b29c 100755 --- a/ansi.py +++ b/ansi.py @@ -1,11 +1,12 @@ #!/usr/bin/env python3 +from abc import abstractmethod import difflib +import io import logging +import re import sys -from typing import Dict, Optional, Tuple - -import string_utils +from typing import Any, Callable, Dict, Iterable, Optional, Tuple logger = logging.getLogger(__name__) @@ -1620,7 +1621,7 @@ def italic() -> str: def italics() -> str: - return "" + return italic() def underline() -> str: @@ -1632,7 +1633,7 @@ def strikethrough() -> str: def strike_through() -> str: - return "" + return strikethrough() def is_16color(num: int) -> bool: @@ -1732,6 +1733,8 @@ def fg(name: Optional[str] = "", *, force_16color: bool = False, force_216color: bool = False) -> str: + import string_utils + if name is not None and string_utils.is_full_string(name): rgb = _find_color_by_name(name) return fg( @@ -1777,6 +1780,8 @@ def pick_contrasting_color(name: Optional[str] = "", red: Optional[int] = None, green: Optional[int] = None, blue: Optional[int] = None) -> Tuple[int, int, int]: + import string_utils + if name is not None and string_utils.is_full_string(name): rgb = _find_color_by_name(name) else: @@ -1812,6 +1817,8 @@ def bg(name: Optional[str] = "", *, force_16color: bool = False, force_216color: bool = False) -> str: + import string_utils + if name is not None and string_utils.is_full_string(name): rgb = _find_color_by_name(name) return bg( @@ -1842,18 +1849,47 @@ def bg(name: Optional[str] = "", return bg_24bit(red, green, blue) -def main() -> None: - name = " ".join(sys.argv[1:]) - for possibility in COLOR_NAMES_TO_RGB: - if name in possibility: - f = fg(possibility) - b = bg(possibility) - _ = pick_contrasting_color(possibility) - xf = fg(None, _[0], _[1], _[2]) - xb = bg(None, _[0], _[1], _[2]) - print(f'{f}{xb}{possibility}{reset()}\t\t\t' - f'{b}{xf}{possibility}{reset()}') +class StdoutInterceptor(io.TextIOBase): + def __init__(self): + self.saved_stdout: Optional[io.TextIOBase] = None + self.buf = '' + + @abstractmethod + def write(self, s): + pass + + def __enter__(self) -> None: + self.saved_stdout = sys.stdout + sys.stdout = self + return None + + def __exit__(self, *args) -> bool: + sys.stdout = self.saved_stdout + print(self.buf) + return None + + +class ProgrammableColorizer(StdoutInterceptor): + def __init__(self, patterns: Iterable[Tuple[re.Pattern, Callable[[Any, re.Pattern], str]]]): + super().__init__() + self.patterns = [_ for _ in patterns] + + def write(self, s: str): + for pattern in self.patterns: + s = pattern[0].sub(pattern[1], s) + self.buf += s if __name__ == '__main__': + def main() -> None: + name = " ".join(sys.argv[1:]) + for possibility in COLOR_NAMES_TO_RGB: + if name in possibility: + f = fg(possibility) + b = bg(possibility) + _ = pick_contrasting_color(possibility) + xf = fg(None, _[0], _[1], _[2]) + xb = bg(None, _[0], _[1], _[2]) + print(f'{f}{xb}{possibility}{reset()}\t\t\t' + f'{b}{xf}{possibility}{reset()}') main()