123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136moduleHtml:sigtypetvalstring_of_list:tlist->stringtypeattrvala_class:stringlist->attrvalcode:a:attrlist->tlist->tvalspan:a:attrlist->tlist->tvaldiv:a:attrlist->tlist->tvaltxt:string->tmoduleUnsafe:sigvaldata:string->tendend=structtypet=Rawofstring|Txtofstring|Concatoftlistletadd_escape_stringbufs=(* https://discuss.ocaml.org/t/html-encoding-of-string/4289/4 *)letadds=Buffer.add_stringbufsinletlen=String.lengthsinletmax_idx=len-1inletflushstarti=ifstart<lenthenBuffer.add_substringbufsstart(i-start)inletrecloopstarti=ifi>max_idxthenflushstartielsematchString.getsiwith|'&'->escape"&"starti|'<'->escape"<"starti|'>'->escape">"starti|'\''->escape"'"starti|'"'->escape"""starti|'@'->escape"@"starti|_->loopstart(i+1)andescapeamperstrstarti=flushstarti;addamperstr;letnext=i+1inloopnextnextinloop00letto_stringt=letbuf=Buffer.create16inletrecgo=function|Raws->Buffer.add_stringbufs|Txts->add_escape_stringbufs|Concatxs->List.itergoxsingot;Buffer.contentsbufletstring_of_listlst=to_string(Concatlst)typeattr=tleta_classlst=Concat[Raw"class=\"";Txt(String.concat" "lst);Raw"\""]letattrs=function[]->Concat[]|xs->Concat(Raw" "::xs)letblockname~abody=letname=RawnameinConcat[Raw"<";name;attrsa;Raw">";Concatbody;Raw"</";name;Raw">"]letcode=block"code"letspan=block"span"letdiv=block"div"lettxts=TxtsmoduleUnsafe=structletdatas=Rawsendendletof_strings~kind~prefix_name~name~rhs~typedecl_params~doc=letopenHtmlinletkind=code~a:[a_class["entry-kind"]][txtkind]andtypedecl_params=matchtypedecl_paramswith|None->[]|Somep->[span~a:[a_class[(* the parameter of the typedecl are highlighted as if part of main entry name. *)"entry-name";];][txt(p^" ")];]andprefix_name=matchprefix_namewith|None->[]|Some""->[]|Someprefix_name->[span~a:[a_class["prefix-name"]][txtprefix_name]]andname=matchnamewith|Somename->[span~a:[a_class["entry-name"]][txtname]]|None->[]andrhs=matchrhswith|None->[]|Somerhs->[code~a:[a_class["entry-rhs"]][txtrhs]]inHtml.string_of_list[kind;code~a:[a_class["entry-title"]](typedecl_params@prefix_name@name@rhs);div~a:[a_class["entry-comment"]][Unsafe.datadoc];]letkind_doc="doc"letkind_typedecl="type"letkind_module="mod"letkind_exception="exn"letkind_class_type="class"letkind_class="class"letkind_method="meth"letkind_extension_constructor="cons"letkind_module_type="sig"letkind_constructor="cons"letkind_field="field"letkind_value="val"letkind_extension="ext"