src/Pure/General/xml_data.scala
author blanchet
Wed, 15 Dec 2010 18:10:32 +0100
changeset 41171 043f8dc3b51f
parent 38355 8cb265fb12fe
child 43698 91c4d7397f0e
permissions -rw-r--r--
facilitate debugging
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/General/xml_data.scala
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
     3
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
     4
XML as basic data representation language.
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
     5
*/
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
     6
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
     7
package isabelle
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
     8
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
     9
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    10
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    11
object XML_Data
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    12
{
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    13
  /* basic values */
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    14
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    15
  class XML_Atom(s: String) extends Exception(s)
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    16
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    17
38355
8cb265fb12fe represent document ids by (long) int, to benefit from the somewhat faster Inttab in ML (LinearSet in Scala is invariably indexed by native object ids);
wenzelm
parents: 38269
diff changeset
    18
  private def make_long_atom(i: Long): String = i.toString
8cb265fb12fe represent document ids by (long) int, to benefit from the somewhat faster Inttab in ML (LinearSet in Scala is invariably indexed by native object ids);
wenzelm
parents: 38269
diff changeset
    19
8cb265fb12fe represent document ids by (long) int, to benefit from the somewhat faster Inttab in ML (LinearSet in Scala is invariably indexed by native object ids);
wenzelm
parents: 38269
diff changeset
    20
  private def dest_long_atom(s: String): Long =
8cb265fb12fe represent document ids by (long) int, to benefit from the somewhat faster Inttab in ML (LinearSet in Scala is invariably indexed by native object ids);
wenzelm
parents: 38269
diff changeset
    21
    try { java.lang.Long.parseLong(s) }
8cb265fb12fe represent document ids by (long) int, to benefit from the somewhat faster Inttab in ML (LinearSet in Scala is invariably indexed by native object ids);
wenzelm
parents: 38269
diff changeset
    22
    catch { case e: NumberFormatException => throw new XML_Atom(s) }
8cb265fb12fe represent document ids by (long) int, to benefit from the somewhat faster Inttab in ML (LinearSet in Scala is invariably indexed by native object ids);
wenzelm
parents: 38269
diff changeset
    23
8cb265fb12fe represent document ids by (long) int, to benefit from the somewhat faster Inttab in ML (LinearSet in Scala is invariably indexed by native object ids);
wenzelm
parents: 38269
diff changeset
    24
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    25
  private def make_int_atom(i: Int): String = i.toString
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    26
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    27
  private def dest_int_atom(s: String): Int =
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    28
    try { Integer.parseInt(s) }
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    29
    catch { case e: NumberFormatException => throw new XML_Atom(s) }
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    30
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    31
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    32
  private def make_bool_atom(b: Boolean): String = if (b) "1" else "0"
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    33
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    34
  private def dest_bool_atom(s: String): Boolean =
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    35
    if (s == "1") true
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    36
    else if (s == "0") false
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    37
    else throw new XML_Atom(s)
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    38
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    39
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    40
  private def make_unit_atom(u: Unit) = ""
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    41
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    42
  private def dest_unit_atom(s: String): Unit =
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    43
    if (s == "") () else throw new XML_Atom(s)
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    44
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    45
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    46
  /* structural nodes */
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    47
38269
cd6906d9199f proper handling of empty text;
wenzelm
parents: 38267
diff changeset
    48
  class XML_Body(body: XML.Body) extends Exception
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    49
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    50
  private def make_node(ts: XML.Body): XML.Tree = XML.Elem(Markup(":", Nil), ts)
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    51
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    52
  private def dest_node(t: XML.Tree): XML.Body =
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    53
    t match {
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    54
      case XML.Elem(Markup(":", Nil), ts) => ts
38269
cd6906d9199f proper handling of empty text;
wenzelm
parents: 38267
diff changeset
    55
      case _ => throw new XML_Body(List(t))
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    56
    }
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    57
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    58
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    59
  /* representation of standard types */
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    60
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    61
  def make_properties(props: List[(String, String)]): XML.Body =
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    62
    List(XML.Elem(Markup(":", props), Nil))
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    63
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    64
  def dest_properties(ts: XML.Body): List[(String, String)] =
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    65
    ts match {
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    66
      case List(XML.Elem(Markup(":", props), Nil)) => props
38269
cd6906d9199f proper handling of empty text;
wenzelm
parents: 38267
diff changeset
    67
      case _ => throw new XML_Body(ts)
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    68
    }
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    69
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    70
38269
cd6906d9199f proper handling of empty text;
wenzelm
parents: 38267
diff changeset
    71
  def make_string(s: String): XML.Body = if (s.isEmpty) Nil else List(XML.Text(s))
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    72
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    73
  def dest_string(ts: XML.Body): String =
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    74
    ts match {
38269
cd6906d9199f proper handling of empty text;
wenzelm
parents: 38267
diff changeset
    75
      case Nil => ""
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    76
      case List(XML.Text(s)) => s
38269
cd6906d9199f proper handling of empty text;
wenzelm
parents: 38267
diff changeset
    77
      case _ => throw new XML_Body(ts)
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    78
    }
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    79
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    80
38355
8cb265fb12fe represent document ids by (long) int, to benefit from the somewhat faster Inttab in ML (LinearSet in Scala is invariably indexed by native object ids);
wenzelm
parents: 38269
diff changeset
    81
  def make_long(i: Long): XML.Body = make_string(make_long_atom(i))
8cb265fb12fe represent document ids by (long) int, to benefit from the somewhat faster Inttab in ML (LinearSet in Scala is invariably indexed by native object ids);
wenzelm
parents: 38269
diff changeset
    82
  def dest_long(ts: XML.Body): Long = dest_long_atom(dest_string(ts))
8cb265fb12fe represent document ids by (long) int, to benefit from the somewhat faster Inttab in ML (LinearSet in Scala is invariably indexed by native object ids);
wenzelm
parents: 38269
diff changeset
    83
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    84
  def make_int(i: Int): XML.Body = make_string(make_int_atom(i))
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    85
  def dest_int(ts: XML.Body): Int = dest_int_atom(dest_string(ts))
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    86
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    87
  def make_bool(b: Boolean): XML.Body = make_string(make_bool_atom(b))
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    88
  def dest_bool(ts: XML.Body) = dest_bool_atom(dest_string(ts))
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    89
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    90
  def make_unit(u: Unit): XML.Body = make_string(make_unit_atom(u))
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    91
  def dest_unit(ts: XML.Body): Unit = dest_unit_atom(dest_string(ts))
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    92
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    93
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    94
  def make_pair[A, B](make1: A => XML.Body)(make2: B => XML.Body)(p: (A, B)): XML.Body =
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    95
    List(make_node(make1(p._1)), make_node(make2(p._2)))
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    96
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    97
  def dest_pair[A, B](dest1: XML.Body => A)(dest2: XML.Body => B)(ts: XML.Body): (A, B) =
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    98
    ts match {
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    99
      case List(t1, t2) => (dest1(dest_node(t1)), dest2(dest_node(t2)))
38269
cd6906d9199f proper handling of empty text;
wenzelm
parents: 38267
diff changeset
   100
      case _ => throw new XML_Body(ts)
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   101
    }
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   102
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   103
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   104
  def make_triple[A, B, C](make1: A => XML.Body)(make2: B => XML.Body)(make3: C => XML.Body)
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   105
      (p: (A, B, C)): XML.Body =
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   106
    List(make_node(make1(p._1)), make_node(make2(p._2)), make_node(make3(p._3)))
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   107
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   108
  def dest_triple[A, B, C](dest1: XML.Body => A)(dest2: XML.Body => B)(dest3: XML.Body => C)
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   109
      (ts: XML.Body): (A, B, C) =
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   110
    ts match {
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   111
      case List(t1, t2, t3) => (dest1(dest_node(t1)), dest2(dest_node(t2)), dest3(dest_node(t3)))
38269
cd6906d9199f proper handling of empty text;
wenzelm
parents: 38267
diff changeset
   112
      case _ => throw new XML_Body(ts)
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   113
    }
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   114
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   115
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   116
  def make_list[A](make: A => XML.Body)(xs: List[A]): XML.Body =
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   117
    xs.map((x: A) => make_node(make(x)))
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   118
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   119
  def dest_list[A](dest: XML.Body => A)(ts: XML.Body): List[A] =
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   120
    ts.map((t: XML.Tree) => dest(dest_node(t)))
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   121
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   122
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   123
  def make_option[A](make: A => XML.Body)(opt: Option[A]): XML.Body =
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   124
    opt match {
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   125
      case None => make_list(make)(Nil)
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   126
      case Some(x) => make_list(make)(List(x))
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   127
    }
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   128
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   129
  def dest_option[A](dest: XML.Body => A)(ts: XML.Body): Option[A] =
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   130
    dest_list(dest)(ts) match {
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   131
      case Nil => None
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   132
      case List(x) => Some(x)
38269
cd6906d9199f proper handling of empty text;
wenzelm
parents: 38267
diff changeset
   133
      case _ => throw new XML_Body(ts)
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   134
    }
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   135
}