X-Git-Url: https://wannabe.guru.org/gitweb/?a=blobdiff_plain;f=text_utils.py;h=28ab75520a1652211dfca0839111ab1826060c43;hb=1e858172519e9339e4720b8bf9b39b6d9801e305;hp=18a22577d7efef0962f1ba8d65ade4e859ce4e4b;hpb=21451d4bda8e23771515c3a581aad9d8b81f5997;p=python_utils.git diff --git a/text_utils.py b/text_utils.py index 18a2257..28ab755 100644 --- a/text_utils.py +++ b/text_utils.py @@ -8,6 +8,7 @@ import contextlib import logging import math +import os import re import sys from collections import defaultdict @@ -33,15 +34,39 @@ def get_console_rows_columns() -> RowsColumns: from exec_utils import cmd - try: - rows, columns = cmd( - "stty size", - timeout_seconds=1.0, - ).split() - except Exception as e: - logger.exception(e) - raise Exception('Can\'t determine console size?!') from e - return RowsColumns(int(rows), int(columns)) + rows: Optional[str] = os.environ.get('LINES', None) + cols: Optional[str] = os.environ.get('COLUMNS', None) + if not rows or not cols: + try: + rows, cols = cmd( + "stty size", + timeout_seconds=1.0, + ).split() + except Exception: + rows = None + cols = None + + if rows is None: + try: + rows = cmd( + "tput rows", + timeout_seconds=1.0, + ) + except Exception: + rows = None + + if cols is None: + try: + cols = cmd( + "tput cols", + timeout_seconds=1.0, + ) + except Exception: + cols = None + + if not rows or not cols: + raise Exception('Can\'t determine console size?!') + return RowsColumns(int(rows), int(cols)) def progress_graph( @@ -282,12 +307,20 @@ def wrap_string(text: str, n: int) -> str: class Indenter(contextlib.AbstractContextManager): """ - with Indenter(pad_count = 8) as i: - i.print('test') - with i: - i.print('-ing') + Context manager that indents stuff (even recursively). e.g.:: + + with Indenter(pad_count = 8) as i: + i.print('test') with i: - i.print('1, 2, 3') + i.print('-ing') + with i: + i.print('1, 2, 3') + + Yields:: + + test + -ing + 1, 2, 3 """ @@ -326,6 +359,7 @@ def header( width: Optional[int] = None, align: Optional[str] = None, style: Optional[str] = 'solid', + color: Optional[str] = None, ): """ Returns a nice header line with a title. @@ -335,7 +369,10 @@ def header( """ if not width: - width = get_console_rows_columns().columns + try: + width = get_console_rows_columns().columns + except Exception: + width = 80 if not align: align = 'left' if not style: @@ -366,7 +403,13 @@ def header( line_char = '-' begin = '[' end = ']' - return line_char * left + begin + ' ' + title + ' ' + end + line_char * right + if color: + col = color + reset_seq = reset() + else: + col = '' + reset_seq = '' + return line_char * left + begin + col + ' ' + title + ' ' + reset_seq + end + line_char * right def box(