| # 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() |