package GT
Generic programming with extensible transformations
Install
Dune Dependency
Authors
Maintainers
Sources
0.5.1.tar.gz
sha256=fe0aa1e40afd36f7c1fcd992c408261d0b5645cea080ea98bc5dbf0b8682187f
sha512=8db0f2d8db4d7c11cf55835ba2b6c4f5ee1e8c09a4bdc2a9c57d50958ff8654688d4c8596079dfd1027d8b9e878f6e1b0d14341bcdf5f63cf96a45b2a571f3cb
doc/src/html/html.ml.html
Source file html.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
(* * Generic transformers: plugins. * Copyright (C) 2016-2019 * Dmitrii Kosarev aka Kakadu * St.Petersburg State University, JetBrains Research *) (** {i Html} module: converts a value to its html represenation (work in progress). *) (* For type declaration [type ('a,'b,...) typ = ...] it will create a transformation function with type [('a -> HTML.er) -> ('b -> HTML.er) -> ... -> ('a,'b,...) typ -> HTML.er ] Inherited attributes' type (both default and for type parameters) are absent. Synthesized attributes' type (both default and for type parameters) is [HTML.er]. *) open Base open Ppxlib open Printf open GTCommon open HelpersBase let trait_name = "html" module Make (AstHelpers : GTHELPERS_sig.S) = struct let trait_name = trait_name module P = Plugin.Make (AstHelpers) open AstHelpers let app_format_sprintf ~loc arg = Exp.app ~loc (Exp.of_longident ~loc (Ldot (Lident "Format", "sprintf"))) arg ;; module H = struct type elt = Exp.t let wrap ~loc s = Exp.of_longident ~loc (Ldot (Lident "HTML", s)) let pcdata ~loc s = Exp.(app ~loc (wrap ~loc "string") (string_const ~loc s)) let div ~loc xs = Exp.app ~loc (wrap ~loc "list") @@ Exp.list ~loc xs let to_list_e ~loc xs = List.fold_right xs ~init:(Exp.construct ~loc (lident "[]") []) ~f:(fun x acc -> Exp.app_list ~loc (Exp.of_longident ~loc (Ldot (Lident "List", "cons"))) [ x; acc ]) ;; let li ~loc xs = Exp.app ~loc (wrap ~loc "li") @@ Exp.app ~loc (wrap ~loc "seq") @@ to_list_e ~loc xs ;; let seq ~loc xs = Exp.app ~loc (wrap ~loc "seq") @@ to_list_e ~loc xs (* let ol ~loc xs = * Exp.app ~loc (wrap ~loc "ol") @@ Exp.app ~loc (wrap ~loc "seq") @@ to_list_e ~loc xs *) let ul ~loc xs = Exp.app ~loc (wrap ~loc "ul") @@ Exp.app ~loc (wrap ~loc "seq") @@ to_list_e ~loc xs ;; let checkbox ~loc name = let open Exp in app ~loc (app_lab ~loc (wrap ~loc "input") "attrs" (string_const ~loc @@ Printf.sprintf "type=\"checkbox\" id=\"%s\"" name)) (app ~loc (wrap ~loc "unit") (unit ~loc)) ;; end class g args tdecls = object (self) inherit [loc, Exp.t, Typ.t, type_arg, Cl.t, Ctf.t, Cf.t, Str.t, Sig.t, Pat.t] Plugin_intf .typ_g inherit P.generator args tdecls inherit P.no_inherit_arg args tdecls method trait_name = trait_name method inh_of_main ~loc _tdecl = Typ.ident ~loc "unit" method syn_of_main ~loc ?in_class _tdecl = self#syn_of_param ~loc "dummy" method syn_of_param ~loc _ = Typ.constr ~loc (Ldot (Lident "HTML", "er")) [] method inh_of_param ~loc tdecl _name = self#inh_of_main ~loc tdecl method plugin_class_params ~loc (typs : Ppxlib.core_type list) ~typname = (* the same as in 'show' plugin *) List.map typs ~f:Typ.from_caml @ [ Typ.var ~loc @@ Naming.make_extra_param typname ] method on_tuple_constr ~loc ~is_self_rec ~mutual_decls ~inhe tdecl constr_info ts = let constr_name = match constr_info with | Some (`Poly s) -> sprintf "`%s" s | Some (`Normal s) -> s | None -> "tuple" in if List.length ts = 0 then H.(pcdata ~loc constr_name) else H.seq ~loc @@ [ H.pcdata ~loc constr_name ; H.ul ~loc (List.map ts ~f:(fun (name, typ) -> H.li ~loc [ self#app_transformation_expr ~loc (self#do_typ_gen ~loc ~is_self_rec ~mutual_decls tdecl typ) (Exp.unit ~loc) (Exp.ident ~loc name) ])) ] method on_record_declaration ~loc ~is_self_rec ~mutual_decls tdecl labs = let pat = Pat.record ~loc @@ List.map labs ~f:(fun l -> Lident l.pld_name.txt, Pat.var ~loc l.pld_name.txt) in let methname = sprintf "do_%s" tdecl.ptype_name.txt in [ (Cf.method_concrete ~loc methname @@ Exp.fun_ ~loc (Pat.unit ~loc) @@ Exp.fun_ ~loc pat @@ let ds = List.map labs ~f:(fun { pld_name; pld_type } -> H.li ~loc [ H.pcdata ~loc pld_name.txt ; self#app_transformation_expr ~loc (self#do_typ_gen ~loc ~is_self_rec ~mutual_decls tdecl pld_type) (Exp.unit ~loc) (Exp.ident ~loc pld_name.txt) ]) in H.ul ~loc @@ (H.pcdata ~loc tdecl.ptype_name.txt :: ds)) ] method! on_record_constr : loc:loc -> is_self_rec:(core_type -> [ `Nonrecursive | `Nonregular | `Regular ]) -> mutual_decls:type_declaration list -> inhe:Exp.t -> _ -> [ `Normal of string | `Poly of string ] -> (string * _ * core_type) list -> label_declaration list -> Exp.t = fun ~loc ~is_self_rec ~mutual_decls ~inhe tdecl info bindings labs -> let constr_name = match info with | `Poly s -> sprintf "`%s" s | `Normal s -> s in let open H in ul ~loc @@ [ pcdata ~loc constr_name ] @ List.map bindings ~f:(fun (pname, lname, typ) -> H.li ~loc [ H.pcdata ~loc lname ; self#app_transformation_expr ~loc (self#do_typ_gen ~loc ~is_self_rec ~mutual_decls tdecl typ) (Exp.unit ~loc) (Exp.ident ~loc pname) ]) method! make_inh ~loc = Pat.unit ~loc, Exp.unit ~loc end let create = (new g :> P.plugin_constructor) end let register () = Expander.register_plugin trait_name (module Make : Plugin_intf.MAKE) let () = register ()
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>