src/Pure/Thy/file_format.scala
author wenzelm
Sun, 16 Aug 2020 11:57:15 +0200
changeset 72159 40b5ee5889d2
parent 71738 3d514ab74161
child 72652 07edf1952ab1
permissions -rw-r--r--
clarified management of services: static declarations vs. dynamic instances (e.g. relevant for stateful Session.Protocol_Handler, notably Scala.Handler and session "System");
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69255
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Thy/file_format.scala
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
     3
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
     4
Support for user-defined file formats.
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
     5
*/
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
     6
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
     7
package isabelle
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
     8
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
     9
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    10
object File_Format
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    11
{
69488
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    12
  sealed case class Theory_Context(name: Document.Node.Name, content: String)
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    13
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    14
71733
6c470c918aad more general support for isabelle_scala_service;
wenzelm
parents: 71601
diff changeset
    15
  /* registry */
69488
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    16
71733
6c470c918aad more general support for isabelle_scala_service;
wenzelm
parents: 71601
diff changeset
    17
  lazy val registry: Registry =
72159
40b5ee5889d2 clarified management of services: static declarations vs. dynamic instances (e.g. relevant for stateful Session.Protocol_Handler, notably Scala.Handler and session "System");
wenzelm
parents: 71738
diff changeset
    18
    new Registry(Isabelle_System.make_services(classOf[File_Format]))
69255
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    19
71733
6c470c918aad more general support for isabelle_scala_service;
wenzelm
parents: 71601
diff changeset
    20
  final class Registry private [File_Format](file_formats: List[File_Format])
69255
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    21
  {
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    22
    override def toString: String = file_formats.mkString("File_Format.Environment(", ",", ")")
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    23
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    24
    def get(name: String): Option[File_Format] = file_formats.find(_.detect(name))
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    25
    def get(name: Document.Node.Name): Option[File_Format] = get(name.node)
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    26
    def get_theory(name: Document.Node.Name): Option[File_Format] = get(name.theory)
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    27
    def is_theory(name: Document.Node.Name): Boolean = get_theory(name).isDefined
69488
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    28
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    29
    def start_session(session: isabelle.Session): Session =
69493
6fa742b03107 clarified;
wenzelm
parents: 69489
diff changeset
    30
      new Session(file_formats.map(_.start(session)).filterNot(_ == No_Agent))
69255
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    31
  }
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    32
69488
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    33
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    34
  /* session */
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    35
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    36
  final class Session private[File_Format](agents: List[Agent])
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    37
  {
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    38
    override def toString: String =
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    39
      agents.mkString("File_Format.Session(", ", ", ")")
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    40
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    41
    def prover_options(options: Options): Options =
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    42
      (options /: agents)({ case (opts, agent) => agent.prover_options(opts) })
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    43
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    44
    def stop_session { agents.foreach(_.stop) }
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    45
  }
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    46
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    47
  trait Agent
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    48
  {
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    49
    def prover_options(options: Options): Options = options
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    50
    def stop {}
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    51
  }
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    52
69493
6fa742b03107 clarified;
wenzelm
parents: 69489
diff changeset
    53
  object No_Agent extends Agent
69255
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    54
}
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    55
72159
40b5ee5889d2 clarified management of services: static declarations vs. dynamic instances (e.g. relevant for stateful Session.Protocol_Handler, notably Scala.Handler and session "System");
wenzelm
parents: 71738
diff changeset
    56
abstract class File_Format extends Isabelle_System.Service
69255
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    57
{
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    58
  def format_name: String
71738
3d514ab74161 tuned message;
wenzelm
parents: 71733
diff changeset
    59
  override def toString: String = "File_Format(" + format_name + ")"
69255
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    60
69257
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    61
  def file_ext: String
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    62
  def detect(name: String): Boolean = name.endsWith("." + file_ext)
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    63
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    64
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    65
  /* implicit theory context: name and content */
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    66
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    67
  def theory_suffix: String = ""
69259
wenzelm
parents: 69257
diff changeset
    68
  def theory_content(name: String): String = ""
69255
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    69
69257
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    70
  def make_theory_name(resources: Resources, name: Document.Node.Name): Option[Document.Node.Name] =
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    71
  {
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    72
    for {
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    73
      (_, ext_name) <- Thy_Header.split_file_name(name.node)
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    74
      if detect(ext_name) && theory_suffix.nonEmpty
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    75
    }
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    76
    yield {
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    77
      val thy_node = resources.append(name.node, Path.explode(theory_suffix))
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    78
      Document.Node.Name(thy_node, name.master_dir, ext_name)
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    79
    }
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    80
  }
69255
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    81
69257
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    82
  def make_theory_content(resources: Resources, thy_name: Document.Node.Name): Option[String] =
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    83
  {
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    84
    for {
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    85
      (prefix, suffix) <- Thy_Header.split_file_name(thy_name.node) if suffix == theory_suffix
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    86
      (_, ext_name) <- Thy_Header.split_file_name(prefix) if detect(ext_name)
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    87
      s <- proper_string(theory_content(ext_name))
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    88
    } yield s
039edba27102 clarified signature;
wenzelm
parents: 69255
diff changeset
    89
  }
69255
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    90
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    91
  def make_preview(snapshot: Document.Snapshot): Option[Present.Preview] = None
69488
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    92
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    93
69489
18c58b0da0a9 tuned comments;
wenzelm
parents: 69488
diff changeset
    94
  /* PIDE session agent */
69488
b05c0bb47f6d support for File_Format.Session, e.g. server process accessible via prover options;
wenzelm
parents: 69277
diff changeset
    95
69493
6fa742b03107 clarified;
wenzelm
parents: 69489
diff changeset
    96
  def start(session: isabelle.Session): File_Format.Agent = File_Format.No_Agent
69255
800b1ce96fce more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
wenzelm
parents:
diff changeset
    97
}