let to_html ~configuration code =
let remove_comments s =
String.sub_exn s ~index:3 ~length:(String.length s - 6)
in
let open Higlo in
let parsed = parse ~lang:"ocaml" code in
let flush_tokens revtoklist =
if List.for_all revtoklist
~f:(function Text t when String.strip t = "" -> true | _ -> false)
then ""
else
let html =
Xtmpl_xml.to_string
(List.rev_map ~f:Higlo.token_to_xml revtoklist) in
"<pre>" ^ html ^ "</pre>"
in
let rec loop acc_tokens acc_html acc_toc tokens =
match tokens with
| [] ->
(List.rev acc_toc |> String.concat ~sep:"\n"
|> Markdown.to_toc ~configuration)
>>= fun toc ->
return (List.rev (flush_tokens acc_tokens :: acc_html)
|> String.concat ~sep:"\n", toc)
| one :: more ->
begin match one with
| Bcomment com
| Lcomment com when String.sub com ~index:0 ~length:3 = Some "(*M" ->
let html_code = flush_tokens acc_tokens in
let comment_content = remove_comments com in
Markdown.to_html ~configuration comment_content
>>= fun html_comment ->
loop [] (html_comment :: html_code :: acc_html)
(comment_content :: acc_toc) more
| tok ->
loop (tok :: acc_tokens) acc_html acc_toc more
end
in
loop [] [] [] parsed