From 470f990722777041a475de2e5cf02ca4504a2237 Mon Sep 17 00:00:00 2001 From: Burak Emir Date: Sat, 14 Oct 2006 13:31:12 +0000 Subject: xml improvements for 2.2.1 (see changes) --- docs/examples/xml/phonebook/embeddedBook.scala | 26 +++++++ docs/examples/xml/phonebook/phonebook.scala | 38 ++++++++++ docs/examples/xml/phonebook/phonebook1.scala | 21 ++++++ docs/examples/xml/phonebook/phonebook2.scala | 25 +++++++ docs/examples/xml/phonebook/phonebook3.scala | 96 ++++++++++++++++++++++++++ docs/examples/xml/phonebook/verboseBook.scala | 24 +++++++ 6 files changed, 230 insertions(+) create mode 100644 docs/examples/xml/phonebook/embeddedBook.scala create mode 100644 docs/examples/xml/phonebook/phonebook.scala create mode 100644 docs/examples/xml/phonebook/phonebook1.scala create mode 100644 docs/examples/xml/phonebook/phonebook2.scala create mode 100644 docs/examples/xml/phonebook/phonebook3.scala create mode 100644 docs/examples/xml/phonebook/verboseBook.scala (limited to 'docs') diff --git a/docs/examples/xml/phonebook/embeddedBook.scala b/docs/examples/xml/phonebook/embeddedBook.scala new file mode 100644 index 0000000000..8ea9628212 --- /dev/null +++ b/docs/examples/xml/phonebook/embeddedBook.scala @@ -0,0 +1,26 @@ +/* examples/phonebook/embeddedBook.scala */ +package phonebook + +object embeddedBook { + + val company = ACME + val first = "Burak" + val last = "Emir" + val location = "work" + + val embBook = + + + This is the phonebook of the + {company} corporation. + + + { first+" "+last } + +41 21 693 68 {val x = 60 + 7; x} + + ; + + def main(args: Array[String]) = + Console.println( embBook ) + +} diff --git a/docs/examples/xml/phonebook/phonebook.scala b/docs/examples/xml/phonebook/phonebook.scala new file mode 100644 index 0000000000..4813c2d20d --- /dev/null +++ b/docs/examples/xml/phonebook/phonebook.scala @@ -0,0 +1,38 @@ +package phonebook ; + +object phonebook { + + val labPhoneBook = + + + This is the phonebook of the + ACME corporation. + + + Burak + +41 21 693 68 67 + +41 79 602 23 23 + + ; + + Console.println( labPhoneBook ); + + // XML is immutable - adding an element + + import scala.xml.{ Node, Text }; + + def add( phonebook:Node, newEntry:Node ):Node = phonebook match { + case { ch @ _* } => + { ch }{ newEntry } + } + + val pb2 = + add( labPhoneBook, + + Kim + +41 21 111 11 11 + ); + + def main(args:Array[String]) = Console.println( pb2 ); + +} diff --git a/docs/examples/xml/phonebook/phonebook1.scala b/docs/examples/xml/phonebook/phonebook1.scala new file mode 100644 index 0000000000..3a7a165202 --- /dev/null +++ b/docs/examples/xml/phonebook/phonebook1.scala @@ -0,0 +1,21 @@ +/* examples/phonebook/phonebook1.scala */ +package phonebook + +object phonebook1 { + + val labPhoneBook = + + + This is the phonebook of the + ACME corporation. + + + Burak Emir + +41 21 693 68 67 + + ; + + def main(args: Array[String]) = + Console.println( labPhoneBook ) + +} diff --git a/docs/examples/xml/phonebook/phonebook2.scala b/docs/examples/xml/phonebook/phonebook2.scala new file mode 100644 index 0000000000..ba50379369 --- /dev/null +++ b/docs/examples/xml/phonebook/phonebook2.scala @@ -0,0 +1,25 @@ +/* examples/xml/phonebook/phonebook2.scala */ +package phonebook; + +object phonebook2 { + + import scala.xml.Node + + /** adds an entry to a phonebook */ + def add( p: Node, newEntry: Node ): Node = p match { + + case { ch @ _* } => + + { ch }{ newEntry } + } + + val pb2 = + add( phonebook1.labPhoneBook, + + Kim + +41 21 111 11 11 + ); + + def main( args: Array[String] ) = + Console.println( pb2 ) +} diff --git a/docs/examples/xml/phonebook/phonebook3.scala b/docs/examples/xml/phonebook/phonebook3.scala new file mode 100644 index 0000000000..ec49d450f4 --- /dev/null +++ b/docs/examples/xml/phonebook/phonebook3.scala @@ -0,0 +1,96 @@ +/* examples/xml/phonebook/phonebook3.scala */ +package phonebook + +object phonebook3 { + + import scala.xml.{Elem, Node, Text} + import scala.xml.Utility.view + import scala.xml.PrettyPrinter + import Node.NoAttributes + + /* finds entry for Name, Where, changes it, or adds if not present */ + def change ( phonebook: Node, Name: String, Where: String, newPhone: String ) = { + + /** returns true if this element's first child is the right 'name' + * x is treated a if it was a singleton sequence here. + */ + def hasName ( x: Seq[Node] ) = x(0).child.elements.next match { + case { Text(Name) } => true + case _ => false + } + + /** returns true if this element has the right 'where' attribute + * y is treated a if it was a singleton sequence here. + * n.attribute(s) is the same as n.attributes.get(s) + */ + def hasWhere ( y: Node ) = y.attribute("where") match { + case Some(Text(Where)) => true + case None => false + } + + /** returns true if this element has the right 'where' attribute + * the apply method of MetaData (n.attributes) returns raw a + * sequence of nodes. + */ + def hasWhere2 ( y: Node ) = y.attributes("where") match { + case null => false + case Text(Where) => true + case _ => false + } + + + /** walks through tree, returns changed/copied updated tree */ + def copyOrChange ( ch: Iterator[Node] ):List[Node] = { + for( val c <- ch ) yield c match { + + case x @ { ch1 @ _* } if hasName( x ) => + val it = ch1.elements; + val nameElem:Seq[Node] = it.next; // grab 'name' element + val ch2 = nameElem concat copyOrChange( it ); // concat with updated seq + + if( ch1 == ch2 ) // not present: add as first entry + + + { Name } + { newPhone } + { ch1 } + + + else // was present and changed + + + { ch2 } + + + case y @ { _* } if hasWhere( y ) => + Console.println("c = "+c); + { newPhone } + + case _ => + Console.println("c = "+c); + Console.println("c.attributes= "+c.attributes); + c + + } + }.toList ; // for ... yield ... returns Iterator, convert to list + + // decompose phonebook, apply updates + phonebook match { + case { ch @ _* } => + { copyOrChange( ch.elements ) } + } + + } + + val pb2 = + change( phonebook1.labPhoneBook, "John", "work", "+41 55 555 55 55" ); + + val pp = new PrettyPrinter( 80, 5 ); + + def main( args:Array[String] ) = { + Console.println("---before---"); + Console.println( pp.format( phonebook1.labPhoneBook )); + Console.println("---after---"); + Console.println( pp.format( pb2 )); + } +} diff --git a/docs/examples/xml/phonebook/verboseBook.scala b/docs/examples/xml/phonebook/verboseBook.scala new file mode 100644 index 0000000000..611cf5370e --- /dev/null +++ b/docs/examples/xml/phonebook/verboseBook.scala @@ -0,0 +1,24 @@ +/* examples/xml/phonebook/verboseBook.scala */ +package phonebook + +object verboseBook { + + import scala.xml.{ UnprefixedAttribute, Elem, Node, Null, Text, TopScope } + + val pbookVerbose = + Elem(null, "phonebook", Null, TopScope, + Elem(null, "descr", Null, TopScope, + Text("This is a "), + Elem(null, "b", Null, TopScope, Text("sample")), + Text("description") + ), + Elem(null, "entry", Null, TopScope, + Elem(null, "name", Null, TopScope, Text("Burak Emir")), + Elem(null, "phone", new UnprefixedAttribute("where","work", Null), TopScope, + Text("+41 21 693 68 67")) + ) + ) + + def main(args: Array[String]) = + Console.println( pbookVerbose ) +} -- cgit v1.2.3