summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config/list/library.lst1
-rw-r--r--sources/scala/xml/factory/Binder.scala43
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)
+ }
+}