| author | huffman | 
| Thu, 06 May 2010 11:08:19 -0700 | |
| changeset 36696 | 1b69f78be286 | 
| 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: 
32738diff
changeset | 17 | val entityN: string val entity: string -> T | 
| 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 wenzelm parents: 
32738diff
changeset | 18 | val defN: string | 
| 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 wenzelm parents: 
32738diff
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: 
27818diff
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: 
26255diff
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: 
28904diff
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: 
28904diff
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: 
34214diff
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: 
30702diff
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: 
32738diff
changeset | 157 | (* formal entities *) | 
| 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 wenzelm parents: 
32738diff
changeset | 158 | |
| 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 wenzelm parents: 
32738diff
changeset | 159 | val (entityN, entity) = markup_string "entity" nameN; | 
| 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 wenzelm parents: 
32738diff
changeset | 160 | |
| 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 wenzelm parents: 
32738diff
changeset | 161 | val defN = "def"; | 
| 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 wenzelm parents: 
32738diff
changeset | 162 | val refN = "ref"; | 
| 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 wenzelm parents: 
32738diff
changeset | 163 | |
| 
757d7787b10c
markup for formal entities, with "def" or "ref" occurrences;
 wenzelm parents: 
32738diff
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: 
27818diff
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: 
26255diff
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: 
28904diff
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: 
28904diff
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: 
34214diff
changeset | 309 | val (assignN, assign) = markup_elem "assign"; | 
| 
5ccdc8bf3849
explicit markup of document assigment message (simplified variant of earlier "edits" 8c3e1f73953d);
 wenzelm parents: 
34214diff
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: 
30702diff
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: 
23794diff
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; |