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