~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/xml_serializer.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2006-05-23 00:18:26 UTC
  • mfrom: (1724.1.1 integration)
  • Revision ID: pqm@pqm.ubuntu.com-20060523001826-458fe69c27fc17a7
Merge bzr add performance improvements. (Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
71
71
 
72
72
    def _read_element(self, f):
73
73
        return ElementTree().parse(f)
 
74
 
 
75
 
 
76
# performance tuning for elementree's serialiser. THis should be
 
77
# sent upstream - RBC 20060523.
 
78
# the functions here are patched into elementree at runtime.
 
79
import elementtree.ElementTree
 
80
import re
 
81
escape_re = re.compile("[&'\"<>]")
 
82
escape_map = {
 
83
    "&":'&amp;',
 
84
    "'":"&apos;", # FIXME: overkill
 
85
    "\"":"&quot;",
 
86
    "<":"&lt;",
 
87
    ">":"&gt;",
 
88
    }
 
89
def _escape_replace(match, map=escape_map):
 
90
    return map[match.group()]
 
91
 
 
92
def _escape_attrib(text, encoding=None, replace=None):
 
93
    # escape attribute value
 
94
    try:
 
95
        if encoding:
 
96
            try:
 
97
                text = elementtree.ElementTree._encode(text, encoding)
 
98
            except UnicodeError:
 
99
                return elementtree.ElementTree._encode_entity(text)
 
100
        if replace is None:
 
101
            return escape_re.sub(_escape_replace, text)
 
102
        else:
 
103
            text = replace(text, "&", "&amp;")
 
104
            text = replace(text, "'", "&apos;") # FIXME: overkill
 
105
            text = replace(text, "\"", "&quot;")
 
106
            text = replace(text, "<", "&lt;")
 
107
            text = replace(text, ">", "&gt;")
 
108
            return text
 
109
    except (TypeError, AttributeError):
 
110
        elementtree.ElementTree._raise_serialization_error(text)
 
111
 
 
112
elementtree.ElementTree._escape_attrib = _escape_attrib
 
113
 
 
114
escape_cdata_re = re.compile("[&<>]")
 
115
escape_cdata_map = {
 
116
    "&":'&amp;',
 
117
    "<":"&lt;",
 
118
    ">":"&gt;",
 
119
    }
 
120
def _escape_cdata_replace(match, map=escape_cdata_map):
 
121
    return map[match.group()]
 
122
 
 
123
def _escape_cdata(text, encoding=None, replace=None):
 
124
    # escape character data
 
125
    try:
 
126
        if encoding:
 
127
            try:
 
128
                text = elementtree.ElementTree._encode(text, encoding)
 
129
            except UnicodeError:
 
130
                return elementtree.ElementTree._encode_entity(text)
 
131
        if replace is None:
 
132
            return escape_cdata_re.sub(_escape_cdata_replace, text)
 
133
        else:
 
134
            text = replace(text, "&", "&amp;")
 
135
            text = replace(text, "<", "&lt;")
 
136
            text = replace(text, ">", "&gt;")
 
137
            return text
 
138
    except (TypeError, AttributeError):
 
139
        elementtree.ElementTree._raise_serialization_error(text)
 
140
 
 
141
elementtree.ElementTree._escape_cdata = _escape_cdata