~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/xml_serializer.py

  • Committer: Matt Nordhoff
  • Date: 2009-04-04 02:50:01 UTC
  • mfrom: (4253 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4256.
  • Revision ID: mnordhoff@mattnordhoff.com-20090404025001-z1403k0tatmc8l91
Merge bzr.dev, fixing conflicts.

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
"""XML externalization support."""
18
18
 
22
22
# importing this module is fairly slow because it has to load several
23
23
# ElementTree bits
24
24
 
25
 
from bzrlib import registry
 
25
from bzrlib.serializer import Serializer
26
26
from bzrlib.trace import mutter, warning
27
27
 
28
28
try:
49
49
from bzrlib import errors
50
50
 
51
51
 
52
 
class Serializer(object):
53
 
    """Abstract object serialize/deserialize"""
54
 
 
55
 
    def write_inventory(self, inv, f):
56
 
        """Write inventory to a file"""
57
 
        raise NotImplementedError(self.write_inventory)
58
 
 
59
 
    def write_inventory_to_string(self, inv):
60
 
        raise NotImplementedError(self.write_inventory_to_string)
 
52
class XMLSerializer(Serializer):
 
53
    """Abstract XML object serialize/deserialize"""
61
54
 
62
55
    def read_inventory_from_string(self, xml_string, revision_id=None,
63
56
                                   entry_cache=None):
122
115
    }
123
116
def _escape_replace(match, map=escape_map):
124
117
    return map[match.group()]
125
 
 
 
118
 
126
119
def _escape_attrib(text, encoding=None, replace=None):
127
120
    # escape attribute value
128
121
    try:
153
146
    }
154
147
def _escape_cdata_replace(match, map=escape_cdata_map):
155
148
    return map[match.group()]
156
 
 
 
149
 
157
150
def _escape_cdata(text, encoding=None, replace=None):
158
151
    # escape character data
159
152
    try:
175
168
elementtree.ElementTree._escape_cdata = _escape_cdata
176
169
 
177
170
 
178
 
class SerializerRegistry(registry.Registry):
179
 
    """Registry for serializer objects"""
180
 
 
181
 
 
182
 
format_registry = SerializerRegistry()
183
 
format_registry.register_lazy('4', 'bzrlib.xml4', 'serializer_v4')
184
 
format_registry.register_lazy('5', 'bzrlib.xml5', 'serializer_v5')
185
 
format_registry.register_lazy('6', 'bzrlib.xml6', 'serializer_v6')
186
 
format_registry.register_lazy('7', 'bzrlib.xml7', 'serializer_v7')
187
 
format_registry.register_lazy('8', 'bzrlib.xml8', 'serializer_v8')
 
171
def escape_invalid_chars(message):
 
172
    """Escape the XML-invalid characters in a commit message.
 
173
 
 
174
    :param message: Commit message to escape
 
175
    :param count: Number of characters that were escaped
 
176
    """
 
177
    # Python strings can include characters that can't be
 
178
    # represented in well-formed XML; escape characters that
 
179
    # aren't listed in the XML specification
 
180
    # (http://www.w3.org/TR/REC-xml/#NT-Char).
 
181
    return re.subn(u'[^\x09\x0A\x0D\u0020-\uD7FF\uE000-\uFFFD]+',
 
182
            lambda match: match.group(0).encode('unicode_escape'),
 
183
            message)