commonmarker 0.23.8 → 1.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +70 -212
  3. data/commonmarker.gemspec +34 -31
  4. data/ext/commonmarker/Cargo.toml +12 -0
  5. data/ext/commonmarker/_util.rb +102 -0
  6. data/ext/commonmarker/extconf.rb +4 -5
  7. data/ext/commonmarker/src/comrak_options.rs +107 -0
  8. data/ext/commonmarker/src/lib.rs +27 -0
  9. data/lib/commonmarker/config.rb +57 -38
  10. data/lib/commonmarker/extension.rb +14 -0
  11. data/lib/commonmarker/renderer.rb +1 -127
  12. data/lib/commonmarker/version.rb +2 -2
  13. data/lib/commonmarker.rb +14 -29
  14. metadata +37 -181
  15. data/Rakefile +0 -109
  16. data/bin/commonmarker +0 -118
  17. data/ext/commonmarker/arena.c +0 -104
  18. data/ext/commonmarker/autolink.c +0 -508
  19. data/ext/commonmarker/autolink.h +0 -8
  20. data/ext/commonmarker/blocks.c +0 -1610
  21. data/ext/commonmarker/buffer.c +0 -278
  22. data/ext/commonmarker/buffer.h +0 -116
  23. data/ext/commonmarker/case_fold_switch.inc +0 -4327
  24. data/ext/commonmarker/chunk.h +0 -135
  25. data/ext/commonmarker/cmark-gfm-core-extensions.h +0 -54
  26. data/ext/commonmarker/cmark-gfm-extension_api.h +0 -737
  27. data/ext/commonmarker/cmark-gfm-extensions_export.h +0 -42
  28. data/ext/commonmarker/cmark-gfm.h +0 -822
  29. data/ext/commonmarker/cmark-gfm_export.h +0 -42
  30. data/ext/commonmarker/cmark-gfm_version.h +0 -7
  31. data/ext/commonmarker/cmark.c +0 -55
  32. data/ext/commonmarker/cmark_ctype.c +0 -44
  33. data/ext/commonmarker/cmark_ctype.h +0 -33
  34. data/ext/commonmarker/commonmark.c +0 -529
  35. data/ext/commonmarker/commonmarker.c +0 -1308
  36. data/ext/commonmarker/commonmarker.h +0 -16
  37. data/ext/commonmarker/config.h +0 -76
  38. data/ext/commonmarker/core-extensions.c +0 -27
  39. data/ext/commonmarker/entities.inc +0 -2138
  40. data/ext/commonmarker/ext_scanners.c +0 -879
  41. data/ext/commonmarker/ext_scanners.h +0 -24
  42. data/ext/commonmarker/footnotes.c +0 -63
  43. data/ext/commonmarker/footnotes.h +0 -27
  44. data/ext/commonmarker/houdini.h +0 -57
  45. data/ext/commonmarker/houdini_href_e.c +0 -100
  46. data/ext/commonmarker/houdini_html_e.c +0 -66
  47. data/ext/commonmarker/houdini_html_u.c +0 -149
  48. data/ext/commonmarker/html.c +0 -500
  49. data/ext/commonmarker/html.h +0 -27
  50. data/ext/commonmarker/inlines.c +0 -1788
  51. data/ext/commonmarker/inlines.h +0 -29
  52. data/ext/commonmarker/iterator.c +0 -159
  53. data/ext/commonmarker/iterator.h +0 -26
  54. data/ext/commonmarker/latex.c +0 -466
  55. data/ext/commonmarker/linked_list.c +0 -37
  56. data/ext/commonmarker/man.c +0 -278
  57. data/ext/commonmarker/map.c +0 -129
  58. data/ext/commonmarker/map.h +0 -44
  59. data/ext/commonmarker/node.c +0 -1009
  60. data/ext/commonmarker/node.h +0 -151
  61. data/ext/commonmarker/parser.h +0 -59
  62. data/ext/commonmarker/plaintext.c +0 -235
  63. data/ext/commonmarker/plugin.c +0 -36
  64. data/ext/commonmarker/plugin.h +0 -34
  65. data/ext/commonmarker/references.c +0 -43
  66. data/ext/commonmarker/references.h +0 -26
  67. data/ext/commonmarker/registry.c +0 -63
  68. data/ext/commonmarker/registry.h +0 -24
  69. data/ext/commonmarker/render.c +0 -205
  70. data/ext/commonmarker/render.h +0 -62
  71. data/ext/commonmarker/scanners.c +0 -14056
  72. data/ext/commonmarker/scanners.h +0 -70
  73. data/ext/commonmarker/scanners.re +0 -341
  74. data/ext/commonmarker/strikethrough.c +0 -167
  75. data/ext/commonmarker/strikethrough.h +0 -9
  76. data/ext/commonmarker/syntax_extension.c +0 -149
  77. data/ext/commonmarker/syntax_extension.h +0 -34
  78. data/ext/commonmarker/table.c +0 -872
  79. data/ext/commonmarker/table.h +0 -12
  80. data/ext/commonmarker/tagfilter.c +0 -60
  81. data/ext/commonmarker/tagfilter.h +0 -8
  82. data/ext/commonmarker/tasklist.c +0 -156
  83. data/ext/commonmarker/tasklist.h +0 -8
  84. data/ext/commonmarker/utf8.c +0 -317
  85. data/ext/commonmarker/utf8.h +0 -35
  86. data/ext/commonmarker/xml.c +0 -181
  87. data/lib/commonmarker/node/inspect.rb +0 -47
  88. data/lib/commonmarker/node.rb +0 -83
  89. data/lib/commonmarker/renderer/html_renderer.rb +0 -252
@@ -1,1009 +0,0 @@
1
- #include <stdlib.h>
2
- #include <string.h>
3
-
4
- #include "config.h"
5
- #include "node.h"
6
- #include "syntax_extension.h"
7
-
8
- static void S_node_unlink(cmark_node *node);
9
-
10
- #define NODE_MEM(node) cmark_node_mem(node)
11
-
12
- void cmark_register_node_flag(cmark_node_internal_flags *flags) {
13
- static cmark_node_internal_flags nextflag = CMARK_NODE__REGISTER_FIRST;
14
-
15
- // flags should be a pointer to a global variable and this function
16
- // should only be called once to initialize its value.
17
- if (*flags) {
18
- fprintf(stderr, "flag initialization error in cmark_register_node_flag\n");
19
- abort();
20
- }
21
-
22
- // Check that we haven't run out of bits.
23
- if (nextflag == 0) {
24
- fprintf(stderr, "too many flags in cmark_register_node_flag\n");
25
- abort();
26
- }
27
-
28
- *flags = nextflag;
29
- nextflag <<= 1;
30
- }
31
-
32
- void cmark_init_standard_node_flags() {}
33
-
34
- bool cmark_node_can_contain_type(cmark_node *node, cmark_node_type child_type) {
35
- if (child_type == CMARK_NODE_DOCUMENT) {
36
- return false;
37
- }
38
-
39
- if (node->extension && node->extension->can_contain_func) {
40
- return node->extension->can_contain_func(node->extension, node, child_type) != 0;
41
- }
42
-
43
- switch (node->type) {
44
- case CMARK_NODE_DOCUMENT:
45
- case CMARK_NODE_BLOCK_QUOTE:
46
- case CMARK_NODE_FOOTNOTE_DEFINITION:
47
- case CMARK_NODE_ITEM:
48
- return CMARK_NODE_TYPE_BLOCK_P(child_type) && child_type != CMARK_NODE_ITEM;
49
-
50
- case CMARK_NODE_LIST:
51
- return child_type == CMARK_NODE_ITEM;
52
-
53
- case CMARK_NODE_CUSTOM_BLOCK:
54
- return true;
55
-
56
- case CMARK_NODE_PARAGRAPH:
57
- case CMARK_NODE_HEADING:
58
- case CMARK_NODE_EMPH:
59
- case CMARK_NODE_STRONG:
60
- case CMARK_NODE_LINK:
61
- case CMARK_NODE_IMAGE:
62
- case CMARK_NODE_CUSTOM_INLINE:
63
- return CMARK_NODE_TYPE_INLINE_P(child_type);
64
-
65
- default:
66
- break;
67
- }
68
-
69
- return false;
70
- }
71
-
72
- static bool S_can_contain(cmark_node *node, cmark_node *child) {
73
- cmark_node *cur;
74
-
75
- if (node == NULL || child == NULL) {
76
- return false;
77
- }
78
- if (NODE_MEM(node) != NODE_MEM(child)) {
79
- return 0;
80
- }
81
-
82
- // Verify that child is not an ancestor of node or equal to node.
83
- cur = node;
84
- do {
85
- if (cur == child) {
86
- return false;
87
- }
88
- cur = cur->parent;
89
- } while (cur != NULL);
90
-
91
- return cmark_node_can_contain_type(node, (cmark_node_type) child->type);
92
- }
93
-
94
- cmark_node *cmark_node_new_with_mem_and_ext(cmark_node_type type, cmark_mem *mem, cmark_syntax_extension *extension) {
95
- cmark_node *node = (cmark_node *)mem->calloc(1, sizeof(*node));
96
- cmark_strbuf_init(mem, &node->content, 0);
97
- node->type = (uint16_t)type;
98
- node->extension = extension;
99
-
100
- switch (node->type) {
101
- case CMARK_NODE_HEADING:
102
- node->as.heading.level = 1;
103
- break;
104
-
105
- case CMARK_NODE_LIST: {
106
- cmark_list *list = &node->as.list;
107
- list->list_type = CMARK_BULLET_LIST;
108
- list->start = 0;
109
- list->tight = false;
110
- break;
111
- }
112
-
113
- default:
114
- break;
115
- }
116
-
117
- if (node->extension && node->extension->opaque_alloc_func) {
118
- node->extension->opaque_alloc_func(node->extension, mem, node);
119
- }
120
-
121
- return node;
122
- }
123
-
124
- cmark_node *cmark_node_new_with_ext(cmark_node_type type, cmark_syntax_extension *extension) {
125
- extern cmark_mem CMARK_DEFAULT_MEM_ALLOCATOR;
126
- return cmark_node_new_with_mem_and_ext(type, &CMARK_DEFAULT_MEM_ALLOCATOR, extension);
127
- }
128
-
129
- cmark_node *cmark_node_new_with_mem(cmark_node_type type, cmark_mem *mem)
130
- {
131
- return cmark_node_new_with_mem_and_ext(type, mem, NULL);
132
- }
133
-
134
- cmark_node *cmark_node_new(cmark_node_type type) {
135
- return cmark_node_new_with_ext(type, NULL);
136
- }
137
-
138
- static void free_node_as(cmark_node *node) {
139
- switch (node->type) {
140
- case CMARK_NODE_CODE_BLOCK:
141
- cmark_chunk_free(NODE_MEM(node), &node->as.code.info);
142
- cmark_chunk_free(NODE_MEM(node), &node->as.code.literal);
143
- break;
144
- case CMARK_NODE_TEXT:
145
- case CMARK_NODE_HTML_INLINE:
146
- case CMARK_NODE_CODE:
147
- case CMARK_NODE_HTML_BLOCK:
148
- case CMARK_NODE_FOOTNOTE_REFERENCE:
149
- case CMARK_NODE_FOOTNOTE_DEFINITION:
150
- cmark_chunk_free(NODE_MEM(node), &node->as.literal);
151
- break;
152
- case CMARK_NODE_LINK:
153
- case CMARK_NODE_IMAGE:
154
- cmark_chunk_free(NODE_MEM(node), &node->as.link.url);
155
- cmark_chunk_free(NODE_MEM(node), &node->as.link.title);
156
- break;
157
- case CMARK_NODE_CUSTOM_BLOCK:
158
- case CMARK_NODE_CUSTOM_INLINE:
159
- cmark_chunk_free(NODE_MEM(node), &node->as.custom.on_enter);
160
- cmark_chunk_free(NODE_MEM(node), &node->as.custom.on_exit);
161
- break;
162
- default:
163
- break;
164
- }
165
- }
166
-
167
- // Free a cmark_node list and any children.
168
- static void S_free_nodes(cmark_node *e) {
169
- cmark_node *next;
170
- while (e != NULL) {
171
- cmark_strbuf_free(&e->content);
172
-
173
- if (e->user_data && e->user_data_free_func)
174
- e->user_data_free_func(NODE_MEM(e), e->user_data);
175
-
176
- if (e->as.opaque && e->extension && e->extension->opaque_free_func)
177
- e->extension->opaque_free_func(e->extension, NODE_MEM(e), e);
178
-
179
- free_node_as(e);
180
-
181
- if (e->last_child) {
182
- // Splice children into list
183
- e->last_child->next = e->next;
184
- e->next = e->first_child;
185
- }
186
- next = e->next;
187
- NODE_MEM(e)->free(e);
188
- e = next;
189
- }
190
- }
191
-
192
- void cmark_node_free(cmark_node *node) {
193
- S_node_unlink(node);
194
- node->next = NULL;
195
- S_free_nodes(node);
196
- }
197
-
198
- cmark_node_type cmark_node_get_type(cmark_node *node) {
199
- if (node == NULL) {
200
- return CMARK_NODE_NONE;
201
- } else {
202
- return (cmark_node_type)node->type;
203
- }
204
- }
205
-
206
- int cmark_node_set_type(cmark_node * node, cmark_node_type type) {
207
- cmark_node_type initial_type;
208
-
209
- if (type == node->type)
210
- return 1;
211
-
212
- initial_type = (cmark_node_type) node->type;
213
- node->type = (uint16_t)type;
214
-
215
- if (!S_can_contain(node->parent, node)) {
216
- node->type = (uint16_t)initial_type;
217
- return 0;
218
- }
219
-
220
- /* We rollback the type to free the union members appropriately */
221
- node->type = (uint16_t)initial_type;
222
- free_node_as(node);
223
-
224
- node->type = (uint16_t)type;
225
-
226
- return 1;
227
- }
228
-
229
- const char *cmark_node_get_type_string(cmark_node *node) {
230
- if (node == NULL) {
231
- return "NONE";
232
- }
233
-
234
- if (node->extension && node->extension->get_type_string_func) {
235
- return node->extension->get_type_string_func(node->extension, node);
236
- }
237
-
238
- switch (node->type) {
239
- case CMARK_NODE_NONE:
240
- return "none";
241
- case CMARK_NODE_DOCUMENT:
242
- return "document";
243
- case CMARK_NODE_BLOCK_QUOTE:
244
- return "block_quote";
245
- case CMARK_NODE_LIST:
246
- return "list";
247
- case CMARK_NODE_ITEM:
248
- return "item";
249
- case CMARK_NODE_CODE_BLOCK:
250
- return "code_block";
251
- case CMARK_NODE_HTML_BLOCK:
252
- return "html_block";
253
- case CMARK_NODE_CUSTOM_BLOCK:
254
- return "custom_block";
255
- case CMARK_NODE_PARAGRAPH:
256
- return "paragraph";
257
- case CMARK_NODE_HEADING:
258
- return "heading";
259
- case CMARK_NODE_THEMATIC_BREAK:
260
- return "thematic_break";
261
- case CMARK_NODE_TEXT:
262
- return "text";
263
- case CMARK_NODE_SOFTBREAK:
264
- return "softbreak";
265
- case CMARK_NODE_LINEBREAK:
266
- return "linebreak";
267
- case CMARK_NODE_CODE:
268
- return "code";
269
- case CMARK_NODE_HTML_INLINE:
270
- return "html_inline";
271
- case CMARK_NODE_CUSTOM_INLINE:
272
- return "custom_inline";
273
- case CMARK_NODE_EMPH:
274
- return "emph";
275
- case CMARK_NODE_STRONG:
276
- return "strong";
277
- case CMARK_NODE_LINK:
278
- return "link";
279
- case CMARK_NODE_IMAGE:
280
- return "image";
281
- }
282
-
283
- return "<unknown>";
284
- }
285
-
286
- cmark_node *cmark_node_next(cmark_node *node) {
287
- if (node == NULL) {
288
- return NULL;
289
- } else {
290
- return node->next;
291
- }
292
- }
293
-
294
- cmark_node *cmark_node_previous(cmark_node *node) {
295
- if (node == NULL) {
296
- return NULL;
297
- } else {
298
- return node->prev;
299
- }
300
- }
301
-
302
- cmark_node *cmark_node_parent(cmark_node *node) {
303
- if (node == NULL) {
304
- return NULL;
305
- } else {
306
- return node->parent;
307
- }
308
- }
309
-
310
- cmark_node *cmark_node_first_child(cmark_node *node) {
311
- if (node == NULL) {
312
- return NULL;
313
- } else {
314
- return node->first_child;
315
- }
316
- }
317
-
318
- cmark_node *cmark_node_last_child(cmark_node *node) {
319
- if (node == NULL) {
320
- return NULL;
321
- } else {
322
- return node->last_child;
323
- }
324
- }
325
-
326
- cmark_node *cmark_node_parent_footnote_def(cmark_node *node) {
327
- if (node == NULL) {
328
- return NULL;
329
- } else {
330
- return node->parent_footnote_def;
331
- }
332
- }
333
-
334
- void *cmark_node_get_user_data(cmark_node *node) {
335
- if (node == NULL) {
336
- return NULL;
337
- } else {
338
- return node->user_data;
339
- }
340
- }
341
-
342
- int cmark_node_set_user_data(cmark_node *node, void *user_data) {
343
- if (node == NULL) {
344
- return 0;
345
- }
346
- node->user_data = user_data;
347
- return 1;
348
- }
349
-
350
- int cmark_node_set_user_data_free_func(cmark_node *node,
351
- cmark_free_func free_func) {
352
- if (node == NULL) {
353
- return 0;
354
- }
355
- node->user_data_free_func = free_func;
356
- return 1;
357
- }
358
-
359
- const char *cmark_node_get_literal(cmark_node *node) {
360
- if (node == NULL) {
361
- return NULL;
362
- }
363
-
364
- switch (node->type) {
365
- case CMARK_NODE_HTML_BLOCK:
366
- case CMARK_NODE_TEXT:
367
- case CMARK_NODE_HTML_INLINE:
368
- case CMARK_NODE_CODE:
369
- case CMARK_NODE_FOOTNOTE_REFERENCE:
370
- return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.literal);
371
-
372
- case CMARK_NODE_CODE_BLOCK:
373
- return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.code.literal);
374
-
375
- default:
376
- break;
377
- }
378
-
379
- return NULL;
380
- }
381
-
382
- int cmark_node_set_literal(cmark_node *node, const char *content) {
383
- if (node == NULL) {
384
- return 0;
385
- }
386
-
387
- switch (node->type) {
388
- case CMARK_NODE_HTML_BLOCK:
389
- case CMARK_NODE_TEXT:
390
- case CMARK_NODE_HTML_INLINE:
391
- case CMARK_NODE_CODE:
392
- case CMARK_NODE_FOOTNOTE_REFERENCE:
393
- cmark_chunk_set_cstr(NODE_MEM(node), &node->as.literal, content);
394
- return 1;
395
-
396
- case CMARK_NODE_CODE_BLOCK:
397
- cmark_chunk_set_cstr(NODE_MEM(node), &node->as.code.literal, content);
398
- return 1;
399
-
400
- default:
401
- break;
402
- }
403
-
404
- return 0;
405
- }
406
-
407
- const char *cmark_node_get_string_content(cmark_node *node) {
408
- return (char *) node->content.ptr;
409
- }
410
-
411
- int cmark_node_set_string_content(cmark_node *node, const char *content) {
412
- cmark_strbuf_sets(&node->content, content);
413
- return true;
414
- }
415
-
416
- int cmark_node_get_heading_level(cmark_node *node) {
417
- if (node == NULL) {
418
- return 0;
419
- }
420
-
421
- switch (node->type) {
422
- case CMARK_NODE_HEADING:
423
- return node->as.heading.level;
424
-
425
- default:
426
- break;
427
- }
428
-
429
- return 0;
430
- }
431
-
432
- int cmark_node_set_heading_level(cmark_node *node, int level) {
433
- if (node == NULL || level < 1 || level > 6) {
434
- return 0;
435
- }
436
-
437
- switch (node->type) {
438
- case CMARK_NODE_HEADING:
439
- node->as.heading.level = level;
440
- return 1;
441
-
442
- default:
443
- break;
444
- }
445
-
446
- return 0;
447
- }
448
-
449
- cmark_list_type cmark_node_get_list_type(cmark_node *node) {
450
- if (node == NULL) {
451
- return CMARK_NO_LIST;
452
- }
453
-
454
- if (node->type == CMARK_NODE_LIST) {
455
- return node->as.list.list_type;
456
- } else {
457
- return CMARK_NO_LIST;
458
- }
459
- }
460
-
461
- int cmark_node_set_list_type(cmark_node *node, cmark_list_type type) {
462
- if (!(type == CMARK_BULLET_LIST || type == CMARK_ORDERED_LIST)) {
463
- return 0;
464
- }
465
-
466
- if (node == NULL) {
467
- return 0;
468
- }
469
-
470
- if (node->type == CMARK_NODE_LIST) {
471
- node->as.list.list_type = type;
472
- return 1;
473
- } else {
474
- return 0;
475
- }
476
- }
477
-
478
- cmark_delim_type cmark_node_get_list_delim(cmark_node *node) {
479
- if (node == NULL) {
480
- return CMARK_NO_DELIM;
481
- }
482
-
483
- if (node->type == CMARK_NODE_LIST) {
484
- return node->as.list.delimiter;
485
- } else {
486
- return CMARK_NO_DELIM;
487
- }
488
- }
489
-
490
- int cmark_node_set_list_delim(cmark_node *node, cmark_delim_type delim) {
491
- if (!(delim == CMARK_PERIOD_DELIM || delim == CMARK_PAREN_DELIM)) {
492
- return 0;
493
- }
494
-
495
- if (node == NULL) {
496
- return 0;
497
- }
498
-
499
- if (node->type == CMARK_NODE_LIST) {
500
- node->as.list.delimiter = delim;
501
- return 1;
502
- } else {
503
- return 0;
504
- }
505
- }
506
-
507
- int cmark_node_get_list_start(cmark_node *node) {
508
- if (node == NULL) {
509
- return 0;
510
- }
511
-
512
- if (node->type == CMARK_NODE_LIST) {
513
- return node->as.list.start;
514
- } else {
515
- return 0;
516
- }
517
- }
518
-
519
- int cmark_node_set_list_start(cmark_node *node, int start) {
520
- if (node == NULL || start < 0) {
521
- return 0;
522
- }
523
-
524
- if (node->type == CMARK_NODE_LIST) {
525
- node->as.list.start = start;
526
- return 1;
527
- } else {
528
- return 0;
529
- }
530
- }
531
-
532
- int cmark_node_get_list_tight(cmark_node *node) {
533
- if (node == NULL) {
534
- return 0;
535
- }
536
-
537
- if (node->type == CMARK_NODE_LIST) {
538
- return node->as.list.tight;
539
- } else {
540
- return 0;
541
- }
542
- }
543
-
544
- int cmark_node_set_list_tight(cmark_node *node, int tight) {
545
- if (node == NULL) {
546
- return 0;
547
- }
548
-
549
- if (node->type == CMARK_NODE_LIST) {
550
- node->as.list.tight = tight == 1;
551
- return 1;
552
- } else {
553
- return 0;
554
- }
555
- }
556
-
557
- const char *cmark_node_get_fence_info(cmark_node *node) {
558
- if (node == NULL) {
559
- return NULL;
560
- }
561
-
562
- if (node->type == CMARK_NODE_CODE_BLOCK) {
563
- return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.code.info);
564
- } else {
565
- return NULL;
566
- }
567
- }
568
-
569
- int cmark_node_set_fence_info(cmark_node *node, const char *info) {
570
- if (node == NULL) {
571
- return 0;
572
- }
573
-
574
- if (node->type == CMARK_NODE_CODE_BLOCK) {
575
- cmark_chunk_set_cstr(NODE_MEM(node), &node->as.code.info, info);
576
- return 1;
577
- } else {
578
- return 0;
579
- }
580
- }
581
-
582
- int cmark_node_get_fenced(cmark_node *node, int *length, int *offset, char *character) {
583
- if (node == NULL) {
584
- return 0;
585
- }
586
-
587
- if (node->type == CMARK_NODE_CODE_BLOCK) {
588
- *length = node->as.code.fence_length;
589
- *offset = node->as.code.fence_offset;
590
- *character = node->as.code.fence_char;
591
- return node->as.code.fenced;
592
- } else {
593
- return 0;
594
- }
595
- }
596
-
597
- int cmark_node_set_fenced(cmark_node * node, int fenced,
598
- int length, int offset, char character) {
599
- if (node == NULL) {
600
- return 0;
601
- }
602
-
603
- if (node->type == CMARK_NODE_CODE_BLOCK) {
604
- node->as.code.fenced = (int8_t)fenced;
605
- node->as.code.fence_length = (uint8_t)length;
606
- node->as.code.fence_offset = (uint8_t)offset;
607
- node->as.code.fence_char = character;
608
- return 1;
609
- } else {
610
- return 0;
611
- }
612
- }
613
-
614
- const char *cmark_node_get_url(cmark_node *node) {
615
- if (node == NULL) {
616
- return NULL;
617
- }
618
-
619
- switch (node->type) {
620
- case CMARK_NODE_LINK:
621
- case CMARK_NODE_IMAGE:
622
- return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.link.url);
623
- default:
624
- break;
625
- }
626
-
627
- return NULL;
628
- }
629
-
630
- int cmark_node_set_url(cmark_node *node, const char *url) {
631
- if (node == NULL) {
632
- return 0;
633
- }
634
-
635
- switch (node->type) {
636
- case CMARK_NODE_LINK:
637
- case CMARK_NODE_IMAGE:
638
- cmark_chunk_set_cstr(NODE_MEM(node), &node->as.link.url, url);
639
- return 1;
640
- default:
641
- break;
642
- }
643
-
644
- return 0;
645
- }
646
-
647
- const char *cmark_node_get_title(cmark_node *node) {
648
- if (node == NULL) {
649
- return NULL;
650
- }
651
-
652
- switch (node->type) {
653
- case CMARK_NODE_LINK:
654
- case CMARK_NODE_IMAGE:
655
- return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.link.title);
656
- default:
657
- break;
658
- }
659
-
660
- return NULL;
661
- }
662
-
663
- int cmark_node_set_title(cmark_node *node, const char *title) {
664
- if (node == NULL) {
665
- return 0;
666
- }
667
-
668
- switch (node->type) {
669
- case CMARK_NODE_LINK:
670
- case CMARK_NODE_IMAGE:
671
- cmark_chunk_set_cstr(NODE_MEM(node), &node->as.link.title, title);
672
- return 1;
673
- default:
674
- break;
675
- }
676
-
677
- return 0;
678
- }
679
-
680
- const char *cmark_node_get_on_enter(cmark_node *node) {
681
- if (node == NULL) {
682
- return NULL;
683
- }
684
-
685
- switch (node->type) {
686
- case CMARK_NODE_CUSTOM_INLINE:
687
- case CMARK_NODE_CUSTOM_BLOCK:
688
- return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.custom.on_enter);
689
- default:
690
- break;
691
- }
692
-
693
- return NULL;
694
- }
695
-
696
- int cmark_node_set_on_enter(cmark_node *node, const char *on_enter) {
697
- if (node == NULL) {
698
- return 0;
699
- }
700
-
701
- switch (node->type) {
702
- case CMARK_NODE_CUSTOM_INLINE:
703
- case CMARK_NODE_CUSTOM_BLOCK:
704
- cmark_chunk_set_cstr(NODE_MEM(node), &node->as.custom.on_enter, on_enter);
705
- return 1;
706
- default:
707
- break;
708
- }
709
-
710
- return 0;
711
- }
712
-
713
- const char *cmark_node_get_on_exit(cmark_node *node) {
714
- if (node == NULL) {
715
- return NULL;
716
- }
717
-
718
- switch (node->type) {
719
- case CMARK_NODE_CUSTOM_INLINE:
720
- case CMARK_NODE_CUSTOM_BLOCK:
721
- return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.custom.on_exit);
722
- default:
723
- break;
724
- }
725
-
726
- return NULL;
727
- }
728
-
729
- int cmark_node_set_on_exit(cmark_node *node, const char *on_exit) {
730
- if (node == NULL) {
731
- return 0;
732
- }
733
-
734
- switch (node->type) {
735
- case CMARK_NODE_CUSTOM_INLINE:
736
- case CMARK_NODE_CUSTOM_BLOCK:
737
- cmark_chunk_set_cstr(NODE_MEM(node), &node->as.custom.on_exit, on_exit);
738
- return 1;
739
- default:
740
- break;
741
- }
742
-
743
- return 0;
744
- }
745
-
746
- cmark_syntax_extension *cmark_node_get_syntax_extension(cmark_node *node) {
747
- if (node == NULL) {
748
- return NULL;
749
- }
750
-
751
- return node->extension;
752
- }
753
-
754
- int cmark_node_set_syntax_extension(cmark_node *node, cmark_syntax_extension *extension) {
755
- if (node == NULL) {
756
- return 0;
757
- }
758
-
759
- node->extension = extension;
760
- return 1;
761
- }
762
-
763
- int cmark_node_get_start_line(cmark_node *node) {
764
- if (node == NULL) {
765
- return 0;
766
- }
767
- return node->start_line;
768
- }
769
-
770
- int cmark_node_get_start_column(cmark_node *node) {
771
- if (node == NULL) {
772
- return 0;
773
- }
774
- return node->start_column;
775
- }
776
-
777
- int cmark_node_get_end_line(cmark_node *node) {
778
- if (node == NULL) {
779
- return 0;
780
- }
781
- return node->end_line;
782
- }
783
-
784
- int cmark_node_get_end_column(cmark_node *node) {
785
- if (node == NULL) {
786
- return 0;
787
- }
788
- return node->end_column;
789
- }
790
-
791
- // Unlink a node without adjusting its next, prev, and parent pointers.
792
- static void S_node_unlink(cmark_node *node) {
793
- if (node == NULL) {
794
- return;
795
- }
796
-
797
- if (node->prev) {
798
- node->prev->next = node->next;
799
- }
800
- if (node->next) {
801
- node->next->prev = node->prev;
802
- }
803
-
804
- // Adjust first_child and last_child of parent.
805
- cmark_node *parent = node->parent;
806
- if (parent) {
807
- if (parent->first_child == node) {
808
- parent->first_child = node->next;
809
- }
810
- if (parent->last_child == node) {
811
- parent->last_child = node->prev;
812
- }
813
- }
814
- }
815
-
816
- void cmark_node_unlink(cmark_node *node) {
817
- S_node_unlink(node);
818
-
819
- node->next = NULL;
820
- node->prev = NULL;
821
- node->parent = NULL;
822
- }
823
-
824
- int cmark_node_insert_before(cmark_node *node, cmark_node *sibling) {
825
- if (node == NULL || sibling == NULL) {
826
- return 0;
827
- }
828
-
829
- if (!node->parent || !S_can_contain(node->parent, sibling)) {
830
- return 0;
831
- }
832
-
833
- S_node_unlink(sibling);
834
-
835
- cmark_node *old_prev = node->prev;
836
-
837
- // Insert 'sibling' between 'old_prev' and 'node'.
838
- if (old_prev) {
839
- old_prev->next = sibling;
840
- }
841
- sibling->prev = old_prev;
842
- sibling->next = node;
843
- node->prev = sibling;
844
-
845
- // Set new parent.
846
- cmark_node *parent = node->parent;
847
- sibling->parent = parent;
848
-
849
- // Adjust first_child of parent if inserted as first child.
850
- if (parent && !old_prev) {
851
- parent->first_child = sibling;
852
- }
853
-
854
- return 1;
855
- }
856
-
857
- int cmark_node_insert_after(cmark_node *node, cmark_node *sibling) {
858
- if (node == NULL || sibling == NULL) {
859
- return 0;
860
- }
861
-
862
- if (!node->parent || !S_can_contain(node->parent, sibling)) {
863
- return 0;
864
- }
865
-
866
- S_node_unlink(sibling);
867
-
868
- cmark_node *old_next = node->next;
869
-
870
- // Insert 'sibling' between 'node' and 'old_next'.
871
- if (old_next) {
872
- old_next->prev = sibling;
873
- }
874
- sibling->next = old_next;
875
- sibling->prev = node;
876
- node->next = sibling;
877
-
878
- // Set new parent.
879
- cmark_node *parent = node->parent;
880
- sibling->parent = parent;
881
-
882
- // Adjust last_child of parent if inserted as last child.
883
- if (parent && !old_next) {
884
- parent->last_child = sibling;
885
- }
886
-
887
- return 1;
888
- }
889
-
890
- int cmark_node_replace(cmark_node *oldnode, cmark_node *newnode) {
891
- if (!cmark_node_insert_before(oldnode, newnode)) {
892
- return 0;
893
- }
894
- cmark_node_unlink(oldnode);
895
- return 1;
896
- }
897
-
898
- int cmark_node_prepend_child(cmark_node *node, cmark_node *child) {
899
- if (!S_can_contain(node, child)) {
900
- return 0;
901
- }
902
-
903
- S_node_unlink(child);
904
-
905
- cmark_node *old_first_child = node->first_child;
906
-
907
- child->next = old_first_child;
908
- child->prev = NULL;
909
- child->parent = node;
910
- node->first_child = child;
911
-
912
- if (old_first_child) {
913
- old_first_child->prev = child;
914
- } else {
915
- // Also set last_child if node previously had no children.
916
- node->last_child = child;
917
- }
918
-
919
- return 1;
920
- }
921
-
922
- int cmark_node_append_child(cmark_node *node, cmark_node *child) {
923
- if (!S_can_contain(node, child)) {
924
- return 0;
925
- }
926
-
927
- S_node_unlink(child);
928
-
929
- cmark_node *old_last_child = node->last_child;
930
-
931
- child->next = NULL;
932
- child->prev = old_last_child;
933
- child->parent = node;
934
- node->last_child = child;
935
-
936
- if (old_last_child) {
937
- old_last_child->next = child;
938
- } else {
939
- // Also set first_child if node previously had no children.
940
- node->first_child = child;
941
- }
942
-
943
- return 1;
944
- }
945
-
946
- static void S_print_error(FILE *out, cmark_node *node, const char *elem) {
947
- if (out == NULL) {
948
- return;
949
- }
950
- fprintf(out, "Invalid '%s' in node type %s at %d:%d\n", elem,
951
- cmark_node_get_type_string(node), node->start_line,
952
- node->start_column);
953
- }
954
-
955
- int cmark_node_check(cmark_node *node, FILE *out) {
956
- cmark_node *cur;
957
- int errors = 0;
958
-
959
- if (!node) {
960
- return 0;
961
- }
962
-
963
- cur = node;
964
- for (;;) {
965
- if (cur->first_child) {
966
- if (cur->first_child->prev != NULL) {
967
- S_print_error(out, cur->first_child, "prev");
968
- cur->first_child->prev = NULL;
969
- ++errors;
970
- }
971
- if (cur->first_child->parent != cur) {
972
- S_print_error(out, cur->first_child, "parent");
973
- cur->first_child->parent = cur;
974
- ++errors;
975
- }
976
- cur = cur->first_child;
977
- continue;
978
- }
979
-
980
- next_sibling:
981
- if (cur == node) {
982
- break;
983
- }
984
- if (cur->next) {
985
- if (cur->next->prev != cur) {
986
- S_print_error(out, cur->next, "prev");
987
- cur->next->prev = cur;
988
- ++errors;
989
- }
990
- if (cur->next->parent != cur->parent) {
991
- S_print_error(out, cur->next, "parent");
992
- cur->next->parent = cur->parent;
993
- ++errors;
994
- }
995
- cur = cur->next;
996
- continue;
997
- }
998
-
999
- if (cur->parent->last_child != cur) {
1000
- S_print_error(out, cur->parent, "last_child");
1001
- cur->parent->last_child = cur;
1002
- ++errors;
1003
- }
1004
- cur = cur->parent;
1005
- goto next_sibling;
1006
- }
1007
-
1008
- return errors;
1009
- }