diff --git a/api_test/main.c b/api_test/main.c index 0df1a7d8d..7e32ee79b 100644 --- a/api_test/main.c +++ b/api_test/main.c @@ -804,6 +804,21 @@ static void render_commonmark(test_batch_runner *runner) { free(commonmark); cmark_node_free(plain_break_doc); + // An info string containing a backtick forces a tilde fence, which must + // be longer than any run of tildes in the code. + static const char tilde_fence[] = "~~~~~ a`b\n" + "~~~\n" + "x\n" + "~~~~~\n"; + cmark_node *tilde_fence_doc = + cmark_parse_document(tilde_fence, sizeof(tilde_fence) - 1, + CMARK_OPT_DEFAULT); + commonmark = cmark_render_commonmark(tilde_fence_doc, CMARK_OPT_DEFAULT, 0); + STR_EQ(runner, commonmark, "~~~~ a`b\n~~~\nx\n~~~~\n", + "render tilde fence longer than tildes in code"); + free(commonmark); + cmark_node_free(tilde_fence_doc); + cmark_node_free(text); cmark_node_free(doc); } diff --git a/src/commonmark.c b/src/commonmark.c index 44ee695d2..1b6268f3f 100644 --- a/src/commonmark.c +++ b/src/commonmark.c @@ -73,13 +73,13 @@ static inline void outc(cmark_renderer *renderer, cmark_escaping escape, } } -static int longest_backtick_sequence(const char *code) { +static int longest_char_sequence(const char *code, char c) { int longest = 0; int current = 0; size_t i = 0; size_t code_len = strlen(code); while (i <= code_len) { - if (code[i] == '`') { + if (code[i] == c) { current++; } else { if (current > longest) { @@ -281,7 +281,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node, fencechar[0] = strchr(info, '`') == NULL ? '`' : '~'; code = cmark_node_get_literal(node); - numticks = longest_backtick_sequence(code) + 1; + numticks = longest_char_sequence(code, fencechar[0]) + 1; if (numticks < 3) { numticks = 3; }