summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2002-10-26 14:50:45 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2002-10-26 14:50:45 (GMT)
commit74b51ac1e5fb76250251a66d8d326baaaf1f1cee (patch)
tree2fd291bbcbfd19c22193e1102b204989ecebeab6 /Lib
parentedb6bff67fdb72718ed656d39ac71317ada37a04 (diff)
downloadcpython-74b51ac1e5fb76250251a66d8d326baaaf1f1cee.zip
cpython-74b51ac1e5fb76250251a66d8d326baaaf1f1cee.tar.gz
cpython-74b51ac1e5fb76250251a66d8d326baaaf1f1cee.tar.bz2
Patch #613256: Add nescape method to xml.sax.saxutils.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/output/test_sax5
-rw-r--r--Lib/test/test_sax.py14
-rw-r--r--Lib/xml/sax/saxutils.py32
3 files changed, 43 insertions, 8 deletions
diff --git a/Lib/test/output/test_sax b/Lib/test/output/test_sax
index 8aa5a77..cfb56cb 100644
--- a/Lib/test/output/test_sax
+++ b/Lib/test/output/test_sax
@@ -29,6 +29,9 @@ Passed test_nsattrs_wattr
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
@@ -36,4 +39,4 @@ Passed test_xmlgen_content_escape
Passed test_xmlgen_ignorable
Passed test_xmlgen_ns
Passed test_xmlgen_pi
-37 tests, 0 failures
+40 tests, 0 failures
diff --git a/Lib/test/test_sax.py b/Lib/test/test_sax.py
index 1200329..3c5b11a 100644
--- a/Lib/test/test_sax.py
+++ b/Lib/test/test_sax.py
@@ -8,7 +8,8 @@ try:
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
@@ -70,6 +71,17 @@ def test_escape_all():
def test_escape_extra():
return escape("Hei på deg", {"å" : "&aring;"}) == "Hei p&aring; deg"
+# ===== unescape
+
+def test_unescape_basic():
+ return unescape("Donald Duck &amp; Co") == "Donald Duck & Co"
+
+def test_unescape_all():
+ return unescape("&lt;Donald Duck &amp; Co&gt;") == "<Donald Duck & Co>"
+
+def test_unescape_extra():
+ return unescape("Hei på deg", {"å" : "&aring;"}) == "Hei p&aring; deg"
+
# ===== quoteattr
def test_quoteattr_basic():
diff --git a/Lib/xml/sax/saxutils.py b/Lib/xml/sax/saxutils.py
index 8a96be6..c369f98 100644
--- a/Lib/xml/sax/saxutils.py
+++ b/Lib/xml/sax/saxutils.py
@@ -12,20 +12,40 @@ try:
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("&", "&amp;")
- data = data.replace("<", "&lt;")
- data = data.replace(">", "&gt;")
- for chars, entity in entities.items():
- data = data.replace(chars, entity)
- return data
+ data = __dict_replace(data, {"<" : "&lt;",
+ ">" : "&gt;",
+ })
+ return __dict_replace(data, entities)
+
+def unescape(data, entities={}):
+ """Unescape &amp;, &lt;, and &gt; 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, {"&lt;" : "<",
+ "&gt;" : ">",
+ })
+ # must do ampersand last
+ data = data.replace("&amp;", "&")
+ return __dict_replace(data, entities)
def quoteattr(data, entities={}):
"""Escape and quote an attribute value.