Skip to content

Commit 180590a

Browse files
committed
mrkdwn: handle elements that don't concern indentation
1 parent 6c77d36 commit 180590a

File tree

1 file changed

+83
-28
lines changed

1 file changed

+83
-28
lines changed

lib/mrkdwn.ml

Lines changed: 83 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -69,42 +69,97 @@ and transform = function
6969
*)
7070
let mrkdwn_of_md md =
7171
let b = Buffer.create 128 in
72+
let references : ref_container option ref = ref None in
7273
let rec f tl = function
7374
| X _ -> loop tl
74-
| Blockquote _q -> loop tl
75-
| Ref (_rc, _name, _text, _fallback) -> loop tl
76-
| Img_ref (_rc, _name, _text, _fallback) -> loop tl
77-
| Paragraph _md -> loop tl
78-
| Img (_alt, _src, _title) -> loop tl
79-
| Text _t -> loop tl
80-
| Raw _t -> loop tl
81-
| Raw_block _t -> loop tl
82-
| Emph _md -> loop tl
83-
| Bold _md -> loop tl
84-
| Ul _l -> loop tl
85-
| Ol _l -> loop tl
86-
| Ulp _l -> loop tl
87-
| Olp _l -> loop tl
88-
| Code_block (_lang, _c) -> loop tl
89-
| Code (_lang, _c) -> loop tl
90-
| Br -> loop tl
91-
| Hr -> loop tl
92-
| Html (_tagname, _attrs, _body) -> loop tl
93-
| Html_block (_tagname, _attrs, _body) -> loop tl
75+
| Blockquote _q -> (* todo *) loop tl
76+
| Ref (rc, _name, _text, fallback) | Img_ref (rc, _name, _text, fallback) ->
77+
(* [rc] stores refs from whole document, so it's enough to record just the
78+
first encounter
79+
*)
80+
if Option.is_empty !references then references := Some rc;
81+
(* [fallback#to_string] renders as
82+
[<text>][<name>] for Ref, e.g., [interesting fact][1]
83+
and
84+
![<text>][<name>] for Img_ref, e.g., ![image of cat][1]
85+
*)
86+
loop (Raw fallback#to_string :: tl)
87+
| Paragraph _md -> (* todo *) loop tl
88+
| Img (alt, src, title) -> loop (Url (src, [ Text alt ], title) :: tl)
89+
| Text t ->
90+
Buffer.add_string b @@ escape_mrkdwn t;
91+
loop tl
92+
| Raw s ->
93+
Buffer.add_string b s;
94+
loop tl
95+
| Raw_block s ->
96+
Buffer.add_char b '\n';
97+
Buffer.add_string b s;
98+
Buffer.add_char b '\n';
99+
loop tl
100+
| Emph md' ->
101+
Buffer.add_string b "_";
102+
loop md';
103+
Buffer.add_string b "_";
104+
loop tl
105+
| Bold md' ->
106+
Buffer.add_string b "*";
107+
loop md';
108+
Buffer.add_string b "*";
109+
loop tl
110+
| Ul _l -> (* todo *) loop tl
111+
| Ol _l -> (* todo *) loop tl
112+
| Ulp _l -> (* todo *) loop tl
113+
| Olp _l -> (* todo *) loop tl
114+
| Code_block (_lang, _c) -> (* todo *) loop tl
115+
| Code (_lang, c) ->
116+
Buffer.add_char b '`';
117+
Buffer.add_string b (escape_mrkdwn c);
118+
Buffer.add_char b '`';
119+
loop tl
120+
| Hr ->
121+
Buffer.add_string b "* * *\n";
122+
loop tl
123+
| Html (tagname, _attrs, body) ->
124+
Printf.bprintf b "`&lt;%s&gt;" tagname;
125+
Buffer.add_string b (escape_mrkdwn @@ to_html body);
126+
Printf.bprintf b "&lt;/%s&gt;`" tagname;
127+
loop tl
128+
| Html_block (_tagname, _attrs, _body) -> (* todo *) loop tl
94129
| Html_comment _s -> loop tl
95-
| Url (_href, _s, _title) -> loop tl
96-
| H1 _md -> loop tl
97-
| H2 _md -> loop tl
98-
| H3 _md -> loop tl
99-
| H4 _md -> loop tl
100-
| H5 _md -> loop tl
101-
| H6 _md -> loop tl
102-
| NL -> loop tl
130+
| Url (href, s, title) ->
131+
Buffer.add_char b '<';
132+
Buffer.add_string b href;
133+
Buffer.add_char b '|';
134+
if String.length title > 0 then Printf.bprintf b "%s - " @@ escape_mrkdwn title;
135+
loop s;
136+
Buffer.add_char b '>';
137+
loop tl
138+
| H1 md' | H2 md' | H3 md' | H4 md' | H5 md' | H6 md' -> loop (Paragraph (transform_list [ Bold md' ]) :: tl)
139+
| NL | Br ->
140+
(* the string "\n" renders NL
141+
the string "\\n" (backslash-newline) renders Br
142+
*)
143+
Buffer.add_char b '\n';
144+
loop tl
103145
and loop = function
104146
| hd :: tl -> f tl hd
105147
| [] -> ()
106148
in
149+
(* print the document *)
107150
loop md;
151+
(* print any references *)
152+
begin
153+
match !references with
154+
| None -> ()
155+
| Some r ->
156+
let print_ref (name, (url, title)) =
157+
if String.equal title "" then Printf.bprintf b "[%s]: %s \n" name url
158+
else Printf.bprintf b "[%s]: %s \"%s\"\n" name url title
159+
in
160+
Buffer.add_char b '\n';
161+
List.iter ~f:print_ref r#get_all
162+
end;
108163
Buffer.contents b
109164

110165
let mrkdwn_of_markdown str = unescape_omd @@ to_markdown @@ transform_list @@ of_string str

0 commit comments

Comments
 (0)