| author | wenzelm | 
| Wed, 11 Dec 2024 11:18:52 +0100 | |
| changeset 81579 | cf4bebd770b5 | 
| parent 81533 | fb49af893986 | 
| child 81628 | e5be995d21f0 | 
| permissions | -rw-r--r-- | 
| 62058 | 1 | (* Title: Pure/Thy/document_antiquotations.ML | 
| 61619 | 2 | Author: Makarius | 
| 3 | ||
| 4 | Miscellaneous document antiquotations. | |
| 5 | *) | |
| 6 | ||
| 7 | structure Document_Antiquotations: sig end = | |
| 8 | struct | |
| 9 | ||
| 67386 | 10 | (* basic entities *) | 
| 11 | ||
| 12 | local | |
| 13 | ||
| 67463 | 14 | type style = term -> term; | 
| 15 | ||
| 16 | fun pretty_term_style ctxt (style: style, t) = | |
| 73761 | 17 | Document_Output.pretty_term ctxt (style t); | 
| 67386 | 18 | |
| 67505 
ceb324e34c14
clarified signature: items with \isasep are special;
 wenzelm parents: 
67497diff
changeset | 19 | fun pretty_thms_style ctxt (style: style, ths) = | 
| 73761 | 20 | map (fn th => Document_Output.pretty_term ctxt (style (Thm.full_prop_of th))) ths; | 
| 67386 | 21 | |
| 67463 | 22 | fun pretty_term_typ ctxt (style: style, t) = | 
| 67386 | 23 | let val t' = style t | 
| 73761 | 24 | in Document_Output.pretty_term ctxt (Type.constraint (Term.fastype_of t') t') end; | 
| 67386 | 25 | |
| 67463 | 26 | fun pretty_term_typeof ctxt (style: style, t) = | 
| 67386 | 27 | Syntax.pretty_typ ctxt (Term.fastype_of (style t)); | 
| 28 | ||
| 29 | fun pretty_const ctxt c = | |
| 30 | let | |
| 31 | val t = Const (c, Consts.type_scheme (Proof_Context.consts_of ctxt) c) | |
| 32 | handle TYPE (msg, _, _) => error msg; | |
| 70326 | 33 | val (t', _) = yield_singleton (Variable.import_terms true) t ctxt; | 
| 73761 | 34 | in Document_Output.pretty_term ctxt t' end; | 
| 67386 | 35 | |
| 36 | fun pretty_abbrev ctxt s = | |
| 37 | let | |
| 38 | val t = Syntax.read_term (Proof_Context.set_mode Proof_Context.mode_abbrev ctxt) s; | |
| 39 |     fun err () = error ("Abbreviated constant expected: " ^ Syntax.string_of_term ctxt t);
 | |
| 40 | val (head, args) = Term.strip_comb t; | |
| 41 | val (c, T) = Term.dest_Const head handle TERM _ => err (); | |
| 42 | val (U, u) = Consts.the_abbreviation (Proof_Context.consts_of ctxt) c | |
| 43 | handle TYPE _ => err (); | |
| 44 | val t' = Term.betapplys (Envir.expand_atom T (U, u), args); | |
| 45 | val eq = Logic.mk_equals (t, t'); | |
| 70308 | 46 | val ctxt' = Proof_Context.augment eq ctxt; | 
| 67386 | 47 | in Proof_Context.pretty_term_abbrev ctxt' eq end; | 
| 48 | ||
| 49 | fun pretty_locale ctxt (name, pos) = | |
| 81533 
fb49af893986
proper context for extern/check operation: observe local options like names_unique;
 wenzelm parents: 
80846diff
changeset | 50 | Pretty.str (Locale.extern ctxt (Locale.check ctxt (name, pos))); | 
| 67386 | 51 | |
| 74122 | 52 | fun pretty_bundle ctxt (name, pos) = | 
| 53 | Pretty.str (Bundle.extern ctxt (Bundle.check ctxt (name, pos))); | |
| 54 | ||
| 69349 
7cef9e386ffe
more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
 wenzelm parents: 
68823diff
changeset | 55 | fun pretty_class ctxt s = | 
| 
7cef9e386ffe
more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
 wenzelm parents: 
68823diff
changeset | 56 | Pretty.str (Proof_Context.extern_class ctxt (Proof_Context.read_class ctxt s)); | 
| 67386 | 57 | |
| 58 | fun pretty_type ctxt s = | |
| 59 |   let val Type (name, _) = Proof_Context.read_type_name {proper = true, strict = false} ctxt s
 | |
| 60 | in Pretty.str (Proof_Context.extern_type ctxt name) end; | |
| 61 | ||
| 70839 
2136e4670ad2
clarified standard_proof_of: prefer expand_proof over somewhat adhoc strip_thm_proof;
 wenzelm parents: 
70326diff
changeset | 62 | fun pretty_prf full ctxt = Proof_Syntax.pretty_standard_proof_of ctxt full; | 
| 67386 | 63 | |
| 68482 | 64 | fun pretty_theory ctxt (name, pos) = | 
| 68484 | 65 |   (Theory.check {long = true} ctxt (name, pos); Pretty.str name);
 | 
| 67386 | 66 | |
| 73761 | 67 | val basic_entity = Document_Output.antiquotation_pretty_source_embedded; | 
| 67386 | 68 | |
| 67505 
ceb324e34c14
clarified signature: items with \isasep are special;
 wenzelm parents: 
67497diff
changeset | 69 | fun basic_entities name scan pretty = | 
| 
ceb324e34c14
clarified signature: items with \isasep are special;
 wenzelm parents: 
67497diff
changeset | 70 | Document_Antiquotation.setup name scan | 
| 
ceb324e34c14
clarified signature: items with \isasep are special;
 wenzelm parents: 
67497diff
changeset | 71 |     (fn {context = ctxt, source = src, argument = xs} =>
 | 
| 73761 | 72 |       Document_Output.pretty_items_source ctxt {embedded = false} src (map (pretty ctxt) xs));
 | 
| 67386 | 73 | |
| 74 | val _ = Theory.setup | |
| 67505 
ceb324e34c14
clarified signature: items with \isasep are special;
 wenzelm parents: 
67497diff
changeset | 75 | (basic_entity \<^binding>\<open>prop\<close> (Term_Style.parse -- Args.prop) pretty_term_style #> | 
| 67386 | 76 | basic_entity \<^binding>\<open>term\<close> (Term_Style.parse -- Args.term) pretty_term_style #> | 
| 77 | basic_entity \<^binding>\<open>term_type\<close> (Term_Style.parse -- Args.term) pretty_term_typ #> | |
| 78 | basic_entity \<^binding>\<open>typeof\<close> (Term_Style.parse -- Args.term) pretty_term_typeof #> | |
| 79 |   basic_entity \<^binding>\<open>const\<close> (Args.const {proper = true, strict = false}) pretty_const #>
 | |
| 74563 | 80 | basic_entity \<^binding>\<open>abbrev\<close> (Scan.lift Parse.embedded_inner_syntax) pretty_abbrev #> | 
| 67386 | 81 | basic_entity \<^binding>\<open>typ\<close> Args.typ_abbrev Syntax.pretty_typ #> | 
| 74563 | 82 | basic_entity \<^binding>\<open>locale\<close> (Scan.lift Parse.embedded_position) pretty_locale #> | 
| 83 | basic_entity \<^binding>\<open>bundle\<close> (Scan.lift Parse.embedded_position) pretty_bundle #> | |
| 84 | basic_entity \<^binding>\<open>class\<close> (Scan.lift Parse.embedded_inner_syntax) pretty_class #> | |
| 85 | basic_entity \<^binding>\<open>type\<close> (Scan.lift Parse.embedded_inner_syntax) pretty_type #> | |
| 86 | basic_entity \<^binding>\<open>theory\<close> (Scan.lift Parse.embedded_position) pretty_theory #> | |
| 67386 | 87 | basic_entities \<^binding>\<open>prf\<close> Attrib.thms (pretty_prf false) #> | 
| 88 | basic_entities \<^binding>\<open>full_prf\<close> Attrib.thms (pretty_prf true) #> | |
| 67505 
ceb324e34c14
clarified signature: items with \isasep are special;
 wenzelm parents: 
67497diff
changeset | 89 | Document_Antiquotation.setup \<^binding>\<open>thm\<close> (Term_Style.parse -- Attrib.thms) | 
| 
ceb324e34c14
clarified signature: items with \isasep are special;
 wenzelm parents: 
67497diff
changeset | 90 |     (fn {context = ctxt, source = src, argument = arg} =>
 | 
| 73761 | 91 |       Document_Output.pretty_items_source ctxt {embedded = false} src (pretty_thms_style ctxt arg)));
 | 
| 67386 | 92 | |
| 73755 | 93 | in end; | 
| 67386 | 94 | |
| 95 | ||
| 62153 
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
 wenzelm parents: 
62058diff
changeset | 96 | (* Markdown errors *) | 
| 
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
 wenzelm parents: 
62058diff
changeset | 97 | |
| 
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
 wenzelm parents: 
62058diff
changeset | 98 | local | 
| 
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
 wenzelm parents: 
62058diff
changeset | 99 | |
| 
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
 wenzelm parents: 
62058diff
changeset | 100 | fun markdown_error binding = | 
| 67386 | 101 | Document_Antiquotation.setup binding (Scan.succeed ()) | 
| 67463 | 102 |     (fn {source = src, ...} =>
 | 
| 62153 
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
 wenzelm parents: 
62058diff
changeset | 103 |       error ("Bad Markdown structure: illegal " ^ quote (Binding.name_of binding) ^
 | 
| 67463 | 104 | Position.here (Position.no_range_position (#1 (Token.range_of src))))) | 
| 62153 
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
 wenzelm parents: 
62058diff
changeset | 105 | |
| 
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
 wenzelm parents: 
62058diff
changeset | 106 | val _ = | 
| 
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
 wenzelm parents: 
62058diff
changeset | 107 | Theory.setup | 
| 67147 | 108 | (markdown_error \<^binding>\<open>item\<close> #> | 
| 109 | markdown_error \<^binding>\<open>enum\<close> #> | |
| 110 | markdown_error \<^binding>\<open>descr\<close>); | |
| 62153 
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
 wenzelm parents: 
62058diff
changeset | 111 | |
| 73755 | 112 | in end; | 
| 62153 
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
 wenzelm parents: 
62058diff
changeset | 113 | |
| 
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
 wenzelm parents: 
62058diff
changeset | 114 | |
| 61619 | 115 | (* control spacing *) | 
| 116 | ||
| 117 | val _ = | |
| 118 | Theory.setup | |
| 73761 | 119 | (Document_Output.antiquotation_raw \<^binding>\<open>noindent\<close> (Scan.succeed ()) | 
| 67463 | 120 | (fn _ => fn () => Latex.string "\\noindent") #> | 
| 73761 | 121 | Document_Output.antiquotation_raw \<^binding>\<open>smallskip\<close> (Scan.succeed ()) | 
| 67463 | 122 | (fn _ => fn () => Latex.string "\\smallskip") #> | 
| 73761 | 123 | Document_Output.antiquotation_raw \<^binding>\<open>medskip\<close> (Scan.succeed ()) | 
| 67463 | 124 | (fn _ => fn () => Latex.string "\\medskip") #> | 
| 73761 | 125 | Document_Output.antiquotation_raw \<^binding>\<open>bigskip\<close> (Scan.succeed ()) | 
| 67463 | 126 | (fn _ => fn () => Latex.string "\\bigskip")); | 
| 61619 | 127 | |
| 128 | ||
| 73753 | 129 | (* nested document text *) | 
| 61619 | 130 | |
| 131 | local | |
| 132 | ||
| 74790 | 133 | fun nested_antiquotation name macro = | 
| 73761 | 134 | Document_Output.antiquotation_raw_embedded name (Scan.lift Args.cartouche_input) | 
| 73752 | 135 | (fn ctxt => fn txt => | 
| 73761 | 136 | (Context_Position.reports ctxt (Document_Output.document_reports txt); | 
| 74790 | 137 |         Latex.macro macro (Document_Output.output_document ctxt {markdown = false} txt)));
 | 
| 61619 | 138 | |
| 139 | val _ = | |
| 140 | Theory.setup | |
| 74790 | 141 | (nested_antiquotation \<^binding>\<open>footnote\<close> "footnote" #> | 
| 142 | nested_antiquotation \<^binding>\<open>emph\<close> "emph" #> | |
| 143 | nested_antiquotation \<^binding>\<open>bold\<close> "textbf"); | |
| 61619 | 144 | |
| 73755 | 145 | in end; | 
| 61619 | 146 | |
| 147 | ||
| 73754 | 148 | (* index entries *) | 
| 149 | ||
| 150 | local | |
| 151 | ||
| 152 | val index_like = Parse.$$$ "(" |-- Parse.!!! (Parse.$$$ "is" |-- Args.name --| Parse.$$$ ")");
 | |
| 74563 | 153 | val index_args = Parse.enum1 "!" (Parse.embedded_input -- Scan.option index_like); | 
| 73754 | 154 | |
| 73780 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73769diff
changeset | 155 | fun output_text ctxt = Document_Output.output_document ctxt {markdown = false};
 | 
| 73754 | 156 | |
| 157 | fun index binding def = | |
| 73761 | 158 | Document_Output.antiquotation_raw binding (Scan.lift index_args) | 
| 73754 | 159 | (fn ctxt => fn args => | 
| 73756 | 160 | let | 
| 73761 | 161 | val _ = Context_Position.reports ctxt (maps (Document_Output.document_reports o #1) args); | 
| 73756 | 162 | fun make_item (txt, opt_like) = | 
| 163 | let | |
| 164 | val text = output_text ctxt txt; | |
| 165 | val like = | |
| 166 | (case opt_like of | |
| 167 | SOME s => s | |
| 73767 | 168 | | NONE => Document_Antiquotation.approx_content ctxt (Input.string_of txt)); | 
| 73756 | 169 | val _ = | 
| 170 | if is_none opt_like andalso Context_Position.is_visible ctxt then | |
| 171 |                 writeln ("(" ^ Markup.markup Markup.keyword2 "is" ^ " " ^ quote like ^ ")" ^
 | |
| 172 | Position.here (Input.pos_of txt)) | |
| 173 | else (); | |
| 174 |           in {text = text, like = like} end;
 | |
| 175 |       in Latex.index_entry {items = map make_item args, def = def} end);
 | |
| 73754 | 176 | |
| 177 | val _ = Theory.setup (index \<^binding>\<open>index_ref\<close> false #> index \<^binding>\<open>index_def\<close> true); | |
| 178 | ||
| 73755 | 179 | in end; | 
| 73754 | 180 | |
| 181 | ||
| 61619 | 182 | (* quasi-formal text (unchecked) *) | 
| 183 | ||
| 184 | local | |
| 185 | ||
| 67474 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 186 | fun report_text ctxt text = | 
| 69965 
da5e7278286b
more markup for various text kinds, notably for nested formal comments;
 wenzelm parents: 
69592diff
changeset | 187 | let val pos = Input.pos_of text in | 
| 
da5e7278286b
more markup for various text kinds, notably for nested formal comments;
 wenzelm parents: 
69592diff
changeset | 188 | Context_Position.reports ctxt | 
| 
da5e7278286b
more markup for various text kinds, notably for nested formal comments;
 wenzelm parents: 
69592diff
changeset | 189 | [(pos, Markup.language_text (Input.is_delimited text)), | 
| 
da5e7278286b
more markup for various text kinds, notably for nested formal comments;
 wenzelm parents: 
69592diff
changeset | 190 | (pos, Markup.raw_text)] | 
| 
da5e7278286b
more markup for various text kinds, notably for nested formal comments;
 wenzelm parents: 
69592diff
changeset | 191 | end; | 
| 67474 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 192 | |
| 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 193 | fun prepare_text ctxt = | 
| 69349 
7cef9e386ffe
more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
 wenzelm parents: 
68823diff
changeset | 194 | Input.source_content #> #1 #> Document_Antiquotation.prepare_lines ctxt; | 
| 67474 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 195 | |
| 61619 | 196 | fun text_antiquotation name = | 
| 74887 | 197 | Document_Output.antiquotation_raw_embedded name (Scan.lift Parse.embedded_input) | 
| 67463 | 198 | (fn ctxt => fn text => | 
| 199 | let | |
| 67474 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 200 | val _ = report_text ctxt text; | 
| 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 201 | in | 
| 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 202 | prepare_text ctxt text | 
| 73761 | 203 | |> Document_Output.output_source ctxt | 
| 204 | |> Document_Output.isabelle ctxt | |
| 67474 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 205 | end); | 
| 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 206 | |
| 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 207 | val theory_text_antiquotation = | 
| 74887 | 208 | Document_Output.antiquotation_raw_embedded \<^binding>\<open>theory_text\<close> (Scan.lift Parse.embedded_input) | 
| 67474 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 209 | (fn ctxt => fn text => | 
| 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 210 | let | 
| 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 211 | val keywords = Thy_Header.get_keywords' ctxt; | 
| 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 212 | |
| 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 213 | val _ = report_text ctxt text; | 
| 67463 | 214 | val _ = | 
| 67474 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 215 | Input.source_explode text | 
| 67497 | 216 |           |> Token.tokenize keywords {strict = true}
 | 
| 67474 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 217 | |> maps (Token.reports keywords) | 
| 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 218 | |> Context_Position.reports_text ctxt; | 
| 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 219 | in | 
| 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 220 | prepare_text ctxt text | 
| 67495 | 221 | |> Token.explode0 keywords | 
| 73761 | 222 | |> maps (Document_Output.output_token ctxt) | 
| 223 | |> Document_Output.isabelle ctxt | |
| 67474 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 224 | end); | 
| 61619 | 225 | |
| 226 | val _ = | |
| 227 | Theory.setup | |
| 67147 | 228 | (text_antiquotation \<^binding>\<open>text\<close> #> | 
| 67474 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 229 | text_antiquotation \<^binding>\<open>cartouche\<close> #> | 
| 
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
 wenzelm parents: 
67471diff
changeset | 230 | theory_text_antiquotation); | 
| 61619 | 231 | |
| 73755 | 232 | in end; | 
| 61619 | 233 | |
| 234 | ||
| 235 | (* goal state *) | |
| 236 | ||
| 237 | local | |
| 238 | ||
| 67463 | 239 | fun goal_state name main = | 
| 73761 | 240 | Document_Output.antiquotation_pretty name (Scan.succeed ()) | 
| 67463 | 241 | (fn ctxt => fn () => | 
| 67505 
ceb324e34c14
clarified signature: items with \isasep are special;
 wenzelm parents: 
67497diff
changeset | 242 | Goal_Display.pretty_goal | 
| 61619 | 243 | (Config.put Goal_Display.show_main_goal main ctxt) | 
| 67505 
ceb324e34c14
clarified signature: items with \isasep are special;
 wenzelm parents: 
67497diff
changeset | 244 | (#goal (Proof.goal (Toplevel.proof_of (Toplevel.presentation_state ctxt))))); | 
| 61619 | 245 | |
| 246 | val _ = Theory.setup | |
| 67147 | 247 | (goal_state \<^binding>\<open>goals\<close> true #> | 
| 248 | goal_state \<^binding>\<open>subgoals\<close> false); | |
| 61619 | 249 | |
| 73755 | 250 | in end; | 
| 61619 | 251 | |
| 252 | ||
| 253 | (* embedded lemma *) | |
| 254 | ||
| 255 | val _ = Theory.setup | |
| 67386 | 256 | (Document_Antiquotation.setup \<^binding>\<open>lemma\<close> | 
| 74601 
b7804cff55d9
clarified keywords: major take precedence for commands, but not used for antiquotations;
 wenzelm parents: 
74563diff
changeset | 257 | (Scan.lift (Scan.ahead Parse.not_eof) -- Args.prop -- Scan.lift Method.parse_by) | 
| 
b7804cff55d9
clarified keywords: major take precedence for commands, but not used for antiquotations;
 wenzelm parents: 
74563diff
changeset | 258 |     (fn {context = ctxt, source = src, argument = ((prop_tok, prop), (methods, reports))} =>
 | 
| 61619 | 259 | let | 
| 260 | val _ = Context_Position.reports ctxt reports; | |
| 261 | ||
| 262 | (* FIXME check proof!? *) | |
| 263 | val _ = ctxt | |
| 264 | |> Proof.theorem NONE (K I) [[(prop, [])]] | |
| 74601 
b7804cff55d9
clarified keywords: major take precedence for commands, but not used for antiquotations;
 wenzelm parents: 
74563diff
changeset | 265 | |> Proof.global_terminal_proof methods; | 
| 70122 
a0b21b4b7a4a
strip cartouches from arguments of "embedded" document antiquotations, corresponding to automated update via "isabelle update -u control_cartouches" -- e.g. relevant for documents with thy_output_source (e.g. doc "isar-ref", "jedit", "system");
 wenzelm parents: 
69965diff
changeset | 266 | in | 
| 73761 | 267 |         Document_Output.pretty_source ctxt {embedded = false}
 | 
| 268 | [hd src, prop_tok] (Document_Output.pretty_term ctxt prop) | |
| 70122 
a0b21b4b7a4a
strip cartouches from arguments of "embedded" document antiquotations, corresponding to automated update via "isabelle update -u control_cartouches" -- e.g. relevant for documents with thy_output_source (e.g. doc "isar-ref", "jedit", "system");
 wenzelm parents: 
69965diff
changeset | 269 | end)); | 
| 61619 | 270 | |
| 271 | ||
| 272 | (* verbatim text *) | |
| 273 | ||
| 67463 | 274 | val _ = Theory.setup | 
| 74887 | 275 | (Document_Output.antiquotation_verbatim_embedded \<^binding>\<open>verbatim\<close> (Scan.lift Parse.embedded_input) | 
| 67463 | 276 | (fn ctxt => fn text => | 
| 277 | let | |
| 69965 
da5e7278286b
more markup for various text kinds, notably for nested formal comments;
 wenzelm parents: 
69592diff
changeset | 278 | val pos = Input.pos_of text; | 
| 67463 | 279 | val _ = | 
| 69965 
da5e7278286b
more markup for various text kinds, notably for nested formal comments;
 wenzelm parents: 
69592diff
changeset | 280 | Context_Position.reports ctxt | 
| 
da5e7278286b
more markup for various text kinds, notably for nested formal comments;
 wenzelm parents: 
69592diff
changeset | 281 | [(pos, Markup.language_verbatim (Input.is_delimited text)), | 
| 
da5e7278286b
more markup for various text kinds, notably for nested formal comments;
 wenzelm parents: 
69592diff
changeset | 282 | (pos, Markup.raw_text)]; | 
| 69349 
7cef9e386ffe
more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
 wenzelm parents: 
68823diff
changeset | 283 | in #1 (Input.source_content text) end)); | 
| 61619 | 284 | |
| 285 | ||
| 71902 
1529336eaedc
check bash functions against Isabelle settings environment;
 wenzelm parents: 
71519diff
changeset | 286 | (* bash functions *) | 
| 
1529336eaedc
check bash functions against Isabelle settings environment;
 wenzelm parents: 
71519diff
changeset | 287 | |
| 
1529336eaedc
check bash functions against Isabelle settings environment;
 wenzelm parents: 
71519diff
changeset | 288 | val _ = Theory.setup | 
| 73761 | 289 | (Document_Output.antiquotation_verbatim_embedded \<^binding>\<open>bash_function\<close> | 
| 74563 | 290 | (Scan.lift Parse.embedded_position) Isabelle_System.check_bash_function); | 
| 71902 
1529336eaedc
check bash functions against Isabelle settings environment;
 wenzelm parents: 
71519diff
changeset | 291 | |
| 
1529336eaedc
check bash functions against Isabelle settings environment;
 wenzelm parents: 
71519diff
changeset | 292 | |
| 71146 | 293 | (* system options *) | 
| 294 | ||
| 295 | val _ = Theory.setup | |
| 73761 | 296 | (Document_Output.antiquotation_verbatim_embedded \<^binding>\<open>system_option\<close> | 
| 74563 | 297 | (Scan.lift Parse.embedded_position) | 
| 71146 | 298 | (fn ctxt => fn (name, pos) => | 
| 299 | let val _ = Completion.check_option (Options.default ()) ctxt (name, pos); | |
| 300 | in name end)); | |
| 301 | ||
| 302 | ||
| 61619 | 303 | (* ML text *) | 
| 304 | ||
| 305 | local | |
| 306 | ||
| 73765 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 307 | fun test_val (ml1, []) = ML_Lex.read "fn _ => (" @ ml1 @ ML_Lex.read ");"
 | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 308 |   | test_val (ml1, ml2) = ML_Lex.read "fn _ => (" @ ml1 @ ML_Lex.read " : " @ ml2 @ ML_Lex.read ");";
 | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 309 | |
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 310 | fun test_op (ml1, ml2) = test_val (ML_Lex.read "op " @ ml1, ml2); | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 311 | |
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 312 | fun test_type (ml1, []) = ML_Lex.read "val _ = NONE : (" @ ml1 @ ML_Lex.read ") option;"
 | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 313 | | test_type (ml1, ml2) = | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 314 |       ML_Lex.read "val _ = [NONE : (" @ ml1 @ ML_Lex.read ") option, NONE : (" @
 | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 315 | ml2 @ ML_Lex.read ") option];"; | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 316 | |
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 317 | fun test_exn (ml1, []) = ML_Lex.read "fn _ => (" @ ml1 @ ML_Lex.read " : exn);"
 | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 318 | | test_exn (ml1, ml2) = | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 319 |       ML_Lex.read "fn _ => (" @ ml1 @ ML_Lex.read " : " @ ml2 @ ML_Lex.read " -> exn);";
 | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 320 | |
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 321 | fun test_struct (ml, _) = | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 322 | ML_Lex.read "functor XXX() = struct structure XX = " @ ml @ ML_Lex.read " end;"; | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 323 | |
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 324 | fun test_functor (Antiquote.Text tok :: _, _) = | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 325 | ML_Lex.read "ML_Env.check_functor " @ | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 326 | ML_Lex.read (ML_Syntax.print_string (ML_Lex.content_of tok)) | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 327 | | test_functor _ = raise Fail "Bad ML functor specification"; | 
| 61619 | 328 | |
| 74887 | 329 | val parse_ml0 = Parse.embedded_input >> (fn source => ("", (source, Input.empty)));
 | 
| 73769 | 330 | |
| 331 | val parse_ml = | |
| 74887 | 332 | Parse.embedded_input -- Scan.optional (Args.colon |-- Parse.embedded_input) Input.empty >> pair ""; | 
| 73769 | 333 | |
| 334 | val parse_exn = | |
| 74887 | 335 | Parse.embedded_input -- Scan.optional (Args.$$$ "of" |-- Parse.embedded_input) Input.empty >> pair ""; | 
| 73769 | 336 | |
| 337 | val parse_type = | |
| 338 |   (Parse.type_args >> (fn [] => "" | [a] => a ^ " " | bs => enclose "(" ") " (commas bs))) --
 | |
| 74887 | 339 | (Parse.embedded_input -- Scan.optional (Args.$$$ "=" |-- Parse.embedded_input) Input.empty); | 
| 73765 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 340 | |
| 73768 | 341 | fun eval ctxt pos ml = | 
| 342 | ML_Context.eval_in (SOME ctxt) ML_Compiler.flags pos ml | |
| 343 | handle ERROR msg => error (msg ^ Position.here pos); | |
| 344 | ||
| 345 | fun make_text sep sources = | |
| 346 | let | |
| 347 | val (txt1, txt2) = apply2 (#1 o Input.source_content) sources; | |
| 348 | val is_ident = | |
| 349 | (case try List.last (Symbol.explode txt1) of | |
| 350 | NONE => false | |
| 351 | | SOME s => Symbol.is_ascii_letdig s); | |
| 352 | val txt = | |
| 353 | if txt2 = "" then txt1 | |
| 354 | else if sep = ":" andalso is_ident then txt1 ^ ": " ^ txt2 | |
| 355 | else txt1 ^ " " ^ sep ^ " " ^ txt2 | |
| 356 | in (txt, txt1) end; | |
| 357 | ||
| 73765 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 358 | fun antiquotation_ml parse test kind show_kind binding index = | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 359 | Document_Output.antiquotation_raw binding (Scan.lift parse) | 
| 73769 | 360 | (fn ctxt => fn (txt0, sources) => | 
| 73765 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 361 | let | 
| 73769 | 362 | val (ml1, ml2) = apply2 ML_Lex.read_source sources; | 
| 363 | val ml0 = ML_Lex.read_source (Input.string txt0); | |
| 364 | val _ = test (ml0 @ ml1, ml2) |> eval ctxt (Input.pos_of (#1 sources)); | |
| 61619 | 365 | |
| 73765 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 366 | val sep = if kind = "type" then "=" else if kind = "exception" then "of" else ":"; | 
| 73768 | 367 | val (txt, idx) = make_text sep sources; | 
| 73765 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 368 | |
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 369 | val main_text = | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 370 | Document_Output.verbatim ctxt | 
| 73769 | 371 | ((if kind = "" orelse not show_kind then "" else kind ^ " ") ^ txt0 ^ txt); | 
| 73765 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 372 | val index_text = | 
| 73780 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73769diff
changeset | 373 | (case index of | 
| 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73769diff
changeset | 374 | NONE => [] | 
| 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73769diff
changeset | 375 | | SOME def => | 
| 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73769diff
changeset | 376 | let | 
| 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73769diff
changeset | 377 | val ctxt' = Config.put Document_Antiquotation.thy_output_display false ctxt; | 
| 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73769diff
changeset | 378 | val kind' = if kind = "" then " (ML)" else " (ML " ^ kind ^ ")"; | 
| 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73769diff
changeset | 379 | val txt' = Document_Output.verbatim ctxt' idx @ Latex.string kind'; | 
| 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73769diff
changeset | 380 | val like = Document_Antiquotation.approx_content ctxt' idx; | 
| 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73769diff
changeset | 381 |               in Latex.index_entry {items = [{text = txt', like = like}], def = def} end);
 | 
| 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73769diff
changeset | 382 | in index_text @ main_text end); | 
| 61619 | 383 | |
| 73765 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 384 | fun antiquotation_ml0 test kind = | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 385 | antiquotation_ml parse_ml0 test kind false; | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 386 | |
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 387 | fun antiquotation_ml1 parse test kind binding = | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 388 | antiquotation_ml parse test kind true binding (SOME true); | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 389 | |
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 390 | in | 
| 61619 | 391 | |
| 73765 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 392 | val _ = | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 393 | Theory.setup | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 394 | (Latex.index_variants (antiquotation_ml0 test_val "") \<^binding>\<open>ML\<close> #> | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 395 | Latex.index_variants (antiquotation_ml0 test_op "infix") \<^binding>\<open>ML_infix\<close> #> | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 396 | Latex.index_variants (antiquotation_ml0 test_type "type") \<^binding>\<open>ML_type\<close> #> | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 397 | Latex.index_variants (antiquotation_ml0 test_struct "structure") \<^binding>\<open>ML_structure\<close> #> | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 398 | Latex.index_variants (antiquotation_ml0 test_functor "functor") \<^binding>\<open>ML_functor\<close> #> | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 399 | antiquotation_ml0 (K []) "text" \<^binding>\<open>ML_text\<close> NONE #> | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 400 | antiquotation_ml1 parse_ml test_val "" \<^binding>\<open>define_ML\<close> #> | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 401 | antiquotation_ml1 parse_ml test_op "infix" \<^binding>\<open>define_ML_infix\<close> #> | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 402 | antiquotation_ml1 parse_type test_type "type" \<^binding>\<open>define_ML_type\<close> #> | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 403 | antiquotation_ml1 parse_exn test_exn "exception" \<^binding>\<open>define_ML_exception\<close> #> | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 404 | antiquotation_ml1 parse_ml0 test_struct "structure" \<^binding>\<open>define_ML_structure\<close> #> | 
| 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 405 | antiquotation_ml1 parse_ml0 test_functor "functor" \<^binding>\<open>define_ML_functor\<close>); | 
| 61619 | 406 | |
| 73765 
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
 wenzelm parents: 
73762diff
changeset | 407 | end; | 
| 61619 | 408 | |
| 409 | ||
| 410 | (* URLs *) | |
| 411 | ||
| 71519 
8a96a11e0cf5
escape some special chars, notably for URL#NAME form;
 wenzelm parents: 
71146diff
changeset | 412 | val escape_url = | 
| 
8a96a11e0cf5
escape some special chars, notably for URL#NAME form;
 wenzelm parents: 
71146diff
changeset | 413 | translate_string (fn c => if c = "%" orelse c = "#" orelse c = "^" then "\\" ^ c else c); | 
| 
8a96a11e0cf5
escape some special chars, notably for URL#NAME form;
 wenzelm parents: 
71146diff
changeset | 414 | |
| 61619 | 415 | val _ = Theory.setup | 
| 74563 | 416 | (Document_Output.antiquotation_raw_embedded \<^binding>\<open>url\<close> (Scan.lift Parse.embedded_input) | 
| 72841 | 417 | (fn ctxt => fn source => | 
| 418 | let | |
| 419 | val url = Input.string_of source; | |
| 420 | val pos = Input.pos_of source; | |
| 421 | val delimited = Input.is_delimited source; | |
| 422 | val _ = | |
| 423 | Context_Position.reports ctxt | |
| 72843 | 424 | [(pos, Markup.language_url delimited), (pos, Markup.url url)]; | 
| 74790 | 425 | in Latex.macro "url" (Latex.string (escape_url url)) end)); | 
| 61619 | 426 | |
| 61623 | 427 | |
| 428 | (* formal entities *) | |
| 429 | ||
| 67463 | 430 | local | 
| 431 | ||
| 74790 | 432 | fun entity_antiquotation name check macro = | 
| 73761 | 433 | Document_Output.antiquotation_raw name (Scan.lift Args.name_position) | 
| 67463 | 434 | (fn ctxt => fn (name, pos) => | 
| 435 | let val _ = check ctxt (name, pos) | |
| 80846 
9ed32b8a03a9
clarified print mode "latex": no longer impact Output/Markup/Pretty operations;
 wenzelm parents: 
74887diff
changeset | 436 | in Latex.macro macro (Latex.string (Latex.output_ name)) end); | 
| 67463 | 437 | |
| 61623 | 438 | val _ = | 
| 439 | Theory.setup | |
| 74790 | 440 | (entity_antiquotation \<^binding>\<open>command\<close> Outer_Syntax.check_command "isacommand" #> | 
| 441 | entity_antiquotation \<^binding>\<open>method\<close> Method.check_name "isa" #> | |
| 442 | entity_antiquotation \<^binding>\<open>attribute\<close> Attrib.check_name "isa"); | |
| 61623 | 443 | |
| 73755 | 444 | in end; | 
| 67463 | 445 | |
| 446 | end; |