#! /bin/python3 -- import os import re import sys def pad_to_width(line: bytes, width: int) -> str: output_line = b'' idx = 0 buffer = b'' while idx < len(line): if width == 0: break if (match := re.match(rb'((?:\x1b\[[\d;]*\w)|[ -~])', line[idx:])): span = match.span() buffer += line[idx + span[0]:idx + span[1]] idx += span[1] if span[1] == 1: width -= 1 output_line += buffer buffer = b'' else: idx += 1 output_line += b'\033[m' return output_line.decode('utf-8') def main() -> int: if len(sys.argv) != 2: columns = os.environ.get('COLUMNS') if columns: width = int(columns) else: width = 20 else: width = int(sys.argv[1]) lines = open(0, 'rb').read().strip(b'\n').split(b'\n') for line in lines: try: print(pad_to_width(line, width), file=sys.stdout, flush=True) except Exception as error: print('There was an error printing the line', file=sys.stderr, flush=True) print(str(error), file=sys.stderr, flush=True) return 1 return 0 if __name__ == '__main__': raise SystemExit(main())