| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 | import textwrapimport typing as tfrom contextlib import contextmanagerclass TextWrapper(textwrap.TextWrapper):    def _handle_long_word(        self,        reversed_chunks: t.List[str],        cur_line: t.List[str],        cur_len: int,        width: int,    ) -> None:        space_left = max(width - cur_len, 1)        if self.break_long_words:            last = reversed_chunks[-1]            cut = last[:space_left]            res = last[space_left:]            cur_line.append(cut)            reversed_chunks[-1] = res        elif not cur_line:            cur_line.append(reversed_chunks.pop())    @contextmanager    def extra_indent(self, indent: str) -> t.Iterator[None]:        old_initial_indent = self.initial_indent        old_subsequent_indent = self.subsequent_indent        self.initial_indent += indent        self.subsequent_indent += indent        try:            yield        finally:            self.initial_indent = old_initial_indent            self.subsequent_indent = old_subsequent_indent    def indent_only(self, text: str) -> str:        rv = []        for idx, line in enumerate(text.splitlines()):            indent = self.initial_indent            if idx > 0:                indent = self.subsequent_indent            rv.append(f"{indent}{line}")        return "\n".join(rv)
 |