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 |