diff options
-rw-r--r-- | src/library/scala/xml/Elem.scala | 2 | ||||
-rw-r--r-- | src/library/scala/xml/Utility.scala | 14 | ||||
-rw-r--r-- | test/files/jvm/unittest_xml.scala | 5 |
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]) = { |