src/Pure/Thy/document_source.ML
author wenzelm
Mon, 25 Mar 2019 17:21:26 +0100
changeset 69981 3dced198b9ec
parent 69891 def3ec9cdb7e
child 70134 e69f00f4b897
permissions -rw-r--r--
more strict AFP properties;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69876
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Thy/document_source.ML
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
     3
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
     4
Document source for presentation.
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
     5
*)
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
     6
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
     7
signature DOCUMENT_SOURCE =
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
     8
sig
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
     9
  val is_white: Token.T -> bool
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    10
  val is_black: Token.T -> bool
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    11
  val is_white_comment: Token.T -> bool
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    12
  val is_black_comment: Token.T -> bool
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    13
  val is_improper: Token.T -> bool
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    14
  val improper: Token.T list parser
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    15
  val improper_end: Token.T list parser
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    16
  val blank_end: Token.T list parser
69887
b9985133805d added semantic document markers;
wenzelm
parents: 69876
diff changeset
    17
  val get_tags: Proof.context -> string list
b9985133805d added semantic document markers;
wenzelm
parents: 69876
diff changeset
    18
  val update_tags: string -> Proof.context -> Proof.context
69876
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    19
  val tags: string list parser
69891
def3ec9cdb7e document markers are formal comments, and may thus occur anywhere in the command-span;
wenzelm
parents: 69887
diff changeset
    20
  val annotation: unit parser
69876
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    21
end;
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    22
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    23
structure Document_Source: DOCUMENT_SOURCE =
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    24
struct
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    25
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    26
(* white space and comments *)
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    27
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    28
(*NB: arranging white space around command spans is a black art*)
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    29
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    30
val is_white = Token.is_space orf Token.is_informal_comment;
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    31
val is_black = not o is_white;
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    32
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    33
val is_white_comment = Token.is_informal_comment;
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    34
val is_black_comment = Token.is_formal_comment;
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    35
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    36
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    37
val space_proper =
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    38
  Scan.one Token.is_blank -- Scan.many is_white_comment -- Scan.one is_black;
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    39
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    40
val is_improper = not o (is_black orf Token.is_begin_ignore orf Token.is_end_ignore);
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    41
val improper = Scan.many is_improper;
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    42
val improper_end = Scan.repeat (Scan.unless space_proper (Scan.one is_improper));
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    43
val blank_end = Scan.repeat (Scan.unless space_proper (Scan.one Token.is_blank));
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    44
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    45
69887
b9985133805d added semantic document markers;
wenzelm
parents: 69876
diff changeset
    46
(* syntactic tags (old-style) *)
b9985133805d added semantic document markers;
wenzelm
parents: 69876
diff changeset
    47
b9985133805d added semantic document markers;
wenzelm
parents: 69876
diff changeset
    48
structure Tags = Proof_Data
b9985133805d added semantic document markers;
wenzelm
parents: 69876
diff changeset
    49
(
b9985133805d added semantic document markers;
wenzelm
parents: 69876
diff changeset
    50
  type T = string list;
b9985133805d added semantic document markers;
wenzelm
parents: 69876
diff changeset
    51
  fun init _ = [];
b9985133805d added semantic document markers;
wenzelm
parents: 69876
diff changeset
    52
);
b9985133805d added semantic document markers;
wenzelm
parents: 69876
diff changeset
    53
b9985133805d added semantic document markers;
wenzelm
parents: 69876
diff changeset
    54
val get_tags = Tags.get;
b9985133805d added semantic document markers;
wenzelm
parents: 69876
diff changeset
    55
val update_tags = Tags.map o update (op =);
69876
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    56
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    57
val tag_name = Parse.group (fn () => "document tag name") (Parse.short_ident || Parse.string);
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    58
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    59
val tag = (improper -- Parse.$$$ "%" -- improper) |-- Parse.!!! (tag_name --| blank_end);
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    60
val tags = Scan.repeat tag;
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    61
69887
b9985133805d added semantic document markers;
wenzelm
parents: 69876
diff changeset
    62
b9985133805d added semantic document markers;
wenzelm
parents: 69876
diff changeset
    63
(* semantic markers (operation on presentation context) *)
b9985133805d added semantic document markers;
wenzelm
parents: 69876
diff changeset
    64
69891
def3ec9cdb7e document markers are formal comments, and may thus occur anywhere in the command-span;
wenzelm
parents: 69887
diff changeset
    65
val marker = improper |-- Parse.document_marker --| blank_end;
69887
b9985133805d added semantic document markers;
wenzelm
parents: 69876
diff changeset
    66
69891
def3ec9cdb7e document markers are formal comments, and may thus occur anywhere in the command-span;
wenzelm
parents: 69887
diff changeset
    67
val annotation = Scan.repeat (tag >> K () || marker >> K ()) >> K ();
69887
b9985133805d added semantic document markers;
wenzelm
parents: 69876
diff changeset
    68
69876
b49bd228ac8a clarified modules;
wenzelm
parents:
diff changeset
    69
end;