_textwrap.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from __future__ import annotations
  2. import collections.abc as cabc
  3. import textwrap
  4. from contextlib import contextmanager
  5. class TextWrapper(textwrap.TextWrapper):
  6. def _handle_long_word(
  7. self,
  8. reversed_chunks: list[str],
  9. cur_line: list[str],
  10. cur_len: int,
  11. width: int,
  12. ) -> None:
  13. space_left = max(width - cur_len, 1)
  14. if self.break_long_words:
  15. last = reversed_chunks[-1]
  16. cut = last[:space_left]
  17. res = last[space_left:]
  18. cur_line.append(cut)
  19. reversed_chunks[-1] = res
  20. elif not cur_line:
  21. cur_line.append(reversed_chunks.pop())
  22. @contextmanager
  23. def extra_indent(self, indent: str) -> cabc.Iterator[None]:
  24. old_initial_indent = self.initial_indent
  25. old_subsequent_indent = self.subsequent_indent
  26. self.initial_indent += indent
  27. self.subsequent_indent += indent
  28. try:
  29. yield
  30. finally:
  31. self.initial_indent = old_initial_indent
  32. self.subsequent_indent = old_subsequent_indent
  33. def indent_only(self, text: str) -> str:
  34. rv = []
  35. for idx, line in enumerate(text.splitlines()):
  36. indent = self.initial_indent
  37. if idx > 0:
  38. indent = self.subsequent_indent
  39. rv.append(f"{indent}{line}")
  40. return "\n".join(rv)