src/Pure/Thy/html.ML
author wenzelm
Tue, 17 Nov 2020 22:57:56 +0100
changeset 72638 2a7fc87495e0
parent 72636 09ee9eb7a3d3
permissions -rw-r--r--
refer to command_timings/last_timing via resources;
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
72622
830222403681 HTML presentation in Isabelle/Scala, based on theory html exports from Isabelle/ML;
wenzelm
parents: 69804
diff changeset
     2
    Author:     Makarius
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
72622
830222403681 HTML presentation in Isabelle/Scala, based on theory html exports from Isabelle/ML;
wenzelm
parents: 69804
diff changeset
    14
  val name: symbols -> string -> text
830222403681 HTML presentation in Isabelle/Scala, based on theory html exports from Isabelle/ML;
wenzelm
parents: 69804
diff changeset
    15
  val keyword: symbols -> string -> text
830222403681 HTML presentation in Isabelle/Scala, based on theory html exports from Isabelle/ML;
wenzelm
parents: 69804
diff changeset
    16
  val command: symbols -> string -> text
830222403681 HTML presentation in Isabelle/Scala, based on theory html exports from Isabelle/ML;
wenzelm
parents: 69804
diff changeset
    17
  val href_name: string -> string -> string
830222403681 HTML presentation in Isabelle/Scala, based on theory html exports from Isabelle/ML;
wenzelm
parents: 69804
diff changeset
    18
  val href_path: Url.T -> string -> string
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    19
  val begin_document: symbols -> string -> text
23724
6e95ed5f64da export html_mode, begin_document, end_document;
wenzelm
parents: 23703
diff changeset
    20
  val end_document: text
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    21
end;
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    22
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    23
structure HTML: HTML =
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    24
struct
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    25
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    26
33985
1d33e85a3fa9 added markup for hidden text;
wenzelm
parents: 33983
diff changeset
    27
(* common markup *)
1d33e85a3fa9 added markup for hidden text;
wenzelm
parents: 33983
diff changeset
    28
67306
897344e33c26 less redundant;
wenzelm
parents: 66044
diff changeset
    29
fun span "" = ("<span>", "</span>")
897344e33c26 less redundant;
wenzelm
parents: 66044
diff changeset
    30
  | span class = ("<span class=" ^ quote (XML.text class) ^ ">", "</span>");
897344e33c26 less redundant;
wenzelm
parents: 66044
diff changeset
    31
66044
bd7516709051 more HTML rendering as in Isabelle/jEdit;
wenzelm
parents: 63934
diff changeset
    32
val enclose_span = uncurry enclose o span;
33985
1d33e85a3fa9 added markup for hidden text;
wenzelm
parents: 33983
diff changeset
    33
66044
bd7516709051 more HTML rendering as in Isabelle/jEdit;
wenzelm
parents: 63934
diff changeset
    34
val hidden = enclose_span Markup.hiddenN;
33985
1d33e85a3fa9 added markup for hidden text;
wenzelm
parents: 33983
diff changeset
    35
1d33e85a3fa9 added markup for hidden text;
wenzelm
parents: 33983
diff changeset
    36
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    37
(* symbol output *)
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    38
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    39
abstype symbols = Symbols of string Symtab.table
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    40
with
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    41
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    42
fun make_symbols codes =
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    43
  let
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    44
    val mapping =
63806
c54a53ef1873 clarified modules;
wenzelm
parents: 62529
diff changeset
    45
      map (apsnd (fn c => "&#" ^ Value.print_int c ^ ";")) codes @
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    46
       [("'", "&#39;"),
62529
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
    47
        ("\<^bsub>", hidden "&#8664;" ^ "<sub>"),
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
    48
        ("\<^esub>", hidden "&#8665;" ^ "</sub>"),
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
    49
        ("\<^bsup>", hidden "&#8663;" ^ "<sup>"),
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
    50
        ("\<^esup>", hidden "&#8662;" ^ "</sup>")];
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    51
  in Symbols (fold Symtab.update mapping Symtab.empty) end;
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    52
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    53
val no_symbols = make_symbols [];
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    54
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    55
fun output_sym (Symbols tab) s =
63934
397b25cee74c \<^raw> output is intended for LaTeX;
wenzelm
parents: 63806
diff changeset
    56
  (case Symtab.lookup tab s of
397b25cee74c \<^raw> output is intended for LaTeX;
wenzelm
parents: 63806
diff changeset
    57
    SOME x => x
397b25cee74c \<^raw> output is intended for LaTeX;
wenzelm
parents: 63806
diff changeset
    58
  | NONE => XML.text s);
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    59
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    60
end;
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    61
6338
bf0d22535e47 output: some symbol translations;
wenzelm
parents: 6324
diff changeset
    62
local
61376
93224745477f output HTML text according to Isabelle/Scala Symbol.Interpretation;
wenzelm
parents: 61374
diff changeset
    63
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    64
fun output_markup (bg, en) symbols s1 s2 =
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    65
  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
    66
93224745477f output HTML text according to Isabelle/Scala Symbol.Interpretation;
wenzelm
parents: 61374
diff changeset
    67
val output_sub = output_markup ("<sub>", "</sub>");
93224745477f output HTML text according to Isabelle/Scala Symbol.Interpretation;
wenzelm
parents: 61374
diff changeset
    68
val output_sup = output_markup ("<sup>", "</sup>");
93224745477f output HTML text according to Isabelle/Scala Symbol.Interpretation;
wenzelm
parents: 61374
diff changeset
    69
val output_bold = output_markup (span "bold");
17178
18a98ecc6821 output \<^loc> as 'loc' span;
wenzelm
parents: 17116
diff changeset
    70
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    71
fun output_syms _ [] result = implode (rev result)
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    72
  | output_syms symbols (s1 :: rest) result =
61376
93224745477f output HTML text according to Isabelle/Scala Symbol.Interpretation;
wenzelm
parents: 61374
diff changeset
    73
      let
93224745477f output HTML text according to Isabelle/Scala Symbol.Interpretation;
wenzelm
parents: 61374
diff changeset
    74
        val (s2, ss) = (case rest of [] => ("", []) | s2 :: ss => (s2, ss));
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    75
        val (s, r) =
62529
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
    76
          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
    77
          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
    78
          else if s1 = "\<^bold>" then (output_bold symbols "&#10073;" s2, ss)
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    79
          else (output_sym symbols s1, rest);
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    80
      in output_syms symbols r (s :: result) end;
14534
7a46bdcd92f2 treat sub/super scripts
kleing
parents: 14083
diff changeset
    81
6338
bf0d22535e47 output: some symbol translations;
wenzelm
parents: 6324
diff changeset
    82
in
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    83
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    84
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
    85
6338
bf0d22535e47 output: some symbol translations;
wenzelm
parents: 6324
diff changeset
    86
end;
bf0d22535e47 output: some symbol translations;
wenzelm
parents: 6324
diff changeset
    87
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
    88
61379
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61376
diff changeset
    89
(* presentation *)
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61376
diff changeset
    90
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    91
fun present_span symbols keywords =
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    92
  let
66044
bd7516709051 more HTML rendering as in Isabelle/jEdit;
wenzelm
parents: 63934
diff changeset
    93
    fun present_markup (name, props) =
bd7516709051 more HTML rendering as in Isabelle/jEdit;
wenzelm
parents: 63934
diff changeset
    94
      (case Properties.get props Markup.kindN of
bd7516709051 more HTML rendering as in Isabelle/jEdit;
wenzelm
parents: 63934
diff changeset
    95
        SOME kind =>
bd7516709051 more HTML rendering as in Isabelle/jEdit;
wenzelm
parents: 63934
diff changeset
    96
          if kind = Markup.commandN orelse kind = Markup.keywordN then enclose_span kind else I
bd7516709051 more HTML rendering as in Isabelle/jEdit;
wenzelm
parents: 63934
diff changeset
    97
      | NONE => I) #> enclose_span name;
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
    98
    fun present_token tok =
66044
bd7516709051 more HTML rendering as in Isabelle/jEdit;
wenzelm
parents: 63934
diff changeset
    99
      fold_rev present_markup (Token.markups keywords tok)
bd7516709051 more HTML rendering as in Isabelle/jEdit;
wenzelm
parents: 63934
diff changeset
   100
        (output symbols (Token.unparse tok));
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
   101
  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
   102
c57820ceead3 more direct HTML presentation, without print mode;
wenzelm
parents: 61376
diff changeset
   103
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   104
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   105
(** HTML markup **)
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   106
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   107
type text = string;
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   108
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   109
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   110
(* atoms *)
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   111
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
   112
val name = enclose "<span class=\"name\">" "</span>" oo output;
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
   113
val keyword = enclose "<span class=\"keyword\">" "</span>" oo output;
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
   114
val command = enclose "<span class=\"command\">" "</span>" oo output;
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   115
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   116
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   117
(* misc *)
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   118
28840
wenzelm
parents: 27896
diff changeset
   119
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
   120
fun href_path path txt = href_name (Url.implode path) txt;
6376
wenzelm
parents: 6361
diff changeset
   121
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   122
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   123
(* document *)
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   124
61381
ddca85598c65 more explicit HTML.symbols;
wenzelm
parents: 61379
diff changeset
   125
fun begin_document symbols title =
69804
9efccbad7d42 uniform XML header;
wenzelm
parents: 67306
diff changeset
   126
  XML.header ^
62529
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   127
  "<!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
   128
  "\"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
   129
  "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   130
  "<head>\n" ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   131
  "<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
   132
  "<title>" ^ output symbols (title ^ " (" ^ Distribution.version ^ ")") ^ "</title>\n" ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   133
  "<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
   134
  "</head>\n" ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   135
  "\n" ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   136
  "<body>\n" ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   137
  "<div class=\"head\">" ^
8b7bdfc09f3b clarified treatment of fragments of Isabelle symbols during bootstrap;
wenzelm
parents: 61381
diff changeset
   138
  "<h1>" ^ output symbols title ^ "</h1>\n";
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   139
14541
0a7743e2f8dd use css
kleing
parents: 14534
diff changeset
   140
val end_document = "\n</div>\n</body>\n</html>\n";
6324
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   141
3b7111b360b1 HTML markup elements.
wenzelm
parents:
diff changeset
   142
end;