123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126(************************************************************************)(* coq-layout-engine *)(* Copyright 2021 Inria *)(* Written by Emilio J. Gallego Arias *)(************************************************************************)(* Status: Very Experimental *)(************************************************************************)typeabs_kind=|Prod|LammoduleId=structtype'at={relative:string;absolute:stringoption;typ:'aoption}endmoduleVariable=structtype'at={name:string;typ:'a}endmoduleBinder=structtype'at={namel:stringlist;typ:'a}letmap~fb={bwithtyp=fb.typ}end(** Output Layout Box model, designed to be embedded in DOM almost directly, and
to replace Pp.t *)typet=|VariableoftoptionVariable.t(** Variable *)|Constantofstring(** Constant (lexical) *)|IdentifieroftId.t(** Identifier *)|Sortofstringlist(** Sort *)|Appof{fn:t;impl:tlist;argl:tlist}(** Application box *)|Castoftoption*t(** Cast box *)|Absof{kind:abs_kind;binderl:tBinder.tlist;v:t}(** Abstraction *)(* XXX Use binder.t *)|Letof{lhs:t;rhs:t;typ:toption;v:t}(** Let *)|Notationof{key:string;args:tlist;pretty:tlist;raw:t}(** Notation *)|Fixpointoft*t(** Renderer *)moduleH=Tyxml.HtmlmoduleRender=structletxxxkind=H.txt("uninplemented: "^kind)let_classc=[H.a_class[c;"box"]]letspan?(extra=[])ce=leta=_classcinH.span~a(extra@e)letid_to_htmlid=span"identifier"[H.txtid]letbinder_to_html({Binder.namel;typ}:_Binder.t):_H.elt=letnamel=List.mapH.txtnamelinspan"binder"[span"namel"namel;span"btype"[typ]]letrecto_html(b:t):_H.elt=matchbwith|Variable{name;typ}->letname=span"name"[id_to_htmlname]inspan"variable"@@[name]@Option.cata(funtyp->[span"type"[to_htmltyp]])[]typ|Constantc->span"constant"[H.txtc]|Identifier{relative;absolute;typ}->span"reference"@@[span"relative"[H.txtrelative]]@Option.cata(funa->[span"absolute"[H.txta]])[]absolute@Option.cata(funtyp->[span"type"[to_htmltyp]])[]typ|Cast(_c,t)->span"cast"@@[to_htmlt]|Sorte->span"sort"@@List.mapH.txte|App{fn;impl=_;argl}->letfn=to_htmlfninletargl=List.mapto_htmlarglinspan"app"[H.txt"(";fn;span"args"argl;H.txt")"]|Abs{kind;binderl;v}->lethead,delim=matchkindwith|Prod->("forall",",")|Lam->("fun","=>")inletbinderl=List.map(Binder.map~f:to_html)binderlinletbinderl=List.mapbinder_to_htmlbinderlinletv=to_htmlvinspan"abs"[H.txthead;span"binderl"binderl;H.txtdelim;v]|Let_->xxx"let"|Notation{key;args;pretty;raw}->lett_h=span"arguments"(List.mapto_htmlargs)inletpretty_h=List.mapto_htmlprettyinspan"notation"[span"key"[H.txtkey];t_h;span"pretty"pretty_h;span"raw"[to_htmlraw]]|Fixpoint(_,_)->xxx"fixpoint"end