markly 0.16.0 → 0.17.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,26 @@ 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
+ static VALUE Markly_Node_replace(VALUE self, VALUE other) {
276
275
  cmark_node *current_node = NULL, *replacement_node = NULL;
277
276
 
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);
277
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, current_node);
278
+ TypedData_Get_Struct(other, cmark_node, &Markly_Node_Type, replacement_node);
280
279
 
281
280
  int result = cmark_node_replace(current_node, replacement_node);
282
281
 
283
282
  if (result == 0) {
284
- rb_raise(rb_Markly_Error, "could not replace node");
283
+ rb_raise(Markly_Error, "could not replace node");
285
284
  }
286
285
 
287
286
  return other;
@@ -299,10 +298,10 @@ static VALUE encode_utf8_string(const char *c_string) {
299
298
  *
300
299
  * Returns a {String} or {nil} if there is no string content.
301
300
  */
302
- static VALUE rb_node_get_string_content(VALUE self) {
301
+ static VALUE Markly_Node_get_string_content(VALUE self) {
303
302
  const char *text;
304
303
  cmark_node *node;
305
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
304
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
306
305
 
307
306
  text = cmark_node_get_literal(node);
308
307
 
@@ -320,16 +319,16 @@ static VALUE rb_node_get_string_content(VALUE self) {
320
319
  *
321
320
  * Raises Error if the string content can't be set.
322
321
  */
323
- static VALUE rb_node_set_string_content(VALUE self, VALUE s) {
322
+ static VALUE Markly_Node_set_string_content(VALUE self, VALUE s) {
324
323
  char *text;
325
324
  cmark_node *node;
326
325
  Check_Type(s, T_STRING);
327
326
 
328
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
327
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
329
328
  text = StringValueCStr(s);
330
329
 
331
330
  if (!cmark_node_set_literal(node, text)) {
332
- rb_raise(rb_Markly_Error, "could not set string content");
331
+ rb_raise(Markly_Error, "could not set string content");
333
332
  }
334
333
 
335
334
  return Qnil;
@@ -340,13 +339,13 @@ static VALUE rb_node_set_string_content(VALUE self, VALUE s) {
340
339
  *
341
340
  * Returns a {Symbol} representing the node's type.
342
341
  */
343
- static VALUE rb_node_get_type(VALUE self) {
342
+ static VALUE Markly_Node_get_type(VALUE self) {
344
343
  int node_type = 0;
345
344
  cmark_node *node = NULL;
346
345
  VALUE symbol = Qnil;
347
346
  const char *s = NULL;
348
347
 
349
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
348
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
350
349
 
351
350
  node_type = cmark_node_get_type(node);
352
351
  symbol = Qnil;
@@ -426,7 +425,7 @@ static VALUE rb_node_get_type(VALUE self) {
426
425
  s = node->extension->get_type_string_func(node->extension, node);
427
426
  return ID2SYM(rb_intern(s));
428
427
  }
429
- rb_raise(rb_Markly_Error, "invalid node type %d", node_type);
428
+ rb_raise(Markly_Error, "invalid node type %d", node_type);
430
429
  }
431
430
 
432
431
  return symbol;
@@ -437,12 +436,12 @@ static VALUE rb_node_get_type(VALUE self) {
437
436
  *
438
437
  * Returns a {Hash} containing {Symbol} keys of the positions.
439
438
  */
440
- static VALUE rb_node_get_source_position(VALUE self) {
439
+ static VALUE Markly_Node_get_source_position(VALUE self) {
441
440
  int start_line, start_column, end_line, end_column;
442
441
  VALUE result;
443
442
 
444
443
  cmark_node *node;
445
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
444
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
446
445
 
447
446
  start_line = cmark_node_get_start_line(node);
448
447
  start_column = cmark_node_get_start_column(node);
@@ -463,9 +462,9 @@ static VALUE rb_node_get_source_position(VALUE self) {
463
462
  *
464
463
  * Returns a {String}.
465
464
  */
466
- static VALUE rb_node_get_type_string(VALUE self) {
465
+ static VALUE Markly_Node_get_type_string(VALUE self) {
467
466
  cmark_node *node;
468
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
467
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
469
468
 
470
469
  return rb_str_new2(cmark_node_get_type_string(node));
471
470
  }
@@ -474,9 +473,9 @@ static VALUE rb_node_get_type_string(VALUE self) {
474
473
  * Internal: Unlinks the node from the tree (fixing pointers in
475
474
  * parents and siblings appropriately).
476
475
  */
477
- static VALUE rb_node_unlink(VALUE self) {
476
+ static VALUE Markly_Node_unlink(VALUE self) {
478
477
  cmark_node *node;
479
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
478
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
480
479
 
481
480
  cmark_node_unlink(node);
482
481
 
@@ -487,26 +486,26 @@ static VALUE rb_node_unlink(VALUE self) {
487
486
  *
488
487
  * Returns a {Node} if a child exists, `nil` otherise.
489
488
  */
490
- static VALUE rb_node_first_child(VALUE self) {
489
+ static VALUE Markly_Node_first_child(VALUE self) {
491
490
  cmark_node *node, *child;
492
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
491
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
493
492
 
494
493
  child = cmark_node_first_child(node);
495
494
 
496
- return rb_Markly_Node_wrap(child);
495
+ return Markly_Node_wrap(child);
497
496
  }
498
497
 
499
498
  /* Public: Fetches the next sibling of the node.
500
499
  *
501
500
  * Returns a {Node} if a sibling exists, `nil` otherwise.
502
501
  */
503
- static VALUE rb_node_next(VALUE self) {
502
+ static VALUE Markly_Node_next(VALUE self) {
504
503
  cmark_node *node, *next;
505
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
504
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
506
505
 
507
506
  next = cmark_node_next(node);
508
507
 
509
- return rb_Markly_Node_wrap(next);
508
+ return Markly_Node_wrap(next);
510
509
  }
511
510
 
512
511
  /*
@@ -517,13 +516,13 @@ static VALUE rb_node_next(VALUE self) {
517
516
  * Returns `true` if successful.
518
517
  * Raises Error if the node can't be inserted.
519
518
  */
520
- static VALUE rb_node_insert_before(VALUE self, VALUE sibling) {
519
+ static VALUE Markly_Node_insert_before(VALUE self, VALUE sibling) {
521
520
  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);
521
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node1);
522
+ TypedData_Get_Struct(sibling, cmark_node, &Markly_Node_Type, node2);
524
523
 
525
524
  if (!cmark_node_insert_before(node1, node2)) {
526
- rb_raise(rb_Markly_Error, "could not insert before");
525
+ rb_raise(Markly_Error, "could not insert before");
527
526
  }
528
527
 
529
528
  return Qtrue;
@@ -533,7 +532,7 @@ static VALUE rb_node_insert_before(VALUE self, VALUE sibling) {
533
532
  *
534
533
  * Returns a {String}.
535
534
  */
536
- static VALUE rb_render_html(VALUE self, VALUE rb_options, VALUE rb_extensions) {
535
+ static VALUE Markly_Node_render_html(VALUE self, VALUE rb_options, VALUE rb_extensions) {
537
536
  VALUE rb_ext_name;
538
537
  int i;
539
538
  cmark_node *node;
@@ -545,7 +544,7 @@ static VALUE rb_render_html(VALUE self, VALUE rb_options, VALUE rb_extensions) {
545
544
  int options = FIX2INT(rb_options);
546
545
  long extensions_len = RARRAY_LEN(rb_extensions);
547
546
 
548
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
547
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
549
548
 
550
549
  for (i = 0; i < extensions_len; ++i) {
551
550
  rb_ext_name = RARRAY_PTR(rb_extensions)[i];
@@ -579,7 +578,7 @@ static VALUE rb_render_html(VALUE self, VALUE rb_options, VALUE rb_extensions) {
579
578
  *
580
579
  * Returns a {String}.
581
580
  */
582
- static VALUE rb_render_commonmark(int argc, VALUE *argv, VALUE self) {
581
+ static VALUE Markly_Node_render_commonmark(int argc, VALUE *argv, VALUE self) {
583
582
  VALUE rb_options, rb_width;
584
583
  rb_scan_args(argc, argv, "11", &rb_options, &rb_width);
585
584
 
@@ -594,7 +593,7 @@ static VALUE rb_render_commonmark(int argc, VALUE *argv, VALUE self) {
594
593
  Check_Type(rb_options, T_FIXNUM);
595
594
 
596
595
  options = FIX2INT(rb_options);
597
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
596
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
598
597
 
599
598
  char *cmark = cmark_render_commonmark(node, options, width);
600
599
  VALUE ruby_cmark = rb_str_new2(cmark);
@@ -607,7 +606,7 @@ static VALUE rb_render_commonmark(int argc, VALUE *argv, VALUE self) {
607
606
  *
608
607
  * Returns a {String}.
609
608
  */
610
- static VALUE rb_render_plaintext(int argc, VALUE *argv, VALUE self) {
609
+ static VALUE Markly_Node_render_plaintext(int argc, VALUE *argv, VALUE self) {
611
610
  VALUE rb_options, rb_width;
612
611
  rb_scan_args(argc, argv, "11", &rb_options, &rb_width);
613
612
 
@@ -622,7 +621,7 @@ static VALUE rb_render_plaintext(int argc, VALUE *argv, VALUE self) {
622
621
  Check_Type(rb_options, T_FIXNUM);
623
622
 
624
623
  options = FIX2INT(rb_options);
625
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
624
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
626
625
 
627
626
  char *text = cmark_render_plaintext(node, options, width);
628
627
  VALUE ruby_text = rb_str_new2(text);
@@ -639,13 +638,13 @@ static VALUE rb_render_plaintext(int argc, VALUE *argv, VALUE self) {
639
638
  * Returns `true` if successful.
640
639
  * Raises Error if the node can't be inserted.
641
640
  */
642
- static VALUE rb_node_insert_after(VALUE self, VALUE sibling) {
641
+ static VALUE Markly_Node_insert_after(VALUE self, VALUE sibling) {
643
642
  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);
643
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node1);
644
+ TypedData_Get_Struct(sibling, cmark_node, &Markly_Node_Type, node2);
646
645
 
647
646
  if (!cmark_node_insert_after(node1, node2)) {
648
- rb_raise(rb_Markly_Error, "could not insert after");
647
+ rb_raise(Markly_Error, "could not insert after");
649
648
  }
650
649
 
651
650
  return Qtrue;
@@ -659,13 +658,13 @@ static VALUE rb_node_insert_after(VALUE self, VALUE sibling) {
659
658
  * Returns `true` if successful.
660
659
  * Raises Error if the node can't be inserted.
661
660
  */
662
- static VALUE rb_node_prepend_child(VALUE self, VALUE child) {
661
+ static VALUE Markly_Node_prepend_child(VALUE self, VALUE child) {
663
662
  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);
663
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node1);
664
+ TypedData_Get_Struct(child, cmark_node, &Markly_Node_Type, node2);
666
665
 
667
666
  if (!cmark_node_prepend_child(node1, node2)) {
668
- rb_raise(rb_Markly_Error, "could not prepend child");
667
+ rb_raise(Markly_Error, "could not prepend child");
669
668
  }
670
669
 
671
670
  return Qtrue;
@@ -679,13 +678,13 @@ static VALUE rb_node_prepend_child(VALUE self, VALUE child) {
679
678
  * Returns `true` if successful.
680
679
  * Raises Error if the node can't be inserted.
681
680
  */
682
- static VALUE rb_node_append_child(VALUE self, VALUE child) {
681
+ static VALUE Markly_Node_append_child(VALUE self, VALUE child) {
683
682
  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);
683
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node1);
684
+ TypedData_Get_Struct(child, cmark_node, &Markly_Node_Type, node2);
686
685
 
687
686
  if (!cmark_node_append_child(node1, node2)) {
688
- rb_raise(rb_Markly_Error, "could not append child");
687
+ rb_raise(Markly_Error, "could not append child");
689
688
  }
690
689
 
691
690
  return Qtrue;
@@ -695,39 +694,39 @@ static VALUE rb_node_append_child(VALUE self, VALUE child) {
695
694
  *
696
695
  * Returns a {Node} if a child exists, `nil` otherise.
697
696
  */
698
- static VALUE rb_node_last_child(VALUE self) {
697
+ static VALUE Markly_Node_last_child(VALUE self) {
699
698
  cmark_node *node, *child;
700
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
699
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
701
700
 
702
701
  child = cmark_node_last_child(node);
703
702
 
704
- return rb_Markly_Node_wrap(child);
703
+ return Markly_Node_wrap(child);
705
704
  }
706
705
 
707
706
  /* Public: Fetches the parent of the current node.
708
707
  *
709
708
  * Returns a {Node} if a parent exists, `nil` otherise.
710
709
  */
711
- static VALUE rb_node_parent(VALUE self) {
710
+ static VALUE Markly_Node_parent(VALUE self) {
712
711
  cmark_node *node, *parent;
713
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
712
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
714
713
 
715
714
  parent = cmark_node_parent(node);
716
715
 
717
- return rb_Markly_Node_wrap(parent);
716
+ return Markly_Node_wrap(parent);
718
717
  }
719
718
 
720
719
  /* Public: Fetches the previous sibling of the current node.
721
720
  *
722
721
  * Returns a {Node} if a parent exists, `nil` otherise.
723
722
  */
724
- static VALUE rb_node_previous(VALUE self) {
723
+ static VALUE Markly_Node_previous(VALUE self) {
725
724
  cmark_node *node, *previous;
726
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
725
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
727
726
 
728
727
  previous = cmark_node_previous(node);
729
728
 
730
- return rb_Markly_Node_wrap(previous);
729
+ return Markly_Node_wrap(previous);
731
730
  }
732
731
 
733
732
  /*
@@ -736,14 +735,14 @@ static VALUE rb_node_previous(VALUE self) {
736
735
  * Returns a {String}.
737
736
  * Raises a Error if the URL can't be retrieved.
738
737
  */
739
- static VALUE rb_node_get_url(VALUE self) {
738
+ static VALUE Markly_Node_get_url(VALUE self) {
740
739
  const char *text;
741
740
  cmark_node *node;
742
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
741
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
743
742
 
744
743
  text = cmark_node_get_url(node);
745
744
  if (text == NULL) {
746
- rb_raise(rb_Markly_Error, "could not get url");
745
+ rb_raise(Markly_Error, "could not get url");
747
746
  }
748
747
 
749
748
  return rb_str_new2(text);
@@ -756,16 +755,16 @@ static VALUE rb_node_get_url(VALUE self) {
756
755
  *
757
756
  * Raises a Error if the URL can't be set.
758
757
  */
759
- static VALUE rb_node_set_url(VALUE self, VALUE url) {
758
+ static VALUE Markly_Node_set_url(VALUE self, VALUE url) {
760
759
  cmark_node *node;
761
760
  char *text;
762
761
  Check_Type(url, T_STRING);
763
762
 
764
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
763
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
765
764
  text = StringValueCStr(url);
766
765
 
767
766
  if (!cmark_node_set_url(node, text)) {
768
- rb_raise(rb_Markly_Error, "could not set url");
767
+ rb_raise(Markly_Error, "could not set url");
769
768
  }
770
769
 
771
770
  return Qnil;
@@ -777,14 +776,14 @@ static VALUE rb_node_set_url(VALUE self, VALUE url) {
777
776
  * Returns a {String}.
778
777
  * Raises a Error if the title can't be retrieved.
779
778
  */
780
- static VALUE rb_node_get_title(VALUE self) {
779
+ static VALUE Markly_Node_get_title(VALUE self) {
781
780
  const char *text;
782
781
  cmark_node *node;
783
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
782
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
784
783
 
785
784
  text = cmark_node_get_title(node);
786
785
  if (text == NULL) {
787
- rb_raise(rb_Markly_Error, "could not get title");
786
+ rb_raise(Markly_Error, "could not get title");
788
787
  }
789
788
 
790
789
  return rb_str_new2(text);
@@ -797,16 +796,16 @@ static VALUE rb_node_get_title(VALUE self) {
797
796
  *
798
797
  * Raises a Error if the title can't be set.
799
798
  */
800
- static VALUE rb_node_set_title(VALUE self, VALUE title) {
799
+ static VALUE Markly_Node_set_title(VALUE self, VALUE title) {
801
800
  char *text;
802
801
  cmark_node *node;
803
802
  Check_Type(title, T_STRING);
804
803
 
805
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
804
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
806
805
  text = StringValueCStr(title);
807
806
 
808
807
  if (!cmark_node_set_title(node, text)) {
809
- rb_raise(rb_Markly_Error, "could not set title");
808
+ rb_raise(Markly_Error, "could not set title");
810
809
  }
811
810
 
812
811
  return Qnil;
@@ -818,15 +817,15 @@ static VALUE rb_node_set_title(VALUE self, VALUE title) {
818
817
  * Returns a {Number} representing the header level.
819
818
  * Raises a Error if the header level can't be retrieved.
820
819
  */
821
- static VALUE rb_node_get_header_level(VALUE self) {
820
+ static VALUE Markly_Node_get_header_level(VALUE self) {
822
821
  int header_level;
823
822
  cmark_node *node;
824
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
823
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
825
824
 
826
825
  header_level = cmark_node_get_header_level(node);
827
826
 
828
827
  if (header_level == 0) {
829
- rb_raise(rb_Markly_Error, "could not get header_level");
828
+ rb_raise(Markly_Error, "could not get header_level");
830
829
  }
831
830
 
832
831
  return INT2NUM(header_level);
@@ -839,16 +838,16 @@ static VALUE rb_node_get_header_level(VALUE self) {
839
838
  *
840
839
  * Raises a Error if the header level can't be set.
841
840
  */
842
- static VALUE rb_node_set_header_level(VALUE self, VALUE level) {
841
+ static VALUE Markly_Node_set_header_level(VALUE self, VALUE level) {
843
842
  int l;
844
843
  cmark_node *node;
845
844
  Check_Type(level, T_FIXNUM);
846
845
 
847
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
846
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
848
847
  l = FIX2INT(level);
849
848
 
850
849
  if (!cmark_node_set_header_level(node, l)) {
851
- rb_raise(rb_Markly_Error, "could not set header_level");
850
+ rb_raise(Markly_Error, "could not set header_level");
852
851
  }
853
852
 
854
853
  return Qnil;
@@ -860,11 +859,11 @@ static VALUE rb_node_set_header_level(VALUE self, VALUE level) {
860
859
  * Returns a {Symbol}.
861
860
  * Raises a Error if the title can't be retrieved.
862
861
  */
863
- static VALUE rb_node_get_list_type(VALUE self) {
862
+ static VALUE Markly_Node_get_list_type(VALUE self) {
864
863
  int list_type;
865
864
  cmark_node *node;
866
865
  VALUE symbol;
867
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
866
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
868
867
 
869
868
  list_type = cmark_node_get_list_type(node);
870
869
 
@@ -873,7 +872,7 @@ static VALUE rb_node_get_list_type(VALUE self) {
873
872
  } else if (list_type == CMARK_ORDERED_LIST) {
874
873
  symbol = sym_ordered_list;
875
874
  } else {
876
- rb_raise(rb_Markly_Error, "could not get list_type");
875
+ rb_raise(Markly_Error, "could not get list_type");
877
876
  }
878
877
 
879
878
  return symbol;
@@ -886,23 +885,23 @@ static VALUE rb_node_get_list_type(VALUE self) {
886
885
  *
887
886
  * Raises a Error if the list type can't be set.
888
887
  */
889
- static VALUE rb_node_set_list_type(VALUE self, VALUE list_type) {
888
+ static VALUE Markly_Node_set_list_type(VALUE self, VALUE list_type) {
890
889
  int type = 0;
891
890
  cmark_node *node;
892
891
  Check_Type(list_type, T_SYMBOL);
893
892
 
894
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
893
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
895
894
 
896
895
  if (list_type == sym_bullet_list) {
897
896
  type = CMARK_BULLET_LIST;
898
897
  } else if (list_type == sym_ordered_list) {
899
898
  type = CMARK_ORDERED_LIST;
900
899
  } else {
901
- rb_raise(rb_Markly_Error, "invalid list_type");
900
+ rb_raise(Markly_Error, "invalid list_type");
902
901
  }
903
902
 
904
903
  if (!cmark_node_set_list_type(node, type)) {
905
- rb_raise(rb_Markly_Error, "could not set list_type");
904
+ rb_raise(Markly_Error, "could not set list_type");
906
905
  }
907
906
 
908
907
  return Qnil;
@@ -915,13 +914,13 @@ static VALUE rb_node_set_list_type(VALUE self, VALUE list_type) {
915
914
  * Returns a {Number} representing the starting number.
916
915
  * Raises a Error if the starting number can't be retrieved.
917
916
  */
918
- static VALUE rb_node_get_list_start(VALUE self) {
917
+ static VALUE Markly_Node_get_list_start(VALUE self) {
919
918
  cmark_node *node;
920
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
919
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
921
920
 
922
921
  if (cmark_node_get_type(node) != CMARK_NODE_LIST ||
923
922
  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",
923
+ rb_raise(Markly_Error, "can't get list_start for non-ordered list %d",
925
924
  cmark_node_get_list_type(node));
926
925
  }
927
926
 
@@ -936,16 +935,16 @@ static VALUE rb_node_get_list_start(VALUE self) {
936
935
  *
937
936
  * Raises a Error if the starting number can't be set.
938
937
  */
939
- static VALUE rb_node_set_list_start(VALUE self, VALUE start) {
938
+ static VALUE Markly_Node_set_list_start(VALUE self, VALUE start) {
940
939
  int s;
941
940
  cmark_node *node;
942
941
  Check_Type(start, T_FIXNUM);
943
942
 
944
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
943
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
945
944
  s = FIX2INT(start);
946
945
 
947
946
  if (!cmark_node_set_list_start(node, s)) {
948
- rb_raise(rb_Markly_Error, "could not set list_start");
947
+ rb_raise(Markly_Error, "could not set list_start");
949
948
  }
950
949
 
951
950
  return Qnil;
@@ -957,13 +956,13 @@ static VALUE rb_node_set_list_start(VALUE self, VALUE start) {
957
956
  * Returns a `true` if the list is tight, `false` otherwise.
958
957
  * Raises a Error if the starting number can't be retrieved.
959
958
  */
960
- static VALUE rb_node_get_list_tight(VALUE self) {
959
+ static VALUE Markly_Node_get_list_tight(VALUE self) {
961
960
  int flag;
962
961
  cmark_node *node;
963
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
962
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
964
963
 
965
964
  if (cmark_node_get_type(node) != CMARK_NODE_LIST) {
966
- rb_raise(rb_Markly_Error, "can't get list_tight for non-list");
965
+ rb_raise(Markly_Error, "can't get list_tight for non-list");
967
966
  }
968
967
 
969
968
  flag = cmark_node_get_list_tight(node);
@@ -978,14 +977,14 @@ static VALUE rb_node_get_list_tight(VALUE self) {
978
977
  *
979
978
  * Raises a Error if the tightness can't be set.
980
979
  */
981
- static VALUE rb_node_set_list_tight(VALUE self, VALUE tight) {
980
+ static VALUE Markly_Node_set_list_tight(VALUE self, VALUE tight) {
982
981
  int t;
983
982
  cmark_node *node;
984
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
983
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
985
984
  t = RTEST(tight);
986
985
 
987
986
  if (!cmark_node_set_list_tight(node, t)) {
988
- rb_raise(rb_Markly_Error, "could not set list_tight");
987
+ rb_raise(Markly_Error, "could not set list_tight");
989
988
  }
990
989
 
991
990
  return Qnil;
@@ -997,15 +996,15 @@ static VALUE rb_node_set_list_tight(VALUE self, VALUE tight) {
997
996
  * Returns a {String} representing the fence info.
998
997
  * Raises a Error if the fence info can't be retrieved.
999
998
  */
1000
- static VALUE rb_node_get_fence_info(VALUE self) {
999
+ static VALUE Markly_Node_get_fence_info(VALUE self) {
1001
1000
  const char *fence_info;
1002
1001
  cmark_node *node;
1003
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
1002
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1004
1003
 
1005
1004
  fence_info = cmark_node_get_fence_info(node);
1006
1005
 
1007
1006
  if (fence_info == NULL) {
1008
- rb_raise(rb_Markly_Error, "could not get fence_info");
1007
+ rb_raise(Markly_Error, "could not get fence_info");
1009
1008
  }
1010
1009
 
1011
1010
  return rb_str_new2(fence_info);
@@ -1018,25 +1017,96 @@ static VALUE rb_node_get_fence_info(VALUE self) {
1018
1017
  *
1019
1018
  * Raises a Error if the fence info can't be set.
1020
1019
  */
1021
- static VALUE rb_node_set_fence_info(VALUE self, VALUE info) {
1020
+ static VALUE Markly_Node_set_fence_info(VALUE self, VALUE info) {
1022
1021
  char *text;
1023
1022
  cmark_node *node;
1024
1023
  Check_Type(info, T_STRING);
1025
1024
 
1026
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
1025
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1027
1026
  text = StringValueCStr(info);
1028
1027
 
1029
1028
  if (!cmark_node_set_fence_info(node, text)) {
1030
- rb_raise(rb_Markly_Error, "could not set fence_info");
1029
+ rb_raise(Markly_Error, "could not set fence_info");
1031
1030
  }
1032
1031
 
1033
1032
  return Qnil;
1034
1033
  }
1035
1034
 
1036
- static VALUE rb_node_get_tasklist_item_checked(VALUE self) {
1035
+ /*
1036
+ * Public: Gets the code info of the current node (must be a `:code_block`,
1037
+ * `:front_matter`, or inline `:code` node).
1038
+ *
1039
+ * Returns a {String} representing the code info.
1040
+ * Raises a Error if the code info can't be retrieved.
1041
+ */
1042
+ static VALUE Markly_Node_get_code_info(VALUE self) {
1043
+ const char *code_info;
1044
+ cmark_node *node;
1045
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1046
+
1047
+ code_info = cmark_node_get_code_info(node);
1048
+
1049
+ if (code_info == NULL) {
1050
+ rb_raise(Markly_Error, "could not get code_info");
1051
+ }
1052
+
1053
+ return rb_str_new2(code_info);
1054
+ }
1055
+
1056
+ /*
1057
+ * Public: Sets the code info of the current node (must be a `:code_block`,
1058
+ * `:front_matter`, or inline `:code` node).
1059
+ *
1060
+ * info - A {String} representing the new code info, or `nil` to clear it.
1061
+ *
1062
+ * Raises a Error if the code info can't be set.
1063
+ */
1064
+ static VALUE Markly_Node_set_code_info(VALUE self, VALUE info) {
1065
+ const char *text = NULL;
1066
+ cmark_node *node;
1067
+
1068
+ if (!NIL_P(info)) {
1069
+ Check_Type(info, T_STRING);
1070
+ text = StringValueCStr(info);
1071
+ }
1072
+
1073
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1074
+
1075
+ if (!cmark_node_set_code_info(node, text)) {
1076
+ rb_raise(Markly_Error, "could not set code_info");
1077
+ }
1078
+
1079
+ return Qnil;
1080
+ }
1081
+
1082
+ /*
1083
+ * Public: Gets fencing details for the current node.
1084
+ *
1085
+ * Returns a {Markly::Node::Fence} for fenced code blocks, `nil` otherwise.
1086
+ */
1087
+ static VALUE Markly_Node_get_fence(VALUE self) {
1088
+ int fence_length = 0;
1089
+ int fence_offset = 0;
1090
+ char fence_character = '\0';
1091
+ cmark_node *node;
1092
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1093
+
1094
+ if (!cmark_node_get_fenced(node, &fence_length, &fence_offset, &fence_character)) {
1095
+ return Qnil;
1096
+ }
1097
+
1098
+ return rb_struct_new(
1099
+ Markly_Node_Fence,
1100
+ rb_str_new(&fence_character, 1),
1101
+ INT2NUM(fence_length),
1102
+ INT2NUM(fence_offset)
1103
+ );
1104
+ }
1105
+
1106
+ static VALUE Markly_Node_tasklist_item_checked_p(VALUE self) {
1037
1107
  int tasklist_state;
1038
1108
  cmark_node *node;
1039
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
1109
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1040
1110
 
1041
1111
  tasklist_state = cmark_gfm_extensions_get_tasklist_item_checked(node);
1042
1112
 
@@ -1055,14 +1125,14 @@ static VALUE rb_node_get_tasklist_item_checked(VALUE self) {
1055
1125
  * Returns a {Boolean} representing the new checkbox state.
1056
1126
  * Raises a Error if the checkbox state can't be set.
1057
1127
  */
1058
- static VALUE rb_node_set_tasklist_item_checked(VALUE self, VALUE item_checked) {
1128
+ static VALUE Markly_Node_set_tasklist_item_checked(VALUE self, VALUE item_checked) {
1059
1129
  int tasklist_state;
1060
1130
  cmark_node *node;
1061
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
1131
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1062
1132
  tasklist_state = RTEST(item_checked);
1063
1133
 
1064
1134
  if (!cmark_gfm_extensions_set_tasklist_item_checked(node, tasklist_state)) {
1065
- rb_raise(rb_Markly_Error, "could not set tasklist_item_checked");
1135
+ rb_raise(Markly_Error, "could not set tasklist_item_checked");
1066
1136
  };
1067
1137
 
1068
1138
  if (tasklist_state) {
@@ -1072,28 +1142,28 @@ static VALUE rb_node_set_tasklist_item_checked(VALUE self, VALUE item_checked) {
1072
1142
  }
1073
1143
  }
1074
1144
 
1075
- static VALUE rb_node_get_parent_footnote_def(VALUE self) {
1145
+ static VALUE Markly_Node_get_parent_footnote_def(VALUE self) {
1076
1146
  cmark_node *node;
1077
1147
  cmark_node *parent;
1078
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
1148
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1079
1149
 
1080
1150
  parent = cmark_node_parent_footnote_def(node);
1081
1151
 
1082
- return rb_Markly_Node_wrap(parent);
1152
+ return Markly_Node_wrap(parent);
1083
1153
  }
1084
1154
 
1085
- static VALUE rb_node_get_table_alignments(VALUE self) {
1155
+ static VALUE Markly_Node_get_table_alignments(VALUE self) {
1086
1156
  uint16_t column_count, i;
1087
1157
  uint8_t *alignments;
1088
1158
  cmark_node *node;
1089
1159
  VALUE ary;
1090
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
1160
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1091
1161
 
1092
1162
  column_count = cmark_gfm_extensions_get_table_columns(node);
1093
1163
  alignments = cmark_gfm_extensions_get_table_alignments(node);
1094
1164
 
1095
1165
  if (!column_count || !alignments) {
1096
- rb_raise(rb_Markly_Error, "could not get column_count or alignments");
1166
+ rb_raise(Markly_Error, "could not get column_count or alignments");
1097
1167
  }
1098
1168
 
1099
1169
  ary = rb_ary_new();
@@ -1111,12 +1181,12 @@ static VALUE rb_node_get_table_alignments(VALUE self) {
1111
1181
  }
1112
1182
 
1113
1183
  /* Internal: Escapes href URLs safely. */
1114
- static VALUE rb_html_escape_href(VALUE self, VALUE rb_text) {
1184
+ static VALUE Markly_Node_html_escape_href(VALUE self, VALUE rb_text) {
1115
1185
  char *result;
1116
1186
  cmark_node *node;
1117
1187
  Check_Type(rb_text, T_STRING);
1118
1188
 
1119
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
1189
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1120
1190
 
1121
1191
  cmark_mem *mem = cmark_node_mem(node);
1122
1192
  cmark_strbuf buf = CMARK_BUF_INIT(mem);
@@ -1131,12 +1201,12 @@ static VALUE rb_html_escape_href(VALUE self, VALUE rb_text) {
1131
1201
  }
1132
1202
 
1133
1203
  /* Internal: Escapes HTML content safely. */
1134
- static VALUE rb_html_escape_html(VALUE self, VALUE rb_text) {
1204
+ static VALUE Markly_Node_html_escape_html(VALUE self, VALUE rb_text) {
1135
1205
  char *result;
1136
1206
  cmark_node *node;
1137
1207
  Check_Type(rb_text, T_STRING);
1138
1208
 
1139
- TypedData_Get_Struct(self, cmark_node, &rb_Markly_Node_Type, node);
1209
+ TypedData_Get_Struct(self, cmark_node, &Markly_Node_Type, node);
1140
1210
 
1141
1211
  cmark_mem *mem = cmark_node_mem(node);
1142
1212
  cmark_strbuf buf = CMARK_BUF_INIT(mem);
@@ -1150,7 +1220,7 @@ static VALUE rb_html_escape_html(VALUE self, VALUE rb_text) {
1150
1220
  return rb_text;
1151
1221
  }
1152
1222
 
1153
- VALUE rb_Markly_extensions(VALUE self) {
1223
+ static VALUE Markly_extensions(VALUE self) {
1154
1224
  cmark_llist *exts, *it;
1155
1225
  cmark_syntax_extension *ext;
1156
1226
  VALUE ary = rb_ary_new();
@@ -1167,7 +1237,7 @@ VALUE rb_Markly_extensions(VALUE self) {
1167
1237
  return ary;
1168
1238
  }
1169
1239
 
1170
- __attribute__((visibility("default"))) void Init_markly(void) {
1240
+ static void Init_Markly_Node(VALUE Markly) {
1171
1241
  sym_document = ID2SYM(rb_intern("document"));
1172
1242
  sym_custom_block = ID2SYM(rb_intern("custom_block"));
1173
1243
  sym_custom_inline = ID2SYM(rb_intern("custom_inline"));
@@ -1199,63 +1269,74 @@ __attribute__((visibility("default"))) void Init_markly(void) {
1199
1269
  sym_right = ID2SYM(rb_intern("right"));
1200
1270
  sym_center = ID2SYM(rb_intern("center"));
1201
1271
 
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);
1272
+ Markly_Node = rb_define_class_under(Markly, "Node", rb_cObject);
1273
+ rb_undef_alloc_func(Markly_Node);
1274
+ rb_define_singleton_method(Markly_Node, "new", Markly_Node_new, 1);
1275
+ Markly_Node_Fence = rb_struct_define_under(Markly_Node, "Fence", "character", "length", "indent", NULL);
1276
+
1277
+ rb_define_method(Markly_Node, "replace", Markly_Node_replace, 1);
1278
+
1279
+ rb_define_method(Markly_Node, "string_content", Markly_Node_get_string_content, 0);
1280
+ rb_define_method(Markly_Node, "string_content=", Markly_Node_set_string_content, 1);
1281
+ rb_define_method(Markly_Node, "type", Markly_Node_get_type, 0);
1282
+ rb_define_method(Markly_Node, "type_string", Markly_Node_get_type_string, 0);
1283
+ rb_define_method(Markly_Node, "source_position", Markly_Node_get_source_position, 0);
1284
+ rb_define_method(Markly_Node, "delete", Markly_Node_unlink, 0);
1285
+ rb_define_method(Markly_Node, "first_child", Markly_Node_first_child, 0);
1286
+ rb_define_method(Markly_Node, "next", Markly_Node_next, 0);
1287
+ rb_define_method(Markly_Node, "insert_before", Markly_Node_insert_before, 1);
1288
+ rb_define_method(Markly_Node, "_render_html", Markly_Node_render_html, 2);
1289
+ rb_define_method(Markly_Node, "_render_commonmark", Markly_Node_render_commonmark, -1);
1290
+ rb_define_method(Markly_Node, "_render_plaintext", Markly_Node_render_plaintext, -1);
1291
+ rb_define_method(Markly_Node, "insert_after", Markly_Node_insert_after, 1);
1292
+ rb_define_method(Markly_Node, "prepend_child", Markly_Node_prepend_child, 1);
1293
+ rb_define_method(Markly_Node, "append_child", Markly_Node_append_child, 1);
1294
+ rb_define_method(Markly_Node, "last_child", Markly_Node_last_child, 0);
1295
+ rb_define_method(Markly_Node, "parent", Markly_Node_parent, 0);
1296
+ rb_define_method(Markly_Node, "previous", Markly_Node_previous, 0);
1297
+ rb_define_method(Markly_Node, "url", Markly_Node_get_url, 0);
1298
+ rb_define_method(Markly_Node, "url=", Markly_Node_set_url, 1);
1299
+ rb_define_method(Markly_Node, "title", Markly_Node_get_title, 0);
1300
+ rb_define_method(Markly_Node, "title=", Markly_Node_set_title, 1);
1301
+ rb_define_method(Markly_Node, "header_level", Markly_Node_get_header_level, 0);
1302
+ rb_define_method(Markly_Node, "header_level=", Markly_Node_set_header_level, 1);
1303
+ rb_define_method(Markly_Node, "list_type", Markly_Node_get_list_type, 0);
1304
+ rb_define_method(Markly_Node, "list_type=", Markly_Node_set_list_type, 1);
1305
+ rb_define_method(Markly_Node, "list_start", Markly_Node_get_list_start, 0);
1306
+ rb_define_method(Markly_Node, "list_start=", Markly_Node_set_list_start, 1);
1307
+ rb_define_method(Markly_Node, "list_tight", Markly_Node_get_list_tight, 0);
1308
+ rb_define_method(Markly_Node, "list_tight=", Markly_Node_set_list_tight, 1);
1309
+ rb_define_method(Markly_Node, "fence_info", Markly_Node_get_fence_info, 0);
1310
+ rb_define_method(Markly_Node, "fence_info=", Markly_Node_set_fence_info, 1);
1311
+ rb_define_method(Markly_Node, "code_info", Markly_Node_get_code_info, 0);
1312
+ rb_define_method(Markly_Node, "code_info=", Markly_Node_set_code_info, 1);
1313
+ rb_define_method(Markly_Node, "fence", Markly_Node_get_fence, 0);
1314
+ rb_define_method(Markly_Node, "table_alignments", Markly_Node_get_table_alignments, 0);
1315
+ rb_define_method(Markly_Node, "tasklist_item_checked?", Markly_Node_tasklist_item_checked_p, 0);
1316
+ rb_define_method(Markly_Node, "tasklist_item_checked=", Markly_Node_set_tasklist_item_checked, 1);
1317
+
1318
+ rb_define_method(Markly_Node, "parent_footnote_def", Markly_Node_get_parent_footnote_def, 0);
1319
+
1320
+ rb_define_method(Markly_Node, "html_escape_href", Markly_Node_html_escape_href, 1);
1321
+ rb_define_method(Markly_Node, "html_escape_html", Markly_Node_html_escape_html, 1);
1322
+ }
1323
+
1324
+ static void Init_Markly_Parser(VALUE Markly) {
1325
+ VALUE Markly_Parser = rb_define_class_under(Markly, "Parser", rb_cObject);
1326
+ rb_define_alloc_func(Markly_Parser, Markly_Parser_allocate);
1327
+ rb_define_method(Markly_Parser, "initialize", Markly_Parser_initialize, 1);
1328
+ rb_define_method(Markly_Parser, "enable", Markly_Parser_enable, 1);
1329
+ rb_define_method(Markly_Parser, "parse", Markly_Parser_parse, 1);
1330
+ }
1331
+
1332
+ __attribute__((visibility("default"))) void Init_markly(void) {
1333
+ VALUE Markly = rb_define_module("Markly");
1334
+ rb_define_singleton_method(Markly, "extensions", Markly_extensions, 0);
1206
1335
 
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);
1336
+ Markly_Error = rb_define_class_under(Markly, "Error", rb_eStandardError);
1212
1337
 
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);
1338
+ Init_Markly_Node(Markly);
1339
+ Init_Markly_Parser(Markly);
1259
1340
 
1260
1341
  cmark_gfm_core_extensions_ensure_registered();
1261
1342
  }