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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/context/getting-started.md +36 -0
- data/ext/markly/cmark-gfm.h +16 -0
- data/ext/markly/cmark-gfm_export.h +1 -0
- data/ext/markly/cmark-gfm_version.h +2 -2
- data/ext/markly/cmark_ctype.c +9 -0
- data/ext/markly/cmark_ctype.h +5 -0
- data/ext/markly/commonmark.c +10 -3
- data/ext/markly/config.h +0 -4
- data/ext/markly/html.c +44 -23
- data/ext/markly/inlines.c +85 -3
- data/ext/markly/iterator.c +6 -1
- data/ext/markly/markly.c +282 -201
- data/ext/markly/node.c +56 -3
- data/ext/markly/xml.c +12 -1
- data/lib/markly/flags.rb +4 -1
- data/lib/markly/node/inspect.rb +10 -3
- data/lib/markly/node.rb +53 -28
- data/lib/markly/renderer/generic.rb +42 -12
- data/lib/markly/renderer/headings.rb +24 -19
- data/lib/markly/renderer/html.rb +111 -10
- data/lib/markly/version.rb +3 -1
- data/lib/markly.rb +14 -13
- data/readme.md +11 -1
- data/releases.md +11 -1
- data.tar.gz.sig +0 -0
- metadata +2 -2
- metadata.gz.sig +0 -0
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
|
|
12
|
-
static VALUE
|
|
13
|
-
static VALUE
|
|
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
|
|
48
|
-
// If a parent of this node is already freed, `
|
|
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
|
|
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
|
|
79
|
+
static const rb_data_type_t Markly_Node_Type = {
|
|
81
80
|
.wrap_struct_name = "Markly::Node",
|
|
82
81
|
.function = {
|
|
83
|
-
.dmark =
|
|
84
|
-
.dfree =
|
|
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
|
|
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
|
|
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(
|
|
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,
|
|
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
|
|
112
|
+
static void Markly_Parser_Type_free(void *data) {
|
|
114
113
|
cmark_parser_free(data);
|
|
115
114
|
}
|
|
116
115
|
|
|
117
|
-
static void
|
|
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
|
|
128
|
+
static const rb_data_type_t Markly_Parser_Type = {
|
|
130
129
|
.wrap_struct_name = "Markly::Parser",
|
|
131
130
|
.function = {
|
|
132
|
-
.dmark =
|
|
133
|
-
.dfree =
|
|
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
|
|
140
|
-
return TypedData_Wrap_Struct(self, &
|
|
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
|
|
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
|
|
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, &
|
|
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
|
|
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, &
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
268
|
+
rb_raise(Markly_Error, "could not create node of type %d", node_type);
|
|
270
269
|
}
|
|
271
270
|
|
|
272
|
-
return
|
|
271
|
+
return Markly_Node_wrap(node);
|
|
273
272
|
}
|
|
274
273
|
|
|
275
|
-
static VALUE
|
|
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, &
|
|
279
|
-
TypedData_Get_Struct(other, cmark_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(
|
|
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
|
|
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, &
|
|
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
|
|
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, &
|
|
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(
|
|
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
|
|
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, &
|
|
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(
|
|
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
|
|
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, &
|
|
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
|
|
465
|
+
static VALUE Markly_Node_get_type_string(VALUE self) {
|
|
467
466
|
cmark_node *node;
|
|
468
|
-
TypedData_Get_Struct(self, cmark_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
|
|
476
|
+
static VALUE Markly_Node_unlink(VALUE self) {
|
|
478
477
|
cmark_node *node;
|
|
479
|
-
TypedData_Get_Struct(self, cmark_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
|
|
489
|
+
static VALUE Markly_Node_first_child(VALUE self) {
|
|
491
490
|
cmark_node *node, *child;
|
|
492
|
-
TypedData_Get_Struct(self, cmark_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
|
|
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
|
|
502
|
+
static VALUE Markly_Node_next(VALUE self) {
|
|
504
503
|
cmark_node *node, *next;
|
|
505
|
-
TypedData_Get_Struct(self, cmark_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
|
|
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
|
|
519
|
+
static VALUE Markly_Node_insert_before(VALUE self, VALUE sibling) {
|
|
521
520
|
cmark_node *node1, *node2;
|
|
522
|
-
TypedData_Get_Struct(self, cmark_node, &
|
|
523
|
-
TypedData_Get_Struct(sibling, cmark_node, &
|
|
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(
|
|
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
|
|
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, &
|
|
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
|
|
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, &
|
|
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
|
|
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, &
|
|
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
|
|
641
|
+
static VALUE Markly_Node_insert_after(VALUE self, VALUE sibling) {
|
|
643
642
|
cmark_node *node1, *node2;
|
|
644
|
-
TypedData_Get_Struct(self, cmark_node, &
|
|
645
|
-
TypedData_Get_Struct(sibling, cmark_node, &
|
|
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(
|
|
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
|
|
661
|
+
static VALUE Markly_Node_prepend_child(VALUE self, VALUE child) {
|
|
663
662
|
cmark_node *node1, *node2;
|
|
664
|
-
TypedData_Get_Struct(self, cmark_node, &
|
|
665
|
-
TypedData_Get_Struct(child, cmark_node, &
|
|
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(
|
|
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
|
|
681
|
+
static VALUE Markly_Node_append_child(VALUE self, VALUE child) {
|
|
683
682
|
cmark_node *node1, *node2;
|
|
684
|
-
TypedData_Get_Struct(self, cmark_node, &
|
|
685
|
-
TypedData_Get_Struct(child, cmark_node, &
|
|
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(
|
|
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
|
|
697
|
+
static VALUE Markly_Node_last_child(VALUE self) {
|
|
699
698
|
cmark_node *node, *child;
|
|
700
|
-
TypedData_Get_Struct(self, cmark_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
|
|
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
|
|
710
|
+
static VALUE Markly_Node_parent(VALUE self) {
|
|
712
711
|
cmark_node *node, *parent;
|
|
713
|
-
TypedData_Get_Struct(self, cmark_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
|
|
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
|
|
723
|
+
static VALUE Markly_Node_previous(VALUE self) {
|
|
725
724
|
cmark_node *node, *previous;
|
|
726
|
-
TypedData_Get_Struct(self, cmark_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
|
|
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
|
|
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, &
|
|
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(
|
|
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
|
|
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, &
|
|
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(
|
|
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
|
|
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, &
|
|
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(
|
|
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
|
|
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, &
|
|
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(
|
|
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
|
|
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, &
|
|
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(
|
|
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
|
|
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, &
|
|
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(
|
|
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
|
|
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, &
|
|
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(
|
|
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
|
|
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, &
|
|
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(
|
|
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(
|
|
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
|
|
917
|
+
static VALUE Markly_Node_get_list_start(VALUE self) {
|
|
919
918
|
cmark_node *node;
|
|
920
|
-
TypedData_Get_Struct(self, cmark_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(
|
|
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
|
|
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, &
|
|
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(
|
|
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
|
|
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, &
|
|
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(
|
|
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
|
|
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, &
|
|
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(
|
|
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
|
|
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, &
|
|
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(
|
|
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
|
|
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, &
|
|
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(
|
|
1029
|
+
rb_raise(Markly_Error, "could not set fence_info");
|
|
1031
1030
|
}
|
|
1032
1031
|
|
|
1033
1032
|
return Qnil;
|
|
1034
1033
|
}
|
|
1035
1034
|
|
|
1036
|
-
|
|
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, &
|
|
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
|
|
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, &
|
|
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(
|
|
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
|
|
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, &
|
|
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
|
|
1152
|
+
return Markly_Node_wrap(parent);
|
|
1083
1153
|
}
|
|
1084
1154
|
|
|
1085
|
-
static VALUE
|
|
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, &
|
|
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(
|
|
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
|
|
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, &
|
|
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
|
|
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, &
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1214
|
-
|
|
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
|
}
|