@@ -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