markly 0.16.0 → 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.
data/ext/markly/markly.c CHANGED
@@ -8,10 +8,9 @@
8
8
  #include "cmark-gfm-core-extensions.h"
9
9
  #include "front_matter.h"
10
10
 
11
- static VALUE rb_Markly;
12
- static VALUE rb_Markly_Error;
13
- static VALUE rb_Markly_Node;
14
- static VALUE rb_Markly_Parser;
11
+ static VALUE Markly_Error;
12
+ static VALUE Markly_Node;
13
+ static VALUE Markly_Node_Fence;
15
14
 
16
15
  static VALUE sym_document;
17
16
  static VALUE sym_custom_block;
@@ -44,8 +43,8 @@ static VALUE sym_left;
44
43
  static VALUE sym_right;
45
44
  static VALUE sym_center;
46
45
 
47
- static void rb_Markly_Node_free(void *data) {
48
- // If a parent of this node is already freed, `rb_Markly_Node_freed` will ensure all the nodes are nullified.
46
+ static void Markly_Node_Type_free(void *data) {
47
+ // If a parent of this node is already freed, `Markly_Node_freed` will ensure all the nodes are nullified.
49
48
  if (data) {
50
49
  cmark_node *node = (cmark_node*)data;
51
50
 
@@ -57,7 +56,7 @@ static void rb_Markly_Node_free(void *data) {
57
56
  }
58
57
  }
59
58
 
60
- static void rb_Markly_Node_mark(void *data) {
59
+ static void Markly_Node_Type_mark(void *data) {
61
60
  cmark_node *node = data;
62
61
 
63
62
  // Mark the parent to make sure that the tree won't be freed as long as a child node is referenced.
@@ -77,23 +76,23 @@ static void rb_Markly_Node_mark(void *data) {
77
76
  }
78
77
  }
79
78
 
80
- static const rb_data_type_t rb_Markly_Node_Type = {
79
+ static const rb_data_type_t Markly_Node_Type = {
81
80
  .wrap_struct_name = "Markly::Node",
82
81
  .function = {
83
- .dmark = rb_Markly_Node_mark,
84
- .dfree = rb_Markly_Node_free,
82
+ .dmark = Markly_Node_Type_mark,
83
+ .dfree = Markly_Node_Type_free,
85
84
  },
86
85
  .data = NULL,
87
86
  .flags = RUBY_TYPED_FREE_IMMEDIATELY,
88
87
  };
89
88
 
90
- static void rb_Markly_Node_freed(cmark_mem *mem, void *user_data) {
89
+ static void Markly_Node_freed(cmark_mem *mem, void *user_data) {
91
90
  VALUE self = (VALUE)user_data;
92
91
 
93
92
  RTYPEDDATA_DATA(self) = NULL;
94
93
  }
95
94
 
96
- static VALUE rb_Markly_Node_wrap(cmark_node *node) {
95
+ static VALUE Markly_Node_wrap(cmark_node *node) {
97
96
  if (node == NULL)
98
97
  return Qnil;
99
98
 
@@ -103,18 +102,18 @@ static VALUE rb_Markly_Node_wrap(cmark_node *node) {
103
102
  return (VALUE)user_data;
104
103
  }
105
104
 
106
- VALUE self = TypedData_Wrap_Struct(rb_Markly_Node, &rb_Markly_Node_Type, node);
105
+ VALUE self = TypedData_Wrap_Struct(Markly_Node, &Markly_Node_Type, node);
107
106
  cmark_node_set_user_data(node, (void *)self);
108
- cmark_node_set_user_data_free_func(node, rb_Markly_Node_freed);
107
+ cmark_node_set_user_data_free_func(node, Markly_Node_freed);
109
108
 
110
109
  return self;
111
110
  }
112
111
 
113
- static void rb_Markly_Parser_free(void *data) {
112
+ static void Markly_Parser_Type_free(void *data) {
114
113
  cmark_parser_free(data);
115
114
  }
116
115
 
117
- static void rb_Markly_Parser_mark(void *data) {
116
+ static void Markly_Parser_Type_mark(void *data) {
118
117
  cmark_parser *parser = data;
119
118
 
120
119
  // Mark the parent to make sure that the tree won't be freed as long as a child node is referenced.
@@ -126,21 +125,21 @@ static void rb_Markly_Parser_mark(void *data) {
126
125
  }
127
126
  }
128
127
 
129
- static const rb_data_type_t rb_Markly_Parser_Type = {
128
+ static const rb_data_type_t Markly_Parser_Type = {
130
129
  .wrap_struct_name = "Markly::Parser",
131
130
  .function = {
132
- .dmark = rb_Markly_Parser_mark,
133
- .dfree = rb_Markly_Parser_free,
131
+ .dmark = Markly_Parser_Type_mark,
132
+ .dfree = Markly_Parser_Type_free,
134
133
  },
135
134
  .data = NULL,
136
135
  .flags = RUBY_TYPED_FREE_IMMEDIATELY,
137
136
  };
138
137
 
139
- static VALUE rb_Markly_Parser_alloc(VALUE self) {
140
- return TypedData_Wrap_Struct(self, &rb_Markly_Parser_Type, NULL);
138
+ static VALUE Markly_Parser_allocate(VALUE self) {
139
+ return TypedData_Wrap_Struct(self, &Markly_Parser_Type, NULL);
141
140
  }
142
141
 
143
- static VALUE rb_Markly_Parser_initialize(VALUE self, VALUE flags) {
142
+ static VALUE Markly_Parser_initialize(VALUE self, VALUE flags) {
144
143
  Check_Type(flags, T_FIXNUM);
145
144
 
146
145
  cmark_mem *mem = cmark_get_default_mem_allocator();
@@ -151,14 +150,14 @@ static VALUE rb_Markly_Parser_initialize(VALUE self, VALUE flags) {
151
150
  return self;
152
151
  }
153
152
 
154
- static VALUE rb_Markly_Parser_enable(VALUE self, VALUE extension) {
153
+ static VALUE Markly_Parser_enable(VALUE self, VALUE extension) {
155
154
  cmark_parser *parser = NULL;
156
155
 
157
156
  Check_Type(extension, T_SYMBOL);
158
157
 
159
158
  VALUE extension_name = rb_sym2str(extension);
160
159
 
161
- TypedData_Get_Struct(self, cmark_parser, &rb_Markly_Parser_Type, parser);
160
+ TypedData_Get_Struct(self, cmark_parser, &Markly_Parser_Type, parser);
162
161
 
163
162
  cmark_syntax_extension *syntax_extension =
164
163
  cmark_find_syntax_extension(StringValueCStr(extension_name));
@@ -172,18 +171,18 @@ static VALUE rb_Markly_Parser_enable(VALUE self, VALUE extension) {
172
171
  return Qnil;
173
172
  }
174
173
 
175
- static VALUE rb_Markly_Parser_parse(VALUE self, VALUE text) {
174
+ static VALUE Markly_Parser_parse(VALUE self, VALUE text) {
176
175
  cmark_parser *parser = NULL;
177
176
 
178
177
  StringValue(text);
179
178
 
180
- TypedData_Get_Struct(self, cmark_parser, &rb_Markly_Parser_Type, parser);
179
+ TypedData_Get_Struct(self, cmark_parser, &Markly_Parser_Type, parser);
181
180
 
182
181
  cmark_parser_feed(parser, RSTRING_PTR(text), RSTRING_LEN(text));
183
182
 
184
183
  cmark_node *root = cmark_parser_finish(parser);
185
184
 
186
- return rb_Markly_Node_wrap(root);
185
+ return Markly_Node_wrap(root);
187
186
  }
188
187
 
189
188
  /*
@@ -211,7 +210,7 @@ static VALUE rb_Markly_Parser_parse(VALUE self, VALUE text) {
211
210
  * - `:link`
212
211
  * - `:image`
213
212
  */
214
- static VALUE rb_node_new(VALUE self, VALUE type) {
213
+ static VALUE Markly_Node_new(VALUE self, VALUE type) {
215
214
  cmark_node_type node_type = 0;
216
215
  cmark_node *node;
217
216
 
@@ -262,26 +261,41 @@ static VALUE rb_node_new(VALUE self, VALUE type) {
262
261
  else if (type == sym_footnote_definition)
263
262
  node_type = CMARK_NODE_FOOTNOTE_DEFINITION;
264
263
  else
265
- rb_raise(rb_Markly_Error, "invalid node of type %d", node_type);
264
+ rb_raise(Markly_Error, "invalid node of type %d", node_type);
266
265
 
267
266
  node = cmark_node_new(node_type);
268
267
  if (node == NULL) {
269
- rb_raise(rb_Markly_Error, "could not create node of type %d", node_type);
268
+ rb_raise(Markly_Error, "could not create node of type %d", node_type);
270
269
  }
271
270
 
272
- return rb_Markly_Node_wrap(node);
271
+ return Markly_Node_wrap(node);
273
272
  }
274
273
 
275
- static VALUE rb_node_replace(VALUE self, VALUE other) {
274
+ /*
275
+ * Duplicate the current node and all its children.
276
+ */
277
+ static VALUE Markly_Node_duplicate(VALUE self) {
278
+ cmark_node *node;
279
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
280
+
281
+ cmark_node *copy = cmark_node_clone(node);
282
+ if (copy == NULL) {
283
+ rb_raise(Markly_Error, "could not duplicate node");
284
+ }
285
+
286
+ return Markly_Node_wrap(copy);
287
+ }
288
+
289
+ static VALUE Markly_Node_replace(VALUE self, VALUE other) {
276
290
  cmark_node *current_node = NULL, *replacement_node = NULL;
277
291
 
278
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, current_node);
279
- TypedData_Get_Struct(other, cmark_node, &rb_Markly_Node_Type, replacement_node);
292
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, current_node);
293
+ TypedData_Get_Struct(other, cmark_node, &Markly_Node_Type, replacement_node);
280
294
 
281
295
  int result = cmark_node_replace(current_node, replacement_node);
282
296
 
283
297
  if (result == 0) {
284
- rb_raise(rb_Markly_Error, "could not replace node");
298
+ rb_raise(Markly_Error, "could not replace node");
285
299
  }
286
300
 
287
301
  return other;
@@ -299,10 +313,10 @@ static VALUE encode_utf8_string(const char *c_string) {
299
313
  *
300
314
  * Returns a {String} or {nil} if there is no string content.
301
315
  */
302
- static VALUE rb_node_get_string_content(VALUE self) {
316
+ static VALUE Markly_Node_get_string_content(VALUE self) {
303
317
  const char *text;
304
318
  cmark_node *node;
305
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
319
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
306
320
 
307
321
  text = cmark_node_get_literal(node);
308
322
 
@@ -320,16 +334,16 @@ static VALUE rb_node_get_string_content(VALUE self) {
320
334
  *
321
335
  * Raises Error if the string content can't be set.
322
336
  */
323
- static VALUE rb_node_set_string_content(VALUE self, VALUE s) {
337
+ static VALUE Markly_Node_set_string_content(VALUE self, VALUE s) {
324
338
  char *text;
325
339
  cmark_node *node;
326
340
  Check_Type(s, T_STRING);
327
341
 
328
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
342
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
329
343
  text = StringValueCStr(s);
330
344
 
331
345
  if (!cmark_node_set_literal(node, text)) {
332
- rb_raise(rb_Markly_Error, "could not set string content");
346
+ rb_raise(Markly_Error, "could not set string content");
333
347
  }
334
348
 
335
349
  return Qnil;
@@ -340,13 +354,13 @@ static VALUE rb_node_set_string_content(VALUE self, VALUE s) {
340
354
  *
341
355
  * Returns a {Symbol} representing the node's type.
342
356
  */
343
- static VALUE rb_node_get_type(VALUE self) {
357
+ static VALUE Markly_Node_get_type(VALUE self) {
344
358
  int node_type = 0;
345
359
  cmark_node *node = NULL;
346
360
  VALUE symbol = Qnil;
347
361
  const char *s = NULL;
348
362
 
349
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
363
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
350
364
 
351
365
  node_type = cmark_node_get_type(node);
352
366
  symbol = Qnil;
@@ -426,7 +440,7 @@ static VALUE rb_node_get_type(VALUE self) {
426
440
  s = node->extension->get_type_string_func(node->extension, node);
427
441
  return ID2SYM(rb_intern(s));
428
442
  }
429
- rb_raise(rb_Markly_Error, "invalid node type %d", node_type);
443
+ rb_raise(Markly_Error, "invalid node type %d", node_type);
430
444
  }
431
445
 
432
446
  return symbol;
@@ -437,12 +451,12 @@ static VALUE rb_node_get_type(VALUE self) {
437
451
  *
438
452
  * Returns a {Hash} containing {Symbol} keys of the positions.
439
453
  */
440
- static VALUE rb_node_get_source_position(VALUE self) {
454
+ static VALUE Markly_Node_get_source_position(VALUE self) {
441
455
  int start_line, start_column, end_line, end_column;
442
456
  VALUE result;
443
457
 
444
458
  cmark_node *node;
445
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
459
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
446
460
 
447
461
  start_line = cmark_node_get_start_line(node);
448
462
  start_column = cmark_node_get_start_column(node);
@@ -463,9 +477,9 @@ static VALUE rb_node_get_source_position(VALUE self) {
463
477
  *
464
478
  * Returns a {String}.
465
479
  */
466
- static VALUE rb_node_get_type_string(VALUE self) {
480
+ static VALUE Markly_Node_get_type_string(VALUE self) {
467
481
  cmark_node *node;
468
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
482
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
469
483
 
470
484
  return rb_str_new2(cmark_node_get_type_string(node));
471
485
  }
@@ -474,9 +488,9 @@ static VALUE rb_node_get_type_string(VALUE self) {
474
488
  * Internal: Unlinks the node from the tree (fixing pointers in
475
489
  * parents and siblings appropriately).
476
490
  */
477
- static VALUE rb_node_unlink(VALUE self) {
491
+ static VALUE Markly_Node_unlink(VALUE self) {
478
492
  cmark_node *node;
479
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
493
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
480
494
 
481
495
  cmark_node_unlink(node);
482
496
 
@@ -487,26 +501,26 @@ static VALUE rb_node_unlink(VALUE self) {
487
501
  *
488
502
  * Returns a {Node} if a child exists, `nil` otherise.
489
503
  */
490
- static VALUE rb_node_first_child(VALUE self) {
504
+ static VALUE Markly_Node_first_child(VALUE self) {
491
505
  cmark_node *node, *child;
492
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
506
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
493
507
 
494
508
  child = cmark_node_first_child(node);
495
509
 
496
- return rb_Markly_Node_wrap(child);
510
+ return Markly_Node_wrap(child);
497
511
  }
498
512
 
499
513
  /* Public: Fetches the next sibling of the node.
500
514
  *
501
515
  * Returns a {Node} if a sibling exists, `nil` otherwise.
502
516
  */
503
- static VALUE rb_node_next(VALUE self) {
517
+ static VALUE Markly_Node_next(VALUE self) {
504
518
  cmark_node *node, *next;
505
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
519
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
506
520
 
507
521
  next = cmark_node_next(node);
508
522
 
509
- return rb_Markly_Node_wrap(next);
523
+ return Markly_Node_wrap(next);
510
524
  }
511
525
 
512
526
  /*
@@ -517,13 +531,13 @@ static VALUE rb_node_next(VALUE self) {
517
531
  * Returns `true` if successful.
518
532
  * Raises Error if the node can't be inserted.
519
533
  */
520
- static VALUE rb_node_insert_before(VALUE self, VALUE sibling) {
534
+ static VALUE Markly_Node_insert_before(VALUE self, VALUE sibling) {
521
535
  cmark_node *node1, *node2;
522
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node1);
523
- TypedData_Get_Struct(sibling, cmark_node, &rb_Markly_Node_Type, node2);
536
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node1);
537
+ TypedData_Get_Struct(sibling, cmark_node, &Markly_Node_Type, node2);
524
538
 
525
539
  if (!cmark_node_insert_before(node1, node2)) {
526
- rb_raise(rb_Markly_Error, "could not insert before");
540
+ rb_raise(Markly_Error, "could not insert before");
527
541
  }
528
542
 
529
543
  return Qtrue;
@@ -533,7 +547,7 @@ static VALUE rb_node_insert_before(VALUE self, VALUE sibling) {
533
547
  *
534
548
  * Returns a {String}.
535
549
  */
536
- static VALUE rb_render_html(VALUE self, VALUE rb_options, VALUE rb_extensions) {
550
+ static VALUE Markly_Node_render_html(VALUE self, VALUE rb_options, VALUE rb_extensions) {
537
551
  VALUE rb_ext_name;
538
552
  int i;
539
553
  cmark_node *node;
@@ -545,7 +559,7 @@ static VALUE rb_render_html(VALUE self, VALUE rb_options, VALUE rb_extensions) {
545
559
  int options = FIX2INT(rb_options);
546
560
  long extensions_len = RARRAY_LEN(rb_extensions);
547
561
 
548
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
562
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
549
563
 
550
564
  for (i = 0; i < extensions_len; ++i) {
551
565
  rb_ext_name = RARRAY_PTR(rb_extensions)[i];
@@ -579,7 +593,7 @@ static VALUE rb_render_html(VALUE self, VALUE rb_options, VALUE rb_extensions) {
579
593
  *
580
594
  * Returns a {String}.
581
595
  */
582
- static VALUE rb_render_commonmark(int argc, VALUE *argv, VALUE self) {
596
+ static VALUE Markly_Node_render_commonmark(int argc, VALUE *argv, VALUE self) {
583
597
  VALUE rb_options, rb_width;
584
598
  rb_scan_args(argc, argv, "11", &rb_options, &rb_width);
585
599
 
@@ -594,7 +608,7 @@ static VALUE rb_render_commonmark(int argc, VALUE *argv, VALUE self) {
594
608
  Check_Type(rb_options, T_FIXNUM);
595
609
 
596
610
  options = FIX2INT(rb_options);
597
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
611
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
598
612
 
599
613
  char *cmark = cmark_render_commonmark(node, options, width);
600
614
  VALUE ruby_cmark = rb_str_new2(cmark);
@@ -607,7 +621,7 @@ static VALUE rb_render_commonmark(int argc, VALUE *argv, VALUE self) {
607
621
  *
608
622
  * Returns a {String}.
609
623
  */
610
- static VALUE rb_render_plaintext(int argc, VALUE *argv, VALUE self) {
624
+ static VALUE Markly_Node_render_plaintext(int argc, VALUE *argv, VALUE self) {
611
625
  VALUE rb_options, rb_width;
612
626
  rb_scan_args(argc, argv, "11", &rb_options, &rb_width);
613
627
 
@@ -622,7 +636,7 @@ static VALUE rb_render_plaintext(int argc, VALUE *argv, VALUE self) {
622
636
  Check_Type(rb_options, T_FIXNUM);
623
637
 
624
638
  options = FIX2INT(rb_options);
625
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
639
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
626
640
 
627
641
  char *text = cmark_render_plaintext(node, options, width);
628
642
  VALUE ruby_text = rb_str_new2(text);
@@ -639,13 +653,13 @@ static VALUE rb_render_plaintext(int argc, VALUE *argv, VALUE self) {
639
653
  * Returns `true` if successful.
640
654
  * Raises Error if the node can't be inserted.
641
655
  */
642
- static VALUE rb_node_insert_after(VALUE self, VALUE sibling) {
656
+ static VALUE Markly_Node_insert_after(VALUE self, VALUE sibling) {
643
657
  cmark_node *node1, *node2;
644
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node1);
645
- TypedData_Get_Struct(sibling, cmark_node, &rb_Markly_Node_Type, node2);
658
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node1);
659
+ TypedData_Get_Struct(sibling, cmark_node, &Markly_Node_Type, node2);
646
660
 
647
661
  if (!cmark_node_insert_after(node1, node2)) {
648
- rb_raise(rb_Markly_Error, "could not insert after");
662
+ rb_raise(Markly_Error, "could not insert after");
649
663
  }
650
664
 
651
665
  return Qtrue;
@@ -659,13 +673,13 @@ static VALUE rb_node_insert_after(VALUE self, VALUE sibling) {
659
673
  * Returns `true` if successful.
660
674
  * Raises Error if the node can't be inserted.
661
675
  */
662
- static VALUE rb_node_prepend_child(VALUE self, VALUE child) {
676
+ static VALUE Markly_Node_prepend_child(VALUE self, VALUE child) {
663
677
  cmark_node *node1, *node2;
664
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node1);
665
- TypedData_Get_Struct(child, cmark_node, &rb_Markly_Node_Type, node2);
678
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node1);
679
+ TypedData_Get_Struct(child, cmark_node, &Markly_Node_Type, node2);
666
680
 
667
681
  if (!cmark_node_prepend_child(node1, node2)) {
668
- rb_raise(rb_Markly_Error, "could not prepend child");
682
+ rb_raise(Markly_Error, "could not prepend child");
669
683
  }
670
684
 
671
685
  return Qtrue;
@@ -679,13 +693,13 @@ static VALUE rb_node_prepend_child(VALUE self, VALUE child) {
679
693
  * Returns `true` if successful.
680
694
  * Raises Error if the node can't be inserted.
681
695
  */
682
- static VALUE rb_node_append_child(VALUE self, VALUE child) {
696
+ static VALUE Markly_Node_append_child(VALUE self, VALUE child) {
683
697
  cmark_node *node1, *node2;
684
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node1);
685
- TypedData_Get_Struct(child, cmark_node, &rb_Markly_Node_Type, node2);
698
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node1);
699
+ TypedData_Get_Struct(child, cmark_node, &Markly_Node_Type, node2);
686
700
 
687
701
  if (!cmark_node_append_child(node1, node2)) {
688
- rb_raise(rb_Markly_Error, "could not append child");
702
+ rb_raise(Markly_Error, "could not append child");
689
703
  }
690
704
 
691
705
  return Qtrue;
@@ -695,39 +709,39 @@ static VALUE rb_node_append_child(VALUE self, VALUE child) {
695
709
  *
696
710
  * Returns a {Node} if a child exists, `nil` otherise.
697
711
  */
698
- static VALUE rb_node_last_child(VALUE self) {
712
+ static VALUE Markly_Node_last_child(VALUE self) {
699
713
  cmark_node *node, *child;
700
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
714
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
701
715
 
702
716
  child = cmark_node_last_child(node);
703
717
 
704
- return rb_Markly_Node_wrap(child);
718
+ return Markly_Node_wrap(child);
705
719
  }
706
720
 
707
721
  /* Public: Fetches the parent of the current node.
708
722
  *
709
723
  * Returns a {Node} if a parent exists, `nil` otherise.
710
724
  */
711
- static VALUE rb_node_parent(VALUE self) {
725
+ static VALUE Markly_Node_parent(VALUE self) {
712
726
  cmark_node *node, *parent;
713
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
727
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
714
728
 
715
729
  parent = cmark_node_parent(node);
716
730
 
717
- return rb_Markly_Node_wrap(parent);
731
+ return Markly_Node_wrap(parent);
718
732
  }
719
733
 
720
734
  /* Public: Fetches the previous sibling of the current node.
721
735
  *
722
736
  * Returns a {Node} if a parent exists, `nil` otherise.
723
737
  */
724
- static VALUE rb_node_previous(VALUE self) {
738
+ static VALUE Markly_Node_previous(VALUE self) {
725
739
  cmark_node *node, *previous;
726
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
740
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
727
741
 
728
742
  previous = cmark_node_previous(node);
729
743
 
730
- return rb_Markly_Node_wrap(previous);
744
+ return Markly_Node_wrap(previous);
731
745
  }
732
746
 
733
747
  /*
@@ -736,14 +750,14 @@ static VALUE rb_node_previous(VALUE self) {
736
750
  * Returns a {String}.
737
751
  * Raises a Error if the URL can't be retrieved.
738
752
  */
739
- static VALUE rb_node_get_url(VALUE self) {
753
+ static VALUE Markly_Node_get_url(VALUE self) {
740
754
  const char *text;
741
755
  cmark_node *node;
742
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
756
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
743
757
 
744
758
  text = cmark_node_get_url(node);
745
759
  if (text == NULL) {
746
- rb_raise(rb_Markly_Error, "could not get url");
760
+ rb_raise(Markly_Error, "could not get url");
747
761
  }
748
762
 
749
763
  return rb_str_new2(text);
@@ -756,16 +770,16 @@ static VALUE rb_node_get_url(VALUE self) {
756
770
  *
757
771
  * Raises a Error if the URL can't be set.
758
772
  */
759
- static VALUE rb_node_set_url(VALUE self, VALUE url) {
773
+ static VALUE Markly_Node_set_url(VALUE self, VALUE url) {
760
774
  cmark_node *node;
761
775
  char *text;
762
776
  Check_Type(url, T_STRING);
763
777
 
764
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
778
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
765
779
  text = StringValueCStr(url);
766
780
 
767
781
  if (!cmark_node_set_url(node, text)) {
768
- rb_raise(rb_Markly_Error, "could not set url");
782
+ rb_raise(Markly_Error, "could not set url");
769
783
  }
770
784
 
771
785
  return Qnil;
@@ -777,14 +791,14 @@ static VALUE rb_node_set_url(VALUE self, VALUE url) {
777
791
  * Returns a {String}.
778
792
  * Raises a Error if the title can't be retrieved.
779
793
  */
780
- static VALUE rb_node_get_title(VALUE self) {
794
+ static VALUE Markly_Node_get_title(VALUE self) {
781
795
  const char *text;
782
796
  cmark_node *node;
783
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
797
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
784
798
 
785
799
  text = cmark_node_get_title(node);
786
800
  if (text == NULL) {
787
- rb_raise(rb_Markly_Error, "could not get title");
801
+ rb_raise(Markly_Error, "could not get title");
788
802
  }
789
803
 
790
804
  return rb_str_new2(text);
@@ -797,16 +811,16 @@ static VALUE rb_node_get_title(VALUE self) {
797
811
  *
798
812
  * Raises a Error if the title can't be set.
799
813
  */
800
- static VALUE rb_node_set_title(VALUE self, VALUE title) {
814
+ static VALUE Markly_Node_set_title(VALUE self, VALUE title) {
801
815
  char *text;
802
816
  cmark_node *node;
803
817
  Check_Type(title, T_STRING);
804
818
 
805
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
819
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
806
820
  text = StringValueCStr(title);
807
821
 
808
822
  if (!cmark_node_set_title(node, text)) {
809
- rb_raise(rb_Markly_Error, "could not set title");
823
+ rb_raise(Markly_Error, "could not set title");
810
824
  }
811
825
 
812
826
  return Qnil;
@@ -818,15 +832,15 @@ static VALUE rb_node_set_title(VALUE self, VALUE title) {
818
832
  * Returns a {Number} representing the header level.
819
833
  * Raises a Error if the header level can't be retrieved.
820
834
  */
821
- static VALUE rb_node_get_header_level(VALUE self) {
835
+ static VALUE Markly_Node_get_header_level(VALUE self) {
822
836
  int header_level;
823
837
  cmark_node *node;
824
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
838
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
825
839
 
826
840
  header_level = cmark_node_get_header_level(node);
827
841
 
828
842
  if (header_level == 0) {
829
- rb_raise(rb_Markly_Error, "could not get header_level");
843
+ rb_raise(Markly_Error, "could not get header_level");
830
844
  }
831
845
 
832
846
  return INT2NUM(header_level);
@@ -839,16 +853,16 @@ static VALUE rb_node_get_header_level(VALUE self) {
839
853
  *
840
854
  * Raises a Error if the header level can't be set.
841
855
  */
842
- static VALUE rb_node_set_header_level(VALUE self, VALUE level) {
856
+ static VALUE Markly_Node_set_header_level(VALUE self, VALUE level) {
843
857
  int l;
844
858
  cmark_node *node;
845
859
  Check_Type(level, T_FIXNUM);
846
860
 
847
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
861
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
848
862
  l = FIX2INT(level);
849
863
 
850
864
  if (!cmark_node_set_header_level(node, l)) {
851
- rb_raise(rb_Markly_Error, "could not set header_level");
865
+ rb_raise(Markly_Error, "could not set header_level");
852
866
  }
853
867
 
854
868
  return Qnil;
@@ -860,11 +874,11 @@ static VALUE rb_node_set_header_level(VALUE self, VALUE level) {
860
874
  * Returns a {Symbol}.
861
875
  * Raises a Error if the title can't be retrieved.
862
876
  */
863
- static VALUE rb_node_get_list_type(VALUE self) {
877
+ static VALUE Markly_Node_get_list_type(VALUE self) {
864
878
  int list_type;
865
879
  cmark_node *node;
866
880
  VALUE symbol;
867
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
881
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
868
882
 
869
883
  list_type = cmark_node_get_list_type(node);
870
884
 
@@ -873,7 +887,7 @@ static VALUE rb_node_get_list_type(VALUE self) {
873
887
  } else if (list_type == CMARK_ORDERED_LIST) {
874
888
  symbol = sym_ordered_list;
875
889
  } else {
876
- rb_raise(rb_Markly_Error, "could not get list_type");
890
+ rb_raise(Markly_Error, "could not get list_type");
877
891
  }
878
892
 
879
893
  return symbol;
@@ -886,23 +900,23 @@ static VALUE rb_node_get_list_type(VALUE self) {
886
900
  *
887
901
  * Raises a Error if the list type can't be set.
888
902
  */
889
- static VALUE rb_node_set_list_type(VALUE self, VALUE list_type) {
903
+ static VALUE Markly_Node_set_list_type(VALUE self, VALUE list_type) {
890
904
  int type = 0;
891
905
  cmark_node *node;
892
906
  Check_Type(list_type, T_SYMBOL);
893
907
 
894
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
908
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
895
909
 
896
910
  if (list_type == sym_bullet_list) {
897
911
  type = CMARK_BULLET_LIST;
898
912
  } else if (list_type == sym_ordered_list) {
899
913
  type = CMARK_ORDERED_LIST;
900
914
  } else {
901
- rb_raise(rb_Markly_Error, "invalid list_type");
915
+ rb_raise(Markly_Error, "invalid list_type");
902
916
  }
903
917
 
904
918
  if (!cmark_node_set_list_type(node, type)) {
905
- rb_raise(rb_Markly_Error, "could not set list_type");
919
+ rb_raise(Markly_Error, "could not set list_type");
906
920
  }
907
921
 
908
922
  return Qnil;
@@ -915,13 +929,13 @@ static VALUE rb_node_set_list_type(VALUE self, VALUE list_type) {
915
929
  * Returns a {Number} representing the starting number.
916
930
  * Raises a Error if the starting number can't be retrieved.
917
931
  */
918
- static VALUE rb_node_get_list_start(VALUE self) {
932
+ static VALUE Markly_Node_get_list_start(VALUE self) {
919
933
  cmark_node *node;
920
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
934
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
921
935
 
922
936
  if (cmark_node_get_type(node) != CMARK_NODE_LIST ||
923
937
  cmark_node_get_list_type(node) != CMARK_ORDERED_LIST) {
924
- rb_raise(rb_Markly_Error, "can't get list_start for non-ordered list %d",
938
+ rb_raise(Markly_Error, "can't get list_start for non-ordered list %d",
925
939
  cmark_node_get_list_type(node));
926
940
  }
927
941
 
@@ -936,16 +950,16 @@ static VALUE rb_node_get_list_start(VALUE self) {
936
950
  *
937
951
  * Raises a Error if the starting number can't be set.
938
952
  */
939
- static VALUE rb_node_set_list_start(VALUE self, VALUE start) {
953
+ static VALUE Markly_Node_set_list_start(VALUE self, VALUE start) {
940
954
  int s;
941
955
  cmark_node *node;
942
956
  Check_Type(start, T_FIXNUM);
943
957
 
944
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
958
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
945
959
  s = FIX2INT(start);
946
960
 
947
961
  if (!cmark_node_set_list_start(node, s)) {
948
- rb_raise(rb_Markly_Error, "could not set list_start");
962
+ rb_raise(Markly_Error, "could not set list_start");
949
963
  }
950
964
 
951
965
  return Qnil;
@@ -957,13 +971,13 @@ static VALUE rb_node_set_list_start(VALUE self, VALUE start) {
957
971
  * Returns a `true` if the list is tight, `false` otherwise.
958
972
  * Raises a Error if the starting number can't be retrieved.
959
973
  */
960
- static VALUE rb_node_get_list_tight(VALUE self) {
974
+ static VALUE Markly_Node_get_list_tight(VALUE self) {
961
975
  int flag;
962
976
  cmark_node *node;
963
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
977
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
964
978
 
965
979
  if (cmark_node_get_type(node) != CMARK_NODE_LIST) {
966
- rb_raise(rb_Markly_Error, "can't get list_tight for non-list");
980
+ rb_raise(Markly_Error, "can't get list_tight for non-list");
967
981
  }
968
982
 
969
983
  flag = cmark_node_get_list_tight(node);
@@ -978,14 +992,14 @@ static VALUE rb_node_get_list_tight(VALUE self) {
978
992
  *
979
993
  * Raises a Error if the tightness can't be set.
980
994
  */
981
- static VALUE rb_node_set_list_tight(VALUE self, VALUE tight) {
995
+ static VALUE Markly_Node_set_list_tight(VALUE self, VALUE tight) {
982
996
  int t;
983
997
  cmark_node *node;
984
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
998
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
985
999
  t = RTEST(tight);
986
1000
 
987
1001
  if (!cmark_node_set_list_tight(node, t)) {
988
- rb_raise(rb_Markly_Error, "could not set list_tight");
1002
+ rb_raise(Markly_Error, "could not set list_tight");
989
1003
  }
990
1004
 
991
1005
  return Qnil;
@@ -997,15 +1011,15 @@ static VALUE rb_node_set_list_tight(VALUE self, VALUE tight) {
997
1011
  * Returns a {String} representing the fence info.
998
1012
  * Raises a Error if the fence info can't be retrieved.
999
1013
  */
1000
- static VALUE rb_node_get_fence_info(VALUE self) {
1014
+ static VALUE Markly_Node_get_fence_info(VALUE self) {
1001
1015
  const char *fence_info;
1002
1016
  cmark_node *node;
1003
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
1017
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1004
1018
 
1005
1019
  fence_info = cmark_node_get_fence_info(node);
1006
1020
 
1007
1021
  if (fence_info == NULL) {
1008
- rb_raise(rb_Markly_Error, "could not get fence_info");
1022
+ rb_raise(Markly_Error, "could not get fence_info");
1009
1023
  }
1010
1024
 
1011
1025
  return rb_str_new2(fence_info);
@@ -1018,25 +1032,96 @@ static VALUE rb_node_get_fence_info(VALUE self) {
1018
1032
  *
1019
1033
  * Raises a Error if the fence info can't be set.
1020
1034
  */
1021
- static VALUE rb_node_set_fence_info(VALUE self, VALUE info) {
1035
+ static VALUE Markly_Node_set_fence_info(VALUE self, VALUE info) {
1022
1036
  char *text;
1023
1037
  cmark_node *node;
1024
1038
  Check_Type(info, T_STRING);
1025
1039
 
1026
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
1040
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1027
1041
  text = StringValueCStr(info);
1028
1042
 
1029
1043
  if (!cmark_node_set_fence_info(node, text)) {
1030
- rb_raise(rb_Markly_Error, "could not set fence_info");
1044
+ rb_raise(Markly_Error, "could not set fence_info");
1031
1045
  }
1032
1046
 
1033
1047
  return Qnil;
1034
1048
  }
1035
1049
 
1036
- static VALUE rb_node_get_tasklist_item_checked(VALUE self) {
1050
+ /*
1051
+ * Public: Gets the code info of the current node (must be a `:code_block`,
1052
+ * `:front_matter`, or inline `:code` node).
1053
+ *
1054
+ * Returns a {String} representing the code info.
1055
+ * Raises a Error if the code info can't be retrieved.
1056
+ */
1057
+ static VALUE Markly_Node_get_code_info(VALUE self) {
1058
+ const char *code_info;
1059
+ cmark_node *node;
1060
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1061
+
1062
+ code_info = cmark_node_get_code_info(node);
1063
+
1064
+ if (code_info == NULL) {
1065
+ rb_raise(Markly_Error, "could not get code_info");
1066
+ }
1067
+
1068
+ return rb_str_new2(code_info);
1069
+ }
1070
+
1071
+ /*
1072
+ * Public: Sets the code info of the current node (must be a `:code_block`,
1073
+ * `:front_matter`, or inline `:code` node).
1074
+ *
1075
+ * info - A {String} representing the new code info, or `nil` to clear it.
1076
+ *
1077
+ * Raises a Error if the code info can't be set.
1078
+ */
1079
+ static VALUE Markly_Node_set_code_info(VALUE self, VALUE info) {
1080
+ const char *text = NULL;
1081
+ cmark_node *node;
1082
+
1083
+ if (!NIL_P(info)) {
1084
+ Check_Type(info, T_STRING);
1085
+ text = StringValueCStr(info);
1086
+ }
1087
+
1088
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1089
+
1090
+ if (!cmark_node_set_code_info(node, text)) {
1091
+ rb_raise(Markly_Error, "could not set code_info");
1092
+ }
1093
+
1094
+ return Qnil;
1095
+ }
1096
+
1097
+ /*
1098
+ * Public: Gets fencing details for the current node.
1099
+ *
1100
+ * Returns a {Markly::Node::Fence} for fenced code blocks, `nil` otherwise.
1101
+ */
1102
+ static VALUE Markly_Node_get_fence(VALUE self) {
1103
+ int fence_length = 0;
1104
+ int fence_offset = 0;
1105
+ char fence_character = '\0';
1106
+ cmark_node *node;
1107
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1108
+
1109
+ if (!cmark_node_get_fenced(node, &fence_length, &fence_offset, &fence_character)) {
1110
+ return Qnil;
1111
+ }
1112
+
1113
+ return rb_struct_new(
1114
+ Markly_Node_Fence,
1115
+ rb_str_new(&fence_character, 1),
1116
+ INT2NUM(fence_length),
1117
+ INT2NUM(fence_offset)
1118
+ );
1119
+ }
1120
+
1121
+ static VALUE Markly_Node_tasklist_item_checked_p(VALUE self) {
1037
1122
  int tasklist_state;
1038
1123
  cmark_node *node;
1039
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
1124
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1040
1125
 
1041
1126
  tasklist_state = cmark_gfm_extensions_get_tasklist_item_checked(node);
1042
1127
 
@@ -1055,14 +1140,14 @@ static VALUE rb_node_get_tasklist_item_checked(VALUE self) {
1055
1140
  * Returns a {Boolean} representing the new checkbox state.
1056
1141
  * Raises a Error if the checkbox state can't be set.
1057
1142
  */
1058
- static VALUE rb_node_set_tasklist_item_checked(VALUE self, VALUE item_checked) {
1143
+ static VALUE Markly_Node_set_tasklist_item_checked(VALUE self, VALUE item_checked) {
1059
1144
  int tasklist_state;
1060
1145
  cmark_node *node;
1061
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
1146
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1062
1147
  tasklist_state = RTEST(item_checked);
1063
1148
 
1064
1149
  if (!cmark_gfm_extensions_set_tasklist_item_checked(node, tasklist_state)) {
1065
- rb_raise(rb_Markly_Error, "could not set tasklist_item_checked");
1150
+ rb_raise(Markly_Error, "could not set tasklist_item_checked");
1066
1151
  };
1067
1152
 
1068
1153
  if (tasklist_state) {
@@ -1072,28 +1157,28 @@ static VALUE rb_node_set_tasklist_item_checked(VALUE self, VALUE item_checked) {
1072
1157
  }
1073
1158
  }
1074
1159
 
1075
- static VALUE rb_node_get_parent_footnote_def(VALUE self) {
1160
+ static VALUE Markly_Node_get_parent_footnote_def(VALUE self) {
1076
1161
  cmark_node *node;
1077
1162
  cmark_node *parent;
1078
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
1163
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1079
1164
 
1080
1165
  parent = cmark_node_parent_footnote_def(node);
1081
1166
 
1082
- return rb_Markly_Node_wrap(parent);
1167
+ return Markly_Node_wrap(parent);
1083
1168
  }
1084
1169
 
1085
- static VALUE rb_node_get_table_alignments(VALUE self) {
1170
+ static VALUE Markly_Node_get_table_alignments(VALUE self) {
1086
1171
  uint16_t column_count, i;
1087
1172
  uint8_t *alignments;
1088
1173
  cmark_node *node;
1089
1174
  VALUE ary;
1090
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
1175
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1091
1176
 
1092
1177
  column_count = cmark_gfm_extensions_get_table_columns(node);
1093
1178
  alignments = cmark_gfm_extensions_get_table_alignments(node);
1094
1179
 
1095
1180
  if (!column_count || !alignments) {
1096
- rb_raise(rb_Markly_Error, "could not get column_count or alignments");
1181
+ rb_raise(Markly_Error, "could not get column_count or alignments");
1097
1182
  }
1098
1183
 
1099
1184
  ary = rb_ary_new();
@@ -1111,12 +1196,12 @@ static VALUE rb_node_get_table_alignments(VALUE self) {
1111
1196
  }
1112
1197
 
1113
1198
  /* Internal: Escapes href URLs safely. */
1114
- static VALUE rb_html_escape_href(VALUE self, VALUE rb_text) {
1199
+ static VALUE Markly_Node_html_escape_href(VALUE self, VALUE rb_text) {
1115
1200
  char *result;
1116
1201
  cmark_node *node;
1117
1202
  Check_Type(rb_text, T_STRING);
1118
1203
 
1119
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
1204
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1120
1205
 
1121
1206
  cmark_mem *mem = cmark_node_mem(node);
1122
1207
  cmark_strbuf buf = CMARK_BUF_INIT(mem);
@@ -1131,12 +1216,12 @@ static VALUE rb_html_escape_href(VALUE self, VALUE rb_text) {
1131
1216
  }
1132
1217
 
1133
1218
  /* Internal: Escapes HTML content safely. */
1134
- static VALUE rb_html_escape_html(VALUE self, VALUE rb_text) {
1219
+ static VALUE Markly_Node_html_escape_html(VALUE self, VALUE rb_text) {
1135
1220
  char *result;
1136
1221
  cmark_node *node;
1137
1222
  Check_Type(rb_text, T_STRING);
1138
1223
 
1139
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
1224
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1140
1225
 
1141
1226
  cmark_mem *mem = cmark_node_mem(node);
1142
1227
  cmark_strbuf buf = CMARK_BUF_INIT(mem);
@@ -1150,7 +1235,7 @@ static VALUE rb_html_escape_html(VALUE self, VALUE rb_text) {
1150
1235
  return rb_text;
1151
1236
  }
1152
1237
 
1153
- VALUE rb_Markly_extensions(VALUE self) {
1238
+ static VALUE Markly_extensions(VALUE self) {
1154
1239
  cmark_llist *exts, *it;
1155
1240
  cmark_syntax_extension *ext;
1156
1241
  VALUE ary = rb_ary_new();
@@ -1167,7 +1252,7 @@ VALUE rb_Markly_extensions(VALUE self) {
1167
1252
  return ary;
1168
1253
  }
1169
1254
 
1170
- __attribute__((visibility("default"))) void Init_markly(void) {
1255
+ static void Init_Markly_Node(VALUE Markly) {
1171
1256
  sym_document = ID2SYM(rb_intern("document"));
1172
1257
  sym_custom_block = ID2SYM(rb_intern("custom_block"));
1173
1258
  sym_custom_inline = ID2SYM(rb_intern("custom_inline"));
@@ -1199,63 +1284,75 @@ __attribute__((visibility("default"))) void Init_markly(void) {
1199
1284
  sym_right = ID2SYM(rb_intern("right"));
1200
1285
  sym_center = ID2SYM(rb_intern("center"));
1201
1286
 
1202
- rb_Markly = rb_define_module("Markly");
1203
- rb_define_singleton_method(rb_Markly, "extensions", rb_Markly_extensions, 0);
1204
-
1205
- rb_Markly_Error = rb_define_class_under(rb_Markly, "Error", rb_eStandardError);
1287
+ Markly_Node = rb_define_class_under(Markly, "Node", rb_cObject);
1288
+ rb_undef_alloc_func(Markly_Node);
1289
+ rb_define_singleton_method(Markly_Node, "new", Markly_Node_new, 1);
1290
+ Markly_Node_Fence = rb_struct_define_under(Markly_Node, "Fence", "character", "length", "indent", NULL);
1291
+ rb_define_method(Markly_Node, "_dup", Markly_Node_duplicate, 0);
1292
+
1293
+ rb_define_method(Markly_Node, "replace", Markly_Node_replace, 1);
1294
+
1295
+ rb_define_method(Markly_Node, "string_content", Markly_Node_get_string_content, 0);
1296
+ rb_define_method(Markly_Node, "string_content=", Markly_Node_set_string_content, 1);
1297
+ rb_define_method(Markly_Node, "type", Markly_Node_get_type, 0);
1298
+ rb_define_method(Markly_Node, "type_string", Markly_Node_get_type_string, 0);
1299
+ rb_define_method(Markly_Node, "source_position", Markly_Node_get_source_position, 0);
1300
+ rb_define_method(Markly_Node, "delete", Markly_Node_unlink, 0);
1301
+ rb_define_method(Markly_Node, "first_child", Markly_Node_first_child, 0);
1302
+ rb_define_method(Markly_Node, "next", Markly_Node_next, 0);
1303
+ rb_define_method(Markly_Node, "insert_before", Markly_Node_insert_before, 1);
1304
+ rb_define_method(Markly_Node, "_render_html", Markly_Node_render_html, 2);
1305
+ rb_define_method(Markly_Node, "_render_commonmark", Markly_Node_render_commonmark, -1);
1306
+ rb_define_method(Markly_Node, "_render_plaintext", Markly_Node_render_plaintext, -1);
1307
+ rb_define_method(Markly_Node, "insert_after", Markly_Node_insert_after, 1);
1308
+ rb_define_method(Markly_Node, "prepend_child", Markly_Node_prepend_child, 1);
1309
+ rb_define_method(Markly_Node, "append_child", Markly_Node_append_child, 1);
1310
+ rb_define_method(Markly_Node, "last_child", Markly_Node_last_child, 0);
1311
+ rb_define_method(Markly_Node, "parent", Markly_Node_parent, 0);
1312
+ rb_define_method(Markly_Node, "previous", Markly_Node_previous, 0);
1313
+ rb_define_method(Markly_Node, "url", Markly_Node_get_url, 0);
1314
+ rb_define_method(Markly_Node, "url=", Markly_Node_set_url, 1);
1315
+ rb_define_method(Markly_Node, "title", Markly_Node_get_title, 0);
1316
+ rb_define_method(Markly_Node, "title=", Markly_Node_set_title, 1);
1317
+ rb_define_method(Markly_Node, "header_level", Markly_Node_get_header_level, 0);
1318
+ rb_define_method(Markly_Node, "header_level=", Markly_Node_set_header_level, 1);
1319
+ rb_define_method(Markly_Node, "list_type", Markly_Node_get_list_type, 0);
1320
+ rb_define_method(Markly_Node, "list_type=", Markly_Node_set_list_type, 1);
1321
+ rb_define_method(Markly_Node, "list_start", Markly_Node_get_list_start, 0);
1322
+ rb_define_method(Markly_Node, "list_start=", Markly_Node_set_list_start, 1);
1323
+ rb_define_method(Markly_Node, "list_tight", Markly_Node_get_list_tight, 0);
1324
+ rb_define_method(Markly_Node, "list_tight=", Markly_Node_set_list_tight, 1);
1325
+ rb_define_method(Markly_Node, "fence_info", Markly_Node_get_fence_info, 0);
1326
+ rb_define_method(Markly_Node, "fence_info=", Markly_Node_set_fence_info, 1);
1327
+ rb_define_method(Markly_Node, "code_info", Markly_Node_get_code_info, 0);
1328
+ rb_define_method(Markly_Node, "code_info=", Markly_Node_set_code_info, 1);
1329
+ rb_define_method(Markly_Node, "fence", Markly_Node_get_fence, 0);
1330
+ rb_define_method(Markly_Node, "table_alignments", Markly_Node_get_table_alignments, 0);
1331
+ rb_define_method(Markly_Node, "tasklist_item_checked?", Markly_Node_tasklist_item_checked_p, 0);
1332
+ rb_define_method(Markly_Node, "tasklist_item_checked=", Markly_Node_set_tasklist_item_checked, 1);
1333
+
1334
+ rb_define_method(Markly_Node, "parent_footnote_def", Markly_Node_get_parent_footnote_def, 0);
1335
+
1336
+ rb_define_method(Markly_Node, "html_escape_href", Markly_Node_html_escape_href, 1);
1337
+ rb_define_method(Markly_Node, "html_escape_html", Markly_Node_html_escape_html, 1);
1338
+ }
1339
+
1340
+ static void Init_Markly_Parser(VALUE Markly) {
1341
+ VALUE Markly_Parser = rb_define_class_under(Markly, "Parser", rb_cObject);
1342
+ rb_define_alloc_func(Markly_Parser, Markly_Parser_allocate);
1343
+ rb_define_method(Markly_Parser, "initialize", Markly_Parser_initialize, 1);
1344
+ rb_define_method(Markly_Parser, "enable", Markly_Parser_enable, 1);
1345
+ rb_define_method(Markly_Parser, "parse", Markly_Parser_parse, 1);
1346
+ }
1347
+
1348
+ __attribute__((visibility("default"))) void Init_markly(void) {
1349
+ VALUE Markly = rb_define_module("Markly");
1350
+ rb_define_singleton_method(Markly, "extensions", Markly_extensions, 0);
1206
1351
 
1207
- rb_Markly_Parser = rb_define_class_under(rb_Markly, "Parser", rb_cObject);
1208
- rb_define_alloc_func(rb_Markly_Parser, rb_Markly_Parser_alloc);
1209
- rb_define_method(rb_Markly_Parser, "initialize", rb_Markly_Parser_initialize, 1);
1210
- rb_define_method(rb_Markly_Parser, "enable", rb_Markly_Parser_enable, 1);
1211
- rb_define_method(rb_Markly_Parser, "parse", rb_Markly_Parser_parse, 1);
1352
+ Markly_Error = rb_define_class_under(Markly, "Error", rb_eStandardError);
1212
1353
 
1213
- rb_Markly_Node = rb_define_class_under(rb_Markly, "Node", rb_cObject);
1214
- rb_undef_alloc_func(rb_Markly_Node);
1215
- rb_define_singleton_method(rb_Markly_Node, "new", rb_node_new, 1);
1216
-
1217
- rb_define_method(rb_Markly_Node, "replace", rb_node_replace, 1);
1218
-
1219
- rb_define_method(rb_Markly_Node, "string_content", rb_node_get_string_content, 0);
1220
- rb_define_method(rb_Markly_Node, "string_content=", rb_node_set_string_content, 1);
1221
- rb_define_method(rb_Markly_Node, "type", rb_node_get_type, 0);
1222
- rb_define_method(rb_Markly_Node, "type_string", rb_node_get_type_string, 0);
1223
- rb_define_method(rb_Markly_Node, "source_position", rb_node_get_source_position, 0);
1224
- rb_define_method(rb_Markly_Node, "delete", rb_node_unlink, 0);
1225
- rb_define_method(rb_Markly_Node, "first_child", rb_node_first_child, 0);
1226
- rb_define_method(rb_Markly_Node, "next", rb_node_next, 0);
1227
- rb_define_method(rb_Markly_Node, "insert_before", rb_node_insert_before, 1);
1228
- rb_define_method(rb_Markly_Node, "_render_html", rb_render_html, 2);
1229
- rb_define_method(rb_Markly_Node, "_render_commonmark", rb_render_commonmark, -1);
1230
- rb_define_method(rb_Markly_Node, "_render_plaintext", rb_render_plaintext, -1);
1231
- rb_define_method(rb_Markly_Node, "insert_after", rb_node_insert_after, 1);
1232
- rb_define_method(rb_Markly_Node, "prepend_child", rb_node_prepend_child, 1);
1233
- rb_define_method(rb_Markly_Node, "append_child", rb_node_append_child, 1);
1234
- rb_define_method(rb_Markly_Node, "last_child", rb_node_last_child, 0);
1235
- rb_define_method(rb_Markly_Node, "parent", rb_node_parent, 0);
1236
- rb_define_method(rb_Markly_Node, "previous", rb_node_previous, 0);
1237
- rb_define_method(rb_Markly_Node, "url", rb_node_get_url, 0);
1238
- rb_define_method(rb_Markly_Node, "url=", rb_node_set_url, 1);
1239
- rb_define_method(rb_Markly_Node, "title", rb_node_get_title, 0);
1240
- rb_define_method(rb_Markly_Node, "title=", rb_node_set_title, 1);
1241
- rb_define_method(rb_Markly_Node, "header_level", rb_node_get_header_level, 0);
1242
- rb_define_method(rb_Markly_Node, "header_level=", rb_node_set_header_level, 1);
1243
- rb_define_method(rb_Markly_Node, "list_type", rb_node_get_list_type, 0);
1244
- rb_define_method(rb_Markly_Node, "list_type=", rb_node_set_list_type, 1);
1245
- rb_define_method(rb_Markly_Node, "list_start", rb_node_get_list_start, 0);
1246
- rb_define_method(rb_Markly_Node, "list_start=", rb_node_set_list_start, 1);
1247
- rb_define_method(rb_Markly_Node, "list_tight", rb_node_get_list_tight, 0);
1248
- rb_define_method(rb_Markly_Node, "list_tight=", rb_node_set_list_tight, 1);
1249
- rb_define_method(rb_Markly_Node, "fence_info", rb_node_get_fence_info, 0);
1250
- rb_define_method(rb_Markly_Node, "fence_info=", rb_node_set_fence_info, 1);
1251
- rb_define_method(rb_Markly_Node, "table_alignments", rb_node_get_table_alignments, 0);
1252
- rb_define_method(rb_Markly_Node, "tasklist_item_checked?", rb_node_get_tasklist_item_checked, 0);
1253
- rb_define_method(rb_Markly_Node, "tasklist_item_checked=", rb_node_set_tasklist_item_checked, 1);
1254
-
1255
- rb_define_method(rb_Markly_Node, "parent_footnote_def", rb_node_get_parent_footnote_def, 0);
1256
-
1257
- rb_define_method(rb_Markly_Node, "html_escape_href", rb_html_escape_href, 1);
1258
- rb_define_method(rb_Markly_Node, "html_escape_html", rb_html_escape_html, 1);
1354
+ Init_Markly_Node(Markly);
1355
+ Init_Markly_Parser(Markly);
1259
1356
 
1260
1357
  cmark_gfm_core_extensions_ensure_registered();
1261
1358
  }