commonmarker 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of commonmarker might be problematic. Click here for more details.

Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/ext/commonmarker/cmark/CMakeLists.txt +10 -4
  3. data/ext/commonmarker/cmark/Makefile +5 -5
  4. data/ext/commonmarker/cmark/api_test/CMakeLists.txt +1 -1
  5. data/ext/commonmarker/cmark/api_test/main.c +16 -0
  6. data/ext/commonmarker/cmark/build/CMakeCache.txt +3 -4
  7. data/ext/commonmarker/cmark/build/CMakeFiles/2.8.10.1/CMakeSystem.cmake +4 -4
  8. data/ext/commonmarker/cmark/build/CMakeFiles/CMakeError.log +12 -12
  9. data/ext/commonmarker/cmark/build/CMakeFiles/CMakeOutput.log +97 -142
  10. data/ext/commonmarker/cmark/build/CMakeFiles/Makefile.cmake +0 -1
  11. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/build.make +1 -1
  12. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/link.txt +1 -1
  13. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/DependInfo.cmake +1 -1
  14. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/build.make +23 -23
  15. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/cmake_clean.cmake +2 -2
  16. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/link.txt +1 -1
  17. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/blocks.c.o +0 -0
  18. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/buffer.c.o +0 -0
  19. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/cmark.c.o +0 -0
  20. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/commonmark.c.o +0 -0
  21. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/houdini_html_u.c.o +0 -0
  22. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/html.c.o +0 -0
  23. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/inlines.c.o +0 -0
  24. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/node.c.o +0 -0
  25. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/references.c.o +0 -0
  26. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/render.c.o +0 -0
  27. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/scanners.c.o +0 -0
  28. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/utf8.c.o +0 -0
  29. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/xml.c.o +0 -0
  30. data/ext/commonmarker/cmark/build/src/cmake_install.cmake +3 -3
  31. data/ext/commonmarker/cmark/build/src/cmark_version.h +2 -2
  32. data/ext/commonmarker/cmark/build/src/config.h +6 -6
  33. data/ext/commonmarker/cmark/build/src/libcmark.a +0 -0
  34. data/ext/commonmarker/cmark/build/src/libcmark.pc +1 -1
  35. data/ext/commonmarker/cmark/build/testdir/CTestTestfile.cmake +4 -4
  36. data/ext/commonmarker/cmark/changelog.txt +46 -0
  37. data/ext/commonmarker/cmark/man/man3/cmark.3 +21 -20
  38. data/ext/commonmarker/cmark/src/CMakeLists.txt +4 -6
  39. data/ext/commonmarker/cmark/src/bench.h +8 -8
  40. data/ext/commonmarker/cmark/src/blocks.c +917 -947
  41. data/ext/commonmarker/cmark/src/buffer.c +213 -288
  42. data/ext/commonmarker/cmark/src/buffer.h +19 -21
  43. data/ext/commonmarker/cmark/src/chunk.h +78 -82
  44. data/ext/commonmarker/cmark/src/cmark.c +9 -17
  45. data/ext/commonmarker/cmark/src/cmark.h +113 -157
  46. data/ext/commonmarker/cmark/src/cmark_ctype.c +24 -35
  47. data/ext/commonmarker/cmark/src/commonmark.c +390 -425
  48. data/ext/commonmarker/cmark/src/config.h.in +6 -6
  49. data/ext/commonmarker/cmark/src/houdini.h +21 -15
  50. data/ext/commonmarker/cmark/src/houdini_href_e.c +50 -57
  51. data/ext/commonmarker/cmark/src/houdini_html_e.c +36 -51
  52. data/ext/commonmarker/cmark/src/houdini_html_u.c +119 -124
  53. data/ext/commonmarker/cmark/src/html.c +289 -307
  54. data/ext/commonmarker/cmark/src/inlines.c +976 -1030
  55. data/ext/commonmarker/cmark/src/inlines.h +4 -2
  56. data/ext/commonmarker/cmark/src/iterator.c +96 -126
  57. data/ext/commonmarker/cmark/src/iterator.h +5 -5
  58. data/ext/commonmarker/cmark/src/latex.c +379 -401
  59. data/ext/commonmarker/cmark/src/main.c +168 -175
  60. data/ext/commonmarker/cmark/src/man.c +212 -226
  61. data/ext/commonmarker/cmark/src/node.c +746 -839
  62. data/ext/commonmarker/cmark/src/node.h +47 -48
  63. data/ext/commonmarker/cmark/src/parser.h +14 -14
  64. data/ext/commonmarker/cmark/src/references.c +101 -111
  65. data/ext/commonmarker/cmark/src/references.h +10 -8
  66. data/ext/commonmarker/cmark/src/render.c +144 -167
  67. data/ext/commonmarker/cmark/src/render.h +22 -41
  68. data/ext/commonmarker/cmark/src/scanners.c +27695 -20903
  69. data/ext/commonmarker/cmark/src/scanners.h +2 -1
  70. data/ext/commonmarker/cmark/src/scanners.re +1 -1
  71. data/ext/commonmarker/cmark/src/utf8.c +276 -419
  72. data/ext/commonmarker/cmark/src/utf8.h +6 -6
  73. data/ext/commonmarker/cmark/src/xml.c +129 -144
  74. data/ext/commonmarker/cmark/test/CMakeLists.txt +4 -4
  75. data/ext/commonmarker/cmark/test/smart_punct.txt +8 -0
  76. data/ext/commonmarker/cmark/test/spec.txt +109 -47
  77. data/lib/commonmarker/version.rb +1 -1
  78. metadata +2 -2
@@ -12,322 +12,304 @@
12
12
 
13
13
  // Functions to convert cmark_nodes to HTML strings.
14
14
 
15
- static void escape_html(cmark_strbuf *dest, const unsigned char *source, bufsize_t length)
16
- {
17
- houdini_escape_html0(dest, source, length, 0);
15
+ static void escape_html(cmark_strbuf *dest, const unsigned char *source,
16
+ bufsize_t length) {
17
+ houdini_escape_html0(dest, source, length, 0);
18
18
  }
19
19
 
20
- static inline void cr(cmark_strbuf *html)
21
- {
22
- if (html->size && html->ptr[html->size - 1] != '\n')
23
- cmark_strbuf_putc(html, '\n');
20
+ static inline void cr(cmark_strbuf *html) {
21
+ if (html->size && html->ptr[html->size - 1] != '\n')
22
+ cmark_strbuf_putc(html, '\n');
24
23
  }
25
24
 
26
25
  struct render_state {
27
- cmark_strbuf* html;
28
- cmark_node *plain;
26
+ cmark_strbuf *html;
27
+ cmark_node *plain;
29
28
  };
30
29
 
31
- static void
32
- S_render_sourcepos(cmark_node *node, cmark_strbuf *html, int options)
33
- {
34
- if (CMARK_OPT_SOURCEPOS & options) {
35
- cmark_strbuf_printf(html, " data-sourcepos=\"%d:%d-%d:%d\"",
36
- cmark_node_get_start_line(node),
37
- cmark_node_get_start_column(node),
38
- cmark_node_get_end_line(node),
39
- cmark_node_get_end_column(node));
40
- }
30
+ static void S_render_sourcepos(cmark_node *node, cmark_strbuf *html,
31
+ int options) {
32
+ char buffer[100];
33
+ if (CMARK_OPT_SOURCEPOS & options) {
34
+ sprintf(buffer, " data-sourcepos=\"%d:%d-%d:%d\"",
35
+ cmark_node_get_start_line(node), cmark_node_get_start_column(node),
36
+ cmark_node_get_end_line(node), cmark_node_get_end_column(node));
37
+ cmark_strbuf_puts(html, buffer);
38
+ }
41
39
  }
42
40
 
43
- static int
44
- S_render_node(cmark_node *node, cmark_event_type ev_type,
45
- struct render_state *state, int options)
46
- {
47
- cmark_node *parent;
48
- cmark_node *grandparent;
49
- cmark_strbuf *html = state->html;
50
- char start_header[] = "<h0";
51
- char end_header[] = "</h0";
52
- bool tight;
53
-
54
- bool entering = (ev_type == CMARK_EVENT_ENTER);
55
-
56
- if (state->plain == node) { // back at original node
57
- state->plain = NULL;
58
- }
59
-
60
- if (state->plain != NULL) {
61
- switch(node->type) {
62
- case CMARK_NODE_TEXT:
63
- case CMARK_NODE_CODE:
64
- case CMARK_NODE_INLINE_HTML:
65
- escape_html(html, node->as.literal.data,
66
- node->as.literal.len);
67
- break;
68
-
69
- case CMARK_NODE_LINEBREAK:
70
- case CMARK_NODE_SOFTBREAK:
71
- cmark_strbuf_putc(html, ' ');
72
- break;
73
-
74
- default:
75
- break;
76
- }
77
- return 1;
78
- }
79
-
80
- switch (node->type) {
81
- case CMARK_NODE_DOCUMENT:
82
- break;
83
-
84
- case CMARK_NODE_BLOCK_QUOTE:
85
- if (entering) {
86
- cr(html);
87
- cmark_strbuf_puts(html, "<blockquote");
88
- S_render_sourcepos(node, html, options);
89
- cmark_strbuf_puts(html, ">\n");
90
- } else {
91
- cr(html);
92
- cmark_strbuf_puts(html, "</blockquote>\n");
93
- }
94
- break;
95
-
96
- case CMARK_NODE_LIST: {
97
- cmark_list_type list_type = node->as.list.list_type;
98
- int start = node->as.list.start;
99
-
100
- if (entering) {
101
- cr(html);
102
- if (list_type == CMARK_BULLET_LIST) {
103
- cmark_strbuf_puts(html, "<ul");
104
- S_render_sourcepos(node, html, options);
105
- cmark_strbuf_puts(html, ">\n");
106
- } else if (start == 1) {
107
- cmark_strbuf_puts(html, "<ol");
108
- S_render_sourcepos(node, html, options);
109
- cmark_strbuf_puts(html, ">\n");
110
- } else {
111
- cmark_strbuf_printf(html,
112
- "<ol start=\"%d\"",
113
- start);
114
- S_render_sourcepos(node, html, options);
115
- cmark_strbuf_puts(html, ">\n");
116
- }
117
- } else {
118
- cmark_strbuf_puts(html,
119
- list_type == CMARK_BULLET_LIST ?
120
- "</ul>\n" : "</ol>\n");
121
- }
122
- break;
123
- }
124
-
125
- case CMARK_NODE_ITEM:
126
- if (entering) {
127
- cr(html);
128
- cmark_strbuf_puts(html, "<li");
129
- S_render_sourcepos(node, html, options);
130
- cmark_strbuf_putc(html, '>');
131
- } else {
132
- cmark_strbuf_puts(html, "</li>\n");
133
- }
134
- break;
135
-
136
- case CMARK_NODE_HEADER:
137
- if (entering) {
138
- cr(html);
139
- start_header[2] = '0' + node->as.header.level;
140
- cmark_strbuf_puts(html, start_header);
141
- S_render_sourcepos(node, html, options);
142
- cmark_strbuf_putc(html, '>');
143
- } else {
144
- end_header[3] = '0' + node->as.header.level;
145
- cmark_strbuf_puts(html, end_header);
146
- cmark_strbuf_puts(html, ">\n");
147
- }
148
- break;
149
-
150
- case CMARK_NODE_CODE_BLOCK:
151
- cr(html);
152
-
153
- if (!node->as.code.fenced || node->as.code.info.len == 0) {
154
- cmark_strbuf_puts(html, "<pre");
155
- S_render_sourcepos(node, html, options);
156
- cmark_strbuf_puts(html, "><code>");
157
- } else {
158
- bufsize_t first_tag = 0;
159
- while (first_tag < node->as.code.info.len &&
160
- !cmark_isspace(node->as.code.info.data[first_tag])) {
161
- first_tag += 1;
162
- }
163
-
164
- cmark_strbuf_puts(html, "<pre");
165
- S_render_sourcepos(node, html, options);
166
- cmark_strbuf_puts(html, "><code class=\"language-");
167
- escape_html(html, node->as.code.info.data, first_tag);
168
- cmark_strbuf_puts(html, "\">");
169
- }
170
-
171
- escape_html(html, node->as.code.literal.data,
172
- node->as.code.literal.len);
173
- cmark_strbuf_puts(html, "</code></pre>\n");
174
- break;
175
-
176
- case CMARK_NODE_HTML:
177
- cr(html);
178
- if (options & CMARK_OPT_SAFE) {
179
- cmark_strbuf_puts(html, "<!-- raw HTML omitted -->");
180
- } else {
181
- cmark_strbuf_put(html, node->as.literal.data,
182
- node->as.literal.len);
183
- }
184
- cr(html);
185
- break;
186
-
187
- case CMARK_NODE_HRULE:
188
- cr(html);
189
- cmark_strbuf_puts(html, "<hr");
190
- S_render_sourcepos(node, html, options);
191
- cmark_strbuf_puts(html, " />\n");
192
- break;
193
-
194
- case CMARK_NODE_PARAGRAPH:
195
- parent = cmark_node_parent(node);
196
- grandparent = cmark_node_parent(parent);
197
- if (grandparent != NULL &&
198
- grandparent->type == CMARK_NODE_LIST) {
199
- tight = grandparent->as.list.tight;
200
- } else {
201
- tight = false;
202
- }
203
- if (!tight) {
204
- if (entering) {
205
- cr(html);
206
- cmark_strbuf_puts(html, "<p");
207
- S_render_sourcepos(node, html, options);
208
- cmark_strbuf_putc(html, '>');
209
- } else {
210
- cmark_strbuf_puts(html, "</p>\n");
211
- }
212
- }
213
- break;
214
-
215
- case CMARK_NODE_TEXT:
216
- escape_html(html, node->as.literal.data, node->as.literal.len);
217
- break;
218
-
219
- case CMARK_NODE_LINEBREAK:
220
- cmark_strbuf_puts(html, "<br />\n");
221
- break;
222
-
223
- case CMARK_NODE_SOFTBREAK:
224
- if (options & CMARK_OPT_HARDBREAKS) {
225
- cmark_strbuf_puts(html, "<br />\n");
226
- } else {
227
- cmark_strbuf_putc(html, '\n');
228
- }
229
- break;
230
-
231
- case CMARK_NODE_CODE:
232
- cmark_strbuf_puts(html, "<code>");
233
- escape_html(html, node->as.literal.data, node->as.literal.len);
234
- cmark_strbuf_puts(html, "</code>");
235
- break;
236
-
237
- case CMARK_NODE_INLINE_HTML:
238
- if (options & CMARK_OPT_SAFE) {
239
- cmark_strbuf_puts(html, "<!-- raw HTML omitted -->");
240
- } else {
241
- cmark_strbuf_put(html, node->as.literal.data,
242
- node->as.literal.len);
243
- }
244
- break;
245
-
246
- case CMARK_NODE_STRONG:
247
- if (entering) {
248
- cmark_strbuf_puts(html, "<strong>");
249
- } else {
250
- cmark_strbuf_puts(html, "</strong>");
251
- }
252
- break;
253
-
254
- case CMARK_NODE_EMPH:
255
- if (entering) {
256
- cmark_strbuf_puts(html, "<em>");
257
- } else {
258
- cmark_strbuf_puts(html, "</em>");
259
- }
260
- break;
261
-
262
- case CMARK_NODE_LINK:
263
- if (entering) {
264
- cmark_strbuf_puts(html, "<a href=\"");
265
- if (!((options & CMARK_OPT_SAFE) &&
266
- scan_dangerous_url(&node->as.link.url, 0))) {
267
- houdini_escape_href(html,
268
- node->as.link.url.data,
269
- node->as.link.url.len);
270
-
271
- }
272
- if (node->as.link.title.len) {
273
- cmark_strbuf_puts(html, "\" title=\"");
274
- escape_html(html,
275
- node->as.link.title.data,
276
- node->as.link.title.len);
277
- }
278
- cmark_strbuf_puts(html, "\">");
279
- } else {
280
- cmark_strbuf_puts(html, "</a>");
281
- }
282
- break;
283
-
284
- case CMARK_NODE_IMAGE:
285
- if (entering) {
286
- cmark_strbuf_puts(html, "<img src=\"");
287
- if (!((options & CMARK_OPT_SAFE) &&
288
- scan_dangerous_url(&node->as.link.url, 0))) {
289
- houdini_escape_href(html,
290
- node->as.link.url.data,
291
- node->as.link.url.len);
292
-
293
- }
294
- cmark_strbuf_puts(html, "\" alt=\"");
295
- state->plain = node;
296
- } else {
297
- if (node->as.link.title.len) {
298
- cmark_strbuf_puts(html, "\" title=\"");
299
- escape_html(html, node->as.link.title.data,
300
- node->as.link.title.len);
301
- }
302
-
303
- cmark_strbuf_puts(html, "\" />");
304
- }
305
- break;
306
-
307
- default:
308
- assert(false);
309
- break;
310
- }
311
-
312
- // cmark_strbuf_putc(html, 'x');
313
- return 1;
41
+ static int S_render_node(cmark_node *node, cmark_event_type ev_type,
42
+ struct render_state *state, int options) {
43
+ cmark_node *parent;
44
+ cmark_node *grandparent;
45
+ cmark_strbuf *html = state->html;
46
+ char start_header[] = "<h0";
47
+ char end_header[] = "</h0";
48
+ bool tight;
49
+ char buffer[100];
50
+
51
+ bool entering = (ev_type == CMARK_EVENT_ENTER);
52
+
53
+ if (state->plain == node) { // back at original node
54
+ state->plain = NULL;
55
+ }
56
+
57
+ if (state->plain != NULL) {
58
+ switch (node->type) {
59
+ case CMARK_NODE_TEXT:
60
+ case CMARK_NODE_CODE:
61
+ case CMARK_NODE_INLINE_HTML:
62
+ escape_html(html, node->as.literal.data, node->as.literal.len);
63
+ break;
64
+
65
+ case CMARK_NODE_LINEBREAK:
66
+ case CMARK_NODE_SOFTBREAK:
67
+ cmark_strbuf_putc(html, ' ');
68
+ break;
69
+
70
+ default:
71
+ break;
72
+ }
73
+ return 1;
74
+ }
75
+
76
+ switch (node->type) {
77
+ case CMARK_NODE_DOCUMENT:
78
+ break;
79
+
80
+ case CMARK_NODE_BLOCK_QUOTE:
81
+ if (entering) {
82
+ cr(html);
83
+ cmark_strbuf_puts(html, "<blockquote");
84
+ S_render_sourcepos(node, html, options);
85
+ cmark_strbuf_puts(html, ">\n");
86
+ } else {
87
+ cr(html);
88
+ cmark_strbuf_puts(html, "</blockquote>\n");
89
+ }
90
+ break;
91
+
92
+ case CMARK_NODE_LIST: {
93
+ cmark_list_type list_type = node->as.list.list_type;
94
+ int start = node->as.list.start;
95
+
96
+ if (entering) {
97
+ cr(html);
98
+ if (list_type == CMARK_BULLET_LIST) {
99
+ cmark_strbuf_puts(html, "<ul");
100
+ S_render_sourcepos(node, html, options);
101
+ cmark_strbuf_puts(html, ">\n");
102
+ } else if (start == 1) {
103
+ cmark_strbuf_puts(html, "<ol");
104
+ S_render_sourcepos(node, html, options);
105
+ cmark_strbuf_puts(html, ">\n");
106
+ } else {
107
+ sprintf(buffer, "<ol start=\"%d\"", start);
108
+ cmark_strbuf_puts(html, buffer);
109
+ S_render_sourcepos(node, html, options);
110
+ cmark_strbuf_puts(html, ">\n");
111
+ }
112
+ } else {
113
+ cmark_strbuf_puts(html,
114
+ list_type == CMARK_BULLET_LIST ? "</ul>\n" : "</ol>\n");
115
+ }
116
+ break;
117
+ }
118
+
119
+ case CMARK_NODE_ITEM:
120
+ if (entering) {
121
+ cr(html);
122
+ cmark_strbuf_puts(html, "<li");
123
+ S_render_sourcepos(node, html, options);
124
+ cmark_strbuf_putc(html, '>');
125
+ } else {
126
+ cmark_strbuf_puts(html, "</li>\n");
127
+ }
128
+ break;
129
+
130
+ case CMARK_NODE_HEADER:
131
+ if (entering) {
132
+ cr(html);
133
+ start_header[2] = (char)('0' + node->as.header.level);
134
+ cmark_strbuf_puts(html, start_header);
135
+ S_render_sourcepos(node, html, options);
136
+ cmark_strbuf_putc(html, '>');
137
+ } else {
138
+ end_header[3] = (char)('0' + node->as.header.level);
139
+ cmark_strbuf_puts(html, end_header);
140
+ cmark_strbuf_puts(html, ">\n");
141
+ }
142
+ break;
143
+
144
+ case CMARK_NODE_CODE_BLOCK:
145
+ cr(html);
146
+
147
+ if (!node->as.code.fenced || node->as.code.info.len == 0) {
148
+ cmark_strbuf_puts(html, "<pre");
149
+ S_render_sourcepos(node, html, options);
150
+ cmark_strbuf_puts(html, "><code>");
151
+ } else {
152
+ bufsize_t first_tag = 0;
153
+ while (first_tag < node->as.code.info.len &&
154
+ !cmark_isspace(node->as.code.info.data[first_tag])) {
155
+ first_tag += 1;
156
+ }
157
+
158
+ cmark_strbuf_puts(html, "<pre");
159
+ S_render_sourcepos(node, html, options);
160
+ cmark_strbuf_puts(html, "><code class=\"language-");
161
+ escape_html(html, node->as.code.info.data, first_tag);
162
+ cmark_strbuf_puts(html, "\">");
163
+ }
164
+
165
+ escape_html(html, node->as.code.literal.data, node->as.code.literal.len);
166
+ cmark_strbuf_puts(html, "</code></pre>\n");
167
+ break;
168
+
169
+ case CMARK_NODE_HTML:
170
+ cr(html);
171
+ if (options & CMARK_OPT_SAFE) {
172
+ cmark_strbuf_puts(html, "<!-- raw HTML omitted -->");
173
+ } else {
174
+ cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len);
175
+ }
176
+ cr(html);
177
+ break;
178
+
179
+ case CMARK_NODE_HRULE:
180
+ cr(html);
181
+ cmark_strbuf_puts(html, "<hr");
182
+ S_render_sourcepos(node, html, options);
183
+ cmark_strbuf_puts(html, " />\n");
184
+ break;
185
+
186
+ case CMARK_NODE_PARAGRAPH:
187
+ parent = cmark_node_parent(node);
188
+ grandparent = cmark_node_parent(parent);
189
+ if (grandparent != NULL && grandparent->type == CMARK_NODE_LIST) {
190
+ tight = grandparent->as.list.tight;
191
+ } else {
192
+ tight = false;
193
+ }
194
+ if (!tight) {
195
+ if (entering) {
196
+ cr(html);
197
+ cmark_strbuf_puts(html, "<p");
198
+ S_render_sourcepos(node, html, options);
199
+ cmark_strbuf_putc(html, '>');
200
+ } else {
201
+ cmark_strbuf_puts(html, "</p>\n");
202
+ }
203
+ }
204
+ break;
205
+
206
+ case CMARK_NODE_TEXT:
207
+ escape_html(html, node->as.literal.data, node->as.literal.len);
208
+ break;
209
+
210
+ case CMARK_NODE_LINEBREAK:
211
+ cmark_strbuf_puts(html, "<br />\n");
212
+ break;
213
+
214
+ case CMARK_NODE_SOFTBREAK:
215
+ if (options & CMARK_OPT_HARDBREAKS) {
216
+ cmark_strbuf_puts(html, "<br />\n");
217
+ } else {
218
+ cmark_strbuf_putc(html, '\n');
219
+ }
220
+ break;
221
+
222
+ case CMARK_NODE_CODE:
223
+ cmark_strbuf_puts(html, "<code>");
224
+ escape_html(html, node->as.literal.data, node->as.literal.len);
225
+ cmark_strbuf_puts(html, "</code>");
226
+ break;
227
+
228
+ case CMARK_NODE_INLINE_HTML:
229
+ if (options & CMARK_OPT_SAFE) {
230
+ cmark_strbuf_puts(html, "<!-- raw HTML omitted -->");
231
+ } else {
232
+ cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len);
233
+ }
234
+ break;
235
+
236
+ case CMARK_NODE_STRONG:
237
+ if (entering) {
238
+ cmark_strbuf_puts(html, "<strong>");
239
+ } else {
240
+ cmark_strbuf_puts(html, "</strong>");
241
+ }
242
+ break;
243
+
244
+ case CMARK_NODE_EMPH:
245
+ if (entering) {
246
+ cmark_strbuf_puts(html, "<em>");
247
+ } else {
248
+ cmark_strbuf_puts(html, "</em>");
249
+ }
250
+ break;
251
+
252
+ case CMARK_NODE_LINK:
253
+ if (entering) {
254
+ cmark_strbuf_puts(html, "<a href=\"");
255
+ if (!((options & CMARK_OPT_SAFE) &&
256
+ scan_dangerous_url(&node->as.link.url, 0))) {
257
+ houdini_escape_href(html, node->as.link.url.data,
258
+ node->as.link.url.len);
259
+ }
260
+ if (node->as.link.title.len) {
261
+ cmark_strbuf_puts(html, "\" title=\"");
262
+ escape_html(html, node->as.link.title.data, node->as.link.title.len);
263
+ }
264
+ cmark_strbuf_puts(html, "\">");
265
+ } else {
266
+ cmark_strbuf_puts(html, "</a>");
267
+ }
268
+ break;
269
+
270
+ case CMARK_NODE_IMAGE:
271
+ if (entering) {
272
+ cmark_strbuf_puts(html, "<img src=\"");
273
+ if (!((options & CMARK_OPT_SAFE) &&
274
+ scan_dangerous_url(&node->as.link.url, 0))) {
275
+ houdini_escape_href(html, node->as.link.url.data,
276
+ node->as.link.url.len);
277
+ }
278
+ cmark_strbuf_puts(html, "\" alt=\"");
279
+ state->plain = node;
280
+ } else {
281
+ if (node->as.link.title.len) {
282
+ cmark_strbuf_puts(html, "\" title=\"");
283
+ escape_html(html, node->as.link.title.data, node->as.link.title.len);
284
+ }
285
+
286
+ cmark_strbuf_puts(html, "\" />");
287
+ }
288
+ break;
289
+
290
+ default:
291
+ assert(false);
292
+ break;
293
+ }
294
+
295
+ // cmark_strbuf_putc(html, 'x');
296
+ return 1;
314
297
  }
315
298
 
316
- char *cmark_render_html(cmark_node *root, int options)
317
- {
318
- char *result;
319
- cmark_strbuf html = GH_BUF_INIT;
320
- cmark_event_type ev_type;
321
- cmark_node *cur;
322
- struct render_state state = { &html, NULL };
323
- cmark_iter *iter = cmark_iter_new(root);
324
-
325
- while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
326
- cur = cmark_iter_get_node(iter);
327
- S_render_node(cur, ev_type, &state, options);
328
- }
329
- result = (char *)cmark_strbuf_detach(&html);
330
-
331
- cmark_iter_free(iter);
332
- return result;
299
+ char *cmark_render_html(cmark_node *root, int options) {
300
+ char *result;
301
+ cmark_strbuf html = GH_BUF_INIT;
302
+ cmark_event_type ev_type;
303
+ cmark_node *cur;
304
+ struct render_state state = {&html, NULL};
305
+ cmark_iter *iter = cmark_iter_new(root);
306
+
307
+ while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
308
+ cur = cmark_iter_get_node(iter);
309
+ S_render_node(cur, ev_type, &state, options);
310
+ }
311
+ result = (char *)cmark_strbuf_detach(&html);
312
+
313
+ cmark_iter_free(iter);
314
+ return result;
333
315
  }