123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354openImporttypeinline=Doc_types.inline=|Textofstring|Codeofstringtypeblock=Doc_types.block=|Paragraphofinlinelist|Preofstringtypedoc=blocklistletparse_textlocs=try(Doc_lexer.parse_strings:blocklist)withe->failwith(Printf.sprintf"%s:\nInvalid format for doc.text %S:\n%s"(Ast.string_of_locloc)s(Printexc.to_stringe))letget_doclocan:docoption=Annot.get_opt_field(funs->Some(parse_textlocs))["doc"]"text"an(* Conversion to HTML *)lethtml_escapebufs=String.iter(function'<'->Buffer.add_stringbuf"<"|'>'->Buffer.add_stringbuf">"|'&'->Buffer.add_stringbuf"&"|'"'->Buffer.add_stringbuf"""|c->Buffer.add_charbufc)sletprint_inlinebuf=function|Texts->html_escapebufs|Codes->bprintfbuf"<code>%a</code>"html_escapeslethtml_of_docblocks=letbuf=Buffer.create300inbprintfbuf"\n<div class=\"atd-doc\">\n";List.iter(function|Paragraphl->Buffer.add_stringbuf"<p>\n";List.iter(print_inlinebuf)l;Buffer.add_stringbuf"\n</p>\n"|Pres->Buffer.add_stringbuf"<pre>\n";html_escapebufs;Buffer.add_stringbuf"</pre>\n")blocks;bprintfbuf"\n</div>\n";Buffer.contentsbuf