src/Pure/General/xml.scala
author wenzelm
Thu, 21 Aug 2008 19:19:31 +0200
changeset 27941 b4656b671cce
parent 27931 b533a9de87a7
child 27942 5ac9a0f9fad0
permissions -rw-r--r--
added iterator over content;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
27931
b533a9de87a7 Minimalistic XML tree values.
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/General/xml.scala
b533a9de87a7 Minimalistic XML tree values.
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
b533a9de87a7 Minimalistic XML tree values.
wenzelm
parents:
diff changeset
     3
    Author:     Makarius
b533a9de87a7 Minimalistic XML tree values.
wenzelm
parents:
diff changeset
     4
b533a9de87a7 Minimalistic XML tree values.
wenzelm
parents:
diff changeset
     5
Minimalistic XML tree values.
b533a9de87a7 Minimalistic XML tree values.
wenzelm
parents:
diff changeset
     6
*/
b533a9de87a7 Minimalistic XML tree values.
wenzelm
parents:
diff changeset
     7
b533a9de87a7 Minimalistic XML tree values.
wenzelm
parents:
diff changeset
     8
package isabelle
b533a9de87a7 Minimalistic XML tree values.
wenzelm
parents:
diff changeset
     9
b533a9de87a7 Minimalistic XML tree values.
wenzelm
parents:
diff changeset
    10
object XML {
b533a9de87a7 Minimalistic XML tree values.
wenzelm
parents:
diff changeset
    11
  type Attributes = List[(String, String)]
b533a9de87a7 Minimalistic XML tree values.
wenzelm
parents:
diff changeset
    12
b533a9de87a7 Minimalistic XML tree values.
wenzelm
parents:
diff changeset
    13
  abstract class Tree
b533a9de87a7 Minimalistic XML tree values.
wenzelm
parents:
diff changeset
    14
  case class Elem(name: String, attributes: Attributes, body: List[Tree]) extends Tree
b533a9de87a7 Minimalistic XML tree values.
wenzelm
parents:
diff changeset
    15
  case class Text(content: String) extends Tree
27941
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    16
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    17
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    18
  /* iterator over content */
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    19
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    20
  private type State = Option[(String, List[Tree])]
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    21
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    22
  private def get_next(tree: Tree): State = tree match {
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    23
    case Elem(_, _, body) => get_nexts(body)
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    24
    case Text(content) => Some(content, Nil)
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    25
  }
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    26
  private def get_nexts(trees: List[Tree]): State = trees match {
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    27
    case Nil => None
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    28
    case t :: ts => get_next(t) match {
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    29
      case None => get_nexts(ts)
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    30
      case Some((s, r)) => Some((s, r ::: ts))
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    31
    }
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    32
  }
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    33
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    34
  def content(tree: Tree) = new Iterator[String] {
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    35
    private var state = get_next(tree)
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    36
    def hasNext() = state.isDefined
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    37
    def next() = state match {
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    38
      case Some((s, rest)) => { state = get_nexts(rest); s }
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    39
      case None => throw new NoSuchElementException("next on empty iterator")
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    40
    }
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    41
  }
b4656b671cce added iterator over content;
wenzelm
parents: 27931
diff changeset
    42
27931
b533a9de87a7 Minimalistic XML tree values.
wenzelm
parents:
diff changeset
    43
}