md4c

C Markdown parser. Fast. SAX-like interface. Compliant to CommonMark specification.
git clone https://noulin.net/git/md4c.git
Log | Files | Refs | README | LICENSE

commit 5980578054ff655c86c8898d75f00d8da73df253
parent dac9acdb46e20c793bacca3e5c137f96ef1e9488
Author: Martin Mitas <mity@morous.org>
Date:   Sat,  8 Oct 2016 22:37:39 +0200

Fix: Handle empty and/or unclosed fenced code block.

Diffstat:
Mmd4c/md4c.c | 17+++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/md4c/md4c.c b/md4c/md4c.c @@ -114,7 +114,6 @@ enum MD_LINETYPE_tag { MD_LINE_SETEXTHEADER, MD_LINE_SETEXTUNDERLINE, MD_LINE_INDENTEDCODE, - MD_LINE_CODEFENCE, MD_LINE_FENCEDCODE, MD_LINE_HTML, MD_LINE_TEXT @@ -1174,11 +1173,18 @@ md_process_code_block(MD_CTX* ctx, const MD_LINE* lines, int n_lines) while(n_lines > 0 && lines[n_lines-1].beg == lines[n_lines-1].end) { n_lines--; } + } - if(n_lines == 0) - return 0; + /* Skip the first line in case of fenced code: It is the fence. + * (Only the starting fence is present due to logic in md_analyze_line().) */ + if(lines[0].type == MD_LINE_FENCEDCODE) { + lines++; + n_lines--; } + if(n_lines == 0) + return 0; + return md_process_verbatim_block(ctx, MD_TEXT_CODE, lines, n_lines); } @@ -1514,7 +1520,7 @@ redo_indentation_after_blockquote_mark: line->beg = off; /* Check whether we are fenced code continuation. */ - if(pivot_line->type == MD_LINE_FENCEDCODE || pivot_line->type == MD_LINE_CODEFENCE) { + if(pivot_line->type == MD_LINE_FENCEDCODE) { /* We are another MD_LINE_FENCEDCODE unless we are closing fence * which we transform into MD_LINE_BLANK. */ if(line->indent < ctx->code_indent_offset) { @@ -1608,7 +1614,7 @@ redo_indentation_after_blockquote_mark: if(CH(off) == _T('`') || CH(off) == _T('~')) { if(md_is_opening_code_fence(ctx, off, &off) == 0) { ctx->code_fence_indent = line->indent; - line->type = MD_LINE_CODEFENCE; + line->type = MD_LINE_FENCEDCODE; goto done; } } @@ -1751,7 +1757,6 @@ md_process_block(MD_CTX* ctx, const MD_LINE* lines, int n_lines) break; case MD_LINE_SETEXTUNDERLINE: - case MD_LINE_CODEFENCE: /* Noop. */ return 0;