]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Added function xml.sax.saxutils.quoteattr().
authorFred Drake <fdrake@acm.org>
Thu, 19 Jul 2001 16:10:15 +0000 (16:10 +0000)
committerFred Drake <fdrake@acm.org>
Thu, 19 Jul 2001 16:10:15 +0000 (16:10 +0000)
This closes SF bug #440351.  It should not be moved to Python 2.1.1.

Doc/lib/xmlsaxutils.tex
Lib/test/output/test_sax
Lib/test/test_sax.py
Lib/xml/sax/saxutils.py

index 2ff14716a869b7ef7e2de1905239b51b54c01bd1..004848523cb65edaca0e2af188dbb148476123f1 100644 (file)
@@ -14,13 +14,33 @@ functions that are commonly useful when creating SAX applications,
 either in direct use, or as base classes.
 
 \begin{funcdesc}{escape}{data\optional{, entities}}
-  Escape \&, <, and > in a string of data.
+  Escape \character{\&}, \character{<}, and \character{>} 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
+  optional \var{entities} parameter.  The keys and values must all be
   strings; each key will be replaced with its corresponding value.
 \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
+  \var{data} with any additional required replacements.
+  \function{quoteattr()} will select a quote character based on the
+  content of \var{data}, attempting to avoid encoding any quote
+  characters in the string.  If both single- and double-quote
+  characters are already in \var{data}, the double-quote characters
+  will be encoded and \var{data} will be wrapped in doule-quotes.  The
+  resulting string can be used directly as an attribute value:
+
+\begin{verbatim}
+>>> print "<element attr=%s>" % quoteattr("ab ' cd \" ef")
+<element attr="ab ' cd &quot; ef">
+\end{verbatim}
+
+  \versionadded{2.2}
+\end{funcdesc}
+
 \begin{classdesc}{XMLGenerator}{\optional{out\optional{, encoding}}}
   This class implements the \class{ContentHandler} interface by
   writing SAX events back into an XML document. In other words, using
index de49c805618c042126a58b37093877daa5d0a92f..b14cf94812d6bf5e4fd6df2347df44cb4fc56030 100644 (file)
@@ -1,6 +1,7 @@
 test_sax
 Passed test_attrs_empty
 Passed test_attrs_wattr
+Passed test_double_quoteattr
 Passed test_escape_all
 Passed test_escape_basic
 Passed test_escape_extra
@@ -25,10 +26,13 @@ Passed test_make_parser
 Passed test_make_parser2
 Passed test_nsattrs_empty
 Passed test_nsattrs_wattr
+Passed test_quoteattr_basic
+Passed test_single_double_quoteattr
+Passed test_single_quoteattr
 Passed test_xmlgen_basic
 Passed test_xmlgen_content
 Passed test_xmlgen_content_escape
 Passed test_xmlgen_ignorable
 Passed test_xmlgen_ns
 Passed test_xmlgen_pi
-32 tests, 0 failures
+36 tests, 0 failures
index f4b43fede83ee74d939c2570da6746f297c463d8..62705c9bcaf7a0f3522b374afee096ac8e3f3aff 100644 (file)
@@ -8,7 +8,7 @@ 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, XMLFilterBase
+from xml.sax.saxutils import XMLGenerator, escape, quoteattr, XMLFilterBase
 from xml.sax.expatreader import create_parser
 from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl
 from cStringIO import StringIO
@@ -69,6 +69,25 @@ def test_escape_all():
 def test_escape_extra():
     return escape("Hei på deg", {"å" : "&aring;"}) == "Hei p&aring; deg"
 
+# ===== quoteattr
+
+def test_quoteattr_basic():
+    return quoteattr("Donald Duck & Co") == '"Donald Duck &amp; Co"'
+
+def test_single_quoteattr():
+    return (quoteattr('Includes "double" quotes')
+            == '\'Includes "double" quotes\'')
+
+def test_double_quoteattr():
+    return (quoteattr("Includes 'single' quotes")
+            == "\"Includes 'single' quotes\"")
+
+def test_single_double_quoteattr():
+    return (quoteattr("Includes 'single' and \"double\" quotes")
+            == "\"Includes 'single' and &quot;double&quot; quotes\"")
+
+# ===== make_parser
+
 def test_make_parser():
     try:
         # Creating a parser should succeed - it should fall back
index e592f2a1d9020967ec45b60228cc90f4027540a2..bf1f5f317e928cd7f9368d57d5c6c55e39f66196 100644 (file)
@@ -27,6 +27,27 @@ def escape(data, entities={}):
         data = data.replace(chars, entity)
     return data
 
+def quoteattr(data, entities={}):
+    """Escape and quote an attribute value.
+
+    Escape &, <, and > in a string of data, then quote it for use as
+    an attribute value.  The \" character will be escaped as well, if
+    necessary.
+
+    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.
+    """
+    data = escape(data, entities)
+    if '"' in data:
+        if "'" in data:
+            data = '"%s"' % data.replace('"', "&quot;")
+        else:
+            data = "'%s'" % data
+    else:
+        data = '"%s"' % data
+    return data
+
 
 class XMLGenerator(handler.ContentHandler):