diff options
-rw-r--r-- | config/list/library.lst | 1 | ||||
-rw-r--r-- | sources/scala/xml/factory/Binder.scala | 43 |
2 files changed, 44 insertions, 0 deletions
diff --git a/config/list/library.lst b/config/list/library.lst index 8a492433e5..b9c6e3c8b8 100644 --- a/config/list/library.lst +++ b/config/list/library.lst @@ -302,6 +302,7 @@ xml/dtd/DtdTypeSymbol.scala #xml/dtd/Validation.scala xml/dtd/ValidationException.scala +xml/factory/Binder.scala xml/factory/NodeFactory.scala xml/factory/LoggedNodeFactory.scala diff --git a/sources/scala/xml/factory/Binder.scala b/sources/scala/xml/factory/Binder.scala new file mode 100644 index 0000000000..a9af7af3d3 --- /dev/null +++ b/sources/scala/xml/factory/Binder.scala @@ -0,0 +1,43 @@ +package scala.xml.factory ; + +import scala.xml.parsing.ValidatingMarkupHandler; + +abstract class Binder(val preserveWS: Boolean) extends ValidatingMarkupHandler { + + var result: NodeBuffer = new NodeBuffer(); + + def reportSyntaxError(pos:Int, str:String) = {} + + final def procInstr(pos: Int, target: String, txt: String ) = + ProcInstr(target, txt); + + final def comment(pos: Int, txt: String ) = + Comment( txt ); + + final def entityRef(pos: Int, n: String) = + EntityRef( n ); + + final def text(pos: Int, txt:String) = + Text( txt ); + + final def traverse(n:Node): Unit = n match { + case x:ProcInstr => result + procInstr(0, x.target, x.text) + case x:Comment => result + comment(0, x.text) + case x:Text => result + text(0, x.data) + case x:EntityRef => result + entityRef(0, x.entityName) + case _ => + elemStart(0, n.prefix, n.label, n.attributes, n.scope); + val old = result; + result = new NodeBuffer(); + for(val m <- n.child) + traverse(m); + result = old + elem(0, n.prefix, n.label, n.attributes, n.scope, NodeSeq.fromSeq(result)).toList; + elemEnd(0, n.prefix, n.label); + } + + final def validate(n:Node): Node = { + this.rootLabel = n.label; + traverse(n); + result(0) + } +} |