~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/xml_serializer.py

Merge bzr.dev into cleanup

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
# importing this module is fairly slow because it has to load several
23
23
# ElementTree bits
24
24
 
 
25
import re
 
26
 
25
27
from bzrlib.serializer import Serializer
26
28
from bzrlib.trace import mutter
27
29
 
111
113
        return ElementTree().parse(f)
112
114
 
113
115
 
114
 
# performance tuning for elementree's serialiser. This should be
115
 
# sent upstream - RBC 20060523.
116
 
# the functions here are patched into elementtree at runtime.
117
 
import re
118
 
escape_re = re.compile("[&'\"<>]")
119
 
escape_map = {
120
 
    "&":'&amp;',
121
 
    "'":"&apos;", # FIXME: overkill
122
 
    "\"":"&quot;",
123
 
    "<":"&lt;",
124
 
    ">":"&gt;",
125
 
    }
126
 
def _escape_replace(match, map=escape_map):
127
 
    return map[match.group()]
128
 
 
129
 
def _escape_attrib(text, encoding=None, replace=None):
130
 
    # escape attribute value
131
 
    try:
132
 
        if encoding:
133
 
            try:
134
 
                text = elementtree.ElementTree._encode(text, encoding)
135
 
            except UnicodeError:
136
 
                return elementtree.ElementTree._encode_entity(text)
137
 
        if replace is None:
138
 
            return escape_re.sub(_escape_replace, text)
139
 
        else:
140
 
            text = replace(text, "&", "&amp;")
141
 
            text = replace(text, "'", "&apos;") # FIXME: overkill
142
 
            text = replace(text, "\"", "&quot;")
143
 
            text = replace(text, "<", "&lt;")
144
 
            text = replace(text, ">", "&gt;")
145
 
            return text
146
 
    except (TypeError, AttributeError):
147
 
        elementtree.ElementTree._raise_serialization_error(text)
148
 
 
149
 
elementtree.ElementTree._escape_attrib = _escape_attrib
150
 
 
151
 
escape_cdata_re = re.compile("[&<>]")
152
 
escape_cdata_map = {
153
 
    "&":'&amp;',
154
 
    "<":"&lt;",
155
 
    ">":"&gt;",
156
 
    }
157
 
def _escape_cdata_replace(match, map=escape_cdata_map):
158
 
    return map[match.group()]
159
 
 
160
 
def _escape_cdata(text, encoding=None, replace=None):
161
 
    # escape character data
162
 
    try:
163
 
        if encoding:
164
 
            try:
165
 
                text = elementtree.ElementTree._encode(text, encoding)
166
 
            except UnicodeError:
167
 
                return elementtree.ElementTree._encode_entity(text)
168
 
        if replace is None:
169
 
            return escape_cdata_re.sub(_escape_cdata_replace, text)
170
 
        else:
171
 
            text = replace(text, "&", "&amp;")
172
 
            text = replace(text, "<", "&lt;")
173
 
            text = replace(text, ">", "&gt;")
174
 
            return text
175
 
    except (TypeError, AttributeError):
176
 
        elementtree.ElementTree._raise_serialization_error(text)
177
 
 
178
 
elementtree.ElementTree._escape_cdata = _escape_cdata
179
 
 
180
 
 
181
116
def escape_invalid_chars(message):
182
117
    """Escape the XML-invalid characters in a commit message.
183
118