src/Pure/PIDE/yxml.scala
changeset 73029 64157cae1ba4
parent 73028 95e0f014cd24
child 73030 72a8fdfa185d
equal deleted inserted replaced
73028:95e0f014cd24 73029:64157cae1ba4
    16   /* chunk markers */
    16   /* chunk markers */
    17 
    17 
    18   val X = '\u0005'
    18   val X = '\u0005'
    19   val Y = '\u0006'
    19   val Y = '\u0006'
    20 
    20 
    21   val is_X = (c: Char) => c == X
    21   val is_X: Char => Boolean = _ == X
    22   val is_Y = (c: Char) => c == Y
    22   val is_Y: Char => Boolean = _ == Y
    23 
    23 
    24   val X_string: String = X.toString
    24   val X_string: String = X.toString
    25   val Y_string: String = Y.toString
    25   val Y_string: String = Y.toString
    26   val XY_string: String = X_string + Y_string
    26   val XY_string: String = X_string + Y_string
    27   val XYX_string: String = XY_string + X_string
    27   val XYX_string: String = XY_string + X_string
    28 
    28 
    29   def detect(s: String): Boolean = s.exists(c => c == X || c == Y)
    29   def detect(s: String): Boolean = s.exists(c => c == X || c == Y)
    30   def detect_elem(s: String): Boolean = s.startsWith(XY_string)
    30   def detect_elem(s: String): Boolean = s.startsWith(XY_string)
    31 
    31 
    32 
    32 
    33   /* string representation */  // FIXME byte array version with pseudo-utf-8 (!?)
    33   /* string representation */
    34 
    34 
    35   def traversal(string: String => Unit, body: XML.Body): Unit =
    35   def traversal(string: String => Unit, body: XML.Body)
    36   {
    36   {
    37     def tree(t: XML.Tree): Unit =
    37     def tree(t: XML.Tree): Unit =
    38       t match {
    38       t match {
    39         case XML.Elem(Markup(name, atts), ts) =>
    39         case XML.Elem(Markup(name, atts), ts) =>
    40           string(XY_string)
    40           string(XY_string)
    65   private def err_element() = err("bad element")
    65   private def err_element() = err("bad element")
    66   private def err_unbalanced(name: String) =
    66   private def err_unbalanced(name: String) =
    67     if (name == "") err("unbalanced element")
    67     if (name == "") err("unbalanced element")
    68     else err("unbalanced element " + quote(name))
    68     else err("unbalanced element " + quote(name))
    69 
    69 
    70   private def parse_attrib(source: CharSequence) = {
    70   private def parse_attrib(source: CharSequence): (String, String) =
       
    71   {
    71     val s = source.toString
    72     val s = source.toString
    72     val i = s.indexOf('=')
    73     val i = s.indexOf('=')
    73     if (i <= 0) err_attribute()
    74     if (i <= 0) err_attribute()
    74     (s.substring(0, i), s.substring(i + 1))
    75     (s.substring(0, i), s.substring(i + 1))
    75   }
    76   }
    82     def buffer(): mutable.ListBuffer[XML.Tree] = new mutable.ListBuffer[XML.Tree]
    83     def buffer(): mutable.ListBuffer[XML.Tree] = new mutable.ListBuffer[XML.Tree]
    83     var stack: List[(Markup, mutable.ListBuffer[XML.Tree])] = List((Markup.Empty, buffer()))
    84     var stack: List[(Markup, mutable.ListBuffer[XML.Tree])] = List((Markup.Empty, buffer()))
    84 
    85 
    85     def add(x: XML.Tree)
    86     def add(x: XML.Tree)
    86     {
    87     {
    87       (stack: @unchecked) match { case ((_, body) :: _) => body += x }
    88       (stack: @unchecked) match { case (_, body) :: _ => body += x }
    88     }
    89     }
    89 
    90 
    90     def push(name: String, atts: XML.Attributes)
    91     def push(name: String, atts: XML.Attributes)
    91     {
    92     {
    92       if (name == "") err_element()
    93       if (name == "") err_element()
    94     }
    95     }
    95 
    96 
    96     def pop()
    97     def pop()
    97     {
    98     {
    98       (stack: @unchecked) match {
    99       (stack: @unchecked) match {
    99         case ((Markup.Empty, _) :: _) => err_unbalanced("")
   100         case (Markup.Empty, _) :: _ => err_unbalanced("")
   100         case ((markup, body) :: pending) =>
   101         case (markup, body) :: pending =>
   101           stack = pending
   102           stack = pending
   102           add(XML.Elem(markup, body.toList))
   103           add(XML.Elem(markup, body.toList))
   103       }
   104       }
   104     }
   105     }
   105 
   106