src/Pure/General/rdf.scala
author wenzelm
Tue, 05 Mar 2019 11:52:20 +0100
changeset 69862 db622ada496d
parent 69858 3d0f27273aa1
child 69867 3fd9298dd200
permissions -rw-r--r--
afford redundant whitespace for improved readability;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69807
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/General/rdf.scala
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
     3
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
     4
Support for RDF/XML representation, see also:
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
     5
  - https://www.w3.org/RDF
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
     6
  - https://www.w3.org/TR/rdf-primer
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
     7
*/
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
     8
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
     9
package isabelle
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    10
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    11
69809
028f61045e8d more operations;
wenzelm
parents: 69808
diff changeset
    12
import java.net.URI
028f61045e8d more operations;
wenzelm
parents: 69808
diff changeset
    13
028f61045e8d more operations;
wenzelm
parents: 69808
diff changeset
    14
69807
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    15
object RDF
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    16
{
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    17
  /* document */
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    18
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    19
  val rdf: XML.Namespace = XML.Namespace("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#")
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    20
  val dc: XML.Namespace = XML.Namespace("dc", "http://purl.org/dc/elements/1.1/")
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    21
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    22
  val default_namespaces: List[XML.Namespace] = List(rdf, dc)
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    23
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    24
  def document(body: XML.Body,
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    25
    namespaces: List[XML.Namespace] = default_namespaces,
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    26
    attributes: XML.Attributes = Nil): XML.Elem =
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    27
  {
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    28
    XML.Elem(Markup(rdf("RDF"), namespaces.map(_.attribute) ::: attributes), body)
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    29
  }
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    30
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    31
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    32
  /* multiple triples vs. compact description */
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    33
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    34
  sealed case class Triple(subject: String, predicate: String, `object`: XML.Body)
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    35
  {
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    36
    def property: XML.Elem = XML.elem(predicate, `object`)
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    37
  }
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    38
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    39
  def triples(args: List[Triple]): XML.Body =
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    40
    args.groupBy(_.subject).toList.map(
69862
db622ada496d afford redundant whitespace for improved readability;
wenzelm
parents: 69858
diff changeset
    41
      { case (subject, ts) =>
db622ada496d afford redundant whitespace for improved readability;
wenzelm
parents: 69858
diff changeset
    42
          val nl = XML.Text("\n")
db622ada496d afford redundant whitespace for improved readability;
wenzelm
parents: 69858
diff changeset
    43
          val body = nl :: ts.flatMap(t => List(t.property, nl))
db622ada496d afford redundant whitespace for improved readability;
wenzelm
parents: 69858
diff changeset
    44
          description(subject, body)
db622ada496d afford redundant whitespace for improved readability;
wenzelm
parents: 69858
diff changeset
    45
      })
69807
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    46
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    47
  def description(subject: String, body: XML.Body, attributes: XML.Attributes = Nil): XML.Elem =
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    48
    XML.Elem(Markup(rdf("Description"), (rdf("about"), subject) :: attributes), body)
69808
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    49
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    50
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    51
  /* collections */
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    52
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    53
  def collection(kind: String, items: List[XML.Body]): XML.Elem =
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    54
    XML.elem(kind, items.map(item => XML.elem(rdf("li"), item)))
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    55
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    56
  def bag(items: List[XML.Body]): XML.Elem = collection(rdf("Bag"), items)
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    57
  def seq(items: List[XML.Body]): XML.Elem = collection(rdf("Seq"), items)
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    58
  def alt(items: List[XML.Body]): XML.Elem = collection(rdf("Alt"), items)
69809
028f61045e8d more operations;
wenzelm
parents: 69808
diff changeset
    59
028f61045e8d more operations;
wenzelm
parents: 69808
diff changeset
    60
028f61045e8d more operations;
wenzelm
parents: 69808
diff changeset
    61
  /* datatypes */
028f61045e8d more operations;
wenzelm
parents: 69808
diff changeset
    62
028f61045e8d more operations;
wenzelm
parents: 69808
diff changeset
    63
  // see https://www.w3.org/TR/rdf11-concepts/#section-Datatypes
028f61045e8d more operations;
wenzelm
parents: 69808
diff changeset
    64
  // see https://www.w3.org/TR/xmlschema-2/#built-in-datatypes
028f61045e8d more operations;
wenzelm
parents: 69808
diff changeset
    65
028f61045e8d more operations;
wenzelm
parents: 69808
diff changeset
    66
  def string(x: String): XML.Body = if (x.isEmpty) Nil else List(XML.Text(x))
028f61045e8d more operations;
wenzelm
parents: 69808
diff changeset
    67
  def uri(x: URI): XML.Body = string(x.toString)
028f61045e8d more operations;
wenzelm
parents: 69808
diff changeset
    68
  def bool(x: Boolean): XML.Body = string(x.toString)
028f61045e8d more operations;
wenzelm
parents: 69808
diff changeset
    69
  def int(x: Int): XML.Body = string(Value.Int(x))
028f61045e8d more operations;
wenzelm
parents: 69808
diff changeset
    70
  def long(x: Long): XML.Body = string(Value.Long(x))
028f61045e8d more operations;
wenzelm
parents: 69808
diff changeset
    71
  def double(x: Double): XML.Body = string(Value.Double(x))
028f61045e8d more operations;
wenzelm
parents: 69808
diff changeset
    72
  def seconds(x: Time): XML.Body = double(x.seconds)
028f61045e8d more operations;
wenzelm
parents: 69808
diff changeset
    73
  def date_time_stamp(x: Date): XML.Body = string(Date.Format("uuuu-MM-dd'T'HH:mm:ss.SSSxxx")(x))
69858
3d0f27273aa1 concrete predicates from "Dublin Core";
wenzelm
parents: 69809
diff changeset
    74
3d0f27273aa1 concrete predicates from "Dublin Core";
wenzelm
parents: 69809
diff changeset
    75
3d0f27273aa1 concrete predicates from "Dublin Core";
wenzelm
parents: 69809
diff changeset
    76
  /* predicates */
3d0f27273aa1 concrete predicates from "Dublin Core";
wenzelm
parents: 69809
diff changeset
    77
3d0f27273aa1 concrete predicates from "Dublin Core";
wenzelm
parents: 69809
diff changeset
    78
  object Property  // binary relation with plain value
3d0f27273aa1 concrete predicates from "Dublin Core";
wenzelm
parents: 69809
diff changeset
    79
  {
3d0f27273aa1 concrete predicates from "Dublin Core";
wenzelm
parents: 69809
diff changeset
    80
    val title: String = dc("title")
3d0f27273aa1 concrete predicates from "Dublin Core";
wenzelm
parents: 69809
diff changeset
    81
    val creator: String = dc("creator")
3d0f27273aa1 concrete predicates from "Dublin Core";
wenzelm
parents: 69809
diff changeset
    82
    val contributor: String = dc("contributor")
3d0f27273aa1 concrete predicates from "Dublin Core";
wenzelm
parents: 69809
diff changeset
    83
    val date: String = dc("date")
3d0f27273aa1 concrete predicates from "Dublin Core";
wenzelm
parents: 69809
diff changeset
    84
    val description: String = dc("description")
3d0f27273aa1 concrete predicates from "Dublin Core";
wenzelm
parents: 69809
diff changeset
    85
  }
69807
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    86
}