| Viewing file:  xml_fix.py (2.12 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
# Copyright (c) 2011 Google Inc. All rights reserved.# Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
 """Applies a fix to CR LF TAB handling in xml.dom.
 
 Fixes this: http://code.google.com/p/chromium/issues/detail?id=76293
 Working around this: http://bugs.python.org/issue5752
 TODO(bradnelson): Consider dropping this when we drop XP support.
 """
 
 
 import xml.dom.minidom
 
 
 def _Replacement_write_data(writer, data, is_attrib=False):
 """Writes datachars to writer."""
 data = data.replace("&", "&").replace("<", "<")
 data = data.replace("\"", """).replace(">", ">")
 if is_attrib:
 data = data.replace(
 "\r", "
").replace(
 "\n", "
").replace(
 "\t", "	")
 writer.write(data)
 
 
 def _Replacement_writexml(self, writer, indent="", addindent="", newl=""):
 # indent = current indentation
 # addindent = indentation to add to higher levels
 # newl = newline string
 writer.write(indent+"<" + self.tagName)
 
 attrs = self._get_attributes()
 a_names = attrs.keys()
 a_names.sort()
 
 for a_name in a_names:
 writer.write(" %s=\"" % a_name)
 _Replacement_write_data(writer, attrs[a_name].value, is_attrib=True)
 writer.write("\"")
 if self.childNodes:
 writer.write(">%s" % newl)
 for node in self.childNodes:
 node.writexml(writer, indent + addindent, addindent, newl)
 writer.write("%s</%s>%s" % (indent, self.tagName, newl))
 else:
 writer.write("/>%s" % newl)
 
 
 class XmlFix(object):
 """Object to manage temporary patching of xml.dom.minidom."""
 
 def __init__(self):
 # Preserve current xml.dom.minidom functions.
 self.write_data = xml.dom.minidom._write_data
 self.writexml = xml.dom.minidom.Element.writexml
 # Inject replacement versions of a function and a method.
 xml.dom.minidom._write_data = _Replacement_write_data
 xml.dom.minidom.Element.writexml = _Replacement_writexml
 
 def Cleanup(self):
 if self.write_data:
 xml.dom.minidom._write_data = self.write_data
 xml.dom.minidom.Element.writexml = self.writexml
 self.write_data = None
 
 def __del__(self):
 self.Cleanup()
 
 |