| author | wenzelm | 
| Thu, 20 May 2010 13:54:31 +0200 | |
| changeset 36993 | b7cce32953f0 | 
| parent 34242 | 5ccdc8bf3849 | 
| child 37186 | 349e9223c685 | 
| permissions | -rw-r--r-- | 
| 23623 | 1  | 
(* Title: Pure/General/markup.ML  | 
2  | 
Author: Makarius  | 
|
3  | 
||
4  | 
Common markup elements.  | 
|
5  | 
*)  | 
|
6  | 
||
7  | 
signature MARKUP =  | 
|
8  | 
sig  | 
|
| 28017 | 9  | 
type T = string * Properties.T  | 
| 23704 | 10  | 
val none: T  | 
| 27883 | 11  | 
val is_none: T -> bool  | 
| 23704 | 12  | 
val properties: (string * string) list -> T -> T  | 
| 23623 | 13  | 
val nameN: string  | 
| 27818 | 14  | 
val name: string -> T -> T  | 
| 30221 | 15  | 
val bindingN: string val binding: string -> T  | 
| 23658 | 16  | 
val kindN: string  | 
| 
33088
 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 
wenzelm 
parents: 
32738 
diff
changeset
 | 
17  | 
val entityN: string val entity: string -> T  | 
| 
 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 
wenzelm 
parents: 
32738 
diff
changeset
 | 
18  | 
val defN: string  | 
| 
 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 
wenzelm 
parents: 
32738 
diff
changeset
 | 
19  | 
val refN: string  | 
| 23671 | 20  | 
val lineN: string  | 
| 26001 | 21  | 
val columnN: string  | 
| 27794 | 22  | 
val offsetN: string  | 
| 27735 | 23  | 
val end_lineN: string  | 
24  | 
val end_columnN: string  | 
|
| 27794 | 25  | 
val end_offsetN: string  | 
| 23671 | 26  | 
val fileN: string  | 
| 30221 | 27  | 
val idN: string  | 
| 27748 | 28  | 
val position_properties': string list  | 
| 26051 | 29  | 
val position_properties: string list  | 
| 23671 | 30  | 
val positionN: string val position: T  | 
| 26255 | 31  | 
val locationN: string val location: T  | 
| 23644 | 32  | 
val indentN: string  | 
| 23704 | 33  | 
val blockN: string val block: int -> T  | 
| 23695 | 34  | 
val widthN: string  | 
| 23644 | 35  | 
val breakN: string val break: int -> T  | 
36  | 
val fbreakN: string val fbreak: T  | 
|
| 33985 | 37  | 
val hiddenN: string val hidden: T  | 
| 
27828
 
edafacb690a3
renamed Markup.class to Markup.tclass, to avoid potential conflicts with spacial meaning in markup languages (e.g. HTML);
 
wenzelm 
parents: 
27818 
diff
changeset
 | 
38  | 
val tclassN: string val tclass: string -> T  | 
| 23637 | 39  | 
val tyconN: string val tycon: string -> T  | 
| 28077 | 40  | 
val fixed_declN: string val fixed_decl: string -> T  | 
| 
26702
 
a079f8f0080b
added markup for fixed variables (local constants);
 
wenzelm 
parents: 
26255 
diff
changeset
 | 
41  | 
val fixedN: string val fixed: string -> T  | 
| 28113 | 42  | 
val const_declN: string val const_decl: string -> T  | 
| 23637 | 43  | 
val constN: string val const: string -> T  | 
| 28077 | 44  | 
val fact_declN: string val fact_decl: string -> T  | 
| 27740 | 45  | 
val factN: string val fact: string -> T  | 
46  | 
val dynamic_factN: string val dynamic_fact: string -> T  | 
|
| 28077 | 47  | 
val local_fact_declN: string val local_fact_decl: string -> T  | 
| 27818 | 48  | 
val local_factN: string val local_fact: string -> T  | 
| 23719 | 49  | 
val tfreeN: string val tfree: T  | 
50  | 
val tvarN: string val tvar: T  | 
|
51  | 
val freeN: string val free: T  | 
|
52  | 
val skolemN: string val skolem: T  | 
|
53  | 
val boundN: string val bound: T  | 
|
54  | 
val varN: string val var: T  | 
|
| 
29318
 
6337d1cb2ba0
added numeral, which supercedes num, xnum, float;
 
wenzelm 
parents: 
28904 
diff
changeset
 | 
55  | 
val numeralN: string val numeral: T  | 
| 27804 | 56  | 
val literalN: string val literal: T  | 
| 
29318
 
6337d1cb2ba0
added numeral, which supercedes num, xnum, float;
 
wenzelm 
parents: 
28904 
diff
changeset
 | 
57  | 
val inner_stringN: string val inner_string: T  | 
| 27883 | 58  | 
val inner_commentN: string val inner_comment: T  | 
| 23637 | 59  | 
val sortN: string val sort: T  | 
60  | 
val typN: string val typ: T  | 
|
61  | 
val termN: string val term: T  | 
|
| 27818 | 62  | 
val propN: string val prop: T  | 
| 27748 | 63  | 
val attributeN: string val attribute: string -> T  | 
64  | 
val methodN: string val method: string -> T  | 
|
| 30614 | 65  | 
val ML_keywordN: string val ML_keyword: T  | 
66  | 
val ML_identN: string val ML_ident: T  | 
|
67  | 
val ML_tvarN: string val ML_tvar: T  | 
|
68  | 
val ML_numeralN: string val ML_numeral: T  | 
|
69  | 
val ML_charN: string val ML_char: T  | 
|
70  | 
val ML_stringN: string val ML_string: T  | 
|
71  | 
val ML_commentN: string val ML_comment: T  | 
|
72  | 
val ML_malformedN: string val ML_malformed: T  | 
|
| 30702 | 73  | 
val ML_defN: string val ML_def: T  | 
| 31472 | 74  | 
val ML_openN: string val ML_open: T  | 
75  | 
val ML_structN: string val ML_struct: T  | 
|
| 30702 | 76  | 
val ML_refN: string val ML_ref: T  | 
77  | 
val ML_typingN: string val ML_typing: T  | 
|
| 27875 | 78  | 
val ML_sourceN: string val ML_source: T  | 
79  | 
val doc_sourceN: string val doc_source: T  | 
|
| 27879 | 80  | 
val antiqN: string val antiq: T  | 
| 27894 | 81  | 
val ML_antiqN: string val ML_antiq: string -> T  | 
82  | 
val doc_antiqN: string val doc_antiq: string -> T  | 
|
| 27836 | 83  | 
val keyword_declN: string val keyword_decl: string -> T  | 
84  | 
val command_declN: string val command_decl: string -> string -> T  | 
|
| 23637 | 85  | 
val keywordN: string val keyword: string -> T  | 
86  | 
val commandN: string val command: string -> T  | 
|
| 27836 | 87  | 
val identN: string val ident: T  | 
| 23719 | 88  | 
val stringN: string val string: T  | 
89  | 
val altstringN: string val altstring: T  | 
|
90  | 
val verbatimN: string val verbatim: T  | 
|
91  | 
val commentN: string val comment: T  | 
|
92  | 
val controlN: string val control: T  | 
|
93  | 
val malformedN: string val malformed: T  | 
|
| 27851 | 94  | 
val tokenN: string val token: T  | 
| 27660 | 95  | 
val command_spanN: string val command_span: string -> T  | 
96  | 
val ignored_spanN: string val ignored_span: T  | 
|
| 27836 | 97  | 
val malformed_spanN: string val malformed_span: T  | 
| 23637 | 98  | 
val stateN: string val state: T  | 
99  | 
val subgoalN: string val subgoal: T  | 
|
| 24289 | 100  | 
val sendbackN: string val sendback: T  | 
| 24555 | 101  | 
val hiliteN: string val hilite: T  | 
| 29417 | 102  | 
val taskN: string  | 
| 27606 | 103  | 
val unprocessedN: string val unprocessed: T  | 
| 29417 | 104  | 
val runningN: string val running: string -> T  | 
| 27615 | 105  | 
val failedN: string val failed: T  | 
| 27606 | 106  | 
val finishedN: string val finished: T  | 
107  | 
val disposedN: string val disposed: T  | 
|
| 
34242
 
5ccdc8bf3849
explicit markup of document assigment message (simplified variant of earlier "edits" 8c3e1f73953d);
 
wenzelm 
parents: 
34214 
diff
changeset
 | 
108  | 
val assignN: string val assign: T  | 
| 29488 | 109  | 
val editN: string val edit: string -> string -> T  | 
| 27969 | 110  | 
val pidN: string  | 
111  | 
val promptN: string val prompt: T  | 
|
| 
31384
 
ce169bd37fc0
IsabelleProcess: emit status "ready" after initialization and reports;
 
wenzelm 
parents: 
30702 
diff
changeset
 | 
112  | 
val readyN: string val ready: T  | 
| 29325 | 113  | 
val no_output: output * output  | 
| 23704 | 114  | 
val default_output: T -> output * output  | 
| 23786 | 115  | 
val add_mode: string -> (T -> output * output) -> unit  | 
| 23704 | 116  | 
val output: T -> output * output  | 
| 23719 | 117  | 
val enclose: T -> output -> output  | 
| 25552 | 118  | 
val markup: T -> string -> string  | 
| 23623 | 119  | 
end;  | 
120  | 
||
121  | 
structure Markup: MARKUP =  | 
|
122  | 
struct  | 
|
123  | 
||
| 30221 | 124  | 
(** markup elements **)  | 
125  | 
||
| 23658 | 126  | 
(* basic markup *)  | 
| 23623 | 127  | 
|
| 28017 | 128  | 
type T = string * Properties.T;  | 
| 23637 | 129  | 
|
130  | 
val none = ("", []);
 | 
|
131  | 
||
| 27883 | 132  | 
fun is_none ("", _) = true
 | 
133  | 
| is_none _ = false;  | 
|
134  | 
||
| 23794 | 135  | 
|
| 23671 | 136  | 
fun properties more_props ((elem, props): T) =  | 
| 28017 | 137  | 
(elem, fold_rev Properties.put more_props props);  | 
| 23671 | 138  | 
|
| 25552 | 139  | 
fun markup_elem elem = (elem, (elem, []): T);  | 
| 23794 | 140  | 
fun markup_string elem prop = (elem, fn s => (elem, [(prop, s)]): T);  | 
141  | 
fun markup_int elem prop = (elem, fn i => (elem, [(prop, Int.toString i)]): T);  | 
|
142  | 
||
| 26977 | 143  | 
|
144  | 
(* name *)  | 
|
145  | 
||
| 23658 | 146  | 
val nameN = "name";  | 
| 27818 | 147  | 
fun name a = properties [(nameN, a)];  | 
148  | 
||
| 30221 | 149  | 
val (bindingN, binding) = markup_string "binding" nameN;  | 
150  | 
||
| 24777 | 151  | 
|
152  | 
(* kind *)  | 
|
153  | 
||
| 23658 | 154  | 
val kindN = "kind";  | 
| 23671 | 155  | 
|
| 23658 | 156  | 
|
| 
33088
 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 
wenzelm 
parents: 
32738 
diff
changeset
 | 
157  | 
(* formal entities *)  | 
| 
 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 
wenzelm 
parents: 
32738 
diff
changeset
 | 
158  | 
|
| 
 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 
wenzelm 
parents: 
32738 
diff
changeset
 | 
159  | 
val (entityN, entity) = markup_string "entity" nameN;  | 
| 
 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 
wenzelm 
parents: 
32738 
diff
changeset
 | 
160  | 
|
| 
 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 
wenzelm 
parents: 
32738 
diff
changeset
 | 
161  | 
val defN = "def";  | 
| 
 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 
wenzelm 
parents: 
32738 
diff
changeset
 | 
162  | 
val refN = "ref";  | 
| 
 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 
wenzelm 
parents: 
32738 
diff
changeset
 | 
163  | 
|
| 
 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 
wenzelm 
parents: 
32738 
diff
changeset
 | 
164  | 
|
| 23671 | 165  | 
(* position *)  | 
166  | 
||
167  | 
val lineN = "line";  | 
|
| 26001 | 168  | 
val columnN = "column";  | 
| 27794 | 169  | 
val offsetN = "offset";  | 
| 27735 | 170  | 
val end_lineN = "end_line";  | 
171  | 
val end_columnN = "end_column";  | 
|
| 27794 | 172  | 
val end_offsetN = "end_offset";  | 
| 23671 | 173  | 
val fileN = "file";  | 
| 25816 | 174  | 
val idN = "id";  | 
| 23671 | 175  | 
|
| 27794 | 176  | 
val position_properties' = [end_lineN, end_columnN, end_offsetN, fileN, idN];  | 
177  | 
val position_properties = [lineN, columnN, offsetN] @ position_properties';  | 
|
| 27748 | 178  | 
|
| 25552 | 179  | 
val (positionN, position) = markup_elem "position";  | 
| 26255 | 180  | 
val (locationN, location) = markup_elem "location";  | 
181  | 
||
| 23644 | 182  | 
|
183  | 
(* pretty printing *)  | 
|
184  | 
||
185  | 
val indentN = "indent";  | 
|
186  | 
val (blockN, block) = markup_int "block" indentN;  | 
|
187  | 
||
188  | 
val widthN = "width";  | 
|
189  | 
val (breakN, break) = markup_int "break" widthN;  | 
|
190  | 
||
| 25552 | 191  | 
val (fbreakN, fbreak) = markup_elem "fbreak";  | 
| 23637 | 192  | 
|
193  | 
||
| 33985 | 194  | 
(* hidden text *)  | 
195  | 
||
196  | 
val (hiddenN, hidden) = markup_elem "hidden";  | 
|
197  | 
||
198  | 
||
| 23623 | 199  | 
(* logical entities *)  | 
200  | 
||
| 
27828
 
edafacb690a3
renamed Markup.class to Markup.tclass, to avoid potential conflicts with spacial meaning in markup languages (e.g. HTML);
 
wenzelm 
parents: 
27818 
diff
changeset
 | 
201  | 
val (tclassN, tclass) = markup_string "tclass" nameN;  | 
| 23658 | 202  | 
val (tyconN, tycon) = markup_string "tycon" nameN;  | 
| 28077 | 203  | 
val (fixed_declN, fixed_decl) = markup_string "fixed_decl" nameN;  | 
| 
26702
 
a079f8f0080b
added markup for fixed variables (local constants);
 
wenzelm 
parents: 
26255 
diff
changeset
 | 
204  | 
val (fixedN, fixed) = markup_string "fixed" nameN;  | 
| 28113 | 205  | 
val (const_declN, const_decl) = markup_string "const_decl" nameN;  | 
| 23658 | 206  | 
val (constN, const) = markup_string "const" nameN;  | 
| 28077 | 207  | 
val (fact_declN, fact_decl) = markup_string "fact_decl" nameN;  | 
| 27740 | 208  | 
val (factN, fact) = markup_string "fact" nameN;  | 
209  | 
val (dynamic_factN, dynamic_fact) = markup_string "dynamic_fact" nameN;  | 
|
| 28077 | 210  | 
val (local_fact_declN, local_fact_decl) = markup_string "local_fact_decl" nameN;  | 
| 27818 | 211  | 
val (local_factN, local_fact) = markup_string "local_fact" nameN;  | 
| 23623 | 212  | 
|
213  | 
||
214  | 
(* inner syntax *)  | 
|
215  | 
||
| 25552 | 216  | 
val (tfreeN, tfree) = markup_elem "tfree";  | 
217  | 
val (tvarN, tvar) = markup_elem "tvar";  | 
|
218  | 
val (freeN, free) = markup_elem "free";  | 
|
219  | 
val (skolemN, skolem) = markup_elem "skolem";  | 
|
220  | 
val (boundN, bound) = markup_elem "bound";  | 
|
221  | 
val (varN, var) = markup_elem "var";  | 
|
| 
29318
 
6337d1cb2ba0
added numeral, which supercedes num, xnum, float;
 
wenzelm 
parents: 
28904 
diff
changeset
 | 
222  | 
val (numeralN, numeral) = markup_elem "numeral";  | 
| 27804 | 223  | 
val (literalN, literal) = markup_elem "literal";  | 
| 
29318
 
6337d1cb2ba0
added numeral, which supercedes num, xnum, float;
 
wenzelm 
parents: 
28904 
diff
changeset
 | 
224  | 
val (inner_stringN, inner_string) = markup_elem "inner_string";  | 
| 27883 | 225  | 
val (inner_commentN, inner_comment) = markup_elem "inner_comment";  | 
| 23719 | 226  | 
|
| 25552 | 227  | 
val (sortN, sort) = markup_elem "sort";  | 
228  | 
val (typN, typ) = markup_elem "typ";  | 
|
229  | 
val (termN, term) = markup_elem "term";  | 
|
| 27818 | 230  | 
val (propN, prop) = markup_elem "prop";  | 
| 27748 | 231  | 
|
232  | 
val (attributeN, attribute) = markup_string "attribute" nameN;  | 
|
233  | 
val (methodN, method) = markup_string "method" nameN;  | 
|
| 23623 | 234  | 
|
235  | 
||
| 30614 | 236  | 
(* ML syntax *)  | 
237  | 
||
238  | 
val (ML_keywordN, ML_keyword) = markup_elem "ML_keyword";  | 
|
239  | 
val (ML_identN, ML_ident) = markup_elem "ML_ident";  | 
|
240  | 
val (ML_tvarN, ML_tvar) = markup_elem "ML_tvar";  | 
|
241  | 
val (ML_numeralN, ML_numeral) = markup_elem "ML_numeral";  | 
|
242  | 
val (ML_charN, ML_char) = markup_elem "ML_char";  | 
|
243  | 
val (ML_stringN, ML_string) = markup_elem "ML_string";  | 
|
244  | 
val (ML_commentN, ML_comment) = markup_elem "ML_comment";  | 
|
245  | 
val (ML_malformedN, ML_malformed) = markup_elem "ML_malformed";  | 
|
246  | 
||
| 30702 | 247  | 
val (ML_defN, ML_def) = markup_elem "ML_def";  | 
| 31472 | 248  | 
val (ML_openN, ML_open) = markup_elem "ML_open";  | 
249  | 
val (ML_structN, ML_struct) = markup_elem "ML_struct";  | 
|
| 30702 | 250  | 
val (ML_refN, ML_ref) = markup_elem "ML_ref";  | 
251  | 
val (ML_typingN, ML_typing) = markup_elem "ML_typing";  | 
|
252  | 
||
| 30614 | 253  | 
|
| 27875 | 254  | 
(* embedded source text *)  | 
255  | 
||
256  | 
val (ML_sourceN, ML_source) = markup_elem "ML_source";  | 
|
257  | 
val (doc_sourceN, doc_source) = markup_elem "doc_source";  | 
|
258  | 
||
| 27879 | 259  | 
val (antiqN, antiq) = markup_elem "antiq";  | 
| 27894 | 260  | 
val (ML_antiqN, ML_antiq) = markup_string "ML_antiq" nameN;  | 
261  | 
val (doc_antiqN, doc_antiq) = markup_string "doc_antiq" nameN;  | 
|
| 27879 | 262  | 
|
| 27875 | 263  | 
|
| 23623 | 264  | 
(* outer syntax *)  | 
265  | 
||
| 24870 | 266  | 
val (keyword_declN, keyword_decl) = markup_string "keyword_decl" nameN;  | 
267  | 
||
268  | 
val command_declN = "command_decl";  | 
|
269  | 
fun command_decl name kind : T = (command_declN, [(nameN, name), (kindN, kind)]);  | 
|
270  | 
||
| 27836 | 271  | 
val (keywordN, keyword) = markup_string "keyword" nameN;  | 
272  | 
val (commandN, command) = markup_string "command" nameN;  | 
|
273  | 
val (identN, ident) = markup_elem "ident";  | 
|
| 25552 | 274  | 
val (stringN, string) = markup_elem "string";  | 
275  | 
val (altstringN, altstring) = markup_elem "altstring";  | 
|
276  | 
val (verbatimN, verbatim) = markup_elem "verbatim";  | 
|
277  | 
val (commentN, comment) = markup_elem "comment";  | 
|
278  | 
val (controlN, control) = markup_elem "control";  | 
|
279  | 
val (malformedN, malformed) = markup_elem "malformed";  | 
|
| 23719 | 280  | 
|
| 27851 | 281  | 
val (tokenN, token) = markup_elem "token";  | 
282  | 
||
| 27660 | 283  | 
val (command_spanN, command_span) = markup_string "command_span" nameN;  | 
284  | 
val (ignored_spanN, ignored_span) = markup_elem "ignored_span";  | 
|
| 27836 | 285  | 
val (malformed_spanN, malformed_span) = markup_elem "malformed_span";  | 
| 23719 | 286  | 
|
| 23623 | 287  | 
|
| 23637 | 288  | 
(* toplevel *)  | 
289  | 
||
| 25552 | 290  | 
val (stateN, state) = markup_elem "state";  | 
291  | 
val (subgoalN, subgoal) = markup_elem "subgoal";  | 
|
292  | 
val (sendbackN, sendback) = markup_elem "sendback";  | 
|
293  | 
val (hiliteN, hilite) = markup_elem "hilite";  | 
|
294  | 
||
295  | 
||
| 27606 | 296  | 
(* command status *)  | 
297  | 
||
| 29417 | 298  | 
val taskN = "task";  | 
299  | 
||
| 27606 | 300  | 
val (unprocessedN, unprocessed) = markup_elem "unprocessed";  | 
| 29417 | 301  | 
val (runningN, running) = markup_string "running" taskN;  | 
| 27615 | 302  | 
val (failedN, failed) = markup_elem "failed";  | 
| 27606 | 303  | 
val (finishedN, finished) = markup_elem "finished";  | 
304  | 
val (disposedN, disposed) = markup_elem "disposed";  | 
|
305  | 
||
| 29488 | 306  | 
|
307  | 
(* interactive documents *)  | 
|
308  | 
||
| 
34242
 
5ccdc8bf3849
explicit markup of document assigment message (simplified variant of earlier "edits" 8c3e1f73953d);
 
wenzelm 
parents: 
34214 
diff
changeset
 | 
309  | 
val (assignN, assign) = markup_elem "assign";  | 
| 
 
5ccdc8bf3849
explicit markup of document assigment message (simplified variant of earlier "edits" 8c3e1f73953d);
 
wenzelm 
parents: 
34214 
diff
changeset
 | 
310  | 
|
| 29488 | 311  | 
val editN = "edit";  | 
312  | 
fun edit id state_id : T = (editN, [(idN, id), (stateN, state_id)]);  | 
|
| 29482 | 313  | 
|
| 27606 | 314  | 
|
| 27969 | 315  | 
(* messages *)  | 
316  | 
||
317  | 
val pidN = "pid";  | 
|
318  | 
||
319  | 
val (promptN, prompt) = markup_elem "prompt";  | 
|
| 
31384
 
ce169bd37fc0
IsabelleProcess: emit status "ready" after initialization and reports;
 
wenzelm 
parents: 
30702 
diff
changeset
 | 
320  | 
val (readyN, ready) = markup_elem "ready";  | 
| 27969 | 321  | 
|
322  | 
||
323  | 
||
| 30221 | 324  | 
(** print mode operations **)  | 
| 23704 | 325  | 
|
| 29325 | 326  | 
val no_output = ("", "");
 | 
327  | 
fun default_output (_: T) = no_output;  | 
|
| 23704 | 328  | 
|
329  | 
local  | 
|
330  | 
  val default = {output = default_output};
 | 
|
| 32738 | 331  | 
  val modes = Unsynchronized.ref (Symtab.make [("", default)]);
 | 
| 23704 | 332  | 
in  | 
| 
23922
 
707639e9497d
marked some CRITICAL sections (for multithreading);
 
wenzelm 
parents: 
23794 
diff
changeset
 | 
333  | 
fun add_mode name output = CRITICAL (fn () =>  | 
| 32738 | 334  | 
    Unsynchronized.change modes (Symtab.update_new (name, {output = output})));
 | 
| 23704 | 335  | 
fun get_mode () =  | 
| 24612 | 336  | 
the_default default (Library.get_first (Symtab.lookup (! modes)) (print_mode_value ()));  | 
| 23623 | 337  | 
end;  | 
| 23704 | 338  | 
|
| 29325 | 339  | 
fun output m = if is_none m then no_output else #output (get_mode ()) m;  | 
| 23704 | 340  | 
|
| 23719 | 341  | 
val enclose = output #-> Library.enclose;  | 
342  | 
||
| 25552 | 343  | 
fun markup m =  | 
344  | 
let val (bg, en) = output m  | 
|
345  | 
in Library.enclose (Output.escape bg) (Output.escape en) end;  | 
|
346  | 
||
| 23704 | 347  | 
end;  |