Commit def4728f authored by Ezio Melotti's avatar Ezio Melotti

#4147: merge with 3.2.

parents 4d5d4e28 8008f2ab
...@@ -467,12 +467,39 @@ class MinidomTest(unittest.TestCase): ...@@ -467,12 +467,39 @@ class MinidomTest(unittest.TestCase):
dom.unlink() dom.unlink()
self.confirm(domstr == str.replace("\n", "\r\n")) self.confirm(domstr == str.replace("\n", "\r\n"))
def test_toprettyxml_with_text_nodes(self):
# see issue #4147, text nodes are not indented
decl = '<?xml version="1.0" ?>\n'
self.assertEqual(parseString('<B>A</B>').toprettyxml(),
decl + '<B>A</B>\n')
self.assertEqual(parseString('<C>A<B>A</B></C>').toprettyxml(),
decl + '<C>\n\tA\n\t<B>A</B>\n</C>\n')
self.assertEqual(parseString('<C><B>A</B>A</C>').toprettyxml(),
decl + '<C>\n\t<B>A</B>\n\tA\n</C>\n')
self.assertEqual(parseString('<C><B>A</B><B>A</B></C>').toprettyxml(),
decl + '<C>\n\t<B>A</B>\n\t<B>A</B>\n</C>\n')
self.assertEqual(parseString('<C><B>A</B>A<B>A</B></C>').toprettyxml(),
decl + '<C>\n\t<B>A</B>\n\tA\n\t<B>A</B>\n</C>\n')
def test_toprettyxml_with_adjacent_text_nodes(self):
# see issue #4147, adjacent text nodes are indented normally
dom = Document()
elem = dom.createElement('elem')
elem.appendChild(dom.createTextNode('TEXT'))
elem.appendChild(dom.createTextNode('TEXT'))
dom.appendChild(elem)
decl = '<?xml version="1.0" ?>\n'
self.assertEqual(dom.toprettyxml(),
decl + '<elem>\n\tTEXT\n\tTEXT\n</elem>\n')
def test_toprettyxml_preserves_content_of_text_node(self): def test_toprettyxml_preserves_content_of_text_node(self):
str = '<A>B</A>' # see issue #4147
dom = parseString(str) for str in ('<B>A</B>', '<A><B>C</B></A>'):
dom2 = parseString(dom.toprettyxml()) dom = parseString(str)
self.assertEqual(dom.childNodes[0].childNodes[0].toxml(), dom2 = parseString(dom.toprettyxml())
dom2.childNodes[0].childNodes[0].toxml()) self.assertEqual(
dom.getElementsByTagName('B')[0].childNodes[0].toxml(),
dom2.getElementsByTagName('B')[0].childNodes[0].toxml())
def testProcessingInstruction(self): def testProcessingInstruction(self):
dom = parseString('<e><?mypi \t\n data \t\n ?></e>') dom = parseString('<e><?mypi \t\n data \t\n ?></e>')
......
...@@ -837,11 +837,15 @@ class Element(Node): ...@@ -837,11 +837,15 @@ class Element(Node):
writer.write("\"") writer.write("\"")
if self.childNodes: if self.childNodes:
writer.write(">") writer.write(">")
if self.childNodes[0].nodeType != Node.TEXT_NODE: if (len(self.childNodes) == 1 and
self.childNodes[0].nodeType == Node.TEXT_NODE):
self.childNodes[0].writexml(writer, '', '', '')
else:
writer.write(newl) writer.write(newl)
for node in self.childNodes: for node in self.childNodes:
node.writexml(writer,indent+addindent,addindent,newl) node.writexml(writer, indent+addindent, addindent, newl)
writer.write("%s</%s>%s" % (indent,self.tagName,newl)) writer.write(indent)
writer.write("</%s>%s" % (self.tagName, newl))
else: else:
writer.write("/>%s"%(newl)) writer.write("/>%s"%(newl))
...@@ -1063,7 +1067,7 @@ class Text(CharacterData): ...@@ -1063,7 +1067,7 @@ class Text(CharacterData):
return newText return newText
def writexml(self, writer, indent="", addindent="", newl=""): def writexml(self, writer, indent="", addindent="", newl=""):
_write_data(writer, self.data) _write_data(writer, "%s%s%s" % (indent, self.data, newl))
# DOM Level 3 (WD 9 April 2002) # DOM Level 3 (WD 9 April 2002)
......
...@@ -377,6 +377,10 @@ Core and Builtins ...@@ -377,6 +377,10 @@ Core and Builtins
Library Library
------- -------
- Issue #4147: minidom's toprettyxml no longer adds whitespace around a text
node when it is the only child of an element. Initial patch by Dan
Kenigsberg.
- Issue #13374: The Windows bytes API has been deprecated in the os module. Use - Issue #13374: The Windows bytes API has been deprecated in the os module. Use
Unicode filenames instead of bytes filenames to not depend on the ANSI code Unicode filenames instead of bytes filenames to not depend on the ANSI code
page anymore and to support any filename. page anymore and to support any filename.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment