[XML-SIG] SAX, escape problem

Martin v. Loewis martin@v.loewis.de
03 Apr 2002 08:45:58 +0200


Gregor Mosheh <stigmata@blackangel.net> writes:

> It appears that something in SAX is failing to convert quote marks
> and some other characters into their entities. How do I correct this?

It's a bug. Please apply this patch.

Regards,
Martin

Index: writer.py
===================================================================
RCS file: /cvsroot/pyxml/xml/xml/sax/writer.py,v
retrieving revision 1.7
diff -u -r1.7 writer.py
--- writer.py	30 Dec 2001 22:46:44 -0000	1.7
+++ writer.py	3 Apr 2002 06:44:55 -0000
@@ -61,6 +61,7 @@
     dsc = "]"                           # declaration subset close
     ero = "&"                           # entity reference open
     lit = '"'                           # literal start or end
+    lit_quoted = '&quot;'               # quoted literal
     lita = "'"                          # literal start or end (alternative)
     mdo = "<!"                          # markup declaration open
     mdc = ">"                           # markup declaration close
@@ -268,6 +269,7 @@
         stag = "%s%s%s" % (prefix, self.__syntax.stago, tag)
         prefix = "%s %s" % (prefix, (len(tag) * " "))
         lit = self.__syntax.lit
+        lita = self.__syntax.lita
         vi = self.__syntax.vi
         a = ''
         if self._flowing != self.__stack[-1][0]:
@@ -285,7 +287,15 @@
         for k, v in attrs.items():
             if v is None:
                 continue
-            a = ' %s%s%s%s%s' % (k, vi, lit, escape(str(v)), lit)
+            v = str(v)
+            if string.find(v, lit) == -1:
+                a = ' %s%s%s%s%s' % (k, vi, lit, escape(str(v)), lit)
+            elif string.find(v, lita) == -1:
+                a = ' %s%s%s%s%s' % (k, vi, lita, escape(str(v)), lita)
+            else:
+                a = ' %s%s%s%s%s' % (k, vi, lita,
+                                     escape(str(v), {lit:self.__syntax.lit_quoted}),
+                                     lita)
             if (self._offset + len(a)) > self.lineLength:
                 self._write(line + "\n")
                 line = prefix + a