# HG changeset patch # User wenzelm # Date 1183760103 -7200 # Node ID 8ce09f6926532ec74a29b71b05577d9bc45c1d66 # Parent e070a6ab1891092e8edc0d543e7358df2fb6ed65 simplified pretty token metric: type int; added command markup; token translations: proper treatment of skolems; separate print_mode setup for Output/Pretty; diff -r e070a6ab1891 -r 8ce09f692653 src/Pure/Thy/html.ML --- a/src/Pure/Thy/html.ML Sat Jul 07 00:15:02 2007 +0200 +++ b/src/Pure/Thy/html.ML Sat Jul 07 00:15:03 2007 +0200 @@ -7,12 +7,11 @@ signature HTML = sig - val output: string -> string - val output_width: string -> string * real - type text (* = string *) + type text = string val plain: string -> text val name: string -> text val keyword: string -> text + val command: string -> text val file_name: string -> text val file_path: Url.T -> text val href_name: string -> text -> text @@ -56,158 +55,158 @@ local val html_syms = Symtab.make - [("\\", (2.0, "  ")), - ("\\", (1.0, "¡")), - ("\\", (1.0, "¢")), - ("\\", (1.0, "£")), - ("\\", (1.0, "¤")), - ("\\", (1.0, "¥")), - ("\\", (1.0, "¦")), - ("\\
", (1.0, "§")), - ("\\", (1.0, "¨")), - ("\\", (1.0, "©")), - ("\\", (1.0, "ª")), - ("\\", (1.0, "«")), - ("\\", (1.0, "¬")), - ("\\", (1.0, "­")), - ("\\", (1.0, "®")), - ("\\", (1.0, "¯")), - ("\\", (1.0, "°")), - ("\\", (1.0, "±")), - ("\\", (1.0, "²")), - ("\\", (1.0, "³")), - ("\\", (1.0, "´")), - ("\\", (1.0, "¶")), - ("\\", (1.0, "·")), - ("\\", (1.0, "¸")), - ("\\", (1.0, "¹")), - ("\\", (1.0, "º")), - ("\\", (1.0, "»")), - ("\\", (1.0, "¼")), - ("\\", (1.0, "½")), - ("\\", (1.0, "¾")), - ("\\", (1.0, "¿")), - ("\\", (1.0, "×")), - ("\\
", (1.0, "÷")), - ("\\", (1.0, "o")), - ("\\", (1.0, "Α")), - ("\\", (1.0, "Β")), - ("\\", (1.0, "Γ")), - ("\\", (1.0, "Δ")), - ("\\", (1.0, "Ε")), - ("\\", (1.0, "Ζ")), - ("\\", (1.0, "Η")), - ("\\", (1.0, "Θ")), - ("\\", (1.0, "Ι")), - ("\\", (1.0, "Κ")), - ("\\", (1.0, "Λ")), - ("\\", (1.0, "Μ")), - ("\\", (1.0, "Ν")), - ("\\", (1.0, "Ξ")), - ("\\", (1.0, "Ο")), - ("\\", (1.0, "Π")), - ("\\", (1.0, "Ρ")), - ("\\", (1.0, "Σ")), - ("\\", (1.0, "Τ")), - ("\\", (1.0, "Υ")), - ("\\", (1.0, "Φ")), - ("\\", (1.0, "Χ")), - ("\\", (1.0, "Ψ")), - ("\\", (1.0, "Ω")), - ("\\", (1.0, "α")), - ("\\", (1.0, "β")), - ("\\", (1.0, "γ")), - ("\\", (1.0, "δ")), - ("\\", (1.0, "ε")), - ("\\", (1.0, "ζ")), - ("\\", (1.0, "η")), - ("\\", (1.0, "ϑ")), - ("\\", (1.0, "ι")), - ("\\", (1.0, "κ")), - ("\\", (1.0, "λ")), - ("\\", (1.0, "μ")), - ("\\", (1.0, "ν")), - ("\\", (1.0, "ξ")), - ("\\", (1.0, "ο")), - ("\\", (1.0, "π")), - ("\\", (1.0, "ρ")), - ("\\", (1.0, "σ")), - ("\\", (1.0, "τ")), - ("\\", (1.0, "υ")), - ("\\", (1.0, "φ")), - ("\\", (1.0, "χ")), - ("\\", (1.0, "ψ")), - ("\\", (1.0, "ω")), - ("\\", (1.0, "•")), - ("\\", (1.0, "…")), - ("\\", (1.0, "ℜ")), - ("\\", (1.0, "ℑ")), - ("\\", (1.0, "℘")), - ("\\", (1.0, "∀")), - ("\\", (1.0, "∂")), - ("\\", (1.0, "∃")), - ("\\", (1.0, "∅")), - ("\\", (1.0, "∇")), - ("\\", (1.0, "∈")), - ("\\", (1.0, "∉")), - ("\\", (1.0, "∏")), - ("\\", (1.0, "∑")), - ("\\", (1.0, "∗")), - ("\\", (1.0, "∝")), - ("\\", (1.0, "∞")), - ("\\", (1.0, "∠")), - ("\\", (1.0, "∧")), - ("\\", (1.0, "∨")), - ("\\", (1.0, "∩")), - ("\\", (1.0, "∪")), - ("\\", (1.0, "∼")), - ("\\", (1.0, "≅")), - ("\\", (1.0, "≈")), - ("\\", (1.0, "≠")), - ("\\", (1.0, "≡")), - ("\\", (1.0, "≤")), - ("\\", (1.0, "≥")), - ("\\", (1.0, "⊂")), - ("\\", (1.0, "⊃")), - ("\\", (1.0, "⊆")), - ("\\", (1.0, "⊇")), - ("\\", (1.0, "⊕")), - ("\\", (1.0, "⊗")), - ("\\", (1.0, "⊥")), - ("\\", (1.0, "⌈")), - ("\\", (1.0, "⌉")), - ("\\", (1.0, "⌊")), - ("\\", (1.0, "⌋")), - ("\\", (1.0, "⟨")), - ("\\", (1.0, "⟩")), - ("\\", (1.0, "◊")), - ("\\", (1.0, "♠")), - ("\\", (1.0, "♣")), - ("\\", (1.0, "♥")), - ("\\", (1.0, "♦")), - ("\\", (2.0, "[|")), - ("\\", (2.0, "|]")), - ("\\", (3.0, "==>")), - ("\\", (2.0, "=>")), - ("\\", (2.0, "!!")), - ("\\", (2.0, "::")), - ("\\", (2.0, "(|")), - ("\\", (2.0, "|)),")), - ("\\", (3.0, "<->")), - ("\\", (3.0, "-->")), - ("\\", (2.0, "->")), - ("\\<^bsub>", (0.0, "")), - ("\\<^esub>", (0.0, "")), - ("\\<^bsup>", (0.0, "")), - ("\\<^esup>", (0.0, ""))]; + [("\\", (2, "  ")), + ("\\", (1, "¡")), + ("\\", (1, "¢")), + ("\\", (1, "£")), + ("\\", (1, "¤")), + ("\\", (1, "¥")), + ("\\", (1, "¦")), + ("\\
", (1, "§")), + ("\\", (1, "¨")), + ("\\", (1, "©")), + ("\\", (1, "ª")), + ("\\", (1, "«")), + ("\\", (1, "¬")), + ("\\", (1, "­")), + ("\\", (1, "®")), + ("\\", (1, "¯")), + ("\\", (1, "°")), + ("\\", (1, "±")), + ("\\", (1, "²")), + ("\\", (1, "³")), + ("\\", (1, "´")), + ("\\", (1, "¶")), + ("\\", (1, "·")), + ("\\", (1, "¸")), + ("\\", (1, "¹")), + ("\\", (1, "º")), + ("\\", (1, "»")), + ("\\", (1, "¼")), + ("\\", (1, "½")), + ("\\", (1, "¾")), + ("\\", (1, "¿")), + ("\\", (1, "×")), + ("\\
", (1, "÷")), + ("\\", (1, "o")), + ("\\", (1, "Α")), + ("\\", (1, "Β")), + ("\\", (1, "Γ")), + ("\\", (1, "Δ")), + ("\\", (1, "Ε")), + ("\\", (1, "Ζ")), + ("\\", (1, "Η")), + ("\\", (1, "Θ")), + ("\\", (1, "Ι")), + ("\\", (1, "Κ")), + ("\\", (1, "Λ")), + ("\\", (1, "Μ")), + ("\\", (1, "Ν")), + ("\\", (1, "Ξ")), + ("\\", (1, "Ο")), + ("\\", (1, "Π")), + ("\\", (1, "Ρ")), + ("\\", (1, "Σ")), + ("\\", (1, "Τ")), + ("\\", (1, "Υ")), + ("\\", (1, "Φ")), + ("\\", (1, "Χ")), + ("\\", (1, "Ψ")), + ("\\", (1, "Ω")), + ("\\", (1, "α")), + ("\\", (1, "β")), + ("\\", (1, "γ")), + ("\\", (1, "δ")), + ("\\", (1, "ε")), + ("\\", (1, "ζ")), + ("\\", (1, "η")), + ("\\", (1, "ϑ")), + ("\\", (1, "ι")), + ("\\", (1, "κ")), + ("\\", (1, "λ")), + ("\\", (1, "μ")), + ("\\", (1, "ν")), + ("\\", (1, "ξ")), + ("\\", (1, "ο")), + ("\\", (1, "π")), + ("\\", (1, "ρ")), + ("\\", (1, "σ")), + ("\\", (1, "τ")), + ("\\", (1, "υ")), + ("\\", (1, "φ")), + ("\\", (1, "χ")), + ("\\", (1, "ψ")), + ("\\", (1, "ω")), + ("\\", (1, "•")), + ("\\", (1, "…")), + ("\\", (1, "ℜ")), + ("\\", (1, "ℑ")), + ("\\", (1, "℘")), + ("\\", (1, "∀")), + ("\\", (1, "∂")), + ("\\", (1, "∃")), + ("\\", (1, "∅")), + ("\\", (1, "∇")), + ("\\", (1, "∈")), + ("\\", (1, "∉")), + ("\\", (1, "∏")), + ("\\", (1, "∑")), + ("\\", (1, "∗")), + ("\\", (1, "∝")), + ("\\", (1, "∞")), + ("\\", (1, "∠")), + ("\\", (1, "∧")), + ("\\", (1, "∨")), + ("\\", (1, "∩")), + ("\\", (1, "∪")), + ("\\", (1, "∼")), + ("\\", (1, "≅")), + ("\\", (1, "≈")), + ("\\", (1, "≠")), + ("\\", (1, "≡")), + ("\\", (1, "≤")), + ("\\", (1, "≥")), + ("\\", (1, "⊂")), + ("\\", (1, "⊃")), + ("\\", (1, "⊆")), + ("\\", (1, "⊇")), + ("\\", (1, "⊕")), + ("\\", (1, "⊗")), + ("\\", (1, "⊥")), + ("\\", (1, "⌈")), + ("\\", (1, "⌉")), + ("\\", (1, "⌊")), + ("\\", (1, "⌋")), + ("\\", (1, "⟨")), + ("\\", (1, "⟩")), + ("\\", (1, "◊")), + ("\\", (1, "♠")), + ("\\", (1, "♣")), + ("\\", (1, "♥")), + ("\\", (1, "♦")), + ("\\", (2, "[|")), + ("\\", (2, "|]")), + ("\\", (3, "==>")), + ("\\", (2, "=>")), + ("\\", (2, "!!")), + ("\\", (2, "::")), + ("\\", (2, "(|")), + ("\\", (2, "|)),")), + ("\\", (3, "<->")), + ("\\", (3, "-->")), + ("\\", (2, "->")), + ("\\<^bsub>", (0, "")), + ("\\<^esub>", (0, "")), + ("\\<^bsup>", (0, "")), + ("\\<^esup>", (0, ""))]; val escape = fn "<" => "<" | ">" => ">" | "&" => "&" | c => c; fun output_sym s = - if Symbol.is_raw s then (1.0, Symbol.decode_raw s) + if Symbol.is_raw s then (1, Symbol.decode_raw s) else (case Symtab.lookup html_syms s of SOME x => x - | NONE => (real (size s), translate_string escape s)); + | NONE => (size s, translate_string escape s)); fun output_sub s = apsnd (enclose "" "") (output_sym s); fun output_sup s = apsnd (enclose "" "") (output_sym s); @@ -224,10 +223,10 @@ fun output_width str = if not (exists_string (fn s => s = "\\" orelse s = "<" orelse s = ">" orelse s = "&") str) - then Symbol.default_output str + then Output.default_output str else let val (syms, width) = fold_map (fn (w, s) => fn width => (s, w + width)) - (output_syms (Symbol.explode str)) 0.0 + (output_syms (Symbol.explode str)) 0 in (implode syms, width) end; val output = #1 o output_width; @@ -236,18 +235,33 @@ end; -(* token translations *) +(* markup and token translations *) + +fun span s = ("", ""); + +fun style s = apfst (span s |-> enclose) o output_width; -fun style s = - apfst (enclose ("") "") o output_width; +fun free_or_skolem x = + (case try Name.dest_skolem x of + NONE => style "free" x + | SOME x' => style "skolem" x'); + +fun var_or_skolem s = + (case Syntax.read_variable s of + SOME (x, i) => + (case try Name.dest_skolem x of + NONE => style "var" s + | SOME x' => style "skolem" + (setmp show_question_marks true Term.string_of_vname (x', i))) + | NONE => style "var" s); val html_trans = [("class", style "tclass"), ("tfree", style "tfree"), ("tvar", style "tvar"), - ("free", style "free"), + ("free", free_or_skolem), ("bound", style "bound"), - ("var", style "var"), + ("var", var_or_skolem), ("xstr", style "xstr")]; val _ = Context.add_setup (Sign.add_mode_tokentrfuns htmlN html_trans); @@ -264,7 +278,7 @@ val plain = output; val name = enclose "" "" o output; val keyword = enclose "" "" o output; -val keyword_width = apfst (enclose "" "") o output_width; +val command = enclose "" "" o output; val file_name = enclose "" "" o output; val file_path = file_name o Url.implode; @@ -377,7 +391,7 @@ fun theory up A = begin_document ("Theory " ^ A) ^ "\n" ^ up_link up ^ - keyword "theory" ^ " " ^ name A; + command "theory" ^ " " ^ name A; fun imports Bs = keyword "imports" ^ " " ^ space_implode " " (map (uncurry href_opt_path o apsnd name) Bs); @@ -422,7 +436,7 @@ in -fun result ctxt k (a, ths) = para (cat_lines ((keyword k ^ thm_name a) :: map (thm ctxt) ths)); +fun result ctxt k (a, ths) = para (cat_lines ((command k ^ thm_name a) :: map (thm ctxt) ths)); fun results _ _ [] = "" | results ctxt k (res :: ress) = cat_lines (result ctxt k res :: map (result ctxt "and") ress); @@ -440,7 +454,7 @@ (* mode output *) -val _ = Output.add_mode htmlN - (output_width, K keyword_width, Symbol.default_indent, Symbol.encode_raw); +val _ = Output.add_mode htmlN output_width Symbol.encode_raw; +val _ = Pretty.add_mode htmlN Pretty.default_indent (span o #1); end;