diff --git a/jvm/src/test/scala/scala/xml/XMLTest.scala b/jvm/src/test/scala/scala/xml/XMLTest.scala
index ba204d0e1..201557503 100644
--- a/jvm/src/test/scala/scala/xml/XMLTest.scala
+++ b/jvm/src/test/scala/scala/xml/XMLTest.scala
@@ -749,4 +749,20 @@ class XMLTestJVM {
assertEquals("\n \n", pp.format(x))
}
+ @UnitTest
+ def issue231: Unit = {
+ val pp = new xml.PrettyPrinter(4, 2, minimizeEmpty = true)
+ val x =
+ val formatted = pp.format(x)
+ assertEquals(x, XML.loadString(formatted))
+ assertTrue(formatted.trim.lines.length >= 2)
+ }
+
+ @UnitTest
+ def issue231_withoutAttributes: Unit = {
+ val pp = new xml.PrettyPrinter(4, 2, minimizeEmpty = true)
+ val x =
+ val formatted = pp.format(x)
+ assertEquals(x, XML.loadString(formatted))
+ }
}
diff --git a/shared/src/main/scala/scala/xml/PrettyPrinter.scala b/shared/src/main/scala/scala/xml/PrettyPrinter.scala
index cce680246..d202da0e6 100755
--- a/shared/src/main/scala/scala/xml/PrettyPrinter.scala
+++ b/shared/src/main/scala/scala/xml/PrettyPrinter.scala
@@ -160,8 +160,16 @@ class PrettyPrinter(width: Int, step: Int, minimizeEmpty: Boolean) {
if (childrenAreLeaves(node) && fits(test)) {
makeBox(ind, test)
} else {
- val (stg, len2) = startTag(node, pscope)
- val etg = endTag(node)
+ val ((stg, len2), etg) =
+ if (node.child.isEmpty && minimizeEmpty) {
+ // force the tag to be self-closing
+ val firstAttribute = test.indexOf(' ')
+ val firstBreak = if (firstAttribute != -1) firstAttribute else test.lastIndexOf('/')
+ ((test, firstBreak), "")
+ } else {
+ (startTag(node, pscope), endTag(node))
+ }
+
if (stg.length < width - cur) { // start tag fits
makeBox(ind, stg)
makeBreak()
@@ -180,10 +188,12 @@ class PrettyPrinter(width: Int, step: Int, minimizeEmpty: Boolean) {
makeBreak()
}
}*/
- makeBox(ind, stg.substring(len2, stg.length))
- makeBreak()
- traverse(node.child.iterator, node.scope, ind + step)
- makeBox(cur, etg)
+ makeBox(ind, stg.substring(len2, stg.length).trim)
+ if (etg.nonEmpty) {
+ makeBreak()
+ traverse(node.child.iterator, node.scope, ind + step)
+ makeBox(cur, etg)
+ }
makeBreak()
} else { // give up
makeBox(ind, test)