@@ -48,6 +48,40 @@ def strip_colour(msg):
4848 return msg
4949
5050
51+ def _len_without_codes (s , codes_subbed = False ):
52+ n = len (s )
53+ for k , v in COLOURS .items ():
54+ if not codes_subbed :
55+ n -= len (k ) * s .count (k )
56+ n -= len (v ) * s .count (v )
57+ return n
58+
59+
60+ def wrap_and_indent (s , indent = 0 , width = None , hang = "" , codes_subbed = False ):
61+ if width is None :
62+ width = CONSOLE_MAX_WIDTH
63+
64+ bits = [" " * indent ]
65+ if hang :
66+ cchw = _len_without_codes (hang , codes_subbed = codes_subbed )
67+ if cchw <= indent - 1 :
68+ bits = [hang + " " * (indent - cchw )]
69+ else :
70+ yield hang
71+ cch = indent
72+ for w in s .split (" " ):
73+ cchw = _len_without_codes (w , codes_subbed = codes_subbed )
74+ if len (bits ) > 1 and cch + cchw > width :
75+ yield "" .join (bits ).rstrip ()
76+ bits = [" " * indent ]
77+ cch = indent
78+ bits .append (w )
79+ bits .append (" " )
80+ cch += cchw + 1
81+ if bits :
82+ yield "" .join (bits ).rstrip ()
83+
84+
5185def supports_colour (stream ):
5286 if os .getenv ("PYTHON_COLORS" , "" ).lower () in ("0" , "no" , "false" ):
5387 return False
@@ -62,7 +96,7 @@ def supports_colour(stream):
6296 if type (stream ).__name__ != "_WindowsConsoleIO" :
6397 return False
6498 try :
65- # Allows us to import logging on its own
99+ # Lazy import to allow us to import logging on its own
66100 from _native import fd_supports_vt100
67101 return fd_supports_vt100 (stream .fileno ())
68102 except Exception :
@@ -187,16 +221,10 @@ def print(self, msg=None, *args, always=False, level=INFO, colours=True, wrap=Fa
187221 else :
188222 msg = ""
189223 if wrap :
190- while len (msg ) > CONSOLE_MAX_WIDTH :
191- part = msg [:CONSOLE_MAX_WIDTH ]
192- n = 0
193- while len (part ) > n :
194- n = len (part )
195- part = msg [:CONSOLE_MAX_WIDTH + 5 * part .count ("\033 " )]
196- pre , sep , rest = part .rpartition (" " )
197- print (pre , ** kwargs , file = self .print_console )
198- msg = rest + msg [len (part ):]
199- print (msg , ** kwargs , file = self .print_console )
224+ for s in wrap_and_indent (msg , codes_subbed = True ):
225+ print (s , ** kwargs , file = self .print_console )
226+ else :
227+ print (msg , ** kwargs , file = self .print_console )
200228
201229 def print_raw (self , * msg , ** kwargs ):
202230 kwargs ["always" ] = True
0 commit comments