src/Pure/PIDE/yxml.scala
changeset 71534 f10bffaa2bae
parent 67820 e30d6368c7c8
child 71601 97ccf48c2f0c
--- a/src/Pure/PIDE/yxml.scala	Mon Mar 09 16:58:23 2020 +0100
+++ b/src/Pure/PIDE/yxml.scala	Mon Mar 09 19:35:07 2020 +0100
@@ -24,6 +24,7 @@
   val X_string = X.toString
   val Y_string = Y.toString
   val XY_string = X_string + Y_string
+  val XYX_string = XY_string + X_string
 
   def detect(s: String): Boolean = s.exists(c => c == X || c == Y)
   def detect_elem(s: String): Boolean = s.startsWith(XY_string)
@@ -31,19 +32,26 @@
 
   /* string representation */  // FIXME byte array version with pseudo-utf-8 (!?)
 
-  def string_of_body(body: XML.Body): String =
+  def traversal(string: String => Unit, body: XML.Body): Unit =
   {
-    val s = new StringBuilder
-    def attrib(p: (String, String)) { s += Y; s ++= p._1; s += '='; s ++= p._2 }
     def tree(t: XML.Tree): Unit =
       t match {
         case XML.Elem(Markup(name, atts), ts) =>
-          s += X; s += Y; s ++= name; atts.foreach(attrib); s += X
+          string(XY_string)
+          string(name)
+          for ((a, x) <- atts) { string(Y_string); string(a); string("="); string(x) }
+          string(X_string)
           ts.foreach(tree)
-          s += X; s += Y; s += X
-        case XML.Text(text) => s ++= text
+          string(XYX_string)
+        case XML.Text(text) => string(text)
       }
     body.foreach(tree)
+  }
+
+  def string_of_body(body: XML.Body): String =
+  {
+    val s = new StringBuilder
+    traversal(str => s ++= str, body)
     s.toString
   }