mercurial/encoding.py
changeset 21861 b515c3a63e96
parent 21856 d24969ee272f
child 22425 6fd944c204a9
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