def buffer(): mutable.ListBuffer[XML.Tree] = new mutable.ListBuffer[XML.Tree] var stack: List[(Markup, mutable.ListBuffer[XML.Tree])] = List((Markup.Empty, buffer()))
def add(x: XML.Tree): Unit =
(stack: @unchecked) match { case (_, body) :: _ => body += x }
def push(name: String, atts: XML.Attributes): Unit = if (name == "") err_element() else stack = (cache.markup(Markup(name, atts)), buffer()) :: stack
def pop(): Unit =
(stack: @unchecked) match { case (Markup.Empty, _) :: _ => err_unbalanced("") case (markup, body) :: pending =>
stack = pending
add(cache.tree0(XML.Elem(markup, body.toList)))
}
/* parse chunks */
for (chunk <- source.iterator_X) { if (!chunk.is_empty) { if (chunk.is_Y) pop() else {
chunk.iterator_Y.toList match { case ch :: name :: atts if ch.is_empty =>
push(parse_string(name), atts.map(parse_attrib)) case txts => for (txt <- txts) add(cache.tree0(XML.Text(cache.string(parse_string(txt)))))
}
}
}
}
(stack: @unchecked) match { case List((Markup.Empty, body)) => body.toList case (Markup(name, _), _) :: _ => err_unbalanced(name)
}
}
def parse(
source: Source,
recode: String => String = identity,
cache: XML.Cache = XML.Cache.none
): XML.Tree =
parse_body(source, recode = recode, cache = cache) match { case List(result) => result case Nil => XML.no_text case _ => err("multiple XML trees")
}
def parse_elem(
source: Source,
recode: String => String = identity,
cache: XML.Cache = XML.Cache.none
): XML.Tree =
parse_body(source, recode = recode, cache = cache) match { case List(elem: XML.Elem) => elem case _ => err("single XML element expected")
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.