-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathsimple_markup__html.ml
49 lines (43 loc) · 1.76 KB
/
simple_markup__html.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
(* Copyright (C) 2009 Mauricio Fernandez <[email protected]> *)
open Simple_markup
open XHTML.M
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)
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]
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)
| Ulist (fst, others) ->
ul (item fst) (List.map item others)
| Olist (fst, others) ->
let item l = li (List.map self l) in
ol (item fst) (List.map item others)
and par_text_to_html ~render_link ~render_img =
List.map (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]
| 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] []
| 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]
| _ -> 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