haftmann@28440: (* Title: Doc/more_antiquote.ML haftmann@28440: ID: $Id$ haftmann@28440: Author: Florian Haftmann, TU Muenchen haftmann@28440: haftmann@28440: More antiquotations. haftmann@28440: *) haftmann@28440: haftmann@28440: signature MORE_ANTIQUOTE = haftmann@28440: sig haftmann@28727: val typewriter: string -> string haftmann@28440: end; haftmann@28440: haftmann@28440: structure More_Antiquote : MORE_ANTIQUOTE = haftmann@28440: struct haftmann@28440: haftmann@28440: structure O = ThyOutput; haftmann@28440: haftmann@28727: (* printing typewriter lines *) haftmann@28440: haftmann@28727: fun typewriter s = haftmann@28714: let haftmann@28714: val parse = Scan.repeat haftmann@28714: (Scan.this_string "\n" |-- Scan.succeed "\\\\\n\\hspace*{0pt}" haftmann@28714: || (Scan.this_string " " haftmann@28921: || Scan.this_string "." haftmann@28921: || Scan.this_string "," haftmann@28714: || Scan.this_string ":" haftmann@28921: || Scan.this_string ";" haftmann@28714: || Scan.this_string "\"" |-- Scan.succeed "{\\char34}" haftmann@28714: || Scan.this_string "#" |-- Scan.succeed "{\\char35}" haftmann@28714: || Scan.this_string "$" |-- Scan.succeed "{\\char36}" haftmann@28714: || Scan.this_string "%" |-- Scan.succeed "{\\char37}" haftmann@28714: || Scan.this_string "&" |-- Scan.succeed "{\\char38}" haftmann@28714: || Scan.this_string "\\" |-- Scan.succeed "{\\char92}" haftmann@28714: || Scan.this_string "^" |-- Scan.succeed "{\\char94}" haftmann@28714: || Scan.this_string "_" |-- Scan.succeed "{\\char95}" haftmann@28714: || Scan.this_string "{" |-- Scan.succeed "{\\char123}" haftmann@28714: || Scan.this_string "}" |-- Scan.succeed "{\\char125}" haftmann@28714: || Scan.this_string "~" |-- Scan.succeed "{\\char126}") haftmann@28714: -- Scan.repeat (Scan.this_string " ") haftmann@28714: >> (fn (x, xs) => x ^ replicate_string (length xs) "~") haftmann@28714: || Scan.one Symbol.not_eof); haftmann@28714: fun is_newline s = (s = "\n"); haftmann@28714: val cs = explode s |> take_prefix is_newline |> snd haftmann@28714: |> take_suffix is_newline |> fst; haftmann@28714: val (texts, []) = Scan.finite Symbol.stopper parse cs haftmann@28714: in if null texts haftmann@28714: then "" haftmann@28727: else implode ("\\isatypewriter%\n\\noindent%\n\\hspace*{0pt}" :: texts) haftmann@28714: end haftmann@28440: haftmann@28440: haftmann@28440: (* class antiquotation *) haftmann@28440: haftmann@28440: local haftmann@28440: haftmann@28634: val pr_text = enclose "\\isa{" "}" o Pretty.output o Pretty.str; haftmann@28634: haftmann@28634: fun pr_class ctxt = Sign.read_class (ProofContext.theory_of ctxt) haftmann@28634: #> Sign.extern_class (ProofContext.theory_of ctxt) haftmann@28634: #> pr_text; haftmann@28634: haftmann@28634: fun pr_type ctxt = Sign.intern_type (ProofContext.theory_of ctxt) haftmann@28634: #> tap (Sign.arity_number (ProofContext.theory_of ctxt)) haftmann@28634: #> Sign.extern_type (ProofContext.theory_of ctxt) haftmann@28634: #> pr_text; haftmann@28440: haftmann@28440: in haftmann@28440: haftmann@28440: val _ = O.add_commands haftmann@28634: [("class", ThyOutput.args (Scan.lift Args.name) (K pr_class)), haftmann@28634: ("type", ThyOutput.args (Scan.lift Args.name) (K pr_type))] haftmann@28440: haftmann@28440: end; haftmann@28440: haftmann@28440: haftmann@28440: (* code antiquotation *) haftmann@28440: haftmann@28440: local haftmann@28440: haftmann@28440: val parse_const_terms = Scan.repeat1 Args.term haftmann@28440: >> (fn ts => fn thy => map (Code_Unit.check_const thy) ts); haftmann@28440: val parse_consts = Scan.lift (Args.parens (Args.$$$ "consts")) |-- parse_const_terms haftmann@28679: >> (fn mk_cs => fn thy => fn naming => map (the o Code_Thingol.lookup_const naming) (mk_cs thy)); haftmann@28440: val parse_types = Scan.lift (Args.parens (Args.$$$ "types") |-- Scan.repeat1 Args.name) haftmann@28679: >> (fn tycos => fn thy => fn naming => map (the o Code_Thingol.lookup_tyco naming o Sign.intern_type thy) tycos); haftmann@28440: val parse_classes = Scan.lift (Args.parens (Args.$$$ "classes") |-- Scan.repeat1 Args.name) haftmann@28679: >> (fn classes => fn thy => fn naming => map (the o Code_Thingol.lookup_class naming o Sign.intern_class thy) classes); haftmann@28440: val parse_instances = Scan.lift (Args.parens (Args.$$$ "instances") |-- Scan.repeat1 (Args.name --| Args.$$$ "::" -- Args.name)) haftmann@28679: >> (fn insts => fn thy => fn naming => map (the o Code_Thingol.lookup_instance naming o apsnd (Sign.intern_type thy) o apfst (Sign.intern_class thy) o swap) insts); haftmann@28440: val parse_names = parse_consts || parse_types || parse_classes || parse_instances; haftmann@28440: haftmann@28440: fun code_stmts src ctxt ((mk_cs, mk_stmtss), target) = haftmann@28440: Code_Target.code_of (ProofContext.theory_of ctxt) haftmann@28440: target "Example" (mk_cs (ProofContext.theory_of ctxt)) haftmann@28679: (fn naming => maps (fn f => f (ProofContext.theory_of ctxt) naming) mk_stmtss) haftmann@28727: |> typewriter; haftmann@28440: haftmann@28440: in haftmann@28440: haftmann@28440: val _ = O.add_commands haftmann@28440: [("code_stmts", O.args haftmann@28440: (parse_const_terms -- Scan.repeat parse_names -- Scan.lift (Args.parens Args.name)) haftmann@28440: code_stmts)] haftmann@28440: haftmann@28440: end haftmann@28440: haftmann@28440: end;