src/Pure/Thy/html.ML
author wenzelm
Sun, 06 Mar 2016 16:19:02 +0100
changeset 62529 8b7bdfc09f3b
parent 61381 ddca85598c65
child 63806 c54a53ef1873
permissions -rw-r--r--
clarified treatment of fragments of Isabelle symbols during bootstrap;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24584
01e83ffa6c54 fixed title
haftmann
parents: 24244
diff changeset
     1
(*  Title:      Pure/Thy/html.ML
9415
daa2296f23ea removed all_sessions;
wenzelm
parents: 9045
diff changeset
     2
    Author:     Markus Wenzel and Stefan Berghofer, TU Muenchen
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
     3
9415
daa2296f23ea removed all_sessions;
wenzelm
parents: 9045
diff changeset
     4
HTML presentation elements.
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
     5
*)
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
     6
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
     7
signature HTML =
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
     8
sig
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
     9
  type symbols
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    10
  val make_symbols: (string * int) list -> symbols
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    11
  val no_symbols: symbols
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    12
  val present_span: symbols -> Keyword.keywords -> Command_Span.span -> Output.output
23622
8ce09f692653 simplified pretty token metric: type int;
wenzelm
parents: 22796
diff changeset
    13
  type text = string
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    14
  val begin_document: symbols -> string -> text
23724
6e95ed5f64da export html_mode, begin_document, end_document;
wenzelm
parents: 23703
diff changeset
    15
  val end_document: text
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    16
  val begin_session_index: symbols -> string -> Url.T -> (Url.T * string) list -> text
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    17
  val theory_entry: symbols -> Url.T * string -> text
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    18
  val theory: symbols -> string -> (Url.T option * string) list -> text -> text
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    19
end;
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    20
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    21
structure HTML: HTML =
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    22
struct
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    23
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    24
33985
1d33e85a3fa9 added markup for hidden text;
wenzelm
parents: 33983
diff changeset
    25
(* common markup *)
1d33e85a3fa9 added markup for hidden text;
wenzelm
parents: 33983
diff changeset
    26
1d33e85a3fa9 added markup for hidden text;
wenzelm
parents: 33983
diff changeset
    27
fun span class = ("<span class=" ^ quote (XML.text class) ^ ">", "</span>");
1d33e85a3fa9 added markup for hidden text;
wenzelm
parents: 33983
diff changeset
    28
61379
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61376
diff changeset
    29
val hidden = span Markup.hiddenN |-> enclose;
33985
1d33e85a3fa9 added markup for hidden text;
wenzelm
parents: 33983
diff changeset
    30
1d33e85a3fa9 added markup for hidden text;
wenzelm
parents: 33983
diff changeset
    31
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    32
(* symbol output *)
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    33
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    34
abstype symbols = Symbols of string Symtab.table
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    35
with
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    36
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    37
fun make_symbols codes =
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    38
  let
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    39
    val mapping =
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    40
      map (apsnd (fn c => "&#" ^ Markup.print_int c ^ ";")) codes @
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    41
       [("'", "&#39;"),
62529
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
    42
        ("\<^bsub>", hidden "&#8664;" ^ "<sub>"),
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
    43
        ("\<^esub>", hidden "&#8665;" ^ "</sub>"),
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
    44
        ("\<^bsup>", hidden "&#8663;" ^ "<sup>"),
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
    45
        ("\<^esup>", hidden "&#8662;" ^ "</sup>")];
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    46
  in Symbols (fold Symtab.update mapping Symtab.empty) end;
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    47
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    48
val no_symbols = make_symbols [];
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    49
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    50
fun output_sym (Symbols tab) s =
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    51
  if Symbol.is_raw s then Symbol.decode_raw s
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    52
  else
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    53
    (case Symtab.lookup tab s of
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    54
      SOME x => x
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    55
    | NONE => XML.text s);
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    56
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    57
end;
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    58
6338
bf0d22535e47 output: some symbol translations;
wenzelm
parents: 6324
diff changeset
    59
local
61376
93224745477f output HTML text according to Isabelle/Scala Symbol.Interpretation;
wenzelm
parents: 61374
diff changeset
    60
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    61
fun output_markup (bg, en) symbols s1 s2 =
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    62
  hidden s1 ^ enclose bg en (output_sym symbols s2);
61376
93224745477f output HTML text according to Isabelle/Scala Symbol.Interpretation;
wenzelm
parents: 61374
diff changeset
    63
93224745477f output HTML text according to Isabelle/Scala Symbol.Interpretation;
wenzelm
parents: 61374
diff changeset
    64
val output_sub = output_markup ("<sub>", "</sub>");
93224745477f output HTML text according to Isabelle/Scala Symbol.Interpretation;
wenzelm
parents: 61374
diff changeset
    65
val output_sup = output_markup ("<sup>", "</sup>");
93224745477f output HTML text according to Isabelle/Scala Symbol.Interpretation;
wenzelm
parents: 61374
diff changeset
    66
val output_bold = output_markup (span "bold");
17178
18a98ecc6821 output \<^loc> as 'loc' span;
wenzelm
parents: 17116
diff changeset
    67
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    68
fun output_syms _ [] result = implode (rev result)
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    69
  | output_syms symbols (s1 :: rest) result =
61376
93224745477f output HTML text according to Isabelle/Scala Symbol.Interpretation;
wenzelm
parents: 61374
diff changeset
    70
      let
93224745477f output HTML text according to Isabelle/Scala Symbol.Interpretation;
wenzelm
parents: 61374
diff changeset
    71
        val (s2, ss) = (case rest of [] => ("", []) | s2 :: ss => (s2, ss));
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    72
        val (s, r) =
62529
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
    73
          if s1 = "\<^sub>" then (output_sub symbols "&#8681;" s2, ss)
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
    74
          else if s1 = "\<^sup>" then (output_sup symbols "&#8679;" s2, ss)
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
    75
          else if s1 = "\<^bold>" then (output_bold symbols "&#10073;" s2, ss)
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    76
          else (output_sym symbols s1, rest);
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    77
      in output_syms symbols r (s :: result) end;
14534
7a46bdcd92f2 treat sub/super scripts
kleing
parents: 14083
diff changeset
    78
6338
bf0d22535e47 output: some symbol translations;
wenzelm
parents: 6324
diff changeset
    79
in
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    80
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    81
fun output symbols str = output_syms symbols (Symbol.explode str) [];
61376
93224745477f output HTML text according to Isabelle/Scala Symbol.Interpretation;
wenzelm
parents: 61374
diff changeset
    82
6338
bf0d22535e47 output: some symbol translations;
wenzelm
parents: 6324
diff changeset
    83
end;
bf0d22535e47 output: some symbol translations;
wenzelm
parents: 6324
diff changeset
    84
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    85
61379
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61376
diff changeset
    86
(* presentation *)
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61376
diff changeset
    87
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    88
fun present_span symbols keywords =
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    89
  let
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    90
    fun present_token tok =
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    91
      fold_rev (uncurry enclose o span o #1)
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    92
        (Token.markups keywords tok) (output symbols (Token.unparse tok));
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    93
  in implode o map present_token o Command_Span.content end;
61379
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61376
diff changeset
    94
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61376
diff changeset
    95
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    96
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    97
(** HTML markup **)
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    98
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    99
type text = string;
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   100
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   101
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   102
(* atoms *)
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   103
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
   104
val name = enclose "<span class=\"name\">" "</span>" oo output;
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
   105
val keyword = enclose "<span class=\"keyword\">" "</span>" oo output;
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
   106
val command = enclose "<span class=\"command\">" "</span>" oo output;
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   107
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   108
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   109
(* misc *)
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   110
28840
wenzelm
parents: 27896
diff changeset
   111
fun href_name s txt = "<a href=" ^ quote s ^ ">" ^ txt ^ "</a>";
21858
05f57309170c avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
wenzelm
parents: 20742
diff changeset
   112
fun href_path path txt = href_name (Url.implode path) txt;
6376
wenzelm
parents: 6361
diff changeset
   113
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15336
diff changeset
   114
fun href_opt_path NONE txt = txt
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15336
diff changeset
   115
  | href_opt_path (SOME p) txt = href_path p txt;
6376
wenzelm
parents: 6361
diff changeset
   116
12413
f879fcc9412d tuned line breaks in HTML source;
wenzelm
parents: 12151
diff changeset
   117
fun para txt = "\n<p>" ^ txt ^ "</p>\n";
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   118
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   119
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   120
(* document *)
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   121
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
   122
fun begin_document symbols title =
62529
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   123
  "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   124
  "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" " ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   125
  "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   126
  "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   127
  "<head>\n" ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   128
  "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n" ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   129
  "<title>" ^ output symbols (title ^ " (" ^ Distribution.version ^ ")") ^ "</title>\n" ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   130
  "<link media=\"all\" rel=\"stylesheet\" type=\"text/css\" href=\"isabelle.css\"/>\n" ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   131
  "</head>\n" ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   132
  "\n" ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   133
  "<body>\n" ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   134
  "<div class=\"head\">" ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   135
  "<h1>" ^ output symbols title ^ "</h1>\n";
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   136
14541
0a7743e2f8dd use css
kleing
parents: 14534
diff changeset
   137
val end_document = "\n</div>\n</body>\n</html>\n";
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   138
6338
bf0d22535e47 output: some symbol translations;
wenzelm
parents: 6324
diff changeset
   139
bf0d22535e47 output: some symbol translations;
wenzelm
parents: 6324
diff changeset
   140
(* session index *)
bf0d22535e47 output: some symbol translations;
wenzelm
parents: 6324
diff changeset
   141
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
   142
fun begin_session_index symbols session graph docs =
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
   143
  begin_document symbols ("Session " ^ output symbols session) ^
6754
c23c542a32e5 tuned markup;
wenzelm
parents: 6649
diff changeset
   144
  para ("View " ^ href_path graph "theory dependencies" ^
27829
c073006e0137 produce XHTML 1.0 Transitional;
wenzelm
parents: 27490
diff changeset
   145
    implode (map (fn (p, name) => "<br/>\nView " ^ href_path p name) docs)) ^
37941
1d812ff95a14 refrain from generating <hr/> and from "hiding" it in isabelle.css -- the latter might be used in other situations as well;
wenzelm
parents: 37940
diff changeset
   146
  "\n</div>\n<div class=\"theories\">\n<h2>Theories</h2>\n<ul>\n";
6338
bf0d22535e47 output: some symbol translations;
wenzelm
parents: 6324
diff changeset
   147
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
   148
fun theory_entry symbols (p, s) = "<li>" ^ href_path p (output symbols s) ^ "</li>\n";
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   149
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   150
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   151
(* theory *)
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   152
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
   153
fun theory symbols A Bs txt =
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
   154
  begin_document symbols ("Theory " ^ A) ^ "\n" ^
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
   155
  command symbols "theory" ^ " " ^ name symbols A ^ "<br/>\n" ^
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
   156
  keyword symbols "imports" ^ " " ^
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
   157
    space_implode " " (map (uncurry href_opt_path o apsnd (name symbols)) Bs) ^
54456
f4b1440d9880 simplified HTML theory presentation;
wenzelm
parents: 54455
diff changeset
   158
  "<br/>\n" ^
61374
b3c665940d62 server-side fonts;
wenzelm
parents: 59448
diff changeset
   159
  enclose "\n</div>\n<div class=\"source\">\n<pre class=\"source\">" "</pre>\n" txt ^
54456
f4b1440d9880 simplified HTML theory presentation;
wenzelm
parents: 54455
diff changeset
   160
  end_document;
16267
0773b17922d8 present new-style theory header, with 'imports' and 'uses';
wenzelm
parents: 16196
diff changeset
   161
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   162
end;