~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/xml5.py

  • Committer: John Arbash Meinel
  • Date: 2006-08-16 22:09:38 UTC
  • mto: This revision was merged to the branch mainline in revision 1942.
  • Revision ID: john@arbash-meinel.com-20060816220938-56c1be7eca420dff
Switch back to using Entity serializer, since performance is equivalent, yet still compatible

Show diffs side-by-side

added added

removed removed

Lines of Context:
42
42
    global _utf8_re
43
43
    if _utf8_re is not None:
44
44
        return
45
 
    _utf8_re = re.compile('[&<>\'\"]')
 
45
    _utf8_re = re.compile(u'[&<>\'\"\u0080-\uffff]')
46
46
 
47
47
 
48
48
def _utf8_escape_replace(match, _map=_utf8_escape_map):
58
58
    # in overall time. But if you miss frequently, then if None is much
59
59
    # faster. For our use case, we *rarely* have a revision id, file id
60
60
    # or path name that is unicode. So use try/KeyError.
61
 
    return _map[match.group()]
 
61
    try:
 
62
        return _map[match.group()]
 
63
    except KeyError:
 
64
        return "&#%d;" % ord(match.group())
62
65
 
63
66
 
64
67
_unicode_to_escaped_map = {}
65
68
 
66
 
def _encode_and_escape(unicode_str, _map=_unicode_to_escaped_map,
67
 
                       _encode=cache_utf8.encode):
 
69
def _encode_and_escape(unicode_str, _map=_unicode_to_escaped_map):
68
70
    """Encode the string into utf8, and escape invalid XML characters"""
69
71
    # We frequently get entities we have not seen before, so it is better
70
72
    # to check if None, rather than try/KeyError
71
73
    text = _map.get(unicode_str)
72
74
    if text is None:
73
75
        # The alternative policy is to do a regular UTF8 encoding
74
 
        # and then escape only XML meta characters. This could take
75
 
        # advantage of cache_utf8 since a lot of the revision ids
76
 
        # and file ids would already be cached.
77
 
        text = _utf8_re.sub(_utf8_escape_replace, _encode(unicode_str)) + '"'
 
76
        # and then escape only XML meta characters.
 
77
        # Performance is equivalent once you use cache_utf8. *However*
 
78
        # this makes the serialized texts incompatible with old versions
 
79
        # of bzr. So no net gain. (Perhaps the read code would handle utf8
 
80
        # better than entity escapes, but cElementTree seems to do just fine
 
81
        # either way)
 
82
        text = str(_utf8_re.sub(_utf8_escape_replace, unicode_str)) + '"'
78
83
        _map[unicode_str] = text
79
84
    return text
80
85