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