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.
- checksums.yaml +4 -4
- data/README.md +19 -17
- data/commonmarker.gemspec +1 -1
- data/ext/commonmarker/arena.c +2 -2
- data/ext/commonmarker/autolink.h +3 -3
- data/ext/commonmarker/blocks.c +21 -15
- data/ext/commonmarker/buffer.h +23 -23
- data/ext/commonmarker/chunk.h +1 -1
- data/ext/commonmarker/cmark-gfm-core-extensions.h +28 -0
- data/ext/commonmarker/{cmark_extension_api.h → cmark-gfm-extension_api.h} +86 -69
- data/ext/commonmarker/cmark-gfm-extensions_export.h +42 -0
- data/ext/commonmarker/{cmark.h → cmark-gfm.h} +118 -96
- data/ext/commonmarker/cmark-gfm_export.h +42 -0
- data/ext/commonmarker/cmark-gfm_version.h +7 -0
- data/ext/commonmarker/cmark.c +3 -3
- data/ext/commonmarker/cmark_ctype.h +6 -6
- data/ext/commonmarker/commonmark.c +8 -4
- data/ext/commonmarker/commonmarker.c +33 -15
- data/ext/commonmarker/commonmarker.h +1 -1
- data/ext/commonmarker/core-extensions.c +2 -2
- data/ext/commonmarker/ext_scanners.h +1 -1
- data/ext/commonmarker/footnotes.c +1 -1
- data/ext/commonmarker/houdini.h +6 -6
- data/ext/commonmarker/houdini_href_e.c +2 -2
- data/ext/commonmarker/html.c +15 -7
- data/ext/commonmarker/inlines.c +36 -5
- data/ext/commonmarker/inlines.h +1 -1
- data/ext/commonmarker/iterator.c +1 -1
- data/ext/commonmarker/iterator.h +1 -1
- data/ext/commonmarker/latex.c +1 -1
- data/ext/commonmarker/linked_list.c +1 -1
- data/ext/commonmarker/man.c +1 -1
- data/ext/commonmarker/node.c +17 -3
- data/ext/commonmarker/node.h +4 -4
- data/ext/commonmarker/plugin.h +2 -2
- data/ext/commonmarker/references.c +1 -1
- data/ext/commonmarker/registry.c +1 -1
- data/ext/commonmarker/registry.h +4 -4
- data/ext/commonmarker/render.c +1 -1
- data/ext/commonmarker/scanners.c +10550 -18051
- data/ext/commonmarker/scanners.h +1 -1
- data/ext/commonmarker/strikethrough.c +13 -3
- data/ext/commonmarker/strikethrough.h +3 -3
- data/ext/commonmarker/syntax_extension.c +11 -1
- data/ext/commonmarker/syntax_extension.h +4 -2
- data/ext/commonmarker/table.c +88 -9
- data/ext/commonmarker/table.h +7 -3
- data/ext/commonmarker/tagfilter.h +3 -3
- data/ext/commonmarker/utf8.h +6 -6
- data/ext/commonmarker/xml.c +10 -3
- data/lib/commonmarker/config.rb +4 -1
- data/lib/commonmarker/node.rb +6 -4
- data/lib/commonmarker/renderer/html_renderer.rb +12 -12
- data/lib/commonmarker/version.rb +1 -1
- data/test/test_extensions.rb +52 -1
- data/test/test_footnotes.rb +1 -1
- data/test/test_options.rb +35 -0
- data/test/test_spec.rb +4 -4
- metadata +12 -10
- data/ext/commonmarker/cmark_export.h +0 -42
- data/ext/commonmarker/cmark_version.h +0 -8
- data/ext/commonmarker/cmarkextensions_export.h +0 -42
- data/ext/commonmarker/core-extensions.h +0 -25
data/ext/commonmarker/cmark.c
CHANGED
|
@@ -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
|
|
13
|
+
int cmark_version() { return CMARK_GFM_VERSION; }
|
|
14
14
|
|
|
15
|
-
const char *cmark_version_string() { return
|
|
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 "
|
|
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
|
-
|
|
14
|
+
CMARK_GFM_EXPORT
|
|
15
15
|
int cmark_isspace(char c);
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
CMARK_GFM_EXPORT
|
|
18
18
|
int cmark_ispunct(char c);
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
CMARK_GFM_EXPORT
|
|
21
21
|
int cmark_isalnum(char c);
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
CMARK_GFM_EXPORT
|
|
24
24
|
int cmark_isdigit(char c);
|
|
25
25
|
|
|
26
|
-
|
|
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 (
|
|
379
|
+
if (extra_spaces) {
|
|
376
380
|
LIT(" ");
|
|
377
381
|
}
|
|
378
382
|
OUT(cmark_node_get_literal(node), allow_wrap, LITERAL);
|
|
379
|
-
if (
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
589
|
+
Data_Get_Struct(self, cmark_node, node);
|
|
581
590
|
|
|
582
|
-
char *cmark = cmark_render_commonmark(node, options,
|
|
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
|
|
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(
|
|
617
|
+
Data_Get_Struct(self, cmark_node, node);
|
|
600
618
|
|
|
601
|
-
char *text = cmark_render_plaintext(node, options,
|
|
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 =
|
|
1027
|
-
alignments =
|
|
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
|
-
|
|
1196
|
+
cmark_gfm_core_extensions_ensure_registered();
|
|
1179
1197
|
}
|
|
@@ -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
|
|
18
|
+
void cmark_gfm_core_extensions_ensure_registered(void) {
|
|
19
19
|
static int registered = 0;
|
|
20
20
|
|
|
21
21
|
if (!registered) {
|
data/ext/commonmarker/houdini.h
CHANGED
|
@@ -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
|
-
|
|
34
|
+
CMARK_GFM_EXPORT
|
|
35
35
|
bufsize_t houdini_unescape_ent(cmark_strbuf *ob, const uint8_t *src,
|
|
36
36
|
bufsize_t size);
|
|
37
|
-
|
|
37
|
+
CMARK_GFM_EXPORT
|
|
38
38
|
int houdini_escape_html(cmark_strbuf *ob, const uint8_t *src,
|
|
39
39
|
bufsize_t size);
|
|
40
|
-
|
|
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
|
-
|
|
43
|
+
CMARK_GFM_EXPORT
|
|
44
44
|
int houdini_unescape_html(cmark_strbuf *ob, const uint8_t *src,
|
|
45
45
|
bufsize_t size);
|
|
46
|
-
|
|
46
|
+
CMARK_GFM_EXPORT
|
|
47
47
|
void houdini_unescape_html_f(cmark_strbuf *ob, const uint8_t *src,
|
|
48
48
|
bufsize_t size);
|
|
49
|
-
|
|
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
|
-
* -_.+!*'()
|
|
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,
|
|
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,
|
data/ext/commonmarker/html.c
CHANGED
|
@@ -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 &
|
|
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 &
|
|
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 &
|
|
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 &
|
|
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, "
|
|
419
|
+
cmark_strbuf_puts(html, "</a></sup>");
|
|
412
420
|
}
|
|
413
421
|
break;
|
|
414
422
|
|
data/ext/commonmarker/inlines.c
CHANGED
|
@@ -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
|
-
|
|
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 (
|
|
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;
|
data/ext/commonmarker/inlines.h
CHANGED
|
@@ -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
|
-
|
|
13
|
+
CMARK_GFM_EXPORT
|
|
14
14
|
void cmark_parse_inlines(cmark_parser *parser,
|
|
15
15
|
cmark_node *parent,
|
|
16
16
|
cmark_map *refmap,
|
data/ext/commonmarker/iterator.c
CHANGED
data/ext/commonmarker/iterator.h
CHANGED
data/ext/commonmarker/latex.c
CHANGED
data/ext/commonmarker/man.c
CHANGED
data/ext/commonmarker/node.c
CHANGED
|
@@ -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 *
|
|
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 *
|
|
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
|
|
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) {
|
data/ext/commonmarker/node.h
CHANGED
|
@@ -8,8 +8,8 @@ extern "C" {
|
|
|
8
8
|
#include <stdio.h>
|
|
9
9
|
#include <stdint.h>
|
|
10
10
|
|
|
11
|
-
#include "cmark.h"
|
|
12
|
-
#include "
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|
data/ext/commonmarker/plugin.h
CHANGED
data/ext/commonmarker/registry.c
CHANGED
data/ext/commonmarker/registry.h
CHANGED
|
@@ -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
|
-
|
|
11
|
+
CMARK_GFM_EXPORT
|
|
12
12
|
void cmark_register_plugin(cmark_plugin_init_func reg_fn);
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
CMARK_GFM_EXPORT
|
|
15
15
|
void cmark_release_plugins(void);
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
CMARK_GFM_EXPORT
|
|
18
18
|
cmark_llist *cmark_list_syntax_extensions(cmark_mem *mem);
|
|
19
19
|
|
|
20
20
|
#ifdef __cplusplus
|