| author | haftmann | 
| Thu, 22 Jan 2009 09:04:46 +0100 | |
| changeset 29614 | 1f7b1b0df292 | 
| parent 29522 | 793766d4c1b5 | 
| child 30221 | 14145e81a2fe | 
| 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 | 
| 25982 | 15 | val groupN: string | 
| 26977 | 16 | val theory_nameN: string | 
| 25808 | 17 | val idN: string | 
| 23658 | 18 | val kindN: string | 
| 24777 | 19 | val internalK: string | 
| 28017 | 20 | val property_internal: Properties.property | 
| 23671 | 21 | val lineN: string | 
| 26001 | 22 | val columnN: string | 
| 27794 | 23 | val offsetN: string | 
| 27735 | 24 | val end_lineN: string | 
| 25 | val end_columnN: string | |
| 27794 | 26 | val end_offsetN: string | 
| 23671 | 27 | val fileN: 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 | |
| 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 | 37 | val tclassN: string val tclass: string -> T | 
| 23637 | 38 | val tyconN: string val tycon: string -> T | 
| 28077 | 39 | val fixed_declN: string val fixed_decl: string -> T | 
| 26702 
a079f8f0080b
added markup for fixed variables (local constants);
 wenzelm parents: 
26255diff
changeset | 40 | val fixedN: string val fixed: string -> T | 
| 28113 | 41 | val const_declN: string val const_decl: string -> T | 
| 23637 | 42 | val constN: string val const: string -> T | 
| 28077 | 43 | val fact_declN: string val fact_decl: string -> T | 
| 27740 | 44 | val factN: string val fact: string -> T | 
| 45 | val dynamic_factN: string val dynamic_fact: string -> T | |
| 28077 | 46 | val local_fact_declN: string val local_fact_decl: string -> T | 
| 27818 | 47 | val local_factN: string val local_fact: string -> T | 
| 23719 | 48 | val tfreeN: string val tfree: T | 
| 49 | val tvarN: string val tvar: T | |
| 50 | val freeN: string val free: T | |
| 51 | val skolemN: string val skolem: T | |
| 52 | val boundN: string val bound: T | |
| 53 | val varN: string val var: T | |
| 29318 
6337d1cb2ba0
added numeral, which supercedes num, xnum, float;
 wenzelm parents: 
28904diff
changeset | 54 | val numeralN: string val numeral: T | 
| 27804 | 55 | val literalN: string val literal: T | 
| 29318 
6337d1cb2ba0
added numeral, which supercedes num, xnum, float;
 wenzelm parents: 
28904diff
changeset | 56 | val inner_stringN: string val inner_string: T | 
| 27883 | 57 | val inner_commentN: string val inner_comment: T | 
| 23637 | 58 | val sortN: string val sort: T | 
| 59 | val typN: string val typ: T | |
| 60 | val termN: string val term: T | |
| 27818 | 61 | val propN: string val prop: T | 
| 27748 | 62 | val attributeN: string val attribute: string -> T | 
| 63 | val methodN: string val method: string -> T | |
| 27875 | 64 | val ML_sourceN: string val ML_source: T | 
| 65 | val doc_sourceN: string val doc_source: T | |
| 27879 | 66 | val antiqN: string val antiq: T | 
| 27894 | 67 | val ML_antiqN: string val ML_antiq: string -> T | 
| 68 | val doc_antiqN: string val doc_antiq: string -> T | |
| 27836 | 69 | val keyword_declN: string val keyword_decl: string -> T | 
| 70 | val command_declN: string val command_decl: string -> string -> T | |
| 23637 | 71 | val keywordN: string val keyword: string -> T | 
| 72 | val commandN: string val command: string -> T | |
| 27836 | 73 | val identN: string val ident: T | 
| 23719 | 74 | val stringN: string val string: T | 
| 75 | val altstringN: string val altstring: T | |
| 76 | val verbatimN: string val verbatim: T | |
| 77 | val commentN: string val comment: T | |
| 78 | val controlN: string val control: T | |
| 79 | val malformedN: string val malformed: T | |
| 27851 | 80 | val tokenN: string val token: T | 
| 27660 | 81 | val command_spanN: string val command_span: string -> T | 
| 82 | val ignored_spanN: string val ignored_span: T | |
| 27836 | 83 | val malformed_spanN: string val malformed_span: T | 
| 23637 | 84 | val stateN: string val state: T | 
| 85 | val subgoalN: string val subgoal: T | |
| 24289 | 86 | val sendbackN: string val sendback: T | 
| 24555 | 87 | val hiliteN: string val hilite: T | 
| 29417 | 88 | val taskN: string | 
| 27606 | 89 | val unprocessedN: string val unprocessed: T | 
| 29417 | 90 | val runningN: string val running: string -> T | 
| 27615 | 91 | val failedN: string val failed: T | 
| 27606 | 92 | val finishedN: string val finished: T | 
| 93 | val disposedN: string val disposed: T | |
| 29488 | 94 | val editsN: string val edits: string -> T | 
| 95 | val editN: string val edit: string -> string -> T | |
| 27969 | 96 | val pidN: string | 
| 97 | val sessionN: string | |
| 98 | val promptN: string val prompt: T | |
| 29325 | 99 | val no_output: output * output | 
| 23704 | 100 | val default_output: T -> output * output | 
| 23786 | 101 | val add_mode: string -> (T -> output * output) -> unit | 
| 23704 | 102 | val output: T -> output * output | 
| 23719 | 103 | val enclose: T -> output -> output | 
| 25552 | 104 | val markup: T -> string -> string | 
| 23623 | 105 | end; | 
| 106 | ||
| 107 | structure Markup: MARKUP = | |
| 108 | struct | |
| 109 | ||
| 23658 | 110 | (* basic markup *) | 
| 23623 | 111 | |
| 28017 | 112 | type T = string * Properties.T; | 
| 23637 | 113 | |
| 114 | val none = ("", []);
 | |
| 115 | ||
| 27883 | 116 | fun is_none ("", _) = true
 | 
| 117 | | is_none _ = false; | |
| 118 | ||
| 23794 | 119 | |
| 23671 | 120 | fun properties more_props ((elem, props): T) = | 
| 28017 | 121 | (elem, fold_rev Properties.put more_props props); | 
| 23671 | 122 | |
| 25552 | 123 | fun markup_elem elem = (elem, (elem, []): T); | 
| 23794 | 124 | fun markup_string elem prop = (elem, fn s => (elem, [(prop, s)]): T); | 
| 125 | fun markup_int elem prop = (elem, fn i => (elem, [(prop, Int.toString i)]): T); | |
| 126 | ||
| 26977 | 127 | |
| 128 | (* name *) | |
| 129 | ||
| 23658 | 130 | val nameN = "name"; | 
| 27818 | 131 | fun name a = properties [(nameN, a)]; | 
| 132 | ||
| 25982 | 133 | val groupN = "group"; | 
| 26977 | 134 | val theory_nameN = "theory_name"; | 
| 24777 | 135 | |
| 136 | ||
| 137 | (* kind *) | |
| 138 | ||
| 23658 | 139 | val kindN = "kind"; | 
| 23671 | 140 | |
| 24777 | 141 | val internalK = "internal"; | 
| 142 | val property_internal = (kindN, internalK); | |
| 143 | ||
| 23658 | 144 | |
| 23671 | 145 | (* position *) | 
| 146 | ||
| 147 | val lineN = "line"; | |
| 26001 | 148 | val columnN = "column"; | 
| 27794 | 149 | val offsetN = "offset"; | 
| 27735 | 150 | val end_lineN = "end_line"; | 
| 151 | val end_columnN = "end_column"; | |
| 27794 | 152 | val end_offsetN = "end_offset"; | 
| 23671 | 153 | val fileN = "file"; | 
| 25816 | 154 | val idN = "id"; | 
| 23671 | 155 | |
| 27794 | 156 | val position_properties' = [end_lineN, end_columnN, end_offsetN, fileN, idN]; | 
| 157 | val position_properties = [lineN, columnN, offsetN] @ position_properties'; | |
| 27748 | 158 | |
| 25552 | 159 | val (positionN, position) = markup_elem "position"; | 
| 26255 | 160 | val (locationN, location) = markup_elem "location"; | 
| 161 | ||
| 23644 | 162 | |
| 163 | (* pretty printing *) | |
| 164 | ||
| 165 | val indentN = "indent"; | |
| 166 | val (blockN, block) = markup_int "block" indentN; | |
| 167 | ||
| 168 | val widthN = "width"; | |
| 169 | val (breakN, break) = markup_int "break" widthN; | |
| 170 | ||
| 25552 | 171 | val (fbreakN, fbreak) = markup_elem "fbreak"; | 
| 23637 | 172 | |
| 173 | ||
| 23623 | 174 | (* logical entities *) | 
| 175 | ||
| 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 | 176 | val (tclassN, tclass) = markup_string "tclass" nameN; | 
| 23658 | 177 | val (tyconN, tycon) = markup_string "tycon" nameN; | 
| 28077 | 178 | val (fixed_declN, fixed_decl) = markup_string "fixed_decl" nameN; | 
| 26702 
a079f8f0080b
added markup for fixed variables (local constants);
 wenzelm parents: 
26255diff
changeset | 179 | val (fixedN, fixed) = markup_string "fixed" nameN; | 
| 28113 | 180 | val (const_declN, const_decl) = markup_string "const_decl" nameN; | 
| 23658 | 181 | val (constN, const) = markup_string "const" nameN; | 
| 28077 | 182 | val (fact_declN, fact_decl) = markup_string "fact_decl" nameN; | 
| 27740 | 183 | val (factN, fact) = markup_string "fact" nameN; | 
| 184 | val (dynamic_factN, dynamic_fact) = markup_string "dynamic_fact" nameN; | |
| 28077 | 185 | val (local_fact_declN, local_fact_decl) = markup_string "local_fact_decl" nameN; | 
| 27818 | 186 | val (local_factN, local_fact) = markup_string "local_fact" nameN; | 
| 23623 | 187 | |
| 188 | ||
| 189 | (* inner syntax *) | |
| 190 | ||
| 25552 | 191 | val (tfreeN, tfree) = markup_elem "tfree"; | 
| 192 | val (tvarN, tvar) = markup_elem "tvar"; | |
| 193 | val (freeN, free) = markup_elem "free"; | |
| 194 | val (skolemN, skolem) = markup_elem "skolem"; | |
| 195 | val (boundN, bound) = markup_elem "bound"; | |
| 196 | val (varN, var) = markup_elem "var"; | |
| 29318 
6337d1cb2ba0
added numeral, which supercedes num, xnum, float;
 wenzelm parents: 
28904diff
changeset | 197 | val (numeralN, numeral) = markup_elem "numeral"; | 
| 27804 | 198 | val (literalN, literal) = markup_elem "literal"; | 
| 29318 
6337d1cb2ba0
added numeral, which supercedes num, xnum, float;
 wenzelm parents: 
28904diff
changeset | 199 | val (inner_stringN, inner_string) = markup_elem "inner_string"; | 
| 27883 | 200 | val (inner_commentN, inner_comment) = markup_elem "inner_comment"; | 
| 23719 | 201 | |
| 25552 | 202 | val (sortN, sort) = markup_elem "sort"; | 
| 203 | val (typN, typ) = markup_elem "typ"; | |
| 204 | val (termN, term) = markup_elem "term"; | |
| 27818 | 205 | val (propN, prop) = markup_elem "prop"; | 
| 27748 | 206 | |
| 207 | val (attributeN, attribute) = markup_string "attribute" nameN; | |
| 208 | val (methodN, method) = markup_string "method" nameN; | |
| 23623 | 209 | |
| 210 | ||
| 27875 | 211 | (* embedded source text *) | 
| 212 | ||
| 213 | val (ML_sourceN, ML_source) = markup_elem "ML_source"; | |
| 214 | val (doc_sourceN, doc_source) = markup_elem "doc_source"; | |
| 215 | ||
| 27879 | 216 | val (antiqN, antiq) = markup_elem "antiq"; | 
| 27894 | 217 | val (ML_antiqN, ML_antiq) = markup_string "ML_antiq" nameN; | 
| 218 | val (doc_antiqN, doc_antiq) = markup_string "doc_antiq" nameN; | |
| 27879 | 219 | |
| 27875 | 220 | |
| 23623 | 221 | (* outer syntax *) | 
| 222 | ||
| 24870 | 223 | val (keyword_declN, keyword_decl) = markup_string "keyword_decl" nameN; | 
| 224 | ||
| 225 | val command_declN = "command_decl"; | |
| 226 | fun command_decl name kind : T = (command_declN, [(nameN, name), (kindN, kind)]); | |
| 227 | ||
| 27836 | 228 | val (keywordN, keyword) = markup_string "keyword" nameN; | 
| 229 | val (commandN, command) = markup_string "command" nameN; | |
| 230 | val (identN, ident) = markup_elem "ident"; | |
| 25552 | 231 | val (stringN, string) = markup_elem "string"; | 
| 232 | val (altstringN, altstring) = markup_elem "altstring"; | |
| 233 | val (verbatimN, verbatim) = markup_elem "verbatim"; | |
| 234 | val (commentN, comment) = markup_elem "comment"; | |
| 235 | val (controlN, control) = markup_elem "control"; | |
| 236 | val (malformedN, malformed) = markup_elem "malformed"; | |
| 23719 | 237 | |
| 27851 | 238 | val (tokenN, token) = markup_elem "token"; | 
| 239 | ||
| 27660 | 240 | val (command_spanN, command_span) = markup_string "command_span" nameN; | 
| 241 | val (ignored_spanN, ignored_span) = markup_elem "ignored_span"; | |
| 27836 | 242 | val (malformed_spanN, malformed_span) = markup_elem "malformed_span"; | 
| 23719 | 243 | |
| 23623 | 244 | |
| 23637 | 245 | (* toplevel *) | 
| 246 | ||
| 25552 | 247 | val (stateN, state) = markup_elem "state"; | 
| 248 | val (subgoalN, subgoal) = markup_elem "subgoal"; | |
| 249 | val (sendbackN, sendback) = markup_elem "sendback"; | |
| 250 | val (hiliteN, hilite) = markup_elem "hilite"; | |
| 251 | ||
| 252 | ||
| 27606 | 253 | (* command status *) | 
| 254 | ||
| 29417 | 255 | val taskN = "task"; | 
| 256 | ||
| 27606 | 257 | val (unprocessedN, unprocessed) = markup_elem "unprocessed"; | 
| 29417 | 258 | val (runningN, running) = markup_string "running" taskN; | 
| 27615 | 259 | val (failedN, failed) = markup_elem "failed"; | 
| 27606 | 260 | val (finishedN, finished) = markup_elem "finished"; | 
| 261 | val (disposedN, disposed) = markup_elem "disposed"; | |
| 262 | ||
| 29488 | 263 | |
| 264 | (* interactive documents *) | |
| 265 | ||
| 266 | val (editsN, edits) = markup_string "edits" idN; | |
| 267 | ||
| 268 | val editN = "edit"; | |
| 269 | fun edit id state_id : T = (editN, [(idN, id), (stateN, state_id)]); | |
| 29482 | 270 | |
| 27606 | 271 | |
| 27969 | 272 | (* messages *) | 
| 273 | ||
| 274 | val pidN = "pid"; | |
| 275 | val sessionN = "session"; | |
| 276 | ||
| 277 | val (promptN, prompt) = markup_elem "prompt"; | |
| 278 | ||
| 279 | ||
| 280 | ||
| 23704 | 281 | (* print mode operations *) | 
| 282 | ||
| 29325 | 283 | val no_output = ("", "");
 | 
| 284 | fun default_output (_: T) = no_output; | |
| 23704 | 285 | |
| 286 | local | |
| 287 |   val default = {output = default_output};
 | |
| 288 |   val modes = ref (Symtab.make [("", default)]);
 | |
| 289 | in | |
| 23922 
707639e9497d
marked some CRITICAL sections (for multithreading);
 wenzelm parents: 
23794diff
changeset | 290 | fun add_mode name output = CRITICAL (fn () => | 
| 
707639e9497d
marked some CRITICAL sections (for multithreading);
 wenzelm parents: 
23794diff
changeset | 291 |     change modes (Symtab.update_new (name, {output = output})));
 | 
| 23704 | 292 | fun get_mode () = | 
| 24612 | 293 | the_default default (Library.get_first (Symtab.lookup (! modes)) (print_mode_value ())); | 
| 23623 | 294 | end; | 
| 23704 | 295 | |
| 29325 | 296 | fun output m = if is_none m then no_output else #output (get_mode ()) m; | 
| 23704 | 297 | |
| 23719 | 298 | val enclose = output #-> Library.enclose; | 
| 299 | ||
| 25552 | 300 | fun markup m = | 
| 301 | let val (bg, en) = output m | |
| 302 | in Library.enclose (Output.escape bg) (Output.escape en) end; | |
| 303 | ||
| 23704 | 304 | end; |