| author | wenzelm | 
| Sat, 11 Jun 2011 15:03:31 +0200 | |
| changeset 43365 | f8944cb2468f | 
| parent 42669 | 04dfffda5671 | 
| child 43564 | 9864182c6bad | 
| permissions | -rw-r--r-- | 
| 22124 | 1  | 
(* Title: Pure/Thy/thy_output.ML  | 
2  | 
Author: Markus Wenzel, TU Muenchen  | 
|
3  | 
||
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
4  | 
Theory document output with antiquotations.  | 
| 22124 | 5  | 
*)  | 
6  | 
||
7  | 
signature THY_OUTPUT =  | 
|
8  | 
sig  | 
|
| 
38767
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
9  | 
val display_default: bool Unsynchronized.ref  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
10  | 
val quotes_default: bool Unsynchronized.ref  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
11  | 
val indent_default: int Unsynchronized.ref  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
12  | 
val source_default: bool Unsynchronized.ref  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
13  | 
val break_default: bool Unsynchronized.ref  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
14  | 
val display: bool Config.T  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
15  | 
val quotes: bool Config.T  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
16  | 
val indent: int Config.T  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
17  | 
val source: bool Config.T  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
18  | 
val break: bool Config.T  | 
| 
38766
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
19  | 
val add_wrapper: ((unit -> string) -> unit -> string) -> Proof.context -> Proof.context  | 
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
20  | 
val add_option: string -> (string -> Proof.context -> Proof.context) -> unit  | 
| 26893 | 21  | 
val defined_command: string -> bool  | 
22  | 
val defined_option: string -> bool  | 
|
| 22124 | 23  | 
val print_antiquotations: unit -> unit  | 
24  | 
val boolean: string -> bool  | 
|
25  | 
val integer: string -> int  | 
|
| 30513 | 26  | 
val antiquotation: string -> 'a context_parser ->  | 
| 
38766
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
27  | 
    ({source: Args.src, state: Toplevel.state, context: Proof.context} -> 'a -> string) -> unit
 | 
| 22124 | 28  | 
datatype markup = Markup | MarkupEnv | Verbatim  | 
| 32738 | 29  | 
val modes: string list Unsynchronized.ref  | 
| 
42508
 
e21362bf1d93
allow nested @{antiq} (nonterminal) and @@{antiq} terminal;
 
wenzelm 
parents: 
42399 
diff
changeset
 | 
30  | 
val eval_antiq: Scan.lexicon -> Toplevel.state -> Symbol_Pos.T list * Position.range -> string  | 
| 30573 | 31  | 
val eval_antiquote: Scan.lexicon -> Toplevel.state -> Symbol_Pos.text * Position.T -> string  | 
| 
28427
 
cc9f7d99fb73
turned process_thy into present_thy, which merely does presentation (wrt. persistent intermediate states);
 
wenzelm 
parents: 
28273 
diff
changeset
 | 
32  | 
val present_thy: Scan.lexicon -> (string -> string list) -> (markup -> string -> bool) ->  | 
| 
36959
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
33  | 
(Toplevel.transition * Toplevel.state) list -> (Token.T, 'a) Source.source -> Buffer.T  | 
| 
38767
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
34  | 
val pretty_text: Proof.context -> string -> Pretty.T  | 
| 28644 | 35  | 
val pretty_term: Proof.context -> term -> Pretty.T  | 
36  | 
val pretty_thm: Proof.context -> thm -> Pretty.T  | 
|
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
37  | 
val str_of_source: Args.src -> string  | 
| 
38767
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
38  | 
val maybe_pretty_source: (Proof.context -> 'a -> Pretty.T) -> Proof.context ->  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
39  | 
Args.src -> 'a list -> Pretty.T list  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
40  | 
val output: Proof.context -> Pretty.T list -> string  | 
| 22124 | 41  | 
end;  | 
42  | 
||
| 
37216
 
3165bc303f66
modernized some structure names, keeping a few legacy aliases;
 
wenzelm 
parents: 
37198 
diff
changeset
 | 
43  | 
structure Thy_Output: THY_OUTPUT =  | 
| 22124 | 44  | 
struct  | 
45  | 
||
46  | 
(** global options **)  | 
|
47  | 
||
| 
38767
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
48  | 
val display_default = Unsynchronized.ref false;  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
49  | 
val quotes_default = Unsynchronized.ref false;  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
50  | 
val indent_default = Unsynchronized.ref 0;  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
51  | 
val source_default = Unsynchronized.ref false;  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
52  | 
val break_default = Unsynchronized.ref false;  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
53  | 
|
| 
42616
 
92715b528e78
added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
 
wenzelm 
parents: 
42508 
diff
changeset
 | 
54  | 
val display = Attrib.setup_config_bool (Binding.name "thy_output_display") (fn _ => ! display_default);  | 
| 
 
92715b528e78
added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
 
wenzelm 
parents: 
42508 
diff
changeset
 | 
55  | 
val quotes = Attrib.setup_config_bool (Binding.name "thy_output_quotes") (fn _ => ! quotes_default);  | 
| 
 
92715b528e78
added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
 
wenzelm 
parents: 
42508 
diff
changeset
 | 
56  | 
val indent = Attrib.setup_config_int (Binding.name "thy_output_indent") (fn _ => ! indent_default);  | 
| 
 
92715b528e78
added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
 
wenzelm 
parents: 
42508 
diff
changeset
 | 
57  | 
val source = Attrib.setup_config_bool (Binding.name "thy_output_source") (fn _ => ! source_default);  | 
| 
 
92715b528e78
added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
 
wenzelm 
parents: 
42508 
diff
changeset
 | 
58  | 
val break = Attrib.setup_config_bool (Binding.name "thy_output_break") (fn _ => ! break_default);  | 
| 22124 | 59  | 
|
60  | 
||
| 
38766
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
61  | 
structure Wrappers = Proof_Data  | 
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
62  | 
(  | 
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
63  | 
type T = ((unit -> string) -> unit -> string) list;  | 
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
64  | 
fun init _ = [];  | 
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
65  | 
);  | 
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
66  | 
|
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
67  | 
fun add_wrapper wrapper = Wrappers.map (cons wrapper);  | 
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
68  | 
|
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
69  | 
val wrap = Wrappers.get #> fold (fn wrapper => fn f => wrapper f);  | 
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
70  | 
|
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
71  | 
|
| 22124 | 72  | 
|
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
73  | 
(** maintain global antiquotations **)  | 
| 22124 | 74  | 
|
75  | 
local  | 
|
76  | 
||
77  | 
val global_commands =  | 
|
| 
38766
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
78  | 
Unsynchronized.ref  | 
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
79  | 
(Symtab.empty: (Args.src -> Toplevel.state -> Proof.context -> string) Symtab.table);  | 
| 22124 | 80  | 
|
81  | 
val global_options =  | 
|
| 
38766
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
82  | 
Unsynchronized.ref (Symtab.empty: (string -> Proof.context -> Proof.context) Symtab.table);  | 
| 22124 | 83  | 
|
| 
38766
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
84  | 
fun add_item kind name item tab =  | 
| 22124 | 85  | 
(if not (Symtab.defined tab name) then ()  | 
| 27897 | 86  | 
  else warning ("Redefined document antiquotation " ^ kind ^ ": " ^ quote name);
 | 
| 
38766
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
87  | 
Symtab.update (name, item) tab);  | 
| 22124 | 88  | 
|
89  | 
in  | 
|
90  | 
||
| 
38766
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
91  | 
fun add_command name cmd =  | 
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
92  | 
CRITICAL (fn () => Unsynchronized.change global_commands (add_item "command" name cmd));  | 
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
93  | 
fun add_option name opt =  | 
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
94  | 
CRITICAL (fn () => Unsynchronized.change global_options (add_item "option" name opt));  | 
| 22124 | 95  | 
|
| 26893 | 96  | 
fun defined_command name = Symtab.defined (! global_commands) name;  | 
97  | 
fun defined_option name = Symtab.defined (! global_options) name;  | 
|
98  | 
||
| 22124 | 99  | 
fun command src =  | 
100  | 
let val ((name, _), pos) = Args.dest_src src in  | 
|
101  | 
(case Symtab.lookup (! global_commands) name of  | 
|
| 
30317
 
159bab53b40d
improved error handling for document antiquotations;
 
wenzelm 
parents: 
30208 
diff
changeset
 | 
102  | 
      NONE => error ("Unknown document antiquotation: " ^ quote name ^ Position.str_of pos)
 | 
| 
 
159bab53b40d
improved error handling for document antiquotations;
 
wenzelm 
parents: 
30208 
diff
changeset
 | 
103  | 
| SOME f =>  | 
| 
39507
 
839873937ddd
tuned signature of (Context_)Position.report variants;
 
wenzelm 
parents: 
39309 
diff
changeset
 | 
104  | 
(Position.report pos (Markup.doc_antiq name);  | 
| 
38766
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
105  | 
(fn state => fn ctxt => f src state ctxt handle ERROR msg =>  | 
| 
30317
 
159bab53b40d
improved error handling for document antiquotations;
 
wenzelm 
parents: 
30208 
diff
changeset
 | 
106  | 
          cat_error msg ("The error(s) above occurred in document antiquotation: " ^
 | 
| 
 
159bab53b40d
improved error handling for document antiquotations;
 
wenzelm 
parents: 
30208 
diff
changeset
 | 
107  | 
quote name ^ Position.str_of pos))))  | 
| 22124 | 108  | 
end;  | 
109  | 
||
| 
38766
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
110  | 
fun option (name, s) ctxt =  | 
| 22124 | 111  | 
(case Symtab.lookup (! global_options) name of  | 
| 27897 | 112  | 
    NONE => error ("Unknown document antiquotation option: " ^ quote name)
 | 
| 
38766
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
113  | 
| SOME opt => opt s ctxt);  | 
| 22124 | 114  | 
|
115  | 
||
116  | 
fun print_antiquotations () =  | 
|
| 27897 | 117  | 
[Pretty.big_list "document antiquotation commands:"  | 
| 23272 | 118  | 
(map Pretty.str (sort_strings (Symtab.keys (! global_commands)))),  | 
| 27897 | 119  | 
Pretty.big_list "document antiquotation options:"  | 
| 23272 | 120  | 
(map Pretty.str (sort_strings (Symtab.keys (! global_options))))]  | 
| 22124 | 121  | 
|> Pretty.chunks |> Pretty.writeln;  | 
122  | 
||
123  | 
end;  | 
|
124  | 
||
| 
38766
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
125  | 
fun antiquotation name scan out =  | 
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
126  | 
add_command name  | 
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
127  | 
(fn src => fn state => fn ctxt =>  | 
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
128  | 
let val (x, ctxt') = Args.context_syntax "document antiquotation" scan src ctxt  | 
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
129  | 
      in out {source = src, state = state, context = ctxt'} x end);
 | 
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
130  | 
|
| 22124 | 131  | 
|
132  | 
||
133  | 
(** syntax of antiquotations **)  | 
|
134  | 
||
135  | 
(* option values *)  | 
|
136  | 
||
137  | 
fun boolean "" = true  | 
|
138  | 
| boolean "true" = true  | 
|
139  | 
| boolean "false" = false  | 
|
140  | 
  | boolean s = error ("Bad boolean value: " ^ quote s);
 | 
|
141  | 
||
142  | 
fun integer s =  | 
|
143  | 
let  | 
|
144  | 
fun int ss =  | 
|
145  | 
(case Library.read_int ss of (i, []) => i  | 
|
146  | 
      | _ => error ("Bad integer value: " ^ quote s));
 | 
|
147  | 
in (case Symbol.explode s of "-" :: ss => ~ (int ss) | ss => int ss) end;  | 
|
148  | 
||
149  | 
||
150  | 
(* outer syntax *)  | 
|
151  | 
||
152  | 
local  | 
|
153  | 
||
| 36950 | 154  | 
val property =  | 
155  | 
Parse.xname -- Scan.optional (Parse.$$$ "=" |-- Parse.!!! Parse.xname) "";  | 
|
156  | 
||
157  | 
val properties =  | 
|
158  | 
Scan.optional (Parse.$$$ "[" |-- Parse.!!! (Parse.enum "," property --| Parse.$$$ "]")) [];  | 
|
| 22124 | 159  | 
|
160  | 
in  | 
|
161  | 
||
| 36950 | 162  | 
val antiq =  | 
| 
40800
 
330eb65c9469
Parse.liberal_name for document antiquotations and attributes;
 
wenzelm 
parents: 
39689 
diff
changeset
 | 
163  | 
Parse.!!!  | 
| 
 
330eb65c9469
Parse.liberal_name for document antiquotations and attributes;
 
wenzelm 
parents: 
39689 
diff
changeset
 | 
164  | 
(Parse.position Parse.liberal_name -- properties -- Args.parse --| Scan.ahead Parse.eof)  | 
| 22124 | 165  | 
>> (fn (((x, pos), y), z) => (y, Args.src ((x, z), pos)));  | 
166  | 
||
167  | 
end;  | 
|
168  | 
||
169  | 
||
170  | 
(* eval_antiquote *)  | 
|
171  | 
||
| 32738 | 172  | 
val modes = Unsynchronized.ref ([]: string list);  | 
| 22124 | 173  | 
|
| 
42508
 
e21362bf1d93
allow nested @{antiq} (nonterminal) and @@{antiq} terminal;
 
wenzelm 
parents: 
42399 
diff
changeset
 | 
174  | 
fun eval_antiq lex state (ss, (pos, _)) =  | 
| 
 
e21362bf1d93
allow nested @{antiq} (nonterminal) and @@{antiq} terminal;
 
wenzelm 
parents: 
42399 
diff
changeset
 | 
175  | 
let  | 
| 
 
e21362bf1d93
allow nested @{antiq} (nonterminal) and @@{antiq} terminal;
 
wenzelm 
parents: 
42399 
diff
changeset
 | 
176  | 
val (opts, src) = Token.read_antiq lex antiq (ss, pos);  | 
| 
 
e21362bf1d93
allow nested @{antiq} (nonterminal) and @@{antiq} terminal;
 
wenzelm 
parents: 
42399 
diff
changeset
 | 
177  | 
fun cmd ctxt = wrap ctxt (fn () => command src state ctxt) ();  | 
| 
 
e21362bf1d93
allow nested @{antiq} (nonterminal) and @@{antiq} terminal;
 
wenzelm 
parents: 
42399 
diff
changeset
 | 
178  | 
val preview_ctxt = fold option opts (Toplevel.presentation_context_of state);  | 
| 
 
e21362bf1d93
allow nested @{antiq} (nonterminal) and @@{antiq} terminal;
 
wenzelm 
parents: 
42399 
diff
changeset
 | 
179  | 
val print_ctxt = Context_Position.set_visible false preview_ctxt;  | 
| 
 
e21362bf1d93
allow nested @{antiq} (nonterminal) and @@{antiq} terminal;
 
wenzelm 
parents: 
42399 
diff
changeset
 | 
180  | 
val _ = cmd preview_ctxt;  | 
| 
 
e21362bf1d93
allow nested @{antiq} (nonterminal) and @@{antiq} terminal;
 
wenzelm 
parents: 
42399 
diff
changeset
 | 
181  | 
in Print_Mode.with_modes (! modes @ Latex.modes) (fn () => cmd print_ctxt) () end;  | 
| 
 
e21362bf1d93
allow nested @{antiq} (nonterminal) and @@{antiq} terminal;
 
wenzelm 
parents: 
42399 
diff
changeset
 | 
182  | 
|
| 30367 | 183  | 
fun eval_antiquote lex state (txt, pos) =  | 
| 22124 | 184  | 
let  | 
| 30589 | 185  | 
fun expand (Antiquote.Text ss) = Symbol_Pos.content ss  | 
| 
42508
 
e21362bf1d93
allow nested @{antiq} (nonterminal) and @@{antiq} terminal;
 
wenzelm 
parents: 
42399 
diff
changeset
 | 
186  | 
| expand (Antiquote.Antiq antiq) = eval_antiq lex state antiq  | 
| 27344 | 187  | 
| expand (Antiquote.Open _) = ""  | 
188  | 
| expand (Antiquote.Close _) = "";  | 
|
| 30642 | 189  | 
val ants = Antiquote.read (Symbol_Pos.explode (txt, pos), pos);  | 
| 22124 | 190  | 
in  | 
| 
30635
 
a7d175c48228
replaced Antiquote.is_antiq by Antiquote.is_text;
 
wenzelm 
parents: 
30613 
diff
changeset
 | 
191  | 
if Toplevel.is_toplevel state andalso not (forall Antiquote.is_text ants) then  | 
| 27897 | 192  | 
      error ("Unknown context -- cannot expand document antiquotations" ^ Position.str_of pos)
 | 
| 22124 | 193  | 
else implode (map expand ants)  | 
194  | 
end;  | 
|
195  | 
||
196  | 
||
197  | 
||
198  | 
(** present theory source **)  | 
|
199  | 
||
200  | 
(*NB: arranging white space around command spans is a black art.*)  | 
|
201  | 
||
202  | 
(* presentation tokens *)  | 
|
203  | 
||
204  | 
datatype token =  | 
|
205  | 
NoToken  | 
|
| 
36959
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
206  | 
| BasicToken of Token.T  | 
| 22124 | 207  | 
| MarkupToken of string * (string * Position.T)  | 
208  | 
| MarkupEnvToken of string * (string * Position.T)  | 
|
209  | 
| VerbatimToken of string * Position.T;  | 
|
210  | 
||
211  | 
fun output_token lex state =  | 
|
| 30367 | 212  | 
let val eval = eval_antiquote lex state in  | 
| 22124 | 213  | 
fn NoToken => ""  | 
214  | 
| BasicToken tok => Latex.output_basic tok  | 
|
215  | 
| MarkupToken (cmd, txt) => Latex.output_markup cmd (eval txt)  | 
|
216  | 
| MarkupEnvToken (cmd, txt) => Latex.output_markup_env cmd (eval txt)  | 
|
217  | 
| VerbatimToken txt => Latex.output_verbatim (eval txt)  | 
|
218  | 
end;  | 
|
219  | 
||
220  | 
fun basic_token pred (BasicToken tok) = pred tok  | 
|
221  | 
| basic_token _ _ = false;  | 
|
222  | 
||
| 
36959
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
223  | 
val improper_token = basic_token (not o Token.is_proper);  | 
| 
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
224  | 
val comment_token = basic_token Token.is_comment;  | 
| 
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
225  | 
val blank_token = basic_token Token.is_blank;  | 
| 
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
226  | 
val newline_token = basic_token Token.is_newline;  | 
| 22124 | 227  | 
|
228  | 
||
229  | 
(* command spans *)  | 
|
230  | 
||
231  | 
type command = string * Position.T * string list; (*name, position, tags*)  | 
|
232  | 
type source = (token * (string * int)) list; (*token, markup flag, meta-comment depth*)  | 
|
233  | 
||
234  | 
datatype span = Span of command * (source * source * source * source) * bool;  | 
|
235  | 
||
236  | 
fun make_span cmd src =  | 
|
237  | 
let  | 
|
238  | 
fun take_newline (tok :: toks) =  | 
|
239  | 
if newline_token (fst tok) then ([tok], toks, true)  | 
|
240  | 
else ([], tok :: toks, false)  | 
|
241  | 
| take_newline [] = ([], [], false);  | 
|
242  | 
val (((src_prefix, src_main), src_suffix1), (src_suffix2, src_appendix, newline)) =  | 
|
243  | 
src  | 
|
244  | 
|> take_prefix (improper_token o fst)  | 
|
245  | 
||>> take_suffix (improper_token o fst)  | 
|
246  | 
||>> take_prefix (comment_token o fst)  | 
|
247  | 
||> take_newline;  | 
|
248  | 
in Span (cmd, (src_prefix, src_main, src_suffix1 @ src_suffix2, src_appendix), newline) end;  | 
|
249  | 
||
250  | 
||
251  | 
(* present spans *)  | 
|
252  | 
||
253  | 
local  | 
|
254  | 
||
255  | 
fun err_bad_nesting pos =  | 
|
256  | 
  error ("Bad nesting of commands in presentation" ^ pos);
 | 
|
257  | 
||
258  | 
fun edge which f (x: string option, y) =  | 
|
259  | 
if x = y then I  | 
|
260  | 
else (case which (x, y) of NONE => I | SOME txt => Buffer.add (f txt));  | 
|
261  | 
||
262  | 
val begin_tag = edge #2 Latex.begin_tag;  | 
|
263  | 
val end_tag = edge #1 Latex.end_tag;  | 
|
264  | 
fun open_delim delim e = edge #2 Latex.begin_delim e #> delim #> edge #2 Latex.end_delim e;  | 
|
265  | 
fun close_delim delim e = edge #1 Latex.begin_delim e #> delim #> edge #1 Latex.end_delim e;  | 
|
266  | 
||
267  | 
in  | 
|
268  | 
||
269  | 
fun present_span lex default_tags span state state'  | 
|
270  | 
(tag_stack, active_tag, newline, buffer, present_cont) =  | 
|
271  | 
let  | 
|
272  | 
val present = fold (fn (tok, (flag, 0)) =>  | 
|
273  | 
Buffer.add (output_token lex state' tok)  | 
|
274  | 
#> Buffer.add flag  | 
|
275  | 
| _ => I);  | 
|
276  | 
||
277  | 
val Span ((cmd_name, cmd_pos, cmd_tags), srcs, span_newline) = span;  | 
|
278  | 
||
279  | 
val (tag, tags) = tag_stack;  | 
|
| 36950 | 280  | 
val tag' = try hd (fold Keyword.update_tags cmd_tags (the_list tag));  | 
| 22124 | 281  | 
|
282  | 
val active_tag' =  | 
|
283  | 
if is_some tag' then tag'  | 
|
284  | 
else if cmd_name = "end" andalso not (Toplevel.is_toplevel state') then NONE  | 
|
285  | 
else try hd (default_tags cmd_name);  | 
|
286  | 
val edge = (active_tag, active_tag');  | 
|
287  | 
||
288  | 
val newline' =  | 
|
289  | 
if is_none active_tag' then span_newline else newline;  | 
|
290  | 
||
291  | 
val nesting = Toplevel.level state' - Toplevel.level state;  | 
|
292  | 
val tag_stack' =  | 
|
293  | 
if nesting = 0 andalso not (Toplevel.is_proof state) then tag_stack  | 
|
294  | 
else if nesting >= 0 then (tag', replicate nesting tag @ tags)  | 
|
295  | 
else  | 
|
| 33957 | 296  | 
(case drop (~ nesting - 1) tags of  | 
| 22124 | 297  | 
tgs :: tgss => (tgs, tgss)  | 
298  | 
| [] => err_bad_nesting (Position.str_of cmd_pos));  | 
|
299  | 
||
300  | 
val buffer' =  | 
|
301  | 
buffer  | 
|
302  | 
|> end_tag edge  | 
|
303  | 
|> close_delim (fst present_cont) edge  | 
|
304  | 
|> snd present_cont  | 
|
305  | 
|> open_delim (present (#1 srcs)) edge  | 
|
306  | 
|> begin_tag edge  | 
|
307  | 
|> present (#2 srcs);  | 
|
308  | 
val present_cont' =  | 
|
309  | 
if newline then (present (#3 srcs), present (#4 srcs))  | 
|
310  | 
else (I, present (#3 srcs) #> present (#4 srcs));  | 
|
311  | 
in (tag_stack', active_tag', newline', buffer', present_cont') end;  | 
|
312  | 
||
313  | 
fun present_trailer ((_, tags), active_tag, _, buffer, present_cont) =  | 
|
314  | 
if not (null tags) then err_bad_nesting " at end of theory"  | 
|
315  | 
else  | 
|
316  | 
buffer  | 
|
317  | 
|> end_tag (active_tag, NONE)  | 
|
318  | 
|> close_delim (fst present_cont) (active_tag, NONE)  | 
|
319  | 
|> snd present_cont;  | 
|
320  | 
||
321  | 
end;  | 
|
322  | 
||
323  | 
||
| 
28427
 
cc9f7d99fb73
turned process_thy into present_thy, which merely does presentation (wrt. persistent intermediate states);
 
wenzelm 
parents: 
28273 
diff
changeset
 | 
324  | 
(* present_thy *)  | 
| 22124 | 325  | 
|
326  | 
datatype markup = Markup | MarkupEnv | Verbatim;  | 
|
327  | 
||
328  | 
local  | 
|
329  | 
||
330  | 
val space_proper =  | 
|
| 
36959
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
331  | 
Scan.one Token.is_blank -- Scan.many Token.is_comment -- Scan.one Token.is_proper;  | 
| 22124 | 332  | 
|
| 
36959
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
333  | 
val is_improper = not o (Token.is_proper orf Token.is_begin_ignore orf Token.is_end_ignore);  | 
| 22124 | 334  | 
val improper = Scan.many is_improper;  | 
335  | 
val improper_end = Scan.repeat (Scan.unless space_proper (Scan.one is_improper));  | 
|
| 
36959
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
336  | 
val blank_end = Scan.repeat (Scan.unless space_proper (Scan.one Token.is_blank));  | 
| 22124 | 337  | 
|
| 
36959
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
338  | 
val opt_newline = Scan.option (Scan.one Token.is_newline);  | 
| 22124 | 339  | 
|
340  | 
val ignore =  | 
|
| 
36959
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
341  | 
Scan.depend (fn d => opt_newline |-- Scan.one Token.is_begin_ignore  | 
| 22124 | 342  | 
>> pair (d + 1)) ||  | 
| 
36959
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
343  | 
Scan.depend (fn d => Scan.one Token.is_end_ignore --|  | 
| 22124 | 344  | 
(if d = 0 then Scan.fail_with (K "Bad nesting of meta-comments") else opt_newline)  | 
345  | 
>> pair (d - 1));  | 
|
346  | 
||
| 36950 | 347  | 
val tag = (improper -- Parse.$$$ "%" -- improper) |-- Parse.!!! (Parse.tag_name --| blank_end);  | 
| 22124 | 348  | 
|
349  | 
val locale =  | 
|
| 36950 | 350  | 
  Scan.option ((Parse.$$$ "(" -- improper -- Parse.$$$ "in") |--
 | 
351  | 
Parse.!!! (improper |-- Parse.xname --| (improper -- Parse.$$$ ")")));  | 
|
| 22124 | 352  | 
|
353  | 
in  | 
|
354  | 
||
| 
28427
 
cc9f7d99fb73
turned process_thy into present_thy, which merely does presentation (wrt. persistent intermediate states);
 
wenzelm 
parents: 
28273 
diff
changeset
 | 
355  | 
fun present_thy lex default_tags is_markup command_results src =  | 
| 22124 | 356  | 
let  | 
357  | 
(* tokens *)  | 
|
358  | 
||
359  | 
val ignored = Scan.state --| ignore  | 
|
360  | 
      >> (fn d => (NONE, (NoToken, ("", d))));
 | 
|
361  | 
||
362  | 
fun markup mark mk flag = Scan.peek (fn d =>  | 
|
| 36950 | 363  | 
improper |--  | 
| 
36959
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
364  | 
Parse.position  | 
| 
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
365  | 
(Scan.one (Token.is_kind Token.Command andf is_markup mark o Token.content_of)) --  | 
| 22124 | 366  | 
Scan.repeat tag --  | 
| 36950 | 367  | 
Parse.!!!! ((improper -- locale -- improper) |-- Parse.doc_source --| improper_end)  | 
| 22124 | 368  | 
>> (fn (((tok, pos), tags), txt) =>  | 
| 
36959
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
369  | 
let val name = Token.content_of tok  | 
| 22124 | 370  | 
in (SOME (name, pos, tags), (mk (name, txt), (flag, d))) end));  | 
371  | 
||
372  | 
val command = Scan.peek (fn d =>  | 
|
| 
36959
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
373  | 
Parse.position (Scan.one (Token.is_kind Token.Command)) --  | 
| 22124 | 374  | 
Scan.repeat tag  | 
375  | 
>> (fn ((tok, pos), tags) =>  | 
|
| 
36959
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
376  | 
let val name = Token.content_of tok  | 
| 22124 | 377  | 
in (SOME (name, pos, tags), (BasicToken tok, (Latex.markup_false, d))) end));  | 
378  | 
||
379  | 
val cmt = Scan.peek (fn d =>  | 
|
| 36950 | 380  | 
Parse.$$$ "--" |-- Parse.!!!! (improper |-- Parse.doc_source)  | 
| 22124 | 381  | 
      >> (fn txt => (NONE, (MarkupToken ("cmt", txt), ("", d)))));
 | 
382  | 
||
383  | 
val other = Scan.peek (fn d =>  | 
|
| 36950 | 384  | 
       Parse.not_eof >> (fn tok => (NONE, (BasicToken tok, ("", d)))));
 | 
| 22124 | 385  | 
|
386  | 
val token =  | 
|
387  | 
ignored ||  | 
|
388  | 
markup Markup MarkupToken Latex.markup_true ||  | 
|
389  | 
markup MarkupEnv MarkupEnvToken Latex.markup_true ||  | 
|
390  | 
markup Verbatim (VerbatimToken o #2) "" ||  | 
|
391  | 
command || cmt || other;  | 
|
392  | 
||
393  | 
||
394  | 
(* spans *)  | 
|
395  | 
||
| 
36959
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
396  | 
val is_eof = fn (_, (BasicToken x, _)) => Token.is_eof x | _ => false;  | 
| 
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
397  | 
    val stopper = Scan.stopper (K (NONE, (BasicToken Token.eof, ("", 0)))) is_eof;
 | 
| 22124 | 398  | 
|
399  | 
val cmd = Scan.one (is_some o fst);  | 
|
| 27732 | 400  | 
val non_cmd = Scan.one (is_none o fst andf not o is_eof) >> #2;  | 
| 22124 | 401  | 
|
402  | 
val comments = Scan.many (comment_token o fst o snd);  | 
|
403  | 
val blank = Scan.one (blank_token o fst o snd);  | 
|
404  | 
val newline = Scan.one (newline_token o fst o snd);  | 
|
405  | 
val before_cmd =  | 
|
406  | 
Scan.option (newline -- comments) --  | 
|
407  | 
Scan.option (newline -- comments) --  | 
|
408  | 
Scan.option (blank -- comments) -- cmd;  | 
|
409  | 
||
410  | 
val span =  | 
|
411  | 
Scan.repeat non_cmd -- cmd --  | 
|
412  | 
Scan.repeat (Scan.unless before_cmd non_cmd) --  | 
|
413  | 
Scan.option (newline >> (single o snd))  | 
|
414  | 
>> (fn (((toks1, (cmd, tok2)), toks3), tok4) =>  | 
|
415  | 
make_span (the cmd) (toks1 @ (tok2 :: (toks3 @ the_default [] tok4))));  | 
|
416  | 
||
417  | 
val spans =  | 
|
418  | 
src  | 
|
| 
36959
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
419  | 
|> Source.filter (not o Token.is_semicolon)  | 
| 
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
420  | 
|> Source.source' 0 Token.stopper (Scan.error (Scan.bulk token)) NONE  | 
| 22124 | 421  | 
|> Source.source stopper (Scan.error (Scan.bulk span)) NONE  | 
422  | 
|> Source.exhaust;  | 
|
| 
28427
 
cc9f7d99fb73
turned process_thy into present_thy, which merely does presentation (wrt. persistent intermediate states);
 
wenzelm 
parents: 
28273 
diff
changeset
 | 
423  | 
|
| 
 
cc9f7d99fb73
turned process_thy into present_thy, which merely does presentation (wrt. persistent intermediate states);
 
wenzelm 
parents: 
28273 
diff
changeset
 | 
424  | 
|
| 
 
cc9f7d99fb73
turned process_thy into present_thy, which merely does presentation (wrt. persistent intermediate states);
 
wenzelm 
parents: 
28273 
diff
changeset
 | 
425  | 
(* present commands *)  | 
| 
 
cc9f7d99fb73
turned process_thy into present_thy, which merely does presentation (wrt. persistent intermediate states);
 
wenzelm 
parents: 
28273 
diff
changeset
 | 
426  | 
|
| 
 
cc9f7d99fb73
turned process_thy into present_thy, which merely does presentation (wrt. persistent intermediate states);
 
wenzelm 
parents: 
28273 
diff
changeset
 | 
427  | 
fun present_command tr span st st' =  | 
| 
 
cc9f7d99fb73
turned process_thy into present_thy, which merely does presentation (wrt. persistent intermediate states);
 
wenzelm 
parents: 
28273 
diff
changeset
 | 
428  | 
Toplevel.setmp_thread_position tr (present_span lex default_tags span st st');  | 
| 
 
cc9f7d99fb73
turned process_thy into present_thy, which merely does presentation (wrt. persistent intermediate states);
 
wenzelm 
parents: 
28273 
diff
changeset
 | 
429  | 
|
| 
 
cc9f7d99fb73
turned process_thy into present_thy, which merely does presentation (wrt. persistent intermediate states);
 
wenzelm 
parents: 
28273 
diff
changeset
 | 
430  | 
fun present _ [] = I  | 
| 
 
cc9f7d99fb73
turned process_thy into present_thy, which merely does presentation (wrt. persistent intermediate states);
 
wenzelm 
parents: 
28273 
diff
changeset
 | 
431  | 
| present st (((tr, st'), span) :: rest) = present_command tr span st st' #> present st' rest;  | 
| 22124 | 432  | 
in  | 
| 
28427
 
cc9f7d99fb73
turned process_thy into present_thy, which merely does presentation (wrt. persistent intermediate states);
 
wenzelm 
parents: 
28273 
diff
changeset
 | 
433  | 
if length command_results = length spans then  | 
| 22124 | 434  | 
((NONE, []), NONE, true, Buffer.empty, (I, I))  | 
| 
28427
 
cc9f7d99fb73
turned process_thy into present_thy, which merely does presentation (wrt. persistent intermediate states);
 
wenzelm 
parents: 
28273 
diff
changeset
 | 
435  | 
|> present Toplevel.toplevel (command_results ~~ spans)  | 
| 22124 | 436  | 
|> present_trailer  | 
437  | 
else error "Messed-up outer syntax for presentation"  | 
|
438  | 
end;  | 
|
439  | 
||
440  | 
end;  | 
|
441  | 
||
442  | 
||
443  | 
||
444  | 
(** setup default output **)  | 
|
445  | 
||
446  | 
(* options *)  | 
|
447  | 
||
| 
39134
 
917b4b6ba3d2
turned show_sorts/show_types into proper configuration options;
 
wenzelm 
parents: 
39129 
diff
changeset
 | 
448  | 
val _ = add_option "show_types" (Config.put show_types o boolean);  | 
| 
 
917b4b6ba3d2
turned show_sorts/show_types into proper configuration options;
 
wenzelm 
parents: 
39129 
diff
changeset
 | 
449  | 
val _ = add_option "show_sorts" (Config.put show_sorts o boolean);  | 
| 
39127
 
e7ecbe86d22e
turned show_structs into proper configuration option;
 
wenzelm 
parents: 
39125 
diff
changeset
 | 
450  | 
val _ = add_option "show_structs" (Config.put show_structs o boolean);  | 
| 
38980
 
af73cf0dc31f
turned show_question_marks into proper configuration option;
 
wenzelm 
parents: 
38832 
diff
changeset
 | 
451  | 
val _ = add_option "show_question_marks" (Config.put show_question_marks o boolean);  | 
| 
40879
 
ca132ef44944
configuration option "show_abbrevs" supersedes print mode "no_abbrevs", with inverted meaning;
 
wenzelm 
parents: 
40801 
diff
changeset
 | 
452  | 
val _ = add_option "show_abbrevs" (Config.put show_abbrevs o boolean);  | 
| 
42669
 
04dfffda5671
more conventional naming scheme: names_long, names_short, names_unique;
 
wenzelm 
parents: 
42616 
diff
changeset
 | 
453  | 
val _ = add_option "names_long" (Config.put Name_Space.names_long o boolean);  | 
| 
 
04dfffda5671
more conventional naming scheme: names_long, names_short, names_unique;
 
wenzelm 
parents: 
42616 
diff
changeset
 | 
454  | 
val _ = add_option "names_short" (Config.put Name_Space.names_short o boolean);  | 
| 
 
04dfffda5671
more conventional naming scheme: names_long, names_short, names_unique;
 
wenzelm 
parents: 
42616 
diff
changeset
 | 
455  | 
val _ = add_option "names_unique" (Config.put Name_Space.names_unique o boolean);  | 
| 42284 | 456  | 
val _ = add_option "eta_contract" (Config.put Syntax_Trans.eta_contract o boolean);  | 
| 
38767
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
457  | 
val _ = add_option "display" (Config.put display o boolean);  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
458  | 
val _ = add_option "break" (Config.put break o boolean);  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
459  | 
val _ = add_option "quotes" (Config.put quotes o boolean);  | 
| 
38766
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
460  | 
val _ = add_option "mode" (add_wrapper o Print_Mode.with_modes o single);  | 
| 
 
8891f4520d16
Thy_Output: options based on proper context, although Thy_Output.add_wrapper still allows to maintain old-style wrapper combinators (setmp_CRITICAL etc.);
 
wenzelm 
parents: 
37216 
diff
changeset
 | 
461  | 
val _ = add_option "margin" (add_wrapper o setmp_CRITICAL Pretty.margin_default o integer);  | 
| 
38767
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
462  | 
val _ = add_option "indent" (Config.put indent o integer);  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
463  | 
val _ = add_option "source" (Config.put source o boolean);  | 
| 
39125
 
f45d332a90e3
pretty_goals: turned some global references and function arguments into configuration options (goals_limit = 10, goals_total = true, show_main_goal = false) depending on the context;
 
wenzelm 
parents: 
38980 
diff
changeset
 | 
464  | 
val _ = add_option "goals_limit" (Config.put Goal_Display.goals_limit o integer);  | 
| 22124 | 465  | 
|
466  | 
||
467  | 
(* basic pretty printing *)  | 
|
468  | 
||
| 
38767
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
469  | 
fun tweak_line ctxt s =  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
470  | 
if Config.get ctxt display then s else Symbol.strip_blanks s;  | 
| 22124 | 471  | 
|
| 
38767
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
472  | 
fun pretty_text ctxt =  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
473  | 
Pretty.chunks o map Pretty.str o map (tweak_line ctxt) o Library.split_lines;  | 
| 22124 | 474  | 
|
| 
26710
 
f79aa228c582
pretty_term: no revert_skolems here, but auto_fixes (token translations will do the rest);
 
wenzelm 
parents: 
26455 
diff
changeset
 | 
475  | 
fun pretty_term ctxt t = Syntax.pretty_term (Variable.auto_fixes t ctxt) t;  | 
| 24920 | 476  | 
|
| 
32898
 
e871d897969c
term styles also cover antiquotations term_type and typeof
 
haftmann 
parents: 
32890 
diff
changeset
 | 
477  | 
fun pretty_thm ctxt = pretty_term ctxt o Thm.full_prop_of;  | 
| 
 
e871d897969c
term styles also cover antiquotations term_type and typeof
 
haftmann 
parents: 
32890 
diff
changeset
 | 
478  | 
|
| 
 
e871d897969c
term styles also cover antiquotations term_type and typeof
 
haftmann 
parents: 
32890 
diff
changeset
 | 
479  | 
fun pretty_term_style ctxt (style, t) =  | 
| 
 
e871d897969c
term styles also cover antiquotations term_type and typeof
 
haftmann 
parents: 
32890 
diff
changeset
 | 
480  | 
pretty_term ctxt (style t);  | 
| 22124 | 481  | 
|
| 
32898
 
e871d897969c
term styles also cover antiquotations term_type and typeof
 
haftmann 
parents: 
32890 
diff
changeset
 | 
482  | 
fun pretty_thm_style ctxt (style, th) =  | 
| 
 
e871d897969c
term styles also cover antiquotations term_type and typeof
 
haftmann 
parents: 
32890 
diff
changeset
 | 
483  | 
pretty_term ctxt (style (Thm.full_prop_of th));  | 
| 22124 | 484  | 
|
| 
32898
 
e871d897969c
term styles also cover antiquotations term_type and typeof
 
haftmann 
parents: 
32890 
diff
changeset
 | 
485  | 
fun pretty_term_typ ctxt (style, t) =  | 
| 
 
e871d897969c
term styles also cover antiquotations term_type and typeof
 
haftmann 
parents: 
32890 
diff
changeset
 | 
486  | 
let val t' = style t  | 
| 39288 | 487  | 
in pretty_term ctxt (Type.constraint (Term.fastype_of t') t') end;  | 
| 
32898
 
e871d897969c
term styles also cover antiquotations term_type and typeof
 
haftmann 
parents: 
32890 
diff
changeset
 | 
488  | 
|
| 
 
e871d897969c
term styles also cover antiquotations term_type and typeof
 
haftmann 
parents: 
32890 
diff
changeset
 | 
489  | 
fun pretty_term_typeof ctxt (style, t) =  | 
| 
 
e871d897969c
term styles also cover antiquotations term_type and typeof
 
haftmann 
parents: 
32890 
diff
changeset
 | 
490  | 
Syntax.pretty_typ ctxt (Term.fastype_of (style t));  | 
| 22124 | 491  | 
|
| 
25373
 
ccbf65080fdf
@{const}: improved ProofContext.read_const does the job;
 
wenzelm 
parents: 
25241 
diff
changeset
 | 
492  | 
fun pretty_const ctxt c =  | 
| 
 
ccbf65080fdf
@{const}: improved ProofContext.read_const does the job;
 
wenzelm 
parents: 
25241 
diff
changeset
 | 
493  | 
let  | 
| 42360 | 494  | 
val t = Const (c, Consts.type_scheme (Proof_Context.consts_of ctxt) c)  | 
| 
25373
 
ccbf65080fdf
@{const}: improved ProofContext.read_const does the job;
 
wenzelm 
parents: 
25241 
diff
changeset
 | 
495  | 
handle TYPE (msg, _, _) => error msg;  | 
| 
 
ccbf65080fdf
@{const}: improved ProofContext.read_const does the job;
 
wenzelm 
parents: 
25241 
diff
changeset
 | 
496  | 
val ([t'], _) = Variable.import_terms true [t] ctxt;  | 
| 
 
ccbf65080fdf
@{const}: improved ProofContext.read_const does the job;
 
wenzelm 
parents: 
25241 
diff
changeset
 | 
497  | 
in pretty_term ctxt t' end;  | 
| 22124 | 498  | 
|
| 
25407
 
2859cf34aaf0
abbrev: bypass full term check via ProofContext.standard_infer_types (prevents forced expansion);
 
wenzelm 
parents: 
25373 
diff
changeset
 | 
499  | 
fun pretty_abbrev ctxt s =  | 
| 22124 | 500  | 
let  | 
| 42399 | 501  | 
val t = Syntax.read_term (Proof_Context.set_mode Proof_Context.mode_abbrev ctxt) s;  | 
| 24920 | 502  | 
    fun err () = error ("Abbreviated constant expected: " ^ Syntax.string_of_term ctxt t);
 | 
| 22124 | 503  | 
val (head, args) = Term.strip_comb t;  | 
504  | 
val (c, T) = Term.dest_Const head handle TERM _ => err ();  | 
|
| 42360 | 505  | 
val (U, u) = Consts.the_abbreviation (Proof_Context.consts_of ctxt) c  | 
| 22124 | 506  | 
handle TYPE _ => err ();  | 
507  | 
val t' = Term.betapplys (Envir.expand_atom T (U, u), args);  | 
|
| 
32898
 
e871d897969c
term styles also cover antiquotations term_type and typeof
 
haftmann 
parents: 
32890 
diff
changeset
 | 
508  | 
val eq = Logic.mk_equals (t, t');  | 
| 
 
e871d897969c
term styles also cover antiquotations term_type and typeof
 
haftmann 
parents: 
32890 
diff
changeset
 | 
509  | 
val ctxt' = Variable.auto_fixes eq ctxt;  | 
| 42360 | 510  | 
in Proof_Context.pretty_term_abbrev ctxt' eq end;  | 
| 22124 | 511  | 
|
| 
39305
 
d4fa19eb0822
'class' and 'type' are now antiquoations by default
 
haftmann 
parents: 
39134 
diff
changeset
 | 
512  | 
fun pretty_class ctxt =  | 
| 42360 | 513  | 
Pretty.str o Proof_Context.extern_class ctxt o Proof_Context.read_class ctxt;  | 
| 
39305
 
d4fa19eb0822
'class' and 'type' are now antiquoations by default
 
haftmann 
parents: 
39134 
diff
changeset
 | 
514  | 
|
| 
39309
 
74469faa27ca
type antiquotation: allow arbitrary type abbreviations, but fail with user-space exception on bad input
 
haftmann 
parents: 
39308 
diff
changeset
 | 
515  | 
fun pretty_type ctxt s =  | 
| 42360 | 516  | 
let val Type (name, _) = Proof_Context.read_type_name_proper ctxt false s  | 
517  | 
in Pretty.str (Proof_Context.extern_type ctxt name) end;  | 
|
| 
39305
 
d4fa19eb0822
'class' and 'type' are now antiquoations by default
 
haftmann 
parents: 
39134 
diff
changeset
 | 
518  | 
|
| 33388 | 519  | 
fun pretty_prf full ctxt = Proof_Syntax.pretty_proof_of ctxt full;  | 
| 22124 | 520  | 
|
521  | 
fun pretty_theory ctxt name =  | 
|
| 42360 | 522  | 
(Theory.requires (Proof_Context.theory_of ctxt) name "presentation"; Pretty.str name);  | 
| 22124 | 523  | 
|
524  | 
||
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
525  | 
(* default output *)  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
526  | 
|
| 
36959
 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 
wenzelm 
parents: 
36950 
diff
changeset
 | 
527  | 
val str_of_source = space_implode " " o map Token.unparse o #2 o #1 o Args.dest_src;  | 
| 22124 | 528  | 
|
| 
38767
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
529  | 
fun maybe_pretty_source pretty ctxt src xs =  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
530  | 
map (pretty ctxt) xs (*always pretty in order to exhibit errors!*)  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
531  | 
|> (if Config.get ctxt source then K [pretty_text ctxt (str_of_source src)] else I);  | 
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
532  | 
|
| 
38767
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
533  | 
fun output ctxt prts =  | 
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
534  | 
prts  | 
| 
38767
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
535  | 
|> (if Config.get ctxt quotes then map Pretty.quote else I)  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
536  | 
|> (if Config.get ctxt display then  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
537  | 
map (Output.output o Pretty.string_of o Pretty.indent (Config.get ctxt indent))  | 
| 22124 | 538  | 
#> space_implode "\\isasep\\isanewline%\n"  | 
539  | 
    #> enclose "\\begin{isabelle}%\n" "%\n\\end{isabelle}"
 | 
|
540  | 
else  | 
|
| 
38767
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
541  | 
map (Output.output o (if Config.get ctxt break then Pretty.string_of else Pretty.str_of))  | 
| 22124 | 542  | 
#> space_implode "\\isasep\\isanewline%\n"  | 
543  | 
    #> enclose "\\isa{" "}");
 | 
|
544  | 
||
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
545  | 
|
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
546  | 
|
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
547  | 
(** concrete antiquotations **)  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
548  | 
|
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
549  | 
(* basic entities *)  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
550  | 
|
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
551  | 
local  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
552  | 
|
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
553  | 
fun basic_entities name scan pretty = antiquotation name scan  | 
| 
38767
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
554  | 
  (fn {source, context, ...} => output context o maybe_pretty_source pretty context source);
 | 
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
555  | 
|
| 
32890
 
77df12652210
generalized term styles: transformations may depend on arguments; modernized term_style module; antiquotations thm, prop and term accepting term styles
 
haftmann 
parents: 
32738 
diff
changeset
 | 
556  | 
fun basic_entities_style name scan pretty = antiquotation name scan  | 
| 
 
77df12652210
generalized term styles: transformations may depend on arguments; modernized term_style module; antiquotations thm, prop and term accepting term styles
 
haftmann 
parents: 
32738 
diff
changeset
 | 
557  | 
  (fn {source, context, ...} => fn (style, xs) =>
 | 
| 
38767
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
558  | 
output context  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
559  | 
(maybe_pretty_source (fn ctxt => fn x => pretty ctxt (style, x)) context source xs));  | 
| 
32890
 
77df12652210
generalized term styles: transformations may depend on arguments; modernized term_style module; antiquotations thm, prop and term accepting term styles
 
haftmann 
parents: 
32738 
diff
changeset
 | 
560  | 
|
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
561  | 
fun basic_entity name scan = basic_entities name (scan >> single);  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
562  | 
|
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
563  | 
in  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
564  | 
|
| 
32890
 
77df12652210
generalized term styles: transformations may depend on arguments; modernized term_style module; antiquotations thm, prop and term accepting term styles
 
haftmann 
parents: 
32738 
diff
changeset
 | 
565  | 
val _ = basic_entities_style "thm" (Term_Style.parse -- Attrib.thms) pretty_thm_style;  | 
| 
 
77df12652210
generalized term styles: transformations may depend on arguments; modernized term_style module; antiquotations thm, prop and term accepting term styles
 
haftmann 
parents: 
32738 
diff
changeset
 | 
566  | 
val _ = basic_entity "prop" (Term_Style.parse -- Args.prop) pretty_term_style;  | 
| 
 
77df12652210
generalized term styles: transformations may depend on arguments; modernized term_style module; antiquotations thm, prop and term accepting term styles
 
haftmann 
parents: 
32738 
diff
changeset
 | 
567  | 
val _ = basic_entity "term" (Term_Style.parse -- Args.term) pretty_term_style;  | 
| 
32898
 
e871d897969c
term styles also cover antiquotations term_type and typeof
 
haftmann 
parents: 
32890 
diff
changeset
 | 
568  | 
val _ = basic_entity "term_type" (Term_Style.parse -- Args.term) pretty_term_typ;  | 
| 
 
e871d897969c
term styles also cover antiquotations term_type and typeof
 
haftmann 
parents: 
32890 
diff
changeset
 | 
569  | 
val _ = basic_entity "typeof" (Term_Style.parse -- Args.term) pretty_term_typeof;  | 
| 
35399
 
3881972fcfca
clarified ProofContext.read_const(_proper)/Args.const(_proper) wrt. strict logical consts;
 
wenzelm 
parents: 
33957 
diff
changeset
 | 
570  | 
val _ = basic_entity "const" (Args.const_proper false) pretty_const;  | 
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
571  | 
val _ = basic_entity "abbrev" (Scan.lift Args.name_source) pretty_abbrev;  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
572  | 
val _ = basic_entity "typ" Args.typ_abbrev Syntax.pretty_typ;  | 
| 
39305
 
d4fa19eb0822
'class' and 'type' are now antiquoations by default
 
haftmann 
parents: 
39134 
diff
changeset
 | 
573  | 
val _ = basic_entity "class" (Scan.lift Args.name) pretty_class;  | 
| 
 
d4fa19eb0822
'class' and 'type' are now antiquoations by default
 
haftmann 
parents: 
39134 
diff
changeset
 | 
574  | 
val _ = basic_entity "type" (Scan.lift Args.name) pretty_type;  | 
| 
38767
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
575  | 
val _ = basic_entity "text" (Scan.lift Args.name) pretty_text;  | 
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
576  | 
val _ = basic_entities "prf" Attrib.thms (pretty_prf false);  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
577  | 
val _ = basic_entities "full_prf" Attrib.thms (pretty_prf true);  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
578  | 
val _ = basic_entity "theory" (Scan.lift Args.name) pretty_theory;  | 
| 
32898
 
e871d897969c
term styles also cover antiquotations term_type and typeof
 
haftmann 
parents: 
32890 
diff
changeset
 | 
579  | 
val _ = basic_entities_style "thm_style" (Term_Style.parse_bare -- Attrib.thms) pretty_thm_style;  | 
| 
 
e871d897969c
term styles also cover antiquotations term_type and typeof
 
haftmann 
parents: 
32890 
diff
changeset
 | 
580  | 
val _ = basic_entity "term_style" (Term_Style.parse_bare -- Args.term) pretty_term_style;  | 
| 
 
e871d897969c
term styles also cover antiquotations term_type and typeof
 
haftmann 
parents: 
32890 
diff
changeset
 | 
581  | 
|
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
582  | 
end;  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
583  | 
|
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
584  | 
|
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
585  | 
(* goal state *)  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
586  | 
|
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
587  | 
local  | 
| 22124 | 588  | 
|
| 30367 | 589  | 
fun proof_state state =  | 
590  | 
(case try Toplevel.proof_of state of  | 
|
591  | 
SOME prf => prf  | 
|
| 22124 | 592  | 
| _ => error "No proof state");  | 
593  | 
||
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
594  | 
fun goal_state name main_goal = antiquotation name (Scan.succeed ())  | 
| 
39125
 
f45d332a90e3
pretty_goals: turned some global references and function arguments into configuration options (goals_limit = 10, goals_total = true, show_main_goal = false) depending on the context;
 
wenzelm 
parents: 
38980 
diff
changeset
 | 
595  | 
  (fn {state, context = ctxt, ...} => fn () => output ctxt
 | 
| 
39129
 
976af4e27cde
recovered options for goal antiquotations from f45d332a90e3: actually pass context to Proof.pretty_goals (see also 45facd8f358e);
 
wenzelm 
parents: 
39128 
diff
changeset
 | 
596  | 
[Pretty.chunks  | 
| 
 
976af4e27cde
recovered options for goal antiquotations from f45d332a90e3: actually pass context to Proof.pretty_goals (see also 45facd8f358e);
 
wenzelm 
parents: 
39128 
diff
changeset
 | 
597  | 
(Proof.pretty_goals main_goal (Proof.map_context (K ctxt) (proof_state state)))]);  | 
| 22124 | 598  | 
|
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
599  | 
in  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
600  | 
|
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
601  | 
val _ = goal_state "goals" true;  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
602  | 
val _ = goal_state "subgoals" false;  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
603  | 
|
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
604  | 
end;  | 
| 22124 | 605  | 
|
606  | 
||
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
607  | 
(* embedded lemma *)  | 
| 27522 | 608  | 
|
| 36950 | 609  | 
val _ = Keyword.keyword "by";  | 
| 27381 | 610  | 
|
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
611  | 
val _ = antiquotation "lemma"  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
612  | 
(Args.prop -- Scan.lift (Args.$$$ "by" |-- Method.parse -- Scan.option Method.parse))  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
613  | 
  (fn {source, context, ...} => fn (prop, methods) =>
 | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
614  | 
let  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
615  | 
val prop_src =  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
616  | 
(case Args.dest_src source of ((a, arg :: _), pos) => Args.src ((a, [arg]), pos));  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
617  | 
val _ = context  | 
| 
36323
 
655e2d74de3a
modernized naming conventions of main Isar proof elements;
 
wenzelm 
parents: 
36163 
diff
changeset
 | 
618  | 
|> Proof.theorem NONE (K I) [[(prop, [])]]  | 
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
619  | 
|> Proof.global_terminal_proof methods;  | 
| 
38767
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
620  | 
in output context (maybe_pretty_source pretty_term context prop_src [prop]) end);  | 
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
621  | 
|
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
622  | 
|
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
623  | 
(* ML text *)  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
624  | 
|
| 40801 | 625  | 
val verb_text =  | 
626  | 
split_lines  | 
|
627  | 
#> map (space_implode "\\verb,|," o map (enclose "\\verb|" "|") o space_explode "|")  | 
|
628  | 
#> space_implode "\\isasep\\isanewline%\n";  | 
|
629  | 
||
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
630  | 
local  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
631  | 
|
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
632  | 
fun ml_text name ml = antiquotation name (Scan.lift Args.name_source_position)  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
633  | 
  (fn {context, ...} => fn (txt, pos) =>
 | 
| 
37198
 
3af985b10550
replaced ML_Lex.read_antiq by more concise ML_Lex.read, which includes full read/report with explicit position information;
 
wenzelm 
parents: 
37146 
diff
changeset
 | 
634  | 
(ML_Context.eval_in (SOME context) false pos (ml pos txt);  | 
| 30573 | 635  | 
Symbol_Pos.content (Symbol_Pos.explode (txt, pos))  | 
| 
38767
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
636  | 
|> (if Config.get context quotes then quote else I)  | 
| 
 
d8da44a8dd25
proper context for various Thy_Output options, via official configuration options in ML and Isar;
 
wenzelm 
parents: 
38766 
diff
changeset
 | 
637  | 
    |> (if Config.get context display then enclose "\\begin{verbatim}\n" "\n\\end{verbatim}"
 | 
| 40801 | 638  | 
else verb_text)));  | 
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
639  | 
|
| 
37198
 
3af985b10550
replaced ML_Lex.read_antiq by more concise ML_Lex.read, which includes full read/report with explicit position information;
 
wenzelm 
parents: 
37146 
diff
changeset
 | 
640  | 
fun ml_enclose bg en pos txt =  | 
| 
 
3af985b10550
replaced ML_Lex.read_antiq by more concise ML_Lex.read, which includes full read/report with explicit position information;
 
wenzelm 
parents: 
37146 
diff
changeset
 | 
641  | 
ML_Lex.read Position.none bg @ ML_Lex.read pos txt @ ML_Lex.read Position.none en;  | 
| 
 
3af985b10550
replaced ML_Lex.read_antiq by more concise ML_Lex.read, which includes full read/report with explicit position information;
 
wenzelm 
parents: 
37146 
diff
changeset
 | 
642  | 
|
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
643  | 
in  | 
| 
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
644  | 
|
| 
37198
 
3af985b10550
replaced ML_Lex.read_antiq by more concise ML_Lex.read, which includes full read/report with explicit position information;
 
wenzelm 
parents: 
37146 
diff
changeset
 | 
645  | 
val _ = ml_text "ML" (ml_enclose "fn _ => (" ");");
 | 
| 
 
3af985b10550
replaced ML_Lex.read_antiq by more concise ML_Lex.read, which includes full read/report with explicit position information;
 
wenzelm 
parents: 
37146 
diff
changeset
 | 
646  | 
val _ = ml_text "ML_type" (ml_enclose "val _ = NONE : (" ") option;");
 | 
| 
 
3af985b10550
replaced ML_Lex.read_antiq by more concise ML_Lex.read, which includes full read/report with explicit position information;
 
wenzelm 
parents: 
37146 
diff
changeset
 | 
647  | 
val _ = ml_text "ML_struct" (ml_enclose "functor XXX() = struct structure XX = " " end;");  | 
| 
 
3af985b10550
replaced ML_Lex.read_antiq by more concise ML_Lex.read, which includes full read/report with explicit position information;
 
wenzelm 
parents: 
37146 
diff
changeset
 | 
648  | 
|
| 
 
3af985b10550
replaced ML_Lex.read_antiq by more concise ML_Lex.read, which includes full read/report with explicit position information;
 
wenzelm 
parents: 
37146 
diff
changeset
 | 
649  | 
val _ = ml_text "ML_functor" (* FIXME formal treatment of functor name (!?) *)  | 
| 
 
3af985b10550
replaced ML_Lex.read_antiq by more concise ML_Lex.read, which includes full read/report with explicit position information;
 
wenzelm 
parents: 
37146 
diff
changeset
 | 
650  | 
(fn pos => fn txt =>  | 
| 
 
3af985b10550
replaced ML_Lex.read_antiq by more concise ML_Lex.read, which includes full read/report with explicit position information;
 
wenzelm 
parents: 
37146 
diff
changeset
 | 
651  | 
    ML_Lex.read Position.none ("ML_Env.check_functor " ^
 | 
| 
 
3af985b10550
replaced ML_Lex.read_antiq by more concise ML_Lex.read, which includes full read/report with explicit position information;
 
wenzelm 
parents: 
37146 
diff
changeset
 | 
652  | 
ML_Syntax.print_string (Symbol_Pos.content (Symbol_Pos.explode (txt, pos)))));  | 
| 
 
3af985b10550
replaced ML_Lex.read_antiq by more concise ML_Lex.read, which includes full read/report with explicit position information;
 
wenzelm 
parents: 
37146 
diff
changeset
 | 
653  | 
|
| 
 
3af985b10550
replaced ML_Lex.read_antiq by more concise ML_Lex.read, which includes full read/report with explicit position information;
 
wenzelm 
parents: 
37146 
diff
changeset
 | 
654  | 
val _ = ml_text "ML_text" (K (K []));  | 
| 22124 | 655  | 
|
656  | 
end;  | 
|
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
657  | 
|
| 40801 | 658  | 
|
659  | 
(* files *)  | 
|
660  | 
||
661  | 
val _ = antiquotation "file" (Scan.lift Args.name)  | 
|
662  | 
  (fn {context, ...} => fn path =>
 | 
|
663  | 
if File.exists (Path.explode path) then verb_text path  | 
|
664  | 
    else error ("Bad file: " ^ quote path));
 | 
|
665  | 
||
| 
30390
 
ad591ee76c78
simplified interface to define document antiquotations, cf. antiquotatation, maybe_pretty_source, output;
 
wenzelm 
parents: 
30381 
diff
changeset
 | 
666  | 
end;  |