From ad7a57103d2d85a198bc0bf2d30d24a86ca17958 Mon Sep 17 00:00:00 2001 From: Lance Stout Date: Thu, 12 Sep 2013 10:39:10 -0700 Subject: ElementTree._escape_cdata isn't reliable across Python versions. It also does not work as desired. Revert "Merge pull request #254 from barreverte/develop" This reverts commit 23750357e21ce1e22445b2e702bdd4efb77f2369, reversing changes made to 07284f380fa0a893a5ef56774fcef71a47851668. --- sleekxmpp/xmlstream/tostring.py | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) (limited to 'sleekxmpp/xmlstream') diff --git a/sleekxmpp/xmlstream/tostring.py b/sleekxmpp/xmlstream/tostring.py index 4d7976b1..c49abd3e 100644 --- a/sleekxmpp/xmlstream/tostring.py +++ b/sleekxmpp/xmlstream/tostring.py @@ -16,7 +16,6 @@ from __future__ import unicode_literals import sys -from xml.etree.ElementTree import _escape_cdata, _escape_attrib if sys.version_info < (3, 0): import types @@ -141,12 +140,33 @@ def tostring(xml=None, xmlns='', stream=None, outbuffer='', def escape(text, use_cdata=False): - encoding = 'utf-8' + """Convert special characters in XML to escape sequences. - if use_cdata: - return _escape_cdata(text, encoding) - - text = _escape_attrib(text, encoding) - if "'" in text: - text = text.replace("'", "'") - return text + :param string text: The XML text to convert. + :rtype: Unicode string + """ + if sys.version_info < (3, 0): + if type(text) != types.UnicodeType: + text = unicode(text, 'utf-8', 'ignore') + + escapes = {'&': '&', + '<': '<', + '>': '>', + "'": ''', + '"': '"'} + + if not use_cdata: + text = list(text) + for i, c in enumerate(text): + text[i] = escapes.get(c, c) + return ''.join(text) + else: + escape_needed = False + for c in text: + if c in escapes: + escape_needed = True + break + if escape_needed: + escaped = map(lambda x : "" % x, text.split("]]>")) + return "]]>".join(escaped) + return text -- cgit v1.2.3