summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library/scala/xml/Elem.scala2
-rw-r--r--src/library/scala/xml/Utility.scala14
-rw-r--r--test/files/jvm/unittest_xml.scala5
3 files changed, 20 insertions, 1 deletions
diff --git a/src/library/scala/xml/Elem.scala b/src/library/scala/xml/Elem.scala
index 027a1120b0..37c2f3e6a4 100644
--- a/src/library/scala/xml/Elem.scala
+++ b/src/library/scala/xml/Elem.scala
@@ -32,7 +32,7 @@ object Elem {
* @param child the children of this node
*/
// "val" is redundant for non-overriding arguments
-/*case*/ class Elem(override val prefix: String,
+@serializable class Elem(override val prefix: String,
val label: String,
override val attributes: MetaData,
override val scope: NamespaceBinding,
diff --git a/src/library/scala/xml/Utility.scala b/src/library/scala/xml/Utility.scala
index c0be4bc280..c0b28b89ae 100644
--- a/src/library/scala/xml/Utility.scala
+++ b/src/library/scala/xml/Utility.scala
@@ -40,6 +40,20 @@ object Utility extends AnyRef with parsing.TokenTests {
case _ =>
x
}
+ /** returns a sorted attribute list */
+ def sort(md: MetaData): MetaData = if((md eq Null) || (md.next eq Null)) md else {
+ val key = md.key
+ val smaller = sort(md.filter { m => m.key < key })
+ val greater = sort(md.filter { m => m.key > key })
+ smaller.append( Null ).append(md.copy ( greater ))
+ }
+
+ /** returns the node with its attribute list sorted alphabetically (prefixes are ignored) */
+ def sort(n:Node): Node = n match {
+ case Elem(pre,lab,md,scp,child@_*) =>
+ Elem(pre,lab,sort(md),scp, (child map sort):_*)
+ case _ => n
+ }
/** @deprecated a string might also be Atom(s) - define your own conversion
*/
diff --git a/test/files/jvm/unittest_xml.scala b/test/files/jvm/unittest_xml.scala
index a6032e257c..c302ef1e24 100644
--- a/test/files/jvm/unittest_xml.scala
+++ b/test/files/jvm/unittest_xml.scala
@@ -69,6 +69,11 @@ object Test {
val z1 = z.toString
assertEquals("apos unescaped", "<bar>''</bar>", z1)
+
+ val q = xml.Utility.sort(<a g='3' j='2' oo='2' a='2'/>)
+ assertEquals("sort attrib"+xml.Utility.sort(q.attributes).toString, " a=\"2\" g=\"3\" j=\"2\" oo=\"2\"", xml.Utility.sort(q.attributes).toString)
+ val pp = new xml.PrettyPrinter(80,5)
+ assertEquals("pretty print sorted attrib:"+pp.format(q), "<a a=\"2\" g=\"3\" j=\"2\" oo=\"2\"></a>", pp.format(q))
}
def main(args:Array[String]) = {