Improve wildcard semantics again.
[python_utils.git] / text_utils.py
index f04c61813ef227c4bfe356f42d08c59f2234132c..18a22577d7efef0962f1ba8d65ade4e859ce4e4b 100644 (file)
@@ -371,6 +371,15 @@ def header(
 
 def box(
     title: Optional[str] = None, text: Optional[str] = None, *, width: int = 80, color: str = ''
+) -> str:
+    assert width > 4
+    if text is not None:
+        text = justify_text(text, width=width - 4, alignment='l')
+    return preformatted_box(title, text, width=width, color=color)
+
+
+def preformatted_box(
+    title: Optional[str] = None, text: Optional[str] = None, *, width=80, color: str = ''
 ) -> str:
     assert width > 4
     ret = ''
@@ -393,9 +402,9 @@ def box(
         )
         ret += color + '│' + ' ' * w + '│' + rset + '\n'
     if text is not None:
-        for line in justify_text(text, width=w - 2, alignment='l').split('\n'):
+        for line in text.split('\n'):
             tw = len(string_utils.strip_ansi_sequences(line))
-            assert tw < w
+            assert tw <= w
             ret += color + '│ ' + rset + line + ' ' * (w - tw - 2) + color + ' │' + rset + '\n'
     ret += color + '╰' + '─' * w + '╯' + rset + '\n'
     return ret
@@ -419,7 +428,7 @@ def print_box(
     ╰────╯
 
     """
-    print(box(title, text, width=width, color=color), end='')
+    print(preformatted_box(title, text, width=width, color=color), end='')
 
 
 if __name__ == '__main__':