@@ -69,42 +69,97 @@ and transform = function
69
69
*)
70
70
let mrkdwn_of_md md =
71
71
let b = Buffer. create 128 in
72
+ let references : ref_container option ref = ref None in
72
73
let rec f tl = function
73
74
| 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 " `<%s>" tagname;
125
+ Buffer. add_string b (escape_mrkdwn @@ to_html body);
126
+ Printf. bprintf b " </%s>`" tagname;
127
+ loop tl
128
+ | Html_block (_tagname , _attrs , _body ) -> (* todo *) loop tl
94
129
| 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
103
145
and loop = function
104
146
| hd :: tl -> f tl hd
105
147
| [] -> ()
106
148
in
149
+ (* print the document *)
107
150
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 ;
108
163
Buffer. contents b
109
164
110
165
let mrkdwn_of_markdown str = unescape_omd @@ to_markdown @@ transform_list @@ of_string str
0 commit comments