src/Pure/Thy/html.ML
changeset 23622 8ce09f692653
parent 22796 34c316d7b630
child 23703 1b6a2c119151
equal deleted inserted replaced
23621:e070a6ab1891 23622:8ce09f692653
     5 HTML presentation elements.
     5 HTML presentation elements.
     6 *)
     6 *)
     7 
     7 
     8 signature HTML =
     8 signature HTML =
     9 sig
     9 sig
    10   val output: string -> string
    10   type text = string
    11   val output_width: string -> string * real
       
    12   type text (* = string *)
       
    13   val plain: string -> text
    11   val plain: string -> text
    14   val name: string -> text
    12   val name: string -> text
    15   val keyword: string -> text
    13   val keyword: string -> text
       
    14   val command: string -> text
    16   val file_name: string -> text
    15   val file_name: string -> text
    17   val file_path: Url.T -> text
    16   val file_path: Url.T -> text
    18   val href_name: string -> text -> text
    17   val href_name: string -> text -> text
    19   val href_path: Url.T -> text -> text
    18   val href_path: Url.T -> text -> text
    20   val href_opt_name: string option -> text -> text
    19   val href_opt_name: string option -> text -> text
    54 
    53 
    55 (* symbol output *)
    54 (* symbol output *)
    56 
    55 
    57 local
    56 local
    58   val html_syms = Symtab.make
    57   val html_syms = Symtab.make
    59    [("\\<spacespace>", (2.0, "&nbsp;&nbsp;")),
    58    [("\\<spacespace>", (2, "&nbsp;&nbsp;")),
    60     ("\\<exclamdown>", (1.0, "&iexcl;")),
    59     ("\\<exclamdown>", (1, "&iexcl;")),
    61     ("\\<cent>", (1.0, "&cent;")),
    60     ("\\<cent>", (1, "&cent;")),
    62     ("\\<pounds>", (1.0, "&pound;")),
    61     ("\\<pounds>", (1, "&pound;")),
    63     ("\\<currency>", (1.0, "&curren;")),
    62     ("\\<currency>", (1, "&curren;")),
    64     ("\\<yen>", (1.0, "&yen;")),
    63     ("\\<yen>", (1, "&yen;")),
    65     ("\\<bar>", (1.0, "&brvbar;")),
    64     ("\\<bar>", (1, "&brvbar;")),
    66     ("\\<section>", (1.0, "&sect;")),
    65     ("\\<section>", (1, "&sect;")),
    67     ("\\<dieresis>", (1.0, "&uml;")),
    66     ("\\<dieresis>", (1, "&uml;")),
    68     ("\\<copyright>", (1.0, "&copy;")),
    67     ("\\<copyright>", (1, "&copy;")),
    69     ("\\<ordfeminine>", (1.0, "&ordf;")),
    68     ("\\<ordfeminine>", (1, "&ordf;")),
    70     ("\\<guillemotleft>", (1.0, "&laquo;")),
    69     ("\\<guillemotleft>", (1, "&laquo;")),
    71     ("\\<not>", (1.0, "&not;")),
    70     ("\\<not>", (1, "&not;")),
    72     ("\\<hyphen>", (1.0, "&shy;")),
    71     ("\\<hyphen>", (1, "&shy;")),
    73     ("\\<registered>", (1.0, "&reg;")),
    72     ("\\<registered>", (1, "&reg;")),
    74     ("\\<inverse>", (1.0, "&macr;")),
    73     ("\\<inverse>", (1, "&macr;")),
    75     ("\\<degree>", (1.0, "&deg;")),
    74     ("\\<degree>", (1, "&deg;")),
    76     ("\\<plusminus>", (1.0, "&plusmn;")),
    75     ("\\<plusminus>", (1, "&plusmn;")),
    77     ("\\<twosuperior>", (1.0, "&sup2;")),
    76     ("\\<twosuperior>", (1, "&sup2;")),
    78     ("\\<threesuperior>", (1.0, "&sup3;")),
    77     ("\\<threesuperior>", (1, "&sup3;")),
    79     ("\\<acute>", (1.0, "&acute;")),
    78     ("\\<acute>", (1, "&acute;")),
    80     ("\\<paragraph>", (1.0, "&para;")),
    79     ("\\<paragraph>", (1, "&para;")),
    81     ("\\<cdot>", (1.0, "&middot;")),
    80     ("\\<cdot>", (1, "&middot;")),
    82     ("\\<cedilla>", (1.0, "&cedil;")),
    81     ("\\<cedilla>", (1, "&cedil;")),
    83     ("\\<onesuperior>", (1.0, "&sup1;")),
    82     ("\\<onesuperior>", (1, "&sup1;")),
    84     ("\\<ordmasculine>", (1.0, "&ordm;")),
    83     ("\\<ordmasculine>", (1, "&ordm;")),
    85     ("\\<guillemotright>", (1.0, "&raquo;")),
    84     ("\\<guillemotright>", (1, "&raquo;")),
    86     ("\\<onequarter>", (1.0, "&frac14;")),
    85     ("\\<onequarter>", (1, "&frac14;")),
    87     ("\\<onehalf>", (1.0, "&frac12;")),
    86     ("\\<onehalf>", (1, "&frac12;")),
    88     ("\\<threequarters>", (1.0, "&frac34;")),
    87     ("\\<threequarters>", (1, "&frac34;")),
    89     ("\\<questiondown>", (1.0, "&iquest;")),
    88     ("\\<questiondown>", (1, "&iquest;")),
    90     ("\\<times>", (1.0, "&times;")),
    89     ("\\<times>", (1, "&times;")),
    91     ("\\<div>", (1.0, "&divide;")),
    90     ("\\<div>", (1, "&divide;")),
    92     ("\\<circ>", (1.0, "o")),
    91     ("\\<circ>", (1, "o")),
    93     ("\\<Alpha>", (1.0, "&Alpha;")),
    92     ("\\<Alpha>", (1, "&Alpha;")),
    94     ("\\<Beta>", (1.0, "&Beta;")),
    93     ("\\<Beta>", (1, "&Beta;")),
    95     ("\\<Gamma>", (1.0, "&Gamma;")),
    94     ("\\<Gamma>", (1, "&Gamma;")),
    96     ("\\<Delta>", (1.0, "&Delta;")),
    95     ("\\<Delta>", (1, "&Delta;")),
    97     ("\\<Epsilon>", (1.0, "&Epsilon;")),
    96     ("\\<Epsilon>", (1, "&Epsilon;")),
    98     ("\\<Zeta>", (1.0, "&Zeta;")),
    97     ("\\<Zeta>", (1, "&Zeta;")),
    99     ("\\<Eta>", (1.0, "&Eta;")),
    98     ("\\<Eta>", (1, "&Eta;")),
   100     ("\\<Theta>", (1.0, "&Theta;")),
    99     ("\\<Theta>", (1, "&Theta;")),
   101     ("\\<Iota>", (1.0, "&Iota;")),
   100     ("\\<Iota>", (1, "&Iota;")),
   102     ("\\<Kappa>", (1.0, "&Kappa;")),
   101     ("\\<Kappa>", (1, "&Kappa;")),
   103     ("\\<Lambda>", (1.0, "&Lambda;")),
   102     ("\\<Lambda>", (1, "&Lambda;")),
   104     ("\\<Mu>", (1.0, "&Mu;")),
   103     ("\\<Mu>", (1, "&Mu;")),
   105     ("\\<Nu>", (1.0, "&Nu;")),
   104     ("\\<Nu>", (1, "&Nu;")),
   106     ("\\<Xi>", (1.0, "&Xi;")),
   105     ("\\<Xi>", (1, "&Xi;")),
   107     ("\\<Omicron>", (1.0, "&Omicron;")),
   106     ("\\<Omicron>", (1, "&Omicron;")),
   108     ("\\<Pi>", (1.0, "&Pi;")),
   107     ("\\<Pi>", (1, "&Pi;")),
   109     ("\\<Rho>", (1.0, "&Rho;")),
   108     ("\\<Rho>", (1, "&Rho;")),
   110     ("\\<Sigma>", (1.0, "&Sigma;")),
   109     ("\\<Sigma>", (1, "&Sigma;")),
   111     ("\\<Tau>", (1.0, "&Tau;")),
   110     ("\\<Tau>", (1, "&Tau;")),
   112     ("\\<Upsilon>", (1.0, "&Upsilon;")),
   111     ("\\<Upsilon>", (1, "&Upsilon;")),
   113     ("\\<Phi>", (1.0, "&Phi;")),
   112     ("\\<Phi>", (1, "&Phi;")),
   114     ("\\<Chi>", (1.0, "&Chi;")),
   113     ("\\<Chi>", (1, "&Chi;")),
   115     ("\\<Psi>", (1.0, "&Psi;")),
   114     ("\\<Psi>", (1, "&Psi;")),
   116     ("\\<Omega>", (1.0, "&Omega;")),
   115     ("\\<Omega>", (1, "&Omega;")),
   117     ("\\<alpha>", (1.0, "&alpha;")),
   116     ("\\<alpha>", (1, "&alpha;")),
   118     ("\\<beta>", (1.0, "&beta;")),
   117     ("\\<beta>", (1, "&beta;")),
   119     ("\\<gamma>", (1.0, "&gamma;")),
   118     ("\\<gamma>", (1, "&gamma;")),
   120     ("\\<delta>", (1.0, "&delta;")),
   119     ("\\<delta>", (1, "&delta;")),
   121     ("\\<epsilon>", (1.0, "&epsilon;")),
   120     ("\\<epsilon>", (1, "&epsilon;")),
   122     ("\\<zeta>", (1.0, "&zeta;")),
   121     ("\\<zeta>", (1, "&zeta;")),
   123     ("\\<eta>", (1.0, "&eta;")),
   122     ("\\<eta>", (1, "&eta;")),
   124     ("\\<theta>", (1.0, "&thetasym;")),
   123     ("\\<theta>", (1, "&thetasym;")),
   125     ("\\<iota>", (1.0, "&iota;")),
   124     ("\\<iota>", (1, "&iota;")),
   126     ("\\<kappa>", (1.0, "&kappa;")),
   125     ("\\<kappa>", (1, "&kappa;")),
   127     ("\\<lambda>", (1.0, "&lambda;")),
   126     ("\\<lambda>", (1, "&lambda;")),
   128     ("\\<mu>", (1.0, "&mu;")),
   127     ("\\<mu>", (1, "&mu;")),
   129     ("\\<nu>", (1.0, "&nu;")),
   128     ("\\<nu>", (1, "&nu;")),
   130     ("\\<xi>", (1.0, "&xi;")),
   129     ("\\<xi>", (1, "&xi;")),
   131     ("\\<omicron>", (1.0, "&omicron;")),
   130     ("\\<omicron>", (1, "&omicron;")),
   132     ("\\<pi>", (1.0, "&pi;")),
   131     ("\\<pi>", (1, "&pi;")),
   133     ("\\<rho>", (1.0, "&rho;")),
   132     ("\\<rho>", (1, "&rho;")),
   134     ("\\<sigma>", (1.0, "&sigma;")),
   133     ("\\<sigma>", (1, "&sigma;")),
   135     ("\\<tau>", (1.0, "&tau;")),
   134     ("\\<tau>", (1, "&tau;")),
   136     ("\\<upsilon>", (1.0, "&upsilon;")),
   135     ("\\<upsilon>", (1, "&upsilon;")),
   137     ("\\<phi>", (1.0, "&phi;")),
   136     ("\\<phi>", (1, "&phi;")),
   138     ("\\<chi>", (1.0, "&chi;")),
   137     ("\\<chi>", (1, "&chi;")),
   139     ("\\<psi>", (1.0, "&psi;")),
   138     ("\\<psi>", (1, "&psi;")),
   140     ("\\<omega>", (1.0, "&omega;")),
   139     ("\\<omega>", (1, "&omega;")),
   141     ("\\<bullet>", (1.0, "&bull;")),
   140     ("\\<bullet>", (1, "&bull;")),
   142     ("\\<dots>", (1.0, "&hellip;")),
   141     ("\\<dots>", (1, "&hellip;")),
   143     ("\\<Re>", (1.0, "&real;")),
   142     ("\\<Re>", (1, "&real;")),
   144     ("\\<Im>", (1.0, "&image;")),
   143     ("\\<Im>", (1, "&image;")),
   145     ("\\<wp>", (1.0, "&weierp;")),
   144     ("\\<wp>", (1, "&weierp;")),
   146     ("\\<forall>", (1.0, "&forall;")),
   145     ("\\<forall>", (1, "&forall;")),
   147     ("\\<partial>", (1.0, "&part;")),
   146     ("\\<partial>", (1, "&part;")),
   148     ("\\<exists>", (1.0, "&exist;")),
   147     ("\\<exists>", (1, "&exist;")),
   149     ("\\<emptyset>", (1.0, "&empty;")),
   148     ("\\<emptyset>", (1, "&empty;")),
   150     ("\\<nabla>", (1.0, "&nabla;")),
   149     ("\\<nabla>", (1, "&nabla;")),
   151     ("\\<in>", (1.0, "&isin;")),
   150     ("\\<in>", (1, "&isin;")),
   152     ("\\<notin>", (1.0, "&notin;")),
   151     ("\\<notin>", (1, "&notin;")),
   153     ("\\<Prod>", (1.0, "&prod;")),
   152     ("\\<Prod>", (1, "&prod;")),
   154     ("\\<Sum>", (1.0, "&sum;")),
   153     ("\\<Sum>", (1, "&sum;")),
   155     ("\\<star>", (1.0, "&lowast;")),
   154     ("\\<star>", (1, "&lowast;")),
   156     ("\\<propto>", (1.0, "&prop;")),
   155     ("\\<propto>", (1, "&prop;")),
   157     ("\\<infinity>", (1.0, "&infin;")),
   156     ("\\<infinity>", (1, "&infin;")),
   158     ("\\<angle>", (1.0, "&ang;")),
   157     ("\\<angle>", (1, "&ang;")),
   159     ("\\<and>", (1.0, "&and;")),
   158     ("\\<and>", (1, "&and;")),
   160     ("\\<or>", (1.0, "&or;")),
   159     ("\\<or>", (1, "&or;")),
   161     ("\\<inter>", (1.0, "&cap;")),
   160     ("\\<inter>", (1, "&cap;")),
   162     ("\\<union>", (1.0, "&cup;")),
   161     ("\\<union>", (1, "&cup;")),
   163     ("\\<sim>", (1.0, "&sim;")),
   162     ("\\<sim>", (1, "&sim;")),
   164     ("\\<cong>", (1.0, "&cong;")),
   163     ("\\<cong>", (1, "&cong;")),
   165     ("\\<approx>", (1.0, "&asymp;")),
   164     ("\\<approx>", (1, "&asymp;")),
   166     ("\\<noteq>", (1.0, "&ne;")),
   165     ("\\<noteq>", (1, "&ne;")),
   167     ("\\<equiv>", (1.0, "&equiv;")),
   166     ("\\<equiv>", (1, "&equiv;")),
   168     ("\\<le>", (1.0, "&le;")),
   167     ("\\<le>", (1, "&le;")),
   169     ("\\<ge>", (1.0, "&ge;")),
   168     ("\\<ge>", (1, "&ge;")),
   170     ("\\<subset>", (1.0, "&sub;")),
   169     ("\\<subset>", (1, "&sub;")),
   171     ("\\<supset>", (1.0, "&sup;")),
   170     ("\\<supset>", (1, "&sup;")),
   172     ("\\<subseteq>", (1.0, "&sube;")),
   171     ("\\<subseteq>", (1, "&sube;")),
   173     ("\\<supseteq>", (1.0, "&supe;")),
   172     ("\\<supseteq>", (1, "&supe;")),
   174     ("\\<oplus>", (1.0, "&oplus;")),
   173     ("\\<oplus>", (1, "&oplus;")),
   175     ("\\<otimes>", (1.0, "&otimes;")),
   174     ("\\<otimes>", (1, "&otimes;")),
   176     ("\\<bottom>", (1.0, "&perp;")),
   175     ("\\<bottom>", (1, "&perp;")),
   177     ("\\<lceil>", (1.0, "&lceil;")),
   176     ("\\<lceil>", (1, "&lceil;")),
   178     ("\\<rceil>", (1.0, "&rceil;")),
   177     ("\\<rceil>", (1, "&rceil;")),
   179     ("\\<lfloor>", (1.0, "&lfloor;")),
   178     ("\\<lfloor>", (1, "&lfloor;")),
   180     ("\\<rfloor>", (1.0, "&rfloor;")),
   179     ("\\<rfloor>", (1, "&rfloor;")),
   181     ("\\<langle>", (1.0, "&lang;")),
   180     ("\\<langle>", (1, "&lang;")),
   182     ("\\<rangle>", (1.0, "&rang;")),
   181     ("\\<rangle>", (1, "&rang;")),
   183     ("\\<lozenge>", (1.0, "&loz;")),
   182     ("\\<lozenge>", (1, "&loz;")),
   184     ("\\<spadesuit>", (1.0, "&spades;")),
   183     ("\\<spadesuit>", (1, "&spades;")),
   185     ("\\<clubsuit>", (1.0, "&clubs;")),
   184     ("\\<clubsuit>", (1, "&clubs;")),
   186     ("\\<heartsuit>", (1.0, "&hearts;")),
   185     ("\\<heartsuit>", (1, "&hearts;")),
   187     ("\\<diamondsuit>", (1.0, "&diams;")),
   186     ("\\<diamondsuit>", (1, "&diams;")),
   188     ("\\<lbrakk>", (2.0, "[|")),
   187     ("\\<lbrakk>", (2, "[|")),
   189     ("\\<rbrakk>", (2.0, "|]")),
   188     ("\\<rbrakk>", (2, "|]")),
   190     ("\\<Longrightarrow>", (3.0, "==&gt;")),
   189     ("\\<Longrightarrow>", (3, "==&gt;")),
   191     ("\\<Rightarrow>", (2.0, "=&gt;")),
   190     ("\\<Rightarrow>", (2, "=&gt;")),
   192     ("\\<And>", (2.0, "!!")),
   191     ("\\<And>", (2, "!!")),
   193     ("\\<Colon>", (2.0, "::")),
   192     ("\\<Colon>", (2, "::")),
   194     ("\\<lparr>", (2.0, "(|")),
   193     ("\\<lparr>", (2, "(|")),
   195     ("\\<rparr>", (2.0, "|)),")),
   194     ("\\<rparr>", (2, "|)),")),
   196     ("\\<longleftrightarrow>", (3.0, "&lt;-&gt;")),
   195     ("\\<longleftrightarrow>", (3, "&lt;-&gt;")),
   197     ("\\<longrightarrow>", (3.0, "--&gt;")),
   196     ("\\<longrightarrow>", (3, "--&gt;")),
   198     ("\\<rightarrow>", (2.0, "-&gt;")),
   197     ("\\<rightarrow>", (2, "-&gt;")),
   199     ("\\<^bsub>", (0.0, "<sub>")),
   198     ("\\<^bsub>", (0, "<sub>")),
   200     ("\\<^esub>", (0.0, "</sub>")),
   199     ("\\<^esub>", (0, "</sub>")),
   201     ("\\<^bsup>", (0.0, "<sup>")),
   200     ("\\<^bsup>", (0, "<sup>")),
   202     ("\\<^esup>", (0.0, "</sup>"))];
   201     ("\\<^esup>", (0, "</sup>"))];
   203 
   202 
   204   val escape = fn "<" => "&lt;" | ">" => "&gt;" | "&" => "&amp;" | c => c;
   203   val escape = fn "<" => "&lt;" | ">" => "&gt;" | "&" => "&amp;" | c => c;
   205 
   204 
   206   fun output_sym s =
   205   fun output_sym s =
   207     if Symbol.is_raw s then (1.0, Symbol.decode_raw s)
   206     if Symbol.is_raw s then (1, Symbol.decode_raw s)
   208     else
   207     else
   209       (case Symtab.lookup html_syms s of SOME x => x
   208       (case Symtab.lookup html_syms s of SOME x => x
   210       | NONE => (real (size s), translate_string escape s));
   209       | NONE => (size s, translate_string escape s));
   211 
   210 
   212   fun output_sub s = apsnd (enclose "<sub>" "</sub>") (output_sym s);
   211   fun output_sub s = apsnd (enclose "<sub>" "</sub>") (output_sym s);
   213   fun output_sup s = apsnd (enclose "<sup>" "</sup>") (output_sym s);
   212   fun output_sup s = apsnd (enclose "<sup>" "</sup>") (output_sym s);
   214   fun output_loc s = apsnd (enclose "<span class=\"loc\">" "</span>") (output_sym s);
   213   fun output_loc s = apsnd (enclose "<span class=\"loc\">" "</span>") (output_sym s);
   215 
   214 
   222     | output_syms [] = [];
   221     | output_syms [] = [];
   223 in
   222 in
   224 
   223 
   225 fun output_width str =
   224 fun output_width str =
   226   if not (exists_string (fn s => s = "\\" orelse s = "<" orelse s = ">" orelse s = "&") str)
   225   if not (exists_string (fn s => s = "\\" orelse s = "<" orelse s = ">" orelse s = "&") str)
   227   then Symbol.default_output str
   226   then Output.default_output str
   228   else
   227   else
   229     let val (syms, width) = fold_map (fn (w, s) => fn width => (s, w + width))
   228     let val (syms, width) = fold_map (fn (w, s) => fn width => (s, w + width))
   230       (output_syms (Symbol.explode str)) 0.0
   229       (output_syms (Symbol.explode str)) 0
   231     in (implode syms, width) end;
   230     in (implode syms, width) end;
   232 
   231 
   233 val output = #1 o output_width;
   232 val output = #1 o output_width;
   234 val output_symbols = map #2 o output_syms;
   233 val output_symbols = map #2 o output_syms;
   235 
   234 
   236 end;
   235 end;
   237 
   236 
   238 
   237 
   239 (* token translations *)
   238 (* markup and token translations *)
   240 
   239 
   241 fun style s =
   240 fun span s = ("<span class=" ^ Library.quote s ^ ">", "</span>");
   242   apfst (enclose ("<span class=" ^ Library.quote s ^ ">") "</span>") o output_width;
   241 
       
   242 fun style s = apfst (span s |-> enclose) o output_width;
       
   243 
       
   244 fun free_or_skolem x =
       
   245   (case try Name.dest_skolem x of
       
   246     NONE => style "free" x
       
   247   | SOME x' => style "skolem" x');
       
   248 
       
   249 fun var_or_skolem s =
       
   250   (case Syntax.read_variable s of
       
   251     SOME (x, i) =>
       
   252       (case try Name.dest_skolem x of
       
   253         NONE => style "var" s
       
   254       | SOME x' => style "skolem"
       
   255           (setmp show_question_marks true Term.string_of_vname (x', i)))
       
   256   | NONE => style "var" s);
   243 
   257 
   244 val html_trans =
   258 val html_trans =
   245  [("class", style "tclass"),
   259  [("class", style "tclass"),
   246   ("tfree", style "tfree"),
   260   ("tfree", style "tfree"),
   247   ("tvar",  style "tvar"),
   261   ("tvar",  style "tvar"),
   248   ("free",  style "free"),
   262   ("free",  free_or_skolem),
   249   ("bound", style "bound"),
   263   ("bound", style "bound"),
   250   ("var",   style "var"),
   264   ("var",   var_or_skolem),
   251   ("xstr",  style "xstr")];
   265   ("xstr",  style "xstr")];
   252 
   266 
   253 val _ = Context.add_setup (Sign.add_mode_tokentrfuns htmlN html_trans);
   267 val _ = Context.add_setup (Sign.add_mode_tokentrfuns htmlN html_trans);
   254 
   268 
   255 
   269 
   262 (* atoms *)
   276 (* atoms *)
   263 
   277 
   264 val plain = output;
   278 val plain = output;
   265 val name = enclose "<span class=\"name\">" "</span>" o output;
   279 val name = enclose "<span class=\"name\">" "</span>" o output;
   266 val keyword = enclose "<span class=\"keyword\">" "</span>" o output;
   280 val keyword = enclose "<span class=\"keyword\">" "</span>" o output;
   267 val keyword_width = apfst (enclose "<span class=\"keyword\">" "</span>") o output_width;
   281 val command = enclose "<span class=\"command\">" "</span>" o output;
   268 val file_name = enclose "<span class=\"filename\">" "</span>" o output;
   282 val file_name = enclose "<span class=\"filename\">" "</span>" o output;
   269 val file_path = file_name o Url.implode;
   283 val file_path = file_name o Url.implode;
   270 
   284 
   271 
   285 
   272 (* misc *)
   286 (* misc *)
   375 
   389 
   376   fun file (opt_ref, path, loadit) = href_opt_path opt_ref (encl loadit (file_path path));
   390   fun file (opt_ref, path, loadit) = href_opt_path opt_ref (encl loadit (file_path path));
   377 
   391 
   378   fun theory up A =
   392   fun theory up A =
   379     begin_document ("Theory " ^ A) ^ "\n" ^ up_link up ^
   393     begin_document ("Theory " ^ A) ^ "\n" ^ up_link up ^
   380     keyword "theory" ^ " " ^ name A;
   394     command "theory" ^ " " ^ name A;
   381 
   395 
   382   fun imports Bs =
   396   fun imports Bs =
   383     keyword "imports" ^ " " ^ space_implode " " (map (uncurry href_opt_path o apsnd name) Bs);
   397     keyword "imports" ^ " " ^ space_implode " " (map (uncurry href_opt_path o apsnd name) Bs);
   384 
   398 
   385   fun uses Ps = keyword "uses" ^ " " ^ space_implode " " (map file Ps) ^ "<br>\n";
   399   fun uses Ps = keyword "uses" ^ " " ^ space_implode " " (map file Ps) ^ "<br>\n";
   420 fun thm_name "" = ""
   434 fun thm_name "" = ""
   421   | thm_name a = " " ^ name (a ^ ":");
   435   | thm_name a = " " ^ name (a ^ ":");
   422 
   436 
   423 in
   437 in
   424 
   438 
   425 fun result ctxt k (a, ths) = para (cat_lines ((keyword k ^ thm_name a) :: map (thm ctxt) ths));
   439 fun result ctxt k (a, ths) = para (cat_lines ((command k ^ thm_name a) :: map (thm ctxt) ths));
   426 
   440 
   427 fun results _ _ [] = ""
   441 fun results _ _ [] = ""
   428   | results ctxt k (res :: ress) = cat_lines (result ctxt k res :: map (result ctxt "and") ress);
   442   | results ctxt k (res :: ress) = cat_lines (result ctxt k res :: map (result ctxt "and") ress);
   429 
   443 
   430 end;
   444 end;
   438 fun subsubsection heading = "\n\n<h4>" ^ plain heading ^ "</h4>\n";
   452 fun subsubsection heading = "\n\n<h4>" ^ plain heading ^ "</h4>\n";
   439 
   453 
   440 
   454 
   441 (* mode output *)
   455 (* mode output *)
   442 
   456 
   443 val _ = Output.add_mode htmlN
   457 val _ = Output.add_mode htmlN output_width Symbol.encode_raw;
   444   (output_width, K keyword_width, Symbol.default_indent, Symbol.encode_raw);
   458 val _ = Pretty.add_mode htmlN Pretty.default_indent (span o #1);
   445 
   459 
   446 end;
   460 end;