diff --git a/src/MarkdownHTML.ml b/src/MarkdownHTML.ml
index 7169c85..5cc12da 100644
--- a/src/MarkdownHTML.ml
+++ b/src/MarkdownHTML.ml
@@ -1,53 +1,60 @@
(* Copyright (C) 2009 Mauricio Fernandez *)
-module Make_html5 (Html5 : Html5_sigs.T with type 'a Xml.wrap = 'a and type 'a wrap = 'a and type 'a list_wrap = 'a list) = struct
+module Make_html5 (Html5 : Html5_sigs.T) = struct
open Markdown
open Html5
+module W = Xml.W
+
+let pcdata_w x = W.return @@ pcdata @@ W.return x
+let wrap_list f l =
+ List.fold_right
+ (fun x l -> W.(cons (return @@ f x) l))
+ l (W.nil ())
let rec elm_to_html ~render_pre ~render_link ~render_img elm =
let self = elm_to_html ~render_pre ~render_link ~render_img in
- let item l = li (List.map self l)
+ let item l = li (wrap_list self l)
in match elm with
Normal text -> p (par_text_to_html ~render_link ~render_img text)
| Pre (s, kind) -> begin match kind with
Some k -> render_pre ~kind:k s
- | None -> pre [pcdata s]
+ | None -> pre W.(singleton @@ pcdata_w s)
end
| Heading (l, text) ->
let f =
match l with 1 -> h1 | 2 -> h2 | 3 -> h3 | 4 -> h4 | 5 -> h5 | _ -> h6
in f (par_text_to_html render_link render_img text)
- | Quote ps -> blockquote (List.map self ps)
+ | Quote ps -> blockquote @@ wrap_list self ps
| Ulist (fst, others) ->
- ul (List.map item (fst :: others))
+ ul (wrap_list item (fst :: others))
| Olist (fst, others) ->
- let item l = li (List.map self l) in
- ol (List.map item (fst :: others))
+ ol (wrap_list item (fst :: others))
and par_text_to_html ~render_link ~render_img =
- List.map (text_to_html ~render_link ~render_img)
+ wrap_list (text_to_html ~render_link ~render_img)
and text_to_html ~render_link ~render_img = function
- Text s -> pcdata s
- | Emph s -> em [pcdata s]
- | Bold s -> b [pcdata s]
- | Struck l -> del (List.map (text_to_html ~render_link ~render_img) l)
- | Code s -> code [pcdata s]
+ Text s -> pcdata @@ W.return s
+ | Emph s -> em @@ W.singleton @@ pcdata_w s
+ | Bold s -> b @@ W.singleton @@ pcdata_w s
+ | Struck l -> del (wrap_list (text_to_html ~render_link ~render_img) l)
+ | Code s -> code @@ W.singleton @@ pcdata_w s
| Anchor id ->
(* would like to do
a ~a:[XHTML.M_01_00.a_name_01_00 id] []
but that'd require switching to M_01_00 everywhere, so cheap hack *)
- b ~a:[a_id id] []
+ b ~a:[a_id @@ W.return id] (W.nil ())
| Link href -> begin match href.href_target with
s when String.length s >= 1 && s.[0] = '#' ->
- a ~a:[a_href (uri_of_string s)] [pcdata href.href_desc]
+ a ~a:[a_href (W.return @@ uri_of_string s)]
+ @@ W.singleton @@ pcdata_w href.href_desc
| _ -> render_link href
end
| Image href -> render_img href
let to_html ~render_pre ~render_link ~render_img l =
- List.map (elm_to_html ~render_pre ~render_link ~render_img) l
+ W.map (elm_to_html ~render_pre ~render_link ~render_img) l
end
diff --git a/src/MarkdownHTML.mli b/src/MarkdownHTML.mli
new file mode 100644
index 0000000..c71a646
--- /dev/null
+++ b/src/MarkdownHTML.mli
@@ -0,0 +1,37 @@
+open Markdown
+
+module Make_html5 (Html5 : Html5_sigs.T) : sig
+
+ val elm_to_html :
+ render_pre:(kind:string ->
+ string ->
+ ([< Html5_types.li_content_fun
+ > `Blockquote `H1 `H2 `H3 `H4 `H5 `H6 `Ol `P `Pre `Ul ]
+ as 'a)
+ Html5.elt) ->
+ render_link:(href -> Html5_types.phrasing Html5.elt) ->
+ render_img:(img_ref -> Html5_types.phrasing Html5.elt) ->
+ paragraph -> 'a Html5.elt
+
+ val par_text_to_html :
+ render_link:(href -> Html5_types.phrasing Html5.elt) ->
+ render_img:(img_ref -> Html5_types.phrasing Html5.elt) ->
+ par_text -> Html5_types.phrasing Html5.elt Html5.list_wrap
+
+ val text_to_html :
+ render_link:(href -> Html5_types.phrasing Html5.elt) ->
+ render_img:(img_ref -> Html5_types.phrasing Html5.elt) ->
+ text -> Html5_types.phrasing Html5.elt
+
+ val to_html :
+ render_pre:(kind:string ->
+ string ->
+ ([< Html5_types.li_content_fun
+ > `Blockquote `H1 `H2 `H3 `H4 `H5 `H6 `Ol `P `Pre `Ul ]
+ as 'a)
+ Html5.elt) ->
+ render_link:(href -> Html5_types.phrasing Html5.elt) ->
+ render_img:(img_ref -> Html5_types.phrasing Html5.elt) ->
+ paragraph Html5.list_wrap -> 'a Html5.elt Html5.list_wrap
+
+end