Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file template.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140open!Stdunetypevar={loc:Loc.t;name:string;payload:stringoption}typepart=|Textofstring|Varofvartypet={quoted:bool;parts:partlist;loc:Loc.t}letcompare_var_no_locv1v2=matchString.comparev1.namev2.namewith|(Ordering.Lt|Gt)asa->a|Eq->Option.compareString.comparev1.payloadv2.payloadletcompare_partp1p2=match(p1,p2)with|Texts1,Texts2->String.compares1s2|Varv1,Varv2->compare_var_no_locv1v2|Text_,Var_->Ordering.Lt|Var_,Text_->Ordering.Gtletcompare_no_loct1t2=matchList.compare~compare:compare_partt1.partst2.partswith|(Ordering.Lt|Gt)asa->a|Eq->Bool.comparet1.quotedt2.quotedmodulePp:sigvalto_string:t->stringend=structletbuf=Buffer.create16letadd_var{loc=_;name;payload}=letbefore,after=("%{","}")inBuffer.add_stringbufbefore;Buffer.add_stringbufname;(matchpayloadwith|None->()|Somepayload->Buffer.add_charbuf':';Buffer.add_stringbufpayload);Buffer.add_stringbufafterletcheck_valid_unquoteds~loc=ifnot(Atom.is_valids)thenCode_error.raise~loc"Invalid text in unquoted template"[("s",Strings)]letto_string{parts;quoted;loc}=Buffer.clearbuf;ifquotedthenBuffer.add_charbuf'"';letcommit_texts=ifs=""then()elseifnotquotedthen(check_valid_unquoted~locs;Buffer.add_stringbufs)elseBuffer.add_stringbuf(Escape.escapeds)inletrecadd_partsacc_text=function|[]->commit_textacc_text|Texts::rest->add_parts(ifacc_text=""thenselseacc_text^s)rest|Varv::rest->commit_textacc_text;add_varv;add_parts""restinadd_parts""parts;ifquotedthenBuffer.add_charbuf'"';Buffer.contentsbufendletto_string=Pp.to_stringletstring_of_var{loc=_;name;payload}=letbefore,after=("%{","}")inmatchpayloadwith|None->before^name^after|Somep->before^name^":"^p^afterletppt=Stdune.Pp.verbatim(Pp.to_stringt)letpp_split_stringsppf(t:t)=ift.quoted||List.existst.parts~f:(function|Texts->String.containss'\n'|Var_->false)then(List.itert.parts~f:(function|Vars->Format.pp_print_stringppf(string_of_vars)|Texts->(matchString.splits~on:'\n'with|[]->assertfalse|[s]->Format.pp_print_stringppf(Escape.escapeds)|split->Format.pp_print_list~pp_sep:(funppf()->Format.fprintfppf"@,\\n")Format.pp_print_stringppfsplit));Format.fprintfppf"@}\"@]")elseFormat.pp_print_stringppf(Pp.to_stringt)letremove_locst={twithloc=Loc.none;parts=List.mapt.parts~f:(function|Varv->Var{vwithloc=Loc.none}|Text_ass->s)}letdyn_of_var{loc=_;name;payload}=letopenDyn.Encoderinrecord[("name",stringname);("payload",optionstringpayload)]letdyn_of_part=letopenDyn.Encoderinfunction|Texts->constr"Text"[strings]|Varv->constr"Var"[dyn_of_varv]letto_dyn{quoted;parts;loc=_}=letopenDyn.Encoderinrecord[("quoted",boolquoted);("parts",listdyn_of_partparts)]