commonmarker 0.17.7.1 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +19 -17
  3. data/commonmarker.gemspec +1 -1
  4. data/ext/commonmarker/arena.c +2 -2
  5. data/ext/commonmarker/autolink.h +3 -3
  6. data/ext/commonmarker/blocks.c +21 -15
  7. data/ext/commonmarker/buffer.h +23 -23
  8. data/ext/commonmarker/chunk.h +1 -1
  9. data/ext/commonmarker/cmark-gfm-core-extensions.h +28 -0
  10. data/ext/commonmarker/{cmark_extension_api.h → cmark-gfm-extension_api.h} +86 -69
  11. data/ext/commonmarker/cmark-gfm-extensions_export.h +42 -0
  12. data/ext/commonmarker/{cmark.h → cmark-gfm.h} +118 -96
  13. data/ext/commonmarker/cmark-gfm_export.h +42 -0
  14. data/ext/commonmarker/cmark-gfm_version.h +7 -0
  15. data/ext/commonmarker/cmark.c +3 -3
  16. data/ext/commonmarker/cmark_ctype.h +6 -6
  17. data/ext/commonmarker/commonmark.c +8 -4
  18. data/ext/commonmarker/commonmarker.c +33 -15
  19. data/ext/commonmarker/commonmarker.h +1 -1
  20. data/ext/commonmarker/core-extensions.c +2 -2
  21. data/ext/commonmarker/ext_scanners.h +1 -1
  22. data/ext/commonmarker/footnotes.c +1 -1
  23. data/ext/commonmarker/houdini.h +6 -6
  24. data/ext/commonmarker/houdini_href_e.c +2 -2
  25. data/ext/commonmarker/html.c +15 -7
  26. data/ext/commonmarker/inlines.c +36 -5
  27. data/ext/commonmarker/inlines.h +1 -1
  28. data/ext/commonmarker/iterator.c +1 -1
  29. data/ext/commonmarker/iterator.h +1 -1
  30. data/ext/commonmarker/latex.c +1 -1
  31. data/ext/commonmarker/linked_list.c +1 -1
  32. data/ext/commonmarker/man.c +1 -1
  33. data/ext/commonmarker/node.c +17 -3
  34. data/ext/commonmarker/node.h +4 -4
  35. data/ext/commonmarker/plugin.h +2 -2
  36. data/ext/commonmarker/references.c +1 -1
  37. data/ext/commonmarker/registry.c +1 -1
  38. data/ext/commonmarker/registry.h +4 -4
  39. data/ext/commonmarker/render.c +1 -1
  40. data/ext/commonmarker/scanners.c +10550 -18051
  41. data/ext/commonmarker/scanners.h +1 -1
  42. data/ext/commonmarker/strikethrough.c +13 -3
  43. data/ext/commonmarker/strikethrough.h +3 -3
  44. data/ext/commonmarker/syntax_extension.c +11 -1
  45. data/ext/commonmarker/syntax_extension.h +4 -2
  46. data/ext/commonmarker/table.c +88 -9
  47. data/ext/commonmarker/table.h +7 -3
  48. data/ext/commonmarker/tagfilter.h +3 -3
  49. data/ext/commonmarker/utf8.h +6 -6
  50. data/ext/commonmarker/xml.c +10 -3
  51. data/lib/commonmarker/config.rb +4 -1
  52. data/lib/commonmarker/node.rb +6 -4
  53. data/lib/commonmarker/renderer/html_renderer.rb +12 -12
  54. data/lib/commonmarker/version.rb +1 -1
  55. data/test/test_extensions.rb +52 -1
  56. data/test/test_footnotes.rb +1 -1
  57. data/test/test_options.rb +35 -0
  58. data/test/test_spec.rb +4 -4
  59. metadata +12 -10
  60. data/ext/commonmarker/cmark_export.h +0 -42
  61. data/ext/commonmarker/cmark_version.h +0 -8
  62. data/ext/commonmarker/cmarkextensions_export.h +0 -42
  63. data/ext/commonmarker/core-extensions.h +0 -25
@@ -4,15 +4,15 @@
4
4
  #include "registry.h"
5
5
  #include "node.h"
6
6
  #include "houdini.h"
7
- #include "cmark.h"
7
+ #include "cmark-gfm.h"
8
8
  #include "buffer.h"
9
9
 
10
10
  cmark_node_type CMARK_NODE_LAST_BLOCK = CMARK_NODE_FOOTNOTE_DEFINITION;
11
11
  cmark_node_type CMARK_NODE_LAST_INLINE = CMARK_NODE_FOOTNOTE_REFERENCE;
12
12
 
13
- int cmark_version() { return CMARK_VERSION; }
13
+ int cmark_version() { return CMARK_GFM_VERSION; }
14
14
 
15
- const char *cmark_version_string() { return CMARK_VERSION_STRING; }
15
+ const char *cmark_version_string() { return CMARK_GFM_VERSION_STRING; }
16
16
 
17
17
  static void *xcalloc(size_t nmem, size_t size) {
18
18
  void *ptr = calloc(nmem, size);
@@ -5,25 +5,25 @@
5
5
  extern "C" {
6
6
  #endif
7
7
 
8
- #include "cmark_export.h"
8
+ #include "cmark-gfm_export.h"
9
9
 
10
10
  /** Locale-independent versions of functions from ctype.h.
11
11
  * We want cmark to behave the same no matter what the system locale.
12
12
  */
13
13
 
14
- CMARK_EXPORT
14
+ CMARK_GFM_EXPORT
15
15
  int cmark_isspace(char c);
16
16
 
17
- CMARK_EXPORT
17
+ CMARK_GFM_EXPORT
18
18
  int cmark_ispunct(char c);
19
19
 
20
- CMARK_EXPORT
20
+ CMARK_GFM_EXPORT
21
21
  int cmark_isalnum(char c);
22
22
 
23
- CMARK_EXPORT
23
+ CMARK_GFM_EXPORT
24
24
  int cmark_isdigit(char c);
25
25
 
26
- CMARK_EXPORT
26
+ CMARK_GFM_EXPORT
27
27
  int cmark_isalpha(char c);
28
28
 
29
29
  #ifdef __cplusplus
@@ -5,7 +5,7 @@
5
5
  #include <assert.h>
6
6
 
7
7
  #include "config.h"
8
- #include "cmark.h"
8
+ #include "cmark-gfm.h"
9
9
  #include "node.h"
10
10
  #include "buffer.h"
11
11
  #include "utf8.h"
@@ -35,7 +35,7 @@ static CMARK_INLINE void outc(cmark_renderer *renderer, cmark_node *node,
35
35
  c < 0x80 && escape != LITERAL &&
36
36
  ((escape == NORMAL &&
37
37
  (c == '*' || c == '_' || c == '[' || c == ']' || c == '#' || c == '<' ||
38
- c == '>' || c == '\\' || c == '`' || c == '!' ||
38
+ c == '>' || c == '\\' || c == '`' || c == '~' || c == '!' ||
39
39
  (c == '&' && cmark_isalpha(nextc)) || (c == '!' && nextc == '[') ||
40
40
  (renderer->begin_content && (c == '-' || c == '+' || c == '=') &&
41
41
  // begin_content doesn't get set to false til we've passed digits
@@ -168,6 +168,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
168
168
  int list_number;
169
169
  cmark_delim_type list_delim;
170
170
  int numticks;
171
+ bool extra_spaces;
171
172
  int i;
172
173
  bool entering = (ev_type == CMARK_EVENT_ENTER);
173
174
  const char *info, *code, *title;
@@ -369,14 +370,17 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
369
370
  code = cmark_node_get_literal(node);
370
371
  code_len = strlen(code);
371
372
  numticks = shortest_unused_backtick_sequence(code);
373
+ extra_spaces = code_len == 0 ||
374
+ code[0] == '`' || code[code_len - 1] == '`' ||
375
+ code[0] == ' ' || code[code_len - 1] == ' ';
372
376
  for (i = 0; i < numticks; i++) {
373
377
  LIT("`");
374
378
  }
375
- if (code_len == 0 || code[0] == '`') {
379
+ if (extra_spaces) {
376
380
  LIT(" ");
377
381
  }
378
382
  OUT(cmark_node_get_literal(node), allow_wrap, LITERAL);
379
- if (code_len == 0 || code[code_len - 1] == '`') {
383
+ if (extra_spaces) {
380
384
  LIT(" ");
381
385
  }
382
386
  for (i = 0; i < numticks; i++) {
@@ -1,11 +1,11 @@
1
1
  #include "commonmarker.h"
2
- #include "cmark.h"
2
+ #include "cmark-gfm.h"
3
3
  #include "houdini.h"
4
4
  #include "node.h"
5
5
  #include "registry.h"
6
6
  #include "parser.h"
7
7
  #include "syntax_extension.h"
8
- #include "core-extensions.h"
8
+ #include "cmark-gfm-core-extensions.h"
9
9
 
10
10
  static VALUE rb_mNodeError;
11
11
  static VALUE rb_mNode;
@@ -524,7 +524,7 @@ static VALUE rb_node_insert_before(VALUE self, VALUE sibling) {
524
524
  *
525
525
  * Returns a {String}.
526
526
  */
527
- static VALUE rb_render_html(VALUE n, VALUE rb_options, VALUE rb_extensions) {
527
+ static VALUE rb_render_html(VALUE self, VALUE rb_options, VALUE rb_extensions) {
528
528
  int options, extensions_len;
529
529
  VALUE rb_ext_name;
530
530
  int i;
@@ -537,7 +537,7 @@ static VALUE rb_render_html(VALUE n, VALUE rb_options, VALUE rb_extensions) {
537
537
  options = FIX2INT(rb_options);
538
538
  extensions_len = RARRAY_LEN(rb_extensions);
539
539
 
540
- Data_Get_Struct(n, cmark_node, node);
540
+ Data_Get_Struct(self, cmark_node, node);
541
541
 
542
542
  for (i = 0; i < extensions_len; ++i) {
543
543
  rb_ext_name = RARRAY_PTR(rb_extensions)[i];
@@ -571,15 +571,24 @@ static VALUE rb_render_html(VALUE n, VALUE rb_options, VALUE rb_extensions) {
571
571
  *
572
572
  * Returns a {String}.
573
573
  */
574
- static VALUE rb_render_commonmark(VALUE n, VALUE rb_options) {
574
+ static VALUE rb_render_commonmark(int argc, VALUE *argv, VALUE self) {
575
+ VALUE rb_options, rb_width;
576
+ rb_scan_args(argc, argv, "11", &rb_options, &rb_width);
577
+
578
+ int width = 120;
579
+ if (!NIL_P(rb_width)) {
580
+ Check_Type(rb_width, T_FIXNUM);
581
+ width = FIX2INT(rb_width);
582
+ }
583
+
575
584
  int options;
576
585
  cmark_node *node;
577
586
  Check_Type(rb_options, T_FIXNUM);
578
587
 
579
588
  options = FIX2INT(rb_options);
580
- Data_Get_Struct(n, cmark_node, node);
589
+ Data_Get_Struct(self, cmark_node, node);
581
590
 
582
- char *cmark = cmark_render_commonmark(node, options, 120);
591
+ char *cmark = cmark_render_commonmark(node, options, width);
583
592
  VALUE ruby_cmark = rb_str_new2(cmark);
584
593
  free(cmark);
585
594
 
@@ -590,15 +599,24 @@ static VALUE rb_render_commonmark(VALUE n, VALUE rb_options) {
590
599
  *
591
600
  * Returns a {String}.
592
601
  */
593
- static VALUE rb_render_plaintext(VALUE n, VALUE rb_options) {
602
+ static VALUE rb_render_plaintext(int argc, VALUE *argv, VALUE self) {
603
+ VALUE rb_options, rb_width;
604
+ rb_scan_args(argc, argv, "11", &rb_options, &rb_width);
605
+
606
+ int width = 120;
607
+ if (!NIL_P(rb_width)) {
608
+ Check_Type(rb_width, T_FIXNUM);
609
+ width = FIX2INT(rb_width);
610
+ }
611
+
594
612
  int options;
595
613
  cmark_node *node;
596
614
  Check_Type(rb_options, T_FIXNUM);
597
615
 
598
616
  options = FIX2INT(rb_options);
599
- Data_Get_Struct(n, cmark_node, node);
617
+ Data_Get_Struct(self, cmark_node, node);
600
618
 
601
- char *text = cmark_render_plaintext(node, options, 120);
619
+ char *text = cmark_render_plaintext(node, options, width);
602
620
  VALUE ruby_text = rb_str_new2(text);
603
621
  free(text);
604
622
 
@@ -1023,8 +1041,8 @@ static VALUE rb_node_get_table_alignments(VALUE self) {
1023
1041
  VALUE ary;
1024
1042
  Data_Get_Struct(self, cmark_node, node);
1025
1043
 
1026
- column_count = cmarkextensions_get_table_columns(node);
1027
- alignments = cmarkextensions_get_table_alignments(node);
1044
+ column_count = cmark_gfm_extensions_get_table_columns(node);
1045
+ alignments = cmark_gfm_extensions_get_table_alignments(node);
1028
1046
 
1029
1047
  if (!column_count || !alignments) {
1030
1048
  rb_raise(rb_mNodeError, "could not get column_count or alignments");
@@ -1148,8 +1166,8 @@ __attribute__((visibility("default"))) void Init_commonmarker() {
1148
1166
  rb_define_method(rb_mNode, "next", rb_node_next, 0);
1149
1167
  rb_define_method(rb_mNode, "insert_before", rb_node_insert_before, 1);
1150
1168
  rb_define_method(rb_mNode, "_render_html", rb_render_html, 2);
1151
- rb_define_method(rb_mNode, "_render_commonmark", rb_render_commonmark, 1);
1152
- rb_define_method(rb_mNode, "_render_plaintext", rb_render_plaintext, 1);
1169
+ rb_define_method(rb_mNode, "_render_commonmark", rb_render_commonmark, -1);
1170
+ rb_define_method(rb_mNode, "_render_plaintext", rb_render_plaintext, -1);
1153
1171
  rb_define_method(rb_mNode, "insert_after", rb_node_insert_after, 1);
1154
1172
  rb_define_method(rb_mNode, "prepend_child", rb_node_prepend_child, 1);
1155
1173
  rb_define_method(rb_mNode, "append_child", rb_node_append_child, 1);
@@ -1175,5 +1193,5 @@ __attribute__((visibility("default"))) void Init_commonmarker() {
1175
1193
  rb_define_method(rb_mNode, "html_escape_href", rb_html_escape_href, 1);
1176
1194
  rb_define_method(rb_mNode, "html_escape_html", rb_html_escape_html, 1);
1177
1195
 
1178
- core_extensions_ensure_registered();
1196
+ cmark_gfm_core_extensions_ensure_registered();
1179
1197
  }
@@ -5,7 +5,7 @@
5
5
  #define __MSXML_LIBRARY_DEFINED__
6
6
  #endif
7
7
 
8
- #include "cmark.h"
8
+ #include "cmark-gfm.h"
9
9
  #include "ruby.h"
10
10
  #include "ruby/encoding.h"
11
11
 
@@ -1,4 +1,4 @@
1
- #include "core-extensions.h"
1
+ #include "cmark-gfm-core-extensions.h"
2
2
  #include "autolink.h"
3
3
  #include "strikethrough.h"
4
4
  #include "table.h"
@@ -15,7 +15,7 @@ static int core_extensions_registration(cmark_plugin *plugin) {
15
15
  return 1;
16
16
  }
17
17
 
18
- void core_extensions_ensure_registered(void) {
18
+ void cmark_gfm_core_extensions_ensure_registered(void) {
19
19
  static int registered = 0;
20
20
 
21
21
  if (!registered) {
@@ -1,5 +1,5 @@
1
1
  #include "chunk.h"
2
- #include "cmark.h"
2
+ #include "cmark-gfm.h"
3
3
 
4
4
  #ifdef __cplusplus
5
5
  extern "C" {
@@ -1,4 +1,4 @@
1
- #include "cmark.h"
1
+ #include "cmark-gfm.h"
2
2
  #include "parser.h"
3
3
  #include "footnotes.h"
4
4
  #include "inlines.h"
@@ -31,22 +31,22 @@ extern "C" {
31
31
  #define HOUDINI_ESCAPED_SIZE(x) (((x)*12) / 10)
32
32
  #define HOUDINI_UNESCAPED_SIZE(x) (x)
33
33
 
34
- CMARK_EXPORT
34
+ CMARK_GFM_EXPORT
35
35
  bufsize_t houdini_unescape_ent(cmark_strbuf *ob, const uint8_t *src,
36
36
  bufsize_t size);
37
- CMARK_EXPORT
37
+ CMARK_GFM_EXPORT
38
38
  int houdini_escape_html(cmark_strbuf *ob, const uint8_t *src,
39
39
  bufsize_t size);
40
- CMARK_EXPORT
40
+ CMARK_GFM_EXPORT
41
41
  int houdini_escape_html0(cmark_strbuf *ob, const uint8_t *src,
42
42
  bufsize_t size, int secure);
43
- CMARK_EXPORT
43
+ CMARK_GFM_EXPORT
44
44
  int houdini_unescape_html(cmark_strbuf *ob, const uint8_t *src,
45
45
  bufsize_t size);
46
- CMARK_EXPORT
46
+ CMARK_GFM_EXPORT
47
47
  void houdini_unescape_html_f(cmark_strbuf *ob, const uint8_t *src,
48
48
  bufsize_t size);
49
- CMARK_EXPORT
49
+ CMARK_GFM_EXPORT
50
50
  int houdini_escape_href(cmark_strbuf *ob, const uint8_t *src,
51
51
  bufsize_t size);
52
52
 
@@ -7,7 +7,7 @@
7
7
  /*
8
8
  * The following characters will not be escaped:
9
9
  *
10
- * -_.+!*'(),%#@?=;:/,+&$ alphanum
10
+ * -_.+!*'(),%#@?=;:/,+&$~ alphanum
11
11
  *
12
12
  * Note that this character set is the addition of:
13
13
  *
@@ -35,7 +35,7 @@ static const char HREF_SAFE[] = {
35
35
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
36
36
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1,
37
37
  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
38
- 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
38
+ 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
39
39
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
40
40
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
41
41
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -4,7 +4,7 @@
4
4
  #include <assert.h>
5
5
  #include "cmark_ctype.h"
6
6
  #include "config.h"
7
- #include "cmark.h"
7
+ #include "cmark-gfm.h"
8
8
  #include "houdini.h"
9
9
  #include "scanners.h"
10
10
  #include "syntax_extension.h"
@@ -203,12 +203,20 @@ static int S_render_node(cmark_html_renderer *renderer, cmark_node *node,
203
203
  cmark_html_render_sourcepos(node, html, options);
204
204
  cmark_strbuf_puts(html, " lang=\"");
205
205
  escape_html(html, node->as.code.info.data, first_tag);
206
+ if (first_tag < node->as.code.info.len && (options & CMARK_OPT_FULL_INFO_STRING)) {
207
+ cmark_strbuf_puts(html, "\" data-meta=\"");
208
+ escape_html(html, node->as.code.info.data + first_tag + 1, node->as.code.info.len - first_tag - 1);
209
+ }
206
210
  cmark_strbuf_puts(html, "\"><code>");
207
211
  } else {
208
212
  cmark_strbuf_puts(html, "<pre");
209
213
  cmark_html_render_sourcepos(node, html, options);
210
214
  cmark_strbuf_puts(html, "><code class=\"language-");
211
215
  escape_html(html, node->as.code.info.data, first_tag);
216
+ if (first_tag < node->as.code.info.len && (options & CMARK_OPT_FULL_INFO_STRING)) {
217
+ cmark_strbuf_puts(html, "\" data-meta=\"");
218
+ escape_html(html, node->as.code.info.data + first_tag + 1, node->as.code.info.len - first_tag - 1);
219
+ }
212
220
  cmark_strbuf_puts(html, "\">");
213
221
  }
214
222
  }
@@ -219,7 +227,7 @@ static int S_render_node(cmark_html_renderer *renderer, cmark_node *node,
219
227
 
220
228
  case CMARK_NODE_HTML_BLOCK:
221
229
  cmark_html_render_cr(html);
222
- if (options & CMARK_OPT_SAFE) {
230
+ if (!(options & CMARK_OPT_UNSAFE)) {
223
231
  cmark_strbuf_puts(html, "<!-- raw HTML omitted -->");
224
232
  } else if (renderer->filter_extensions) {
225
233
  filter_html_block(renderer, node->as.literal.data, node->as.literal.len);
@@ -297,7 +305,7 @@ static int S_render_node(cmark_html_renderer *renderer, cmark_node *node,
297
305
  break;
298
306
 
299
307
  case CMARK_NODE_HTML_INLINE:
300
- if (options & CMARK_OPT_SAFE) {
308
+ if (!(options & CMARK_OPT_UNSAFE)) {
301
309
  cmark_strbuf_puts(html, "<!-- raw HTML omitted -->");
302
310
  } else {
303
311
  filtered = false;
@@ -346,7 +354,7 @@ static int S_render_node(cmark_html_renderer *renderer, cmark_node *node,
346
354
  case CMARK_NODE_LINK:
347
355
  if (entering) {
348
356
  cmark_strbuf_puts(html, "<a href=\"");
349
- if (!((options & CMARK_OPT_SAFE) &&
357
+ if (!(!(options & CMARK_OPT_UNSAFE) &&
350
358
  scan_dangerous_url(&node->as.link.url, 0))) {
351
359
  houdini_escape_href(html, node->as.link.url.data,
352
360
  node->as.link.url.len);
@@ -364,7 +372,7 @@ static int S_render_node(cmark_html_renderer *renderer, cmark_node *node,
364
372
  case CMARK_NODE_IMAGE:
365
373
  if (entering) {
366
374
  cmark_strbuf_puts(html, "<img src=\"");
367
- if (!((options & CMARK_OPT_SAFE) &&
375
+ if (!(!(options & CMARK_OPT_UNSAFE) &&
368
376
  scan_dangerous_url(&node->as.link.url, 0))) {
369
377
  houdini_escape_href(html, node->as.link.url.data,
370
378
  node->as.link.url.len);
@@ -406,9 +414,9 @@ static int S_render_node(cmark_html_renderer *renderer, cmark_node *node,
406
414
  cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len);
407
415
  cmark_strbuf_puts(html, "\" id=\"fnref");
408
416
  cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len);
409
- cmark_strbuf_puts(html, "\">[");
417
+ cmark_strbuf_puts(html, "\">");
410
418
  cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len);
411
- cmark_strbuf_puts(html, "]</a></sup>");
419
+ cmark_strbuf_puts(html, "</a></sup>");
412
420
  }
413
421
  break;
414
422
 
@@ -7,7 +7,7 @@
7
7
  #include "node.h"
8
8
  #include "parser.h"
9
9
  #include "references.h"
10
- #include "cmark.h"
10
+ #include "cmark-gfm.h"
11
11
  #include "houdini.h"
12
12
  #include "utf8.h"
13
13
  #include "scanners.h"
@@ -321,6 +321,37 @@ static bufsize_t scan_to_closing_backticks(subject *subj,
321
321
  return 0;
322
322
  }
323
323
 
324
+ // Destructively modify string, converting newlines to
325
+ // spaces, then removing a single leading + trailing space.
326
+ static void S_normalize_code(cmark_strbuf *s) {
327
+ bufsize_t r, w;
328
+
329
+ for (r = 0, w = 0; r < s->size; ++r) {
330
+ switch (s->ptr[r]) {
331
+ case '\r':
332
+ if (s->ptr[r + 1] != '\n') {
333
+ s->ptr[w++] = ' ';
334
+ }
335
+ break;
336
+ case '\n':
337
+ s->ptr[w++] = ' ';
338
+ break;
339
+ default:
340
+ s->ptr[w++] = s->ptr[r];
341
+ }
342
+ }
343
+
344
+ // begins and ends with space?
345
+ if (s->ptr[0] == ' ' && s->ptr[w - 1] == ' ') {
346
+ cmark_strbuf_drop(s, 1);
347
+ cmark_strbuf_truncate(s, w - 2);
348
+ } else {
349
+ cmark_strbuf_truncate(s, w);
350
+ }
351
+
352
+ }
353
+
354
+
324
355
  // Parse backtick code section or raw backticks, return an inline.
325
356
  // Assumes that the subject has a backtick at the current position.
326
357
  static cmark_node *handle_backticks(subject *subj, int options) {
@@ -336,8 +367,7 @@ static cmark_node *handle_backticks(subject *subj, int options) {
336
367
 
337
368
  cmark_strbuf_set(&buf, subj->input.data + startpos,
338
369
  endpos - startpos - openticks.len);
339
- cmark_strbuf_trim(&buf);
340
- cmark_strbuf_normalize_whitespace(&buf);
370
+ S_normalize_code(&buf);
341
371
 
342
372
  cmark_node *node = make_code(subj, startpos, endpos - openticks.len - 1, cmark_chunk_buf_detach(&buf));
343
373
  adjust_subj_node_newlines(subj, node, endpos - startpos, openticks.len, options);
@@ -345,6 +375,7 @@ static cmark_node *handle_backticks(subject *subj, int options) {
345
375
  }
346
376
  }
347
377
 
378
+
348
379
  // Scan ***, **, or * and return number scanned, or 0.
349
380
  // Advances position.
350
381
  static int scan_delims(subject *subj, unsigned char c, bool *can_open,
@@ -972,7 +1003,7 @@ static bufsize_t manual_scan_link_url(cmark_chunk *input, bufsize_t offset,
972
1003
  break;
973
1004
  } else if (input->data[i] == '\\')
974
1005
  i += 2;
975
- else if (cmark_isspace(input->data[i]) || input->data[i] == '<')
1006
+ else if (input->data[i] == '\n' || input->data[i] == '<')
976
1007
  return manual_scan_link_url_2(input, offset, output);
977
1008
  else
978
1009
  ++i;
@@ -1410,7 +1441,7 @@ bufsize_t cmark_parse_reference_inline(cmark_mem *mem, cmark_chunk *input,
1410
1441
  // parse optional link_title
1411
1442
  beforetitle = subj.pos;
1412
1443
  spnl(&subj);
1413
- matchlen = scan_link_title(&subj.input, subj.pos);
1444
+ matchlen = subj.pos == beforetitle ? 0 : scan_link_title(&subj.input, subj.pos);
1414
1445
  if (matchlen) {
1415
1446
  title = cmark_chunk_dup(&subj.input, subj.pos, matchlen);
1416
1447
  subj.pos += matchlen;
@@ -10,7 +10,7 @@ extern "C" {
10
10
  cmark_chunk cmark_clean_url(cmark_mem *mem, cmark_chunk *url);
11
11
  cmark_chunk cmark_clean_title(cmark_mem *mem, cmark_chunk *title);
12
12
 
13
- CMARK_EXPORT
13
+ CMARK_GFM_EXPORT
14
14
  void cmark_parse_inlines(cmark_parser *parser,
15
15
  cmark_node *parent,
16
16
  cmark_map *refmap,
@@ -3,7 +3,7 @@
3
3
 
4
4
  #include "config.h"
5
5
  #include "node.h"
6
- #include "cmark.h"
6
+ #include "cmark-gfm.h"
7
7
  #include "iterator.h"
8
8
 
9
9
  cmark_iter *cmark_iter_new(cmark_node *root) {
@@ -5,7 +5,7 @@
5
5
  extern "C" {
6
6
  #endif
7
7
 
8
- #include "cmark.h"
8
+ #include "cmark-gfm.h"
9
9
  #include "memory.h"
10
10
 
11
11
  typedef struct {
@@ -4,7 +4,7 @@
4
4
  #include <assert.h>
5
5
 
6
6
  #include "config.h"
7
- #include "cmark.h"
7
+ #include "cmark-gfm.h"
8
8
  #include "node.h"
9
9
  #include "buffer.h"
10
10
  #include "utf8.h"
@@ -1,6 +1,6 @@
1
1
  #include <stdlib.h>
2
2
 
3
- #include "cmark.h"
3
+ #include "cmark-gfm.h"
4
4
 
5
5
  cmark_llist *cmark_llist_append(cmark_mem *mem, cmark_llist *head, void *data) {
6
6
  cmark_llist *tmp;
@@ -4,7 +4,7 @@
4
4
  #include <assert.h>
5
5
 
6
6
  #include "config.h"
7
- #include "cmark.h"
7
+ #include "cmark-gfm.h"
8
8
  #include "node.h"
9
9
  #include "buffer.h"
10
10
  #include "utf8.h"
@@ -69,10 +69,11 @@ static bool S_can_contain(cmark_node *node, cmark_node *child) {
69
69
  return cmark_node_can_contain_type(node, (cmark_node_type) child->type);
70
70
  }
71
71
 
72
- cmark_node *cmark_node_new_with_mem(cmark_node_type type, cmark_mem *mem) {
72
+ cmark_node *cmark_node_new_with_mem_and_ext(cmark_node_type type, cmark_mem *mem, cmark_syntax_extension *extension) {
73
73
  cmark_node *node = (cmark_node *)mem->calloc(1, sizeof(*node));
74
74
  cmark_strbuf_init(mem, &node->content, 0);
75
75
  node->type = (uint16_t)type;
76
+ node->extension = extension;
76
77
 
77
78
  switch (node->type) {
78
79
  case CMARK_NODE_HEADING:
@@ -91,12 +92,25 @@ cmark_node *cmark_node_new_with_mem(cmark_node_type type, cmark_mem *mem) {
91
92
  break;
92
93
  }
93
94
 
95
+ if (node->extension && node->extension->opaque_alloc_func) {
96
+ node->extension->opaque_alloc_func(node->extension, mem, node);
97
+ }
98
+
94
99
  return node;
95
100
  }
96
101
 
97
- cmark_node *cmark_node_new(cmark_node_type type) {
102
+ cmark_node *cmark_node_new_with_ext(cmark_node_type type, cmark_syntax_extension *extension) {
98
103
  extern cmark_mem CMARK_DEFAULT_MEM_ALLOCATOR;
99
- return cmark_node_new_with_mem(type, &CMARK_DEFAULT_MEM_ALLOCATOR);
104
+ return cmark_node_new_with_mem_and_ext(type, &CMARK_DEFAULT_MEM_ALLOCATOR, extension);
105
+ }
106
+
107
+ cmark_node *cmark_node_new_with_mem(cmark_node_type type, cmark_mem *mem)
108
+ {
109
+ return cmark_node_new_with_mem_and_ext(type, mem, NULL);
110
+ }
111
+
112
+ cmark_node *cmark_node_new(cmark_node_type type) {
113
+ return cmark_node_new_with_ext(type, NULL);
100
114
  }
101
115
 
102
116
  static void free_node_as(cmark_node *node) {
@@ -8,8 +8,8 @@ extern "C" {
8
8
  #include <stdio.h>
9
9
  #include <stdint.h>
10
10
 
11
- #include "cmark.h"
12
- #include "cmark_extension_api.h"
11
+ #include "cmark-gfm.h"
12
+ #include "cmark-gfm-extension_api.h"
13
13
  #include "buffer.h"
14
14
  #include "chunk.h"
15
15
 
@@ -89,7 +89,7 @@ struct cmark_node {
89
89
  static CMARK_INLINE cmark_mem *cmark_node_mem(cmark_node *node) {
90
90
  return node->content.mem;
91
91
  }
92
- CMARK_EXPORT int cmark_node_check(cmark_node *node, FILE *out);
92
+ CMARK_GFM_EXPORT int cmark_node_check(cmark_node *node, FILE *out);
93
93
 
94
94
  static CMARK_INLINE bool CMARK_NODE_TYPE_BLOCK_P(cmark_node_type node_type) {
95
95
  return (node_type & CMARK_NODE_TYPE_MASK) == CMARK_NODE_TYPE_BLOCK;
@@ -107,7 +107,7 @@ static CMARK_INLINE bool CMARK_NODE_INLINE_P(cmark_node *node) {
107
107
  return node != NULL && CMARK_NODE_TYPE_INLINE_P((cmark_node_type) node->type);
108
108
  }
109
109
 
110
- CMARK_EXPORT bool cmark_node_can_contain_type(cmark_node *node, cmark_node_type child_type);
110
+ CMARK_GFM_EXPORT bool cmark_node_can_contain_type(cmark_node *node, cmark_node_type child_type);
111
111
 
112
112
  #ifdef __cplusplus
113
113
  }
@@ -5,8 +5,8 @@
5
5
  extern "C" {
6
6
  #endif
7
7
 
8
- #include "cmark.h"
9
- #include "cmark_extension_api.h"
8
+ #include "cmark-gfm.h"
9
+ #include "cmark-gfm-extension_api.h"
10
10
 
11
11
  /**
12
12
  * cmark_plugin:
@@ -1,4 +1,4 @@
1
- #include "cmark.h"
1
+ #include "cmark-gfm.h"
2
2
  #include "parser.h"
3
3
  #include "references.h"
4
4
  #include "inlines.h"
@@ -3,7 +3,7 @@
3
3
  #include <string.h>
4
4
 
5
5
  #include "config.h"
6
- #include "cmark.h"
6
+ #include "cmark-gfm.h"
7
7
  #include "syntax_extension.h"
8
8
  #include "registry.h"
9
9
  #include "plugin.h"
@@ -5,16 +5,16 @@
5
5
  extern "C" {
6
6
  #endif
7
7
 
8
- #include "cmark.h"
8
+ #include "cmark-gfm.h"
9
9
  #include "plugin.h"
10
10
 
11
- CMARK_EXPORT
11
+ CMARK_GFM_EXPORT
12
12
  void cmark_register_plugin(cmark_plugin_init_func reg_fn);
13
13
 
14
- CMARK_EXPORT
14
+ CMARK_GFM_EXPORT
15
15
  void cmark_release_plugins(void);
16
16
 
17
- CMARK_EXPORT
17
+ CMARK_GFM_EXPORT
18
18
  cmark_llist *cmark_list_syntax_extensions(cmark_mem *mem);
19
19
 
20
20
  #ifdef __cplusplus
@@ -1,7 +1,7 @@
1
1
  #include <stdlib.h>
2
2
  #include "buffer.h"
3
3
  #include "chunk.h"
4
- #include "cmark.h"
4
+ #include "cmark-gfm.h"
5
5
  #include "utf8.h"
6
6
  #include "render.h"
7
7
  #include "node.h"