commonmarker 0.23.10 → 2.1.1

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 (97) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +1156 -0
  3. data/Cargo.toml +7 -0
  4. data/README.md +237 -172
  5. data/ext/commonmarker/Cargo.toml +20 -0
  6. data/ext/commonmarker/extconf.rb +3 -6
  7. data/ext/commonmarker/src/lib.rs +103 -0
  8. data/ext/commonmarker/src/node.rs +1221 -0
  9. data/ext/commonmarker/src/options.rs +220 -0
  10. data/ext/commonmarker/src/plugins/syntax_highlighting.rs +166 -0
  11. data/ext/commonmarker/src/plugins.rs +6 -0
  12. data/ext/commonmarker/src/utils.rs +8 -0
  13. data/lib/commonmarker/config.rb +92 -40
  14. data/lib/commonmarker/constants.rb +7 -0
  15. data/lib/commonmarker/extension.rb +14 -0
  16. data/lib/commonmarker/node/ast.rb +8 -0
  17. data/lib/commonmarker/node/inspect.rb +14 -4
  18. data/lib/commonmarker/node.rb +29 -47
  19. data/lib/commonmarker/renderer.rb +1 -127
  20. data/lib/commonmarker/utils.rb +22 -0
  21. data/lib/commonmarker/version.rb +2 -2
  22. data/lib/commonmarker.rb +27 -25
  23. metadata +38 -191
  24. data/Rakefile +0 -109
  25. data/bin/commonmarker +0 -118
  26. data/commonmarker.gemspec +0 -38
  27. data/ext/commonmarker/arena.c +0 -104
  28. data/ext/commonmarker/autolink.c +0 -508
  29. data/ext/commonmarker/autolink.h +0 -8
  30. data/ext/commonmarker/blocks.c +0 -1622
  31. data/ext/commonmarker/buffer.c +0 -278
  32. data/ext/commonmarker/buffer.h +0 -116
  33. data/ext/commonmarker/case_fold_switch.inc +0 -4327
  34. data/ext/commonmarker/chunk.h +0 -135
  35. data/ext/commonmarker/cmark-gfm-core-extensions.h +0 -54
  36. data/ext/commonmarker/cmark-gfm-extension_api.h +0 -737
  37. data/ext/commonmarker/cmark-gfm-extensions_export.h +0 -42
  38. data/ext/commonmarker/cmark-gfm.h +0 -833
  39. data/ext/commonmarker/cmark-gfm_export.h +0 -42
  40. data/ext/commonmarker/cmark-gfm_version.h +0 -7
  41. data/ext/commonmarker/cmark.c +0 -55
  42. data/ext/commonmarker/cmark_ctype.c +0 -44
  43. data/ext/commonmarker/cmark_ctype.h +0 -33
  44. data/ext/commonmarker/commonmark.c +0 -514
  45. data/ext/commonmarker/commonmarker.c +0 -1308
  46. data/ext/commonmarker/commonmarker.h +0 -16
  47. data/ext/commonmarker/config.h +0 -76
  48. data/ext/commonmarker/core-extensions.c +0 -27
  49. data/ext/commonmarker/entities.inc +0 -2138
  50. data/ext/commonmarker/ext_scanners.c +0 -879
  51. data/ext/commonmarker/ext_scanners.h +0 -24
  52. data/ext/commonmarker/footnotes.c +0 -63
  53. data/ext/commonmarker/footnotes.h +0 -27
  54. data/ext/commonmarker/houdini.h +0 -57
  55. data/ext/commonmarker/houdini_href_e.c +0 -100
  56. data/ext/commonmarker/houdini_html_e.c +0 -66
  57. data/ext/commonmarker/houdini_html_u.c +0 -149
  58. data/ext/commonmarker/html.c +0 -502
  59. data/ext/commonmarker/html.h +0 -27
  60. data/ext/commonmarker/inlines.c +0 -1788
  61. data/ext/commonmarker/inlines.h +0 -29
  62. data/ext/commonmarker/iterator.c +0 -159
  63. data/ext/commonmarker/iterator.h +0 -26
  64. data/ext/commonmarker/latex.c +0 -468
  65. data/ext/commonmarker/linked_list.c +0 -37
  66. data/ext/commonmarker/man.c +0 -274
  67. data/ext/commonmarker/map.c +0 -129
  68. data/ext/commonmarker/map.h +0 -44
  69. data/ext/commonmarker/node.c +0 -1045
  70. data/ext/commonmarker/node.h +0 -167
  71. data/ext/commonmarker/parser.h +0 -59
  72. data/ext/commonmarker/plaintext.c +0 -218
  73. data/ext/commonmarker/plugin.c +0 -36
  74. data/ext/commonmarker/plugin.h +0 -34
  75. data/ext/commonmarker/references.c +0 -43
  76. data/ext/commonmarker/references.h +0 -26
  77. data/ext/commonmarker/registry.c +0 -63
  78. data/ext/commonmarker/registry.h +0 -24
  79. data/ext/commonmarker/render.c +0 -213
  80. data/ext/commonmarker/render.h +0 -62
  81. data/ext/commonmarker/scanners.c +0 -14056
  82. data/ext/commonmarker/scanners.h +0 -70
  83. data/ext/commonmarker/scanners.re +0 -341
  84. data/ext/commonmarker/strikethrough.c +0 -167
  85. data/ext/commonmarker/strikethrough.h +0 -9
  86. data/ext/commonmarker/syntax_extension.c +0 -149
  87. data/ext/commonmarker/syntax_extension.h +0 -34
  88. data/ext/commonmarker/table.c +0 -917
  89. data/ext/commonmarker/table.h +0 -12
  90. data/ext/commonmarker/tagfilter.c +0 -60
  91. data/ext/commonmarker/tagfilter.h +0 -8
  92. data/ext/commonmarker/tasklist.c +0 -156
  93. data/ext/commonmarker/tasklist.h +0 -8
  94. data/ext/commonmarker/utf8.c +0 -317
  95. data/ext/commonmarker/utf8.h +0 -35
  96. data/ext/commonmarker/xml.c +0 -182
  97. data/lib/commonmarker/renderer/html_renderer.rb +0 -256
@@ -1,70 +0,0 @@
1
- #ifndef CMARK_SCANNERS_H
2
- #define CMARK_SCANNERS_H
3
-
4
- #include "cmark-gfm.h"
5
- #include "chunk.h"
6
-
7
- #ifdef __cplusplus
8
- extern "C" {
9
- #endif
10
-
11
- bufsize_t _scan_at(bufsize_t (*scanner)(const unsigned char *), cmark_chunk *c,
12
- bufsize_t offset);
13
- bufsize_t _scan_scheme(const unsigned char *p);
14
- bufsize_t _scan_autolink_uri(const unsigned char *p);
15
- bufsize_t _scan_autolink_email(const unsigned char *p);
16
- bufsize_t _scan_html_tag(const unsigned char *p);
17
- bufsize_t _scan_liberal_html_tag(const unsigned char *p);
18
- bufsize_t _scan_html_comment(const unsigned char *p);
19
- bufsize_t _scan_html_pi(const unsigned char *p);
20
- bufsize_t _scan_html_declaration(const unsigned char *p);
21
- bufsize_t _scan_html_cdata(const unsigned char *p);
22
- bufsize_t _scan_html_block_start(const unsigned char *p);
23
- bufsize_t _scan_html_block_start_7(const unsigned char *p);
24
- bufsize_t _scan_html_block_end_1(const unsigned char *p);
25
- bufsize_t _scan_html_block_end_2(const unsigned char *p);
26
- bufsize_t _scan_html_block_end_3(const unsigned char *p);
27
- bufsize_t _scan_html_block_end_4(const unsigned char *p);
28
- bufsize_t _scan_html_block_end_5(const unsigned char *p);
29
- bufsize_t _scan_link_title(const unsigned char *p);
30
- bufsize_t _scan_spacechars(const unsigned char *p);
31
- bufsize_t _scan_atx_heading_start(const unsigned char *p);
32
- bufsize_t _scan_setext_heading_line(const unsigned char *p);
33
- bufsize_t _scan_open_code_fence(const unsigned char *p);
34
- bufsize_t _scan_close_code_fence(const unsigned char *p);
35
- bufsize_t _scan_entity(const unsigned char *p);
36
- bufsize_t _scan_dangerous_url(const unsigned char *p);
37
- bufsize_t _scan_footnote_definition(const unsigned char *p);
38
-
39
- #define scan_scheme(c, n) _scan_at(&_scan_scheme, c, n)
40
- #define scan_autolink_uri(c, n) _scan_at(&_scan_autolink_uri, c, n)
41
- #define scan_autolink_email(c, n) _scan_at(&_scan_autolink_email, c, n)
42
- #define scan_html_tag(c, n) _scan_at(&_scan_html_tag, c, n)
43
- #define scan_liberal_html_tag(c, n) _scan_at(&_scan_liberal_html_tag, c, n)
44
- #define scan_html_comment(c, n) _scan_at(&_scan_html_comment, c, n)
45
- #define scan_html_pi(c, n) _scan_at(&_scan_html_pi, c, n)
46
- #define scan_html_declaration(c, n) _scan_at(&_scan_html_declaration, c, n)
47
- #define scan_html_cdata(c, n) _scan_at(&_scan_html_cdata, c, n)
48
- #define scan_html_block_start(c, n) _scan_at(&_scan_html_block_start, c, n)
49
- #define scan_html_block_start_7(c, n) _scan_at(&_scan_html_block_start_7, c, n)
50
- #define scan_html_block_end_1(c, n) _scan_at(&_scan_html_block_end_1, c, n)
51
- #define scan_html_block_end_2(c, n) _scan_at(&_scan_html_block_end_2, c, n)
52
- #define scan_html_block_end_3(c, n) _scan_at(&_scan_html_block_end_3, c, n)
53
- #define scan_html_block_end_4(c, n) _scan_at(&_scan_html_block_end_4, c, n)
54
- #define scan_html_block_end_5(c, n) _scan_at(&_scan_html_block_end_5, c, n)
55
- #define scan_link_title(c, n) _scan_at(&_scan_link_title, c, n)
56
- #define scan_spacechars(c, n) _scan_at(&_scan_spacechars, c, n)
57
- #define scan_atx_heading_start(c, n) _scan_at(&_scan_atx_heading_start, c, n)
58
- #define scan_setext_heading_line(c, n) \
59
- _scan_at(&_scan_setext_heading_line, c, n)
60
- #define scan_open_code_fence(c, n) _scan_at(&_scan_open_code_fence, c, n)
61
- #define scan_close_code_fence(c, n) _scan_at(&_scan_close_code_fence, c, n)
62
- #define scan_entity(c, n) _scan_at(&_scan_entity, c, n)
63
- #define scan_dangerous_url(c, n) _scan_at(&_scan_dangerous_url, c, n)
64
- #define scan_footnote_definition(c, n) _scan_at(&_scan_footnote_definition, c, n)
65
-
66
- #ifdef __cplusplus
67
- }
68
- #endif
69
-
70
- #endif
@@ -1,341 +0,0 @@
1
- #include <stdlib.h>
2
- #include "chunk.h"
3
- #include "scanners.h"
4
-
5
- bufsize_t _scan_at(bufsize_t (*scanner)(const unsigned char *), cmark_chunk *c, bufsize_t offset)
6
- {
7
- bufsize_t res;
8
- unsigned char *ptr = (unsigned char *)c->data;
9
-
10
- if (ptr == NULL || offset > c->len) {
11
- return 0;
12
- } else {
13
- unsigned char lim = ptr[c->len];
14
-
15
- ptr[c->len] = '\0';
16
- res = scanner(ptr + offset);
17
- ptr[c->len] = lim;
18
- }
19
-
20
- return res;
21
- }
22
-
23
- /*!re2c
24
- re2c:define:YYCTYPE = "unsigned char";
25
- re2c:define:YYCURSOR = p;
26
- re2c:define:YYMARKER = marker;
27
- re2c:define:YYCTXMARKER = marker;
28
- re2c:yyfill:enable = 0;
29
-
30
- wordchar = [^\x00-\x20];
31
-
32
- spacechar = [ \t\v\f\r\n];
33
-
34
- reg_char = [^\\()\x00-\x20];
35
-
36
- escaped_char = [\\][!"#$%&'()*+,./:;<=>?@[\\\]^_`{|}~-];
37
-
38
- tagname = [A-Za-z][A-Za-z0-9-]*;
39
-
40
- blocktagname = 'address'|'article'|'aside'|'base'|'basefont'|'blockquote'|'body'|'caption'|'center'|'col'|'colgroup'|'dd'|'details'|'dialog'|'dir'|'div'|'dl'|'dt'|'fieldset'|'figcaption'|'figure'|'footer'|'form'|'frame'|'frameset'|'h1'|'h2'|'h3'|'h4'|'h5'|'h6'|'head'|'header'|'hr'|'html'|'iframe'|'legend'|'li'|'link'|'main'|'menu'|'menuitem'|'meta'|'nav'|'noframes'|'ol'|'optgroup'|'option'|'p'|'param'|'section'|'source'|'title'|'summary'|'table'|'tbody'|'td'|'tfoot'|'th'|'thead'|'title'|'tr'|'track'|'ul';
41
-
42
- attributename = [a-zA-Z_:][a-zA-Z0-9:._-]*;
43
-
44
- unquotedvalue = [^"'=<>`\x00]+;
45
- singlequotedvalue = ['][^'\x00]*['];
46
- doublequotedvalue = ["][^"\x00]*["];
47
-
48
- attributevalue = unquotedvalue | singlequotedvalue | doublequotedvalue;
49
-
50
- attributevaluespec = spacechar* [=] spacechar* attributevalue;
51
-
52
- attribute = spacechar+ attributename attributevaluespec?;
53
-
54
- opentag = tagname attribute* spacechar* [/]? [>];
55
- closetag = [/] tagname spacechar* [>];
56
-
57
- htmlcomment = "!---->" | ("!--" ([-]? [^\x00>-]) ([-]? [^\x00-])* "-->");
58
-
59
- processinginstruction = "?" ([^?>\x00]+ | [?][^>\x00] | [>])* "?>";
60
-
61
- declaration = "!" [A-Z]+ spacechar+ [^>\x00]* ">";
62
-
63
- cdata = "![CDATA[" ([^\]\x00]+ | "]" [^\]\x00] | "]]" [^>\x00])* "]]>";
64
-
65
- htmltag = opentag | closetag | htmlcomment | processinginstruction |
66
- declaration | cdata;
67
-
68
- in_parens_nosp = [(] (reg_char|escaped_char|[\\])* [)];
69
-
70
- in_double_quotes = ["] (escaped_char|[^"\x00])* ["];
71
- in_single_quotes = ['] (escaped_char|[^'\x00])* ['];
72
- in_parens = [(] (escaped_char|[^)\x00])* [)];
73
-
74
- scheme = [A-Za-z][A-Za-z0-9.+-]{1,31};
75
- */
76
-
77
- // Try to match a scheme including colon.
78
- bufsize_t _scan_scheme(const unsigned char *p)
79
- {
80
- const unsigned char *marker = NULL;
81
- const unsigned char *start = p;
82
- /*!re2c
83
- scheme [:] { return (bufsize_t)(p - start); }
84
- * { return 0; }
85
- */
86
- }
87
-
88
- // Try to match URI autolink after first <, returning number of chars matched.
89
- bufsize_t _scan_autolink_uri(const unsigned char *p)
90
- {
91
- const unsigned char *marker = NULL;
92
- const unsigned char *start = p;
93
- /*!re2c
94
- scheme [:][^\x00-\x20<>]*[>] { return (bufsize_t)(p - start); }
95
- * { return 0; }
96
- */
97
- }
98
-
99
- // Try to match email autolink after first <, returning num of chars matched.
100
- bufsize_t _scan_autolink_email(const unsigned char *p)
101
- {
102
- const unsigned char *marker = NULL;
103
- const unsigned char *start = p;
104
- /*!re2c
105
- [a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+
106
- [@]
107
- [a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?
108
- ([.][a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*
109
- [>] { return (bufsize_t)(p - start); }
110
- * { return 0; }
111
- */
112
- }
113
-
114
- // Try to match an HTML tag after first <, returning num of chars matched.
115
- bufsize_t _scan_html_tag(const unsigned char *p)
116
- {
117
- const unsigned char *marker = NULL;
118
- const unsigned char *start = p;
119
- /*!re2c
120
- htmltag { return (bufsize_t)(p - start); }
121
- * { return 0; }
122
- */
123
- }
124
-
125
- // Try to (liberally) match an HTML tag after first <, returning num of chars matched.
126
- bufsize_t _scan_liberal_html_tag(const unsigned char *p)
127
- {
128
- const unsigned char *marker = NULL;
129
- const unsigned char *start = p;
130
- /*!re2c
131
- [^\n\x00]+ [>] { return (bufsize_t)(p - start); }
132
- * { return 0; }
133
- */
134
- }
135
-
136
- // Try to match an HTML block tag start line, returning
137
- // an integer code for the type of block (1-6, matching the spec).
138
- // #7 is handled by a separate function, below.
139
- bufsize_t _scan_html_block_start(const unsigned char *p)
140
- {
141
- const unsigned char *marker = NULL;
142
- /*!re2c
143
- [<] ('script'|'pre'|'style') (spacechar | [>]) { return 1; }
144
- '<!--' { return 2; }
145
- '<?' { return 3; }
146
- '<!' [A-Z] { return 4; }
147
- '<![CDATA[' { return 5; }
148
- [<] [/]? blocktagname (spacechar | [/]? [>]) { return 6; }
149
- * { return 0; }
150
- */
151
- }
152
-
153
- // Try to match an HTML block tag start line of type 7, returning
154
- // 7 if successful, 0 if not.
155
- bufsize_t _scan_html_block_start_7(const unsigned char *p)
156
- {
157
- const unsigned char *marker = NULL;
158
- /*!re2c
159
- [<] (opentag | closetag) [\t\n\f ]* [\r\n] { return 7; }
160
- * { return 0; }
161
- */
162
- }
163
-
164
- // Try to match an HTML block end line of type 1
165
- bufsize_t _scan_html_block_end_1(const unsigned char *p)
166
- {
167
- const unsigned char *marker = NULL;
168
- const unsigned char *start = p;
169
- /*!re2c
170
- [^\n\x00]* [<] [/] ('script'|'pre'|'style') [>] { return (bufsize_t)(p - start); }
171
- * { return 0; }
172
- */
173
- }
174
-
175
- // Try to match an HTML block end line of type 2
176
- bufsize_t _scan_html_block_end_2(const unsigned char *p)
177
- {
178
- const unsigned char *marker = NULL;
179
- const unsigned char *start = p;
180
- /*!re2c
181
- [^\n\x00]* '-->' { return (bufsize_t)(p - start); }
182
- * { return 0; }
183
- */
184
- }
185
-
186
- // Try to match an HTML block end line of type 3
187
- bufsize_t _scan_html_block_end_3(const unsigned char *p)
188
- {
189
- const unsigned char *marker = NULL;
190
- const unsigned char *start = p;
191
- /*!re2c
192
- [^\n\x00]* '?>' { return (bufsize_t)(p - start); }
193
- * { return 0; }
194
- */
195
- }
196
-
197
- // Try to match an HTML block end line of type 4
198
- bufsize_t _scan_html_block_end_4(const unsigned char *p)
199
- {
200
- const unsigned char *marker = NULL;
201
- const unsigned char *start = p;
202
- /*!re2c
203
- [^\n\x00]* '>' { return (bufsize_t)(p - start); }
204
- * { return 0; }
205
- */
206
- }
207
-
208
- // Try to match an HTML block end line of type 5
209
- bufsize_t _scan_html_block_end_5(const unsigned char *p)
210
- {
211
- const unsigned char *marker = NULL;
212
- const unsigned char *start = p;
213
- /*!re2c
214
- [^\n\x00]* ']]>' { return (bufsize_t)(p - start); }
215
- * { return 0; }
216
- */
217
- }
218
-
219
- // Try to match a link title (in single quotes, in double quotes, or
220
- // in parentheses), returning number of chars matched. Allow one
221
- // level of internal nesting (quotes within quotes).
222
- bufsize_t _scan_link_title(const unsigned char *p)
223
- {
224
- const unsigned char *marker = NULL;
225
- const unsigned char *start = p;
226
- /*!re2c
227
- ["] (escaped_char|[^"\x00])* ["] { return (bufsize_t)(p - start); }
228
- ['] (escaped_char|[^'\x00])* ['] { return (bufsize_t)(p - start); }
229
- [(] (escaped_char|[^)\x00])* [)] { return (bufsize_t)(p - start); }
230
- * { return 0; }
231
- */
232
- }
233
-
234
- // Match space characters, including newlines.
235
- bufsize_t _scan_spacechars(const unsigned char *p)
236
- {
237
- const unsigned char *start = p; \
238
- /*!re2c
239
- [ \t\v\f\r\n]+ { return (bufsize_t)(p - start); }
240
- * { return 0; }
241
- */
242
- }
243
-
244
- // Match ATX heading start.
245
- bufsize_t _scan_atx_heading_start(const unsigned char *p)
246
- {
247
- const unsigned char *marker = NULL;
248
- const unsigned char *start = p;
249
- /*!re2c
250
- [#]{1,6} ([ \t]+|[\r\n]) { return (bufsize_t)(p - start); }
251
- * { return 0; }
252
- */
253
- }
254
-
255
- // Match setext heading line. Return 1 for level-1 heading,
256
- // 2 for level-2, 0 for no match.
257
- bufsize_t _scan_setext_heading_line(const unsigned char *p)
258
- {
259
- const unsigned char *marker = NULL;
260
- /*!re2c
261
- [=]+ [ \t]* [\r\n] { return 1; }
262
- [-]+ [ \t]* [\r\n] { return 2; }
263
- * { return 0; }
264
- */
265
- }
266
-
267
- // Scan a thematic break line: "...three or more hyphens, asterisks,
268
- // or underscores on a line by themselves. If you wish, you may use
269
- // spaces between the hyphens or asterisks."
270
- bufsize_t _scan_thematic_break(const unsigned char *p)
271
- {
272
- const unsigned char *marker = NULL;
273
- const unsigned char *start = p;
274
- /*!re2c
275
- ([*][ \t]*){3,} [ \t]* [\r\n] { return (bufsize_t)(p - start); }
276
- ([_][ \t]*){3,} [ \t]* [\r\n] { return (bufsize_t)(p - start); }
277
- ([-][ \t]*){3,} [ \t]* [\r\n] { return (bufsize_t)(p - start); }
278
- * { return 0; }
279
- */
280
- }
281
-
282
- // Scan an opening code fence.
283
- bufsize_t _scan_open_code_fence(const unsigned char *p)
284
- {
285
- const unsigned char *marker = NULL;
286
- const unsigned char *start = p;
287
- /*!re2c
288
- [`]{3,} / [^`\r\n\x00]*[\r\n] { return (bufsize_t)(p - start); }
289
- [~]{3,} / [^~\r\n\x00]*[\r\n] { return (bufsize_t)(p - start); }
290
- * { return 0; }
291
- */
292
- }
293
-
294
- // Scan a closing code fence with length at least len.
295
- bufsize_t _scan_close_code_fence(const unsigned char *p)
296
- {
297
- const unsigned char *marker = NULL;
298
- const unsigned char *start = p;
299
- /*!re2c
300
- [`]{3,} / [ \t]*[\r\n] { return (bufsize_t)(p - start); }
301
- [~]{3,} / [ \t]*[\r\n] { return (bufsize_t)(p - start); }
302
- * { return 0; }
303
- */
304
- }
305
-
306
- // Scans an entity.
307
- // Returns number of chars matched.
308
- bufsize_t _scan_entity(const unsigned char *p)
309
- {
310
- const unsigned char *marker = NULL;
311
- const unsigned char *start = p;
312
- /*!re2c
313
- [&] ([#] ([Xx][A-Fa-f0-9]{1,8}|[0-9]{1,8}) |[A-Za-z][A-Za-z0-9]{1,31} ) [;]
314
- { return (bufsize_t)(p - start); }
315
- * { return 0; }
316
- */
317
- }
318
-
319
- // Returns positive value if a URL begins in a way that is potentially
320
- // dangerous, with javascript:, vbscript:, file:, or data:, otherwise 0.
321
- bufsize_t _scan_dangerous_url(const unsigned char *p)
322
- {
323
- const unsigned char *marker = NULL;
324
- const unsigned char *start = p;
325
- /*!re2c
326
- 'data:image/' ('png'|'gif'|'jpeg'|'webp') { return 0; }
327
- 'javascript:' | 'vbscript:' | 'file:' | 'data:' { return (bufsize_t)(p - start); }
328
- * { return 0; }
329
- */
330
- }
331
-
332
- // Scans a footnote definition opening.
333
- bufsize_t _scan_footnote_definition(const unsigned char *p)
334
- {
335
- const unsigned char *marker = NULL;
336
- const unsigned char *start = p;
337
- /*!re2c
338
- '[^' ([^\] \r\n\x00\t]+) ']:' [ \t]* { return (bufsize_t)(p - start); }
339
- * { return 0; }
340
- */
341
- }
@@ -1,167 +0,0 @@
1
- #include "strikethrough.h"
2
- #include <parser.h>
3
- #include <render.h>
4
-
5
- cmark_node_type CMARK_NODE_STRIKETHROUGH;
6
-
7
- static cmark_node *match(cmark_syntax_extension *self, cmark_parser *parser,
8
- cmark_node *parent, unsigned char character,
9
- cmark_inline_parser *inline_parser) {
10
- cmark_node *res = NULL;
11
- int left_flanking, right_flanking, punct_before, punct_after, delims;
12
- char buffer[101];
13
-
14
- if (character != '~')
15
- return NULL;
16
-
17
- delims = cmark_inline_parser_scan_delimiters(
18
- inline_parser, sizeof(buffer) - 1, '~',
19
- &left_flanking,
20
- &right_flanking, &punct_before, &punct_after);
21
-
22
- memset(buffer, '~', delims);
23
- buffer[delims] = 0;
24
-
25
- res = cmark_node_new_with_mem(CMARK_NODE_TEXT, parser->mem);
26
- cmark_node_set_literal(res, buffer);
27
- res->start_line = res->end_line = cmark_inline_parser_get_line(inline_parser);
28
- res->start_column = cmark_inline_parser_get_column(inline_parser) - delims;
29
-
30
- if ((left_flanking || right_flanking) &&
31
- (delims == 2 || (!(parser->options & CMARK_OPT_STRIKETHROUGH_DOUBLE_TILDE) && delims == 1))) {
32
- cmark_inline_parser_push_delimiter(inline_parser, character, left_flanking,
33
- right_flanking, res);
34
- }
35
-
36
- return res;
37
- }
38
-
39
- static delimiter *insert(cmark_syntax_extension *self, cmark_parser *parser,
40
- cmark_inline_parser *inline_parser, delimiter *opener,
41
- delimiter *closer) {
42
- cmark_node *strikethrough;
43
- cmark_node *tmp, *next;
44
- delimiter *delim, *tmp_delim;
45
- delimiter *res = closer->next;
46
-
47
- strikethrough = opener->inl_text;
48
-
49
- if (opener->inl_text->as.literal.len != closer->inl_text->as.literal.len)
50
- goto done;
51
-
52
- if (!cmark_node_set_type(strikethrough, CMARK_NODE_STRIKETHROUGH))
53
- goto done;
54
-
55
- cmark_node_set_syntax_extension(strikethrough, self);
56
-
57
- tmp = cmark_node_next(opener->inl_text);
58
-
59
- while (tmp) {
60
- if (tmp == closer->inl_text)
61
- break;
62
- next = cmark_node_next(tmp);
63
- cmark_node_append_child(strikethrough, tmp);
64
- tmp = next;
65
- }
66
-
67
- strikethrough->end_column = closer->inl_text->start_column + closer->inl_text->as.literal.len - 1;
68
- cmark_node_free(closer->inl_text);
69
-
70
- done:
71
- delim = closer;
72
- while (delim != NULL && delim != opener) {
73
- tmp_delim = delim->previous;
74
- cmark_inline_parser_remove_delimiter(inline_parser, delim);
75
- delim = tmp_delim;
76
- }
77
-
78
- cmark_inline_parser_remove_delimiter(inline_parser, opener);
79
-
80
- return res;
81
- }
82
-
83
- static const char *get_type_string(cmark_syntax_extension *extension,
84
- cmark_node *node) {
85
- return node->type == CMARK_NODE_STRIKETHROUGH ? "strikethrough" : "<unknown>";
86
- }
87
-
88
- static int can_contain(cmark_syntax_extension *extension, cmark_node *node,
89
- cmark_node_type child_type) {
90
- if (node->type != CMARK_NODE_STRIKETHROUGH)
91
- return false;
92
-
93
- return CMARK_NODE_TYPE_INLINE_P(child_type);
94
- }
95
-
96
- static void commonmark_render(cmark_syntax_extension *extension,
97
- cmark_renderer *renderer, cmark_node *node,
98
- cmark_event_type ev_type, int options) {
99
- renderer->out(renderer, node, "~~", false, LITERAL);
100
- }
101
-
102
- static void latex_render(cmark_syntax_extension *extension,
103
- cmark_renderer *renderer, cmark_node *node,
104
- cmark_event_type ev_type, int options) {
105
- // requires \usepackage{ulem}
106
- bool entering = (ev_type == CMARK_EVENT_ENTER);
107
- if (entering) {
108
- renderer->out(renderer, node, "\\sout{", false, LITERAL);
109
- } else {
110
- renderer->out(renderer, node, "}", false, LITERAL);
111
- }
112
- }
113
-
114
- static void man_render(cmark_syntax_extension *extension,
115
- cmark_renderer *renderer, cmark_node *node,
116
- cmark_event_type ev_type, int options) {
117
- bool entering = (ev_type == CMARK_EVENT_ENTER);
118
- if (entering) {
119
- renderer->cr(renderer);
120
- renderer->out(renderer, node, ".ST \"", false, LITERAL);
121
- } else {
122
- renderer->out(renderer, node, "\"", false, LITERAL);
123
- renderer->cr(renderer);
124
- }
125
- }
126
-
127
- static void html_render(cmark_syntax_extension *extension,
128
- cmark_html_renderer *renderer, cmark_node *node,
129
- cmark_event_type ev_type, int options) {
130
- bool entering = (ev_type == CMARK_EVENT_ENTER);
131
- if (entering) {
132
- cmark_strbuf_puts(renderer->html, "<del>");
133
- } else {
134
- cmark_strbuf_puts(renderer->html, "</del>");
135
- }
136
- }
137
-
138
- static void plaintext_render(cmark_syntax_extension *extension,
139
- cmark_renderer *renderer, cmark_node *node,
140
- cmark_event_type ev_type, int options) {
141
- renderer->out(renderer, node, "~", false, LITERAL);
142
- }
143
-
144
- cmark_syntax_extension *create_strikethrough_extension(void) {
145
- cmark_syntax_extension *ext = cmark_syntax_extension_new("strikethrough");
146
- cmark_llist *special_chars = NULL;
147
-
148
- cmark_syntax_extension_set_get_type_string_func(ext, get_type_string);
149
- cmark_syntax_extension_set_can_contain_func(ext, can_contain);
150
- cmark_syntax_extension_set_commonmark_render_func(ext, commonmark_render);
151
- cmark_syntax_extension_set_latex_render_func(ext, latex_render);
152
- cmark_syntax_extension_set_man_render_func(ext, man_render);
153
- cmark_syntax_extension_set_html_render_func(ext, html_render);
154
- cmark_syntax_extension_set_plaintext_render_func(ext, plaintext_render);
155
- CMARK_NODE_STRIKETHROUGH = cmark_syntax_extension_add_node(1);
156
-
157
- cmark_syntax_extension_set_match_inline_func(ext, match);
158
- cmark_syntax_extension_set_inline_from_delim_func(ext, insert);
159
-
160
- cmark_mem *mem = cmark_get_default_mem_allocator();
161
- special_chars = cmark_llist_append(mem, special_chars, (void *)'~');
162
- cmark_syntax_extension_set_special_inline_chars(ext, special_chars);
163
-
164
- cmark_syntax_extension_set_emphasis(ext, 1);
165
-
166
- return ext;
167
- }
@@ -1,9 +0,0 @@
1
- #ifndef CMARK_GFM_STRIKETHROUGH_H
2
- #define CMARK_GFM_STRIKETHROUGH_H
3
-
4
- #include "cmark-gfm-core-extensions.h"
5
-
6
- extern cmark_node_type CMARK_NODE_STRIKETHROUGH;
7
- cmark_syntax_extension *create_strikethrough_extension(void);
8
-
9
- #endif