@@ -13,6 +13,18 @@ static const char *get_type_string(cmark_syntax_extension *extension, cmark_node
13
13
return "tasklist" ;
14
14
}
15
15
16
+ char * cmark_gfm_extensions_get_tasklist_state (cmark_node * node ) {
17
+ if (!node || ((int )node -> as .opaque != CMARK_TASKLIST_CHECKED && (int )node -> as .opaque != CMARK_TASKLIST_NOCHECKED ))
18
+ return 0 ;
19
+
20
+ if ((int )node -> as .opaque != CMARK_TASKLIST_CHECKED ) {
21
+ return "checked" ;
22
+ }
23
+ else {
24
+ return "unchecked" ;
25
+ }
26
+ }
27
+
16
28
static bool parse_node_item_prefix (cmark_parser * parser , const char * input ,
17
29
cmark_node * container ) {
18
30
bool res = false;
@@ -62,13 +74,11 @@ static cmark_node *open_tasklist_item(cmark_syntax_extension *self,
62
74
cmark_node_set_syntax_extension (parent_container , self );
63
75
cmark_parser_advance_offset (parser , (char * )input , 3 , false);
64
76
65
- long userdata ;
66
77
if (strstr ((char * )input , "[x]" )) {
67
- userdata = CMARK_TASKLIST_CHECKED ;
78
+ parent_container -> as . opaque = ( void * ) CMARK_TASKLIST_CHECKED ;
68
79
} else {
69
- userdata = CMARK_TASKLIST_NOCHECKED ;
80
+ parent_container -> as . opaque = ( void * ) CMARK_TASKLIST_NOCHECKED ;
70
81
}
71
- cmark_node_set_user_data (parent_container , (void * )userdata );
72
82
73
83
return NULL ;
74
84
}
@@ -79,15 +89,14 @@ static void commonmark_render(cmark_syntax_extension *extension,
79
89
bool entering = (ev_type == CMARK_EVENT_ENTER );
80
90
if (entering ) {
81
91
renderer -> cr (renderer );
82
- long userdata = (long )cmark_node_get_user_data (node );
83
- if (userdata == CMARK_TASKLIST_CHECKED ) {
84
- renderer -> out (renderer , node , " - [x] " , false, LITERAL );
92
+ if ((int )node -> as .opaque == CMARK_TASKLIST_CHECKED ) {
93
+ renderer -> out (renderer , node , "- [x] " , false, LITERAL );
85
94
} else {
86
- renderer -> out (renderer , node , " - [ ] " , false, LITERAL );
95
+ renderer -> out (renderer , node , "- [ ] " , false, LITERAL );
87
96
}
88
- cmark_strbuf_puts (renderer -> prefix , " " );
97
+ cmark_strbuf_puts (renderer -> prefix , " " );
89
98
} else {
90
- cmark_strbuf_truncate (renderer -> prefix , renderer -> prefix -> size - 4 );
99
+ cmark_strbuf_truncate (renderer -> prefix , renderer -> prefix -> size - 2 );
91
100
renderer -> cr (renderer );
92
101
}
93
102
}
@@ -101,8 +110,7 @@ static void html_render(cmark_syntax_extension *extension,
101
110
cmark_strbuf_puts (renderer -> html , "<li" );
102
111
cmark_html_render_sourcepos (node , renderer -> html , options );
103
112
cmark_strbuf_putc (renderer -> html , '>' );
104
- long userdata = (long )cmark_node_get_user_data (node );
105
- if (userdata == CMARK_TASKLIST_CHECKED ) {
113
+ if ((int )node -> as .opaque == CMARK_TASKLIST_CHECKED ) {
106
114
cmark_strbuf_puts (renderer -> html , "<input type=\"checkbox\" checked=\"\" disabled=\"\" /> " );
107
115
} else {
108
116
cmark_strbuf_puts (renderer -> html , "<input type=\"checkbox\" disabled=\"\" /> " );
0 commit comments