diff options
author | Kai Köhne <kai.koehne@qt.io> | 2021-06-07 12:11:30 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-06-15 22:40:12 +0000 |
commit | f9a757ad81b0e4b187d7e6f5e1f531c0c909afe8 (patch) | |
tree | 0d263208ecb848f91a5eb4dfb9a4c8d82d57c601 /src | |
parent | 5671daa48746aeca3d1864be1196746c09e87077 (diff) |
Update md4c to 0.4.8
Change-Id: Ib0e1ef259696aa380aba0819aa4e1d8a12b4a21d
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
(cherry picked from commit 1759626cd61fbc765d21ce458cc5d472db087f3e)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/3rdparty/md4c/md4c.c | 91 | ||||
-rw-r--r-- | src/3rdparty/md4c/qt_attribution.json | 4 |
2 files changed, 67 insertions, 28 deletions
diff --git a/src/3rdparty/md4c/md4c.c b/src/3rdparty/md4c/md4c.c index 19ba212a09..6aeef112e5 100644 --- a/src/3rdparty/md4c/md4c.c +++ b/src/3rdparty/md4c/md4c.c @@ -588,7 +588,7 @@ struct MD_UNICODE_FOLD_INFO_tag { #define R(cp_min, cp_max) ((cp_min) | 0x40000000), ((cp_max) | 0x80000000) #define S(cp) (cp) /* Unicode "Pc", "Pd", "Pe", "Pf", "Pi", "Po", "Ps" categories. - * (generated by scripts/build_punct_map.py) */ + * (generated by scripts/build_folding_map.py) */ static const unsigned FOLD_MAP_1[] = { R(0x0041,0x005a), S(0x00b5), R(0x00c0,0x00d6), R(0x00d8,0x00de), R(0x0100,0x012e), R(0x0132,0x0136), R(0x0139,0x0147), R(0x014a,0x0176), S(0x0178), R(0x0179,0x017d), S(0x017f), S(0x0181), S(0x0182), @@ -3611,6 +3611,34 @@ md_resolve_links(MD_CTX* ctx, const MD_LINE* lines, int n_lines) } md_analyze_link_contents(ctx, lines, n_lines, opener_index+1, closer_index); + + /* If the link text is formed by nothing but permissive autolink, + * suppress the autolink. + * See https://github.com/mity/md4c/issues/152 for more info. */ + if(ctx->parser.flags & MD_FLAG_PERMISSIVEAUTOLINKS) { + MD_MARK* first_nested; + MD_MARK* last_nested; + + first_nested = opener + 1; + while(first_nested->ch == _T('D') && first_nested < closer) + first_nested++; + + last_nested = closer - 1; + while(first_nested->ch == _T('D') && last_nested > opener) + last_nested--; + + if((first_nested->flags & MD_MARK_RESOLVED) && + first_nested->beg == opener->end && + ISANYOF_(first_nested->ch, _T("@:.")) && + first_nested->next == (last_nested - ctx->marks) && + last_nested->end == closer->beg) + { + first_nested->ch = _T('D'); + first_nested->flags &= ~MD_MARK_RESOLVED; + last_nested->ch = _T('D'); + last_nested->flags &= ~MD_MARK_RESOLVED; + } + } } opener_index = next_index; @@ -5525,7 +5553,7 @@ md_push_container(MD_CTX* ctx, const MD_CONTAINER* container) } static int -md_enter_child_containers(MD_CTX* ctx, int n_children, unsigned data) +md_enter_child_containers(MD_CTX* ctx, int n_children) { int i; int ret = 0; @@ -5550,7 +5578,7 @@ md_enter_child_containers(MD_CTX* ctx, int n_children, unsigned data) MD_CHECK(md_push_container_bytes(ctx, (is_ordered_list ? MD_BLOCK_OL : MD_BLOCK_UL), - c->start, data, MD_BLOCK_CONTAINER_OPENER)); + c->start, c->ch, MD_BLOCK_CONTAINER_OPENER)); MD_CHECK(md_push_container_bytes(ctx, MD_BLOCK_LI, c->task_mark_off, (c->is_task ? CH(c->task_mark_off) : 0), @@ -5779,25 +5807,30 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OFF* p_end, /* Check whether we are HTML block continuation. */ if(pivot_line->type == MD_LINE_HTML && ctx->html_block_type > 0) { - int html_block_type; + if(n_parents < ctx->n_containers) { + /* HTML block is implicitly ended if the enclosing container + * block ends. */ + ctx->html_block_type = 0; + } else { + int html_block_type; - html_block_type = md_is_html_block_end_condition(ctx, off, &off); - if(html_block_type > 0) { - MD_ASSERT(html_block_type == ctx->html_block_type); + html_block_type = md_is_html_block_end_condition(ctx, off, &off); + if(html_block_type > 0) { + MD_ASSERT(html_block_type == ctx->html_block_type); - /* Make sure this is the last line of the block. */ - ctx->html_block_type = 0; + /* Make sure this is the last line of the block. */ + ctx->html_block_type = 0; - /* Some end conditions serve as blank lines at the same time. */ - if(html_block_type == 6 || html_block_type == 7) { - line->type = MD_LINE_BLANK; - line->indent = 0; - break; + /* Some end conditions serve as blank lines at the same time. */ + if(html_block_type == 6 || html_block_type == 7) { + line->type = MD_LINE_BLANK; + line->indent = 0; + break; + } } - } - if(n_parents == ctx->n_containers) { line->type = MD_LINE_HTML; + n_parents = ctx->n_containers; break; } } @@ -5864,7 +5897,7 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OFF* p_end, /* Check whether we are Setext underline. */ if(line->indent < ctx->code_indent_offset && pivot_line->type == MD_LINE_TEXT - && (CH(off) == _T('=') || CH(off) == _T('-')) + && off < ctx->size && ISANYOF2(off, _T('='), _T('-')) && (n_parents == ctx->n_containers)) { unsigned level; @@ -5877,7 +5910,10 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OFF* p_end, } /* Check for thematic break line. */ - if(line->indent < ctx->code_indent_offset && ISANYOF(off, _T("-_*")) && off >= hr_killer) { + if(line->indent < ctx->code_indent_offset + && off < ctx->size && off >= hr_killer + && ISANYOF(off, _T("-_*"))) + { if(md_is_hr_line(ctx, off, &off, &hr_killer)) { line->type = MD_LINE_HR; break; @@ -5941,7 +5977,7 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OFF* p_end, { /* Noop. List mark followed by a blank line cannot interrupt a paragraph. */ } else if(pivot_line->type == MD_LINE_TEXT && n_parents == ctx->n_containers && - (container.ch == _T('.') || container.ch == _T(')')) && container.start != 1) + ISANYOF2_(container.ch, _T('.'), _T(')')) && container.start != 1) { /* Noop. Ordered list cannot interrupt a paragraph unless the start index is 1. */ } else { @@ -5982,7 +6018,9 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OFF* p_end, } /* Check for ATX header. */ - if(line->indent < ctx->code_indent_offset && CH(off) == _T('#')) { + if(line->indent < ctx->code_indent_offset && + off < ctx->size && CH(off) == _T('#')) + { unsigned level; if(md_is_atxheader_line(ctx, off, &line->beg, &off, &level)) { @@ -5993,7 +6031,7 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OFF* p_end, } /* Check whether we are starting code fence. */ - if(CH(off) == _T('`') || CH(off) == _T('~')) { + if(off < ctx->size && ISANYOF2(off, _T('`'), _T('~'))) { if(md_is_opening_code_fence(ctx, off, &off)) { line->type = MD_LINE_FENCEDCODE; line->data = 1; @@ -6002,7 +6040,8 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OFF* p_end, } /* Check for start of raw HTML block. */ - if(CH(off) == _T('<') && !(ctx->parser.flags & MD_FLAG_NOHTMLBLOCKS)) + if(off < ctx->size && CH(off) == _T('<') + && !(ctx->parser.flags & MD_FLAG_NOHTMLBLOCKS)) { ctx->html_block_type = md_is_html_block_start_condition(ctx, off); @@ -6023,9 +6062,9 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OFF* p_end, } /* Check for table underline. */ - if((ctx->parser.flags & MD_FLAG_TABLES) && pivot_line->type == MD_LINE_TEXT && - (CH(off) == _T('|') || CH(off) == _T('-') || CH(off) == _T(':')) && - n_parents == ctx->n_containers) + if((ctx->parser.flags & MD_FLAG_TABLES) && pivot_line->type == MD_LINE_TEXT + && off < ctx->size && ISANYOF3(off, _T('|'), _T('-'), _T(':')) + && n_parents == ctx->n_containers) { unsigned col_count; @@ -6157,7 +6196,7 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OFF* p_end, } if(n_children > 0) - MD_CHECK(md_enter_child_containers(ctx, n_children, line->data)); + MD_CHECK(md_enter_child_containers(ctx, n_children)); abort: return ret; diff --git a/src/3rdparty/md4c/qt_attribution.json b/src/3rdparty/md4c/qt_attribution.json index 8f2296e2d2..29c0666f2d 100644 --- a/src/3rdparty/md4c/qt_attribution.json +++ b/src/3rdparty/md4c/qt_attribution.json @@ -9,7 +9,7 @@ "License": "MIT License", "LicenseId": "MIT", "LicenseFile": "LICENSE.md", - "Version": "0.4.7", - "DownloadLocation": "https://github.com/mity/md4c/releases/tag/release-0.4.7", + "Version": "0.4.8", + "DownloadLocation": "https://github.com/mity/md4c/releases/tag/release-0.4.8", "Copyright": "Copyright © 2016-2020 Martin Mitáš" } |