diff options
-rw-r--r-- | sources/scala/xml/parsing/MarkupParser.scala | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/sources/scala/xml/parsing/MarkupParser.scala b/sources/scala/xml/parsing/MarkupParser.scala index e5982a6930..bab7a5b67e 100644 --- a/sources/scala/xml/parsing/MarkupParser.scala +++ b/sources/scala/xml/parsing/MarkupParser.scala @@ -39,10 +39,10 @@ abstract class MarkupParser[MarkupType] { /** append Unicode character to name buffer*/ protected def putChar(c: Char) = cbuf.append(c); - protected var aMap: mutable.Map[String,AttribValue] = - new mutable.HashMap[String,AttribValue]; + protected var aMap: mutable.Map[String,AttribValue] = _; final val noChildren = new mutable.ListBuffer[MarkupType]; + final val noAttribs = new mutable.HashMap[String, AttribValue]; //var xEmbeddedBlock = false; @@ -84,7 +84,7 @@ abstract class MarkupParser[MarkupType] { * | `{` scalablock `}` */ def xAttributes = { - aMap.clear; + val aMap = new mutable.HashMap[String,AttribValue]; while( xml.Parsing.isNameStart( ch )) { val key = xName; xEQ; @@ -136,13 +136,17 @@ abstract class MarkupParser[MarkupType] { * [40] STag ::= '<' Name { S Attribute } [S] * [44] EmptyElemTag ::= '<' Name { S Attribute } [S] */ - protected def xTag: String = { + protected def xTag: Pair[String, mutable.Map[String,AttribValue]] = { val elemqName = xName; + xSpaceOpt; - if(xml.Parsing.isNameStart( ch )) { - xAttributes; - } - elemqName; + val aMap: mutable.Map[String,AttribValue] = + if(xml.Parsing.isNameStart( ch )) { + xAttributes; + } else { + noAttribs + }; + Pair(elemqName, aMap); } /** [42] '<' xmlEndTag ::= '<' '/' Name S? '>' @@ -264,7 +268,7 @@ abstract class MarkupParser[MarkupType] { nextch; ts.appendAll(xProcInstr); case _ => - ts.appendAll(element); // child + ts.appendAll(element1); // child } case '{' => @@ -298,15 +302,18 @@ abstract class MarkupParser[MarkupType] { ts } /* end content */ + def element: Iterable[MarkupType] = { + xToken('<'); + element1 + } + /** '<' element ::= xmlTag1 '>' { xmlExpr | '{' simpleExpr '}' } ETag * | xmlTag1 '/' '>' */ - def element: Iterable[MarkupType] = { - xSpaceOpt; // @todo: move this to init - xToken('<'); + def element1: Iterable[MarkupType] = { var pref: Map[String, String] = _; var pos1 = pos; - val qname = xTag; + val Pair(qname, aMap) = xTag; val ts: mutable.Buffer[MarkupType] = { if(ch == '/') { // empty element xToken('/'); |