strings; each key will be replaced with its corresponding value.
\end{funcdesc}
+\begin{funcdesc}{unescape}{data\optional{, entities}}
+ Unescape \character{\&}, \character{\<}, and \character{\>}
+ in a string of data.
+
+ You can unescape other strings of data by passing a dictionary as the
+ optional \var{entities} parameter. The keys and values must all be
+ strings; each key will be replaced with its corresponding value.
+
+ \versionadded{2.3}
+\end{funcdesc}
+
\begin{funcdesc}{quoteattr}{data\optional{, entities}}
Similar to \function{escape()}, but also prepares \var{data} to be
used as an attribute value. The return value is a quoted version of
Passed test_quoteattr_basic
Passed test_single_double_quoteattr
Passed test_single_quoteattr
+Passed test_unescape_all
+Passed test_unescape_basic
+Passed test_unescape_extra
Passed test_xmlgen_attr_escape
Passed test_xmlgen_basic
Passed test_xmlgen_content
Passed test_xmlgen_ignorable
Passed test_xmlgen_ns
Passed test_xmlgen_pi
-37 tests, 0 failures
+40 tests, 0 failures
except SAXReaderNotAvailable:
# don't try to test this module if we cannot create a parser
raise ImportError("no XML parsers available")
-from xml.sax.saxutils import XMLGenerator, escape, quoteattr, XMLFilterBase
+from xml.sax.saxutils import XMLGenerator, escape, unescape, quoteattr, \
+ XMLFilterBase
from xml.sax.expatreader import create_parser
from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl
from cStringIO import StringIO
def test_escape_extra():
return escape("Hei på deg", {"å" : "å"}) == "Hei på deg"
+# ===== unescape
+
+def test_unescape_basic():
+ return unescape("Donald Duck & Co") == "Donald Duck & Co"
+
+def test_unescape_all():
+ return unescape("<Donald Duck & Co>") == "<Donald Duck & Co>"
+
+def test_unescape_extra():
+ return unescape("Hei på deg", {"å" : "å"}) == "Hei på deg"
+
# ===== quoteattr
def test_quoteattr_basic():
except AttributeError:
_StringTypes = [types.StringType]
+def __dict_replace(s, d):
+ """Replace substrings of a string using a dictionary."""
+ for key, value in d.items():
+ s = s.replace(key, value)
+ return s
def escape(data, entities={}):
"""Escape &, <, and > in a string of data.
-
+
You can escape other strings of data by passing a dictionary as
the optional entities parameter. The keys and values must all be
strings; each key will be replaced with its corresponding value.
"""
+
+ # must do ampersand first
data = data.replace("&", "&")
- data = data.replace("<", "<")
- data = data.replace(">", ">")
- for chars, entity in entities.items():
- data = data.replace(chars, entity)
- return data
+ data = __dict_replace(data, {"<" : "<",
+ ">" : ">",
+ })
+ return __dict_replace(data, entities)
+
+def unescape(data, entities={}):
+ """Unescape &, <, and > in a string of data.
+
+ You can unescape other strings of data by passing a dictionary as
+ the optional entities parameter. The keys and values must all be
+ strings; each key will be replaced with its corresponding value.
+ """
+ data = __dict_replace(data, {"<" : "<",
+ ">" : ">",
+ })
+ # must do ampersand last
+ data = data.replace("&", "&")
+ return __dict_replace(data, entities)
def quoteattr(data, entities={}):
"""Escape and quote an attribute value.
Erik van Blokland
Finn Bock
Paul Boddie
+Matthew Boedicker
David Bolen
Jurjen Bos
Peter Bosch
Library
-------
+- xml.sax.saxutils.unescape has been added, to replace entity references
+ with their entity value.
+
- Queue.Queue.{put,get} now support an optional timeout argument.
- Various features of Tk 8.4 are exposed in Tkinter.py. The multiple