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