src/Pure/General/rdf.scala
author wenzelm
Thu, 14 Feb 2019 16:25:12 +0100
changeset 69808 c64197a224c6
parent 69807 3389fda6cffd
child 69809 028f61045e8d
permissions -rw-r--r--
more operations;
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
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    12
object RDF
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    13
{
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    14
  /* document */
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    15
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    16
  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
    17
  val dc: XML.Namespace = XML.Namespace("dc", "http://purl.org/dc/elements/1.1/")
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    18
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    19
  val default_namespaces: List[XML.Namespace] = List(rdf, dc)
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    20
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    21
  def document(body: XML.Body,
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    22
    namespaces: List[XML.Namespace] = default_namespaces,
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    23
    attributes: XML.Attributes = Nil): XML.Elem =
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    24
  {
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    25
    XML.Elem(Markup(rdf("RDF"), namespaces.map(_.attribute) ::: attributes), body)
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    26
  }
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    27
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    28
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    29
  /* multiple triples vs. compact description */
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    30
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    31
  sealed case class Triple(subject: String, predicate: String, `object`: XML.Body)
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    32
  {
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    33
    def property: XML.Elem = XML.elem(predicate, `object`)
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    34
  }
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    35
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    36
  def triples(args: List[Triple]): XML.Body =
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    37
    args.groupBy(_.subject).toList.map(
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    38
      { case (subject, ts) => description(subject, ts.map(_.property)) })
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    39
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    40
  def description(subject: String, body: XML.Body, attributes: XML.Attributes = Nil): XML.Elem =
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    41
    XML.Elem(Markup(rdf("Description"), (rdf("about"), subject) :: attributes), body)
69808
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    42
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    43
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    44
  /* collections */
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    45
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    46
  def collection(kind: String, items: List[XML.Body]): XML.Elem =
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    47
    XML.elem(kind, items.map(item => XML.elem(rdf("li"), item)))
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    48
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    49
  def bag(items: List[XML.Body]): XML.Elem = collection(rdf("Bag"), items)
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    50
  def seq(items: List[XML.Body]): XML.Elem = collection(rdf("Seq"), items)
c64197a224c6 more operations;
wenzelm
parents: 69807
diff changeset
    51
  def alt(items: List[XML.Body]): XML.Elem = collection(rdf("Alt"), items)
69807
3389fda6cffd support for RDF/XML representation;
wenzelm
parents:
diff changeset
    52
}