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