@@ -13,24 +13,43 @@ function _repprint(out::IO, c::AbstractChar, n::Int)
1313 end
1414end
1515
16-
1716# ## print string or char
1817
18+ function _truncstr (s:: AbstractString , slen, prec)
19+ prec == 0 && return (" " , 0 )
20+ i, n = 0 , 1
21+ siz = ncodeunits (s)
22+ while n <= siz
23+ (prec -= textwidth (s[n])) < 0 && break
24+ i = n
25+ n = nextind (s, i)
26+ end
27+ str = SubString (s, 1 , i)
28+ return (str, textwidth (str))
29+ end
30+
31+ _truncstr (s:: AbstractChar , slen, prec) = (" " , 0 )
32+
1933function _pfmt_s (out:: IO , fs:: FormatSpec , s:: Union{AbstractString,AbstractChar} )
20- pad = fs. width - textwidth (s)
21- if pad <= 0
22- print (out, s)
23- elseif fs. align == ' <'
24- print (out, s)
25- _repprint (out, fs. fill, pad)
26- elseif fs. align == ' ^'
27- _repprint (out, fs. fill, pad>> 1 )
28- print (out, s)
29- _repprint (out, fs. fill, (pad+ 1 )>> 1 )
30- else
31- _repprint (out, fs. fill, pad)
32- print (out, s)
34+ slen = textwidth (s)
35+ str, slen = 0 <= fs. prec < slen ? _truncstr (s, slen, fs. prec) : (s, slen)
36+ prepad = postpad = 0
37+ pad = fs. width - slen
38+ if pad > 0
39+ if fs. align == ' <'
40+ postpad = pad
41+ elseif fs. align == ' ^'
42+ prepad, postpad = pad>> 1 , (pad+ 1 )>> 1
43+ else
44+ prepad = pad
45+ end
3346 end
47+ # left padding
48+ prepad == 0 || _repprint (out, fs. fill, prepad)
49+ # print string
50+ print (out, str)
51+ # right padding
52+ postpad == 0 || _repprint (out, fs. fill, postpad)
3453end
3554
3655_unsigned_abs (x:: Signed ) = unsigned (abs (x))
0 commit comments