comparison mercurial/encoding.py @ 21861:b515c3a63e96

encoding: add 'leftside' argument into 'trim' to switch trimming side
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
date Sun, 06 Jul 2014 02:56:41 +0900
parents d24969ee272f
children 6fd944c204a9
comparison
equal deleted inserted replaced
21860:e382cf9ec30b 21861:b515c3a63e96
163 for x in xrange(start + c, len(s)): 163 for x in xrange(start + c, len(s)):
164 t = s[start:x] 164 t = s[start:x]
165 if colwidth(t) == c: 165 if colwidth(t) == c:
166 return t 166 return t
167 167
168 def trim(s, width, ellipsis=''): 168 def trim(s, width, ellipsis='', leftside=False):
169 """Trim string 's' to at most 'width' columns (including 'ellipsis'). 169 """Trim string 's' to at most 'width' columns (including 'ellipsis').
170
171 If 'leftside' is True, left side of string 's' is trimmed.
172 'ellipsis' is always placed at trimmed side.
170 173
171 >>> ellipsis = '+++' 174 >>> ellipsis = '+++'
172 >>> from mercurial import encoding 175 >>> from mercurial import encoding
173 >>> encoding.encoding = 'utf-8' 176 >>> encoding.encoding = 'utf-8'
174 >>> t= '1234567890' 177 >>> t= '1234567890'
176 1234567890 179 1234567890
177 >>> print trim(t, 10, ellipsis=ellipsis) 180 >>> print trim(t, 10, ellipsis=ellipsis)
178 1234567890 181 1234567890
179 >>> print trim(t, 8, ellipsis=ellipsis) 182 >>> print trim(t, 8, ellipsis=ellipsis)
180 12345+++ 183 12345+++
184 >>> print trim(t, 8, ellipsis=ellipsis, leftside=True)
185 +++67890
181 >>> print trim(t, 8) 186 >>> print trim(t, 8)
182 12345678 187 12345678
188 >>> print trim(t, 8, leftside=True)
189 34567890
183 >>> print trim(t, 3, ellipsis=ellipsis) 190 >>> print trim(t, 3, ellipsis=ellipsis)
184 +++ 191 +++
185 >>> print trim(t, 1, ellipsis=ellipsis) 192 >>> print trim(t, 1, ellipsis=ellipsis)
186 + 193 +
187 >>> u = u'\u3042\u3044\u3046\u3048\u304a' # 2 x 5 = 10 columns 194 >>> u = u'\u3042\u3044\u3046\u3048\u304a' # 2 x 5 = 10 columns
190 \xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a 197 \xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a
191 >>> print trim(t, 10, ellipsis=ellipsis) 198 >>> print trim(t, 10, ellipsis=ellipsis)
192 \xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a 199 \xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a
193 >>> print trim(t, 8, ellipsis=ellipsis) 200 >>> print trim(t, 8, ellipsis=ellipsis)
194 \xe3\x81\x82\xe3\x81\x84+++ 201 \xe3\x81\x82\xe3\x81\x84+++
202 >>> print trim(t, 8, ellipsis=ellipsis, leftside=True)
203 +++\xe3\x81\x88\xe3\x81\x8a
195 >>> print trim(t, 5) 204 >>> print trim(t, 5)
196 \xe3\x81\x82\xe3\x81\x84 205 \xe3\x81\x82\xe3\x81\x84
206 >>> print trim(t, 5, leftside=True)
207 \xe3\x81\x88\xe3\x81\x8a
197 >>> print trim(t, 4, ellipsis=ellipsis) 208 >>> print trim(t, 4, ellipsis=ellipsis)
209 +++
210 >>> print trim(t, 4, ellipsis=ellipsis, leftside=True)
198 +++ 211 +++
199 >>> t = '\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa' # invalid byte sequence 212 >>> t = '\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa' # invalid byte sequence
200 >>> print trim(t, 12, ellipsis=ellipsis) 213 >>> print trim(t, 12, ellipsis=ellipsis)
201 \x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa 214 \x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa
202 >>> print trim(t, 10, ellipsis=ellipsis) 215 >>> print trim(t, 10, ellipsis=ellipsis)
203 \x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa 216 \x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa
204 >>> print trim(t, 8, ellipsis=ellipsis) 217 >>> print trim(t, 8, ellipsis=ellipsis)
205 \x11\x22\x33\x44\x55+++ 218 \x11\x22\x33\x44\x55+++
219 >>> print trim(t, 8, ellipsis=ellipsis, leftside=True)
220 +++\x66\x77\x88\x99\xaa
206 >>> print trim(t, 8) 221 >>> print trim(t, 8)
207 \x11\x22\x33\x44\x55\x66\x77\x88 222 \x11\x22\x33\x44\x55\x66\x77\x88
223 >>> print trim(t, 8, leftside=True)
224 \x33\x44\x55\x66\x77\x88\x99\xaa
208 >>> print trim(t, 3, ellipsis=ellipsis) 225 >>> print trim(t, 3, ellipsis=ellipsis)
209 +++ 226 +++
210 >>> print trim(t, 1, ellipsis=ellipsis) 227 >>> print trim(t, 1, ellipsis=ellipsis)
211 + 228 +
212 """ 229 """
216 if len(s) <= width: # trimming is not needed 233 if len(s) <= width: # trimming is not needed
217 return s 234 return s
218 width -= len(ellipsis) 235 width -= len(ellipsis)
219 if width <= 0: # no enough room even for ellipsis 236 if width <= 0: # no enough room even for ellipsis
220 return ellipsis[:width + len(ellipsis)] 237 return ellipsis[:width + len(ellipsis)]
238 if leftside:
239 return ellipsis + s[-width:]
221 return s[:width] + ellipsis 240 return s[:width] + ellipsis
222 241
223 if ucolwidth(u) <= width: # trimming is not needed 242 if ucolwidth(u) <= width: # trimming is not needed
224 return s 243 return s
225 244
226 width -= len(ellipsis) 245 width -= len(ellipsis)
227 if width <= 0: # no enough room even for ellipsis 246 if width <= 0: # no enough room even for ellipsis
228 return ellipsis[:width + len(ellipsis)] 247 return ellipsis[:width + len(ellipsis)]
229 248
230 uslice = lambda i: u[:-i] 249 if leftside:
231 concat = lambda s: s + ellipsis 250 uslice = lambda i: u[i:]
251 concat = lambda s: ellipsis + s
252 else:
253 uslice = lambda i: u[:-i]
254 concat = lambda s: s + ellipsis
232 for i in xrange(1, len(u)): 255 for i in xrange(1, len(u)):
233 usub = uslice(i) 256 usub = uslice(i)
234 if ucolwidth(usub) <= width: 257 if ucolwidth(usub) <= width:
235 return concat(usub.encode(encoding)) 258 return concat(usub.encode(encoding))
236 return ellipsis # no enough room for multi-column characters 259 return ellipsis # no enough room for multi-column characters