@@ -13,24 +13,43 @@ function _repprint(out::IO, c::AbstractChar, n::Int)
13
13
end
14
14
end
15
15
16
-
17
16
# ## print string or char
18
17
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
+
19
33
function _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
33
46
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)
34
53
end
35
54
36
55
_unsigned_abs (x:: Signed ) = unsigned (abs (x))
0 commit comments