~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/utextwrap.py

  • Committer: INADA Naoki
  • Date: 2011-05-08 03:50:12 UTC
  • mto: This revision was merged to the branch mainline in revision 5874.
  • Revision ID: songofacandy@gmail.com-20110508035012-tv5y9281z20b3hg7
Split calculating width of char logic into separated function.

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
 
28
28
__all__ = ["UTextWrapper", "fill", "wrap"]
29
29
 
 
30
def _unicode_char_width(uc):
 
31
    """Return width of character `uc`.
 
32
 
 
33
    :param:     uc      Single unicode character.
 
34
    """
 
35
    # 'A' means width of the character is not be able to determine.
 
36
    # We assume that it's width is 2 because longer wrap may over
 
37
    # terminal width but shorter wrap may be acceptable.
 
38
    return (_eawidth(uc) in 'FWA' and 2) or 1
 
39
 
30
40
def _width(s):
31
41
    """Returns width for s.
32
42
    
38
48
    if isinstance(s, str):
39
49
        return len(s)
40
50
    assert isinstance(s, unicode)
41
 
    w = 0
42
 
    for c in map(_eawidth, s):
43
 
        #w += 2 if c in 'FWA' else 1 # needs Python >= 2.5
44
 
        w += (c in 'FWA' and 2) or 1
45
 
    return w
 
51
    return sum(_unicode_char_width(c) for c in s)
46
52
 
47
53
def _cut(s, width):
48
 
    """Returns head and rest of s. (head+rest == s).
 
54
    """Returns head and rest of s. (head+rest == s)
49
55
 
50
56
    Head is large as long as _width(head) <= width.
51
57
    """
53
59
        return s[:width], s[width:]
54
60
    assert isinstance(s, unicode)
55
61
    w = 0
 
62
    charwidth = _unicode_char_width
56
63
    for pos, c in enumerate(s):
57
 
        w += (_eawidth(c) in 'FWA' and 2) or 1
 
64
        w += charwidth(c)
58
65
        if w > width:
59
66
            return s[:pos], s[pos:]
60
 
    return s, ''
 
67
    return s, u''
61
68
 
62
69
 
63
70
class UTextWrapper(textwrap.TextWrapper):