| from __future__ import annotations
|
|
|
| import collections.abc as cabc
|
| import textwrap
|
| from contextlib import contextmanager
|
|
|
|
|
| class TextWrapper(textwrap.TextWrapper):
|
| def _handle_long_word(
|
| self,
|
| reversed_chunks: list[str],
|
| cur_line: 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) -> cabc.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)
|
|
|