author | wenzelm |
Mon, 21 Jul 2025 16:21:37 +0200 | |
changeset 82892 | 45107da819fc |
parent 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:
67497
diff
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:
80846
diff
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:
68823
diff
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:
68823
diff
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:
70326
diff
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:
67497
diff
changeset
|
69 |
fun basic_entities name scan pretty = |
ceb324e34c14
clarified signature: items with \isasep are special;
wenzelm
parents:
67497
diff
changeset
|
70 |
Document_Antiquotation.setup name scan |
ceb324e34c14
clarified signature: items with \isasep are special;
wenzelm
parents:
67497
diff
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:
67497
diff
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:
67497
diff
changeset
|
89 |
Document_Antiquotation.setup \<^binding>\<open>thm\<close> (Term_Style.parse -- Attrib.thms) |
ceb324e34c14
clarified signature: items with \isasep are special;
wenzelm
parents:
67497
diff
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:
62058
diff
changeset
|
96 |
(* Markdown errors *) |
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
wenzelm
parents:
62058
diff
changeset
|
97 |
|
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
wenzelm
parents:
62058
diff
changeset
|
98 |
local |
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
wenzelm
parents:
62058
diff
changeset
|
99 |
|
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
wenzelm
parents:
62058
diff
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:
62058
diff
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:
62058
diff
changeset
|
105 |
|
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
wenzelm
parents:
62058
diff
changeset
|
106 |
val _ = |
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
wenzelm
parents:
62058
diff
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:
62058
diff
changeset
|
111 |
|
73755 | 112 |
in end; |
62153
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
wenzelm
parents:
62058
diff
changeset
|
113 |
|
df566b87e269
more explicit errors for control symbols that are left-over after Markdown parsing;
wenzelm
parents:
62058
diff
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:
73769
diff
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:
67471
diff
changeset
|
186 |
fun report_text ctxt text = |
69965
da5e7278286b
more markup for various text kinds, notably for nested formal comments;
wenzelm
parents:
69592
diff
changeset
|
187 |
let val pos = Input.pos_of text in |
da5e7278286b
more markup for various text kinds, notably for nested formal comments;
wenzelm
parents:
69592
diff
changeset
|
188 |
Context_Position.reports ctxt |
da5e7278286b
more markup for various text kinds, notably for nested formal comments;
wenzelm
parents:
69592
diff
changeset
|
189 |
[(pos, Markup.language_text (Input.is_delimited text)), |
da5e7278286b
more markup for various text kinds, notably for nested formal comments;
wenzelm
parents:
69592
diff
changeset
|
190 |
(pos, Markup.raw_text)] |
da5e7278286b
more markup for various text kinds, notably for nested formal comments;
wenzelm
parents:
69592
diff
changeset
|
191 |
end; |
67474
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
wenzelm
parents:
67471
diff
changeset
|
192 |
|
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
wenzelm
parents:
67471
diff
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:
68823
diff
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:
67471
diff
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:
67471
diff
changeset
|
200 |
val _ = report_text ctxt text; |
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
wenzelm
parents:
67471
diff
changeset
|
201 |
in |
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
wenzelm
parents:
67471
diff
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:
67471
diff
changeset
|
205 |
end); |
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
wenzelm
parents:
67471
diff
changeset
|
206 |
|
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
wenzelm
parents:
67471
diff
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:
67471
diff
changeset
|
209 |
(fn ctxt => fn text => |
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
wenzelm
parents:
67471
diff
changeset
|
210 |
let |
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
wenzelm
parents:
67471
diff
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:
67471
diff
changeset
|
212 |
|
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
wenzelm
parents:
67471
diff
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:
67471
diff
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:
67471
diff
changeset
|
217 |
|> maps (Token.reports keywords) |
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
wenzelm
parents:
67471
diff
changeset
|
218 |
|> Context_Position.reports_text ctxt; |
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
wenzelm
parents:
67471
diff
changeset
|
219 |
in |
90def2b06305
more uniform output of source / text / theory_text, with handling of formal comments etc.;
wenzelm
parents:
67471
diff
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:
67471
diff
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:
67471
diff
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:
67471
diff
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:
67497
diff
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:
67497
diff
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:
74563
diff
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:
74563
diff
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:
74563
diff
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:
69965
diff
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:
69965
diff
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:
69592
diff
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:
69592
diff
changeset
|
280 |
Context_Position.reports ctxt |
da5e7278286b
more markup for various text kinds, notably for nested formal comments;
wenzelm
parents:
69592
diff
changeset
|
281 |
[(pos, Markup.language_verbatim (Input.is_delimited text)), |
da5e7278286b
more markup for various text kinds, notably for nested formal comments;
wenzelm
parents:
69592
diff
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:
68823
diff
changeset
|
283 |
in #1 (Input.source_content text) end)); |
61619 | 284 |
|
285 |
||
71902
1529336eaedc
check bash functions against Isabelle settings environment;
wenzelm
parents:
71519
diff
changeset
|
286 |
(* bash functions *) |
1529336eaedc
check bash functions against Isabelle settings environment;
wenzelm
parents:
71519
diff
changeset
|
287 |
|
1529336eaedc
check bash functions against Isabelle settings environment;
wenzelm
parents:
71519
diff
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:
71519
diff
changeset
|
291 |
|
1529336eaedc
check bash functions against Isabelle settings environment;
wenzelm
parents:
71519
diff
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:
73762
diff
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:
73762
diff
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:
73762
diff
changeset
|
309 |
|
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
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:
73762
diff
changeset
|
311 |
|
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
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:
73762
diff
changeset
|
313 |
| test_type (ml1, ml2) = |
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
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:
73762
diff
changeset
|
315 |
ml2 @ ML_Lex.read ") option];"; |
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
changeset
|
316 |
|
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
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:
73762
diff
changeset
|
318 |
| test_exn (ml1, ml2) = |
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
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:
73762
diff
changeset
|
320 |
|
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
changeset
|
321 |
fun test_struct (ml, _) = |
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
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:
73762
diff
changeset
|
323 |
|
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
changeset
|
324 |
fun test_functor (Antiquote.Text tok :: _, _) = |
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
changeset
|
325 |
ML_Lex.read "ML_Env.check_functor " @ |
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
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:
73762
diff
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:
73762
diff
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:
73762
diff
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:
73762
diff
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:
73762
diff
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:
73762
diff
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:
73762
diff
changeset
|
368 |
|
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
changeset
|
369 |
val main_text = |
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
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:
73762
diff
changeset
|
372 |
val index_text = |
73780
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
wenzelm
parents:
73769
diff
changeset
|
373 |
(case index of |
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
wenzelm
parents:
73769
diff
changeset
|
374 |
NONE => [] |
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
wenzelm
parents:
73769
diff
changeset
|
375 |
| SOME def => |
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
wenzelm
parents:
73769
diff
changeset
|
376 |
let |
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
wenzelm
parents:
73769
diff
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:
73769
diff
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:
73769
diff
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:
73769
diff
changeset
|
380 |
val like = Document_Antiquotation.approx_content ctxt' idx; |
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
wenzelm
parents:
73769
diff
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:
73769
diff
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:
73762
diff
changeset
|
384 |
fun antiquotation_ml0 test kind = |
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
changeset
|
385 |
antiquotation_ml parse_ml0 test kind false; |
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
changeset
|
386 |
|
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
changeset
|
387 |
fun antiquotation_ml1 parse test kind binding = |
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
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:
73762
diff
changeset
|
389 |
|
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
changeset
|
390 |
in |
61619 | 391 |
|
73765
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
changeset
|
392 |
val _ = |
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
changeset
|
393 |
Theory.setup |
ebaed09ce06e
more uniform document antiquotations for ML: consolidate former setup for manuals;
wenzelm
parents:
73762
diff
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:
73762
diff
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:
73762
diff
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:
73762
diff
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:
73762
diff
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:
73762
diff
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:
73762
diff
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:
73762
diff
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:
73762
diff
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:
73762
diff
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:
73762
diff
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:
73762
diff
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:
73762
diff
changeset
|
407 |
end; |
61619 | 408 |
|
409 |
||
410 |
(* URLs *) |
|
411 |
||
71519
8a96a11e0cf5
escape some special chars, notably for URL#NAME form;
wenzelm
parents:
71146
diff
changeset
|
412 |
val escape_url = |
8a96a11e0cf5
escape some special chars, notably for URL#NAME form;
wenzelm
parents:
71146
diff
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:
71146
diff
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:
74887
diff
changeset
|
436 |
in Latex.macro macro (Latex.string (Latex.output_ name)) end); |
67463 | 437 |
|
61623 | 438 |
val _ = |
439 |
Theory.setup |
|
81628
e5be995d21f0
clarified LaTeX presentation: more specific keywords;
wenzelm
parents:
81533
diff
changeset
|
440 |
(entity_antiquotation \<^binding>\<open>command\<close> Outer_Syntax.check_command "isakeywordONE" #> |
74790 | 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; |