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