Skip to content

Commit 9f7ca02

Browse files
gjtorikianAshe Connor
authored andcommitted
Adjustments to how the tasklist generation occurs (commonmark#136)
* Adjustments to how the tasklist generation occurs * hit it until it passes spec * clean up compiler warnings
1 parent 4b9523d commit 9f7ca02

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

extensions/cmark-gfm-core-extensions.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ uint8_t *cmark_gfm_extensions_get_table_alignments(cmark_node *node);
2121
CMARK_GFM_EXTENSIONS_EXPORT
2222
int cmark_gfm_extensions_get_table_row_is_header(cmark_node *node);
2323

24+
CMARK_GFM_EXTENSIONS_EXPORT
25+
char *cmark_gfm_extensions_get_tasklist_state(cmark_node *node);
26+
2427
#ifdef __cplusplus
2528
}
2629
#endif

extensions/tasklist.c

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,18 @@ static const char *get_type_string(cmark_syntax_extension *extension, cmark_node
1313
return "tasklist";
1414
}
1515

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+
1628
static bool parse_node_item_prefix(cmark_parser *parser, const char *input,
1729
cmark_node *container) {
1830
bool res = false;
@@ -62,13 +74,11 @@ static cmark_node *open_tasklist_item(cmark_syntax_extension *self,
6274
cmark_node_set_syntax_extension(parent_container, self);
6375
cmark_parser_advance_offset(parser, (char *)input, 3, false);
6476

65-
long userdata;
6677
if (strstr((char*)input, "[x]")) {
67-
userdata = CMARK_TASKLIST_CHECKED;
78+
parent_container->as.opaque = (void *)CMARK_TASKLIST_CHECKED;
6879
} else {
69-
userdata = CMARK_TASKLIST_NOCHECKED;
80+
parent_container->as.opaque = (void *)CMARK_TASKLIST_NOCHECKED;
7081
}
71-
cmark_node_set_user_data(parent_container, (void*)userdata);
7282

7383
return NULL;
7484
}
@@ -79,15 +89,14 @@ static void commonmark_render(cmark_syntax_extension *extension,
7989
bool entering = (ev_type == CMARK_EVENT_ENTER);
8090
if (entering) {
8191
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);
8594
} else {
86-
renderer->out(renderer, node, " - [ ] ", false, LITERAL);
95+
renderer->out(renderer, node, "- [ ] ", false, LITERAL);
8796
}
88-
cmark_strbuf_puts(renderer->prefix, " ");
97+
cmark_strbuf_puts(renderer->prefix, " ");
8998
} else {
90-
cmark_strbuf_truncate(renderer->prefix, renderer->prefix->size - 4);
99+
cmark_strbuf_truncate(renderer->prefix, renderer->prefix->size - 2);
91100
renderer->cr(renderer);
92101
}
93102
}
@@ -101,8 +110,7 @@ static void html_render(cmark_syntax_extension *extension,
101110
cmark_strbuf_puts(renderer->html, "<li");
102111
cmark_html_render_sourcepos(node, renderer->html, options);
103112
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) {
106114
cmark_strbuf_puts(renderer->html, "<input type=\"checkbox\" checked=\"\" disabled=\"\" /> ");
107115
} else {
108116
cmark_strbuf_puts(renderer->html, "<input type=\"checkbox\" disabled=\"\" /> ");

0 commit comments

Comments
 (0)