author | Olivier Brunel
<jjk@jjacky.com> 2022-12-29 20:44:22 UTC |
committer | Olivier Brunel
<jjk@jjacky.com> 2023-07-19 12:39:53 UTC |
parent | 6b58ae194c3cd6a9b6d7f81597d5eea559961156 |
src/md4c.c | +34 | -3 |
src/md4c.h | +6 | -0 |
diff --git a/src/md4c.c b/src/md4c.c index 43d7655..c989747 100644 --- a/src/md4c.c +++ b/src/md4c.c @@ -178,7 +178,7 @@ struct MD_CTX_tag { #endif /* For resolving of inline spans. */ - MD_MARKCHAIN mark_chains[13]; + MD_MARKCHAIN mark_chains[14]; #define PTR_CHAIN (ctx->mark_chains[0]) #define TABLECELLBOUNDARIES (ctx->mark_chains[1]) #define ASTERISK_OPENERS_extraword_mod3_0 (ctx->mark_chains[2]) @@ -192,8 +192,9 @@ struct MD_CTX_tag { #define TILDE_OPENERS_2 (ctx->mark_chains[10]) #define BRACKET_OPENERS (ctx->mark_chains[11]) #define DOLLAR_OPENERS (ctx->mark_chains[12]) +#define HIGHLIGHT_OPENERS (ctx->mark_chains[13]) #define OPENERS_CHAIN_FIRST 1 -#define OPENERS_CHAIN_LAST 12 +#define OPENERS_CHAIN_LAST 13 int n_table_cell_boundaries; @@ -2434,6 +2435,7 @@ md_free_ref_defs(MD_CTX* ctx) * '*': Maybe (strong) emphasis start/end. * '_': Maybe (strong) emphasis start/end. * '~': Maybe strikethrough start/end (needs MD_FLAG_STRIKETHROUGH). + * '=': Maybe highlight start/end (needs MD_FLAG_HIGHLIGHT). * '`': Maybe code span start/end. * '&': Maybe start of entity. * ';': Maybe end of entity. @@ -2513,6 +2515,7 @@ md_mark_chain(MD_CTX* ctx, int mark_index) case _T('*'): return md_asterisk_chain(ctx, mark->flags); case _T('_'): return &UNDERSCORE_OPENERS; case _T('~'): return (mark->end - mark->beg == 1) ? &TILDE_OPENERS_1 : &TILDE_OPENERS_2; + case _T('='): return &HIGHLIGHT_OPENERS; case _T('!'): MD_FALLTHROUGH(); case _T('['): return &BRACKET_OPENERS; case _T('|'): return &TABLECELLBOUNDARIES; @@ -2738,6 +2741,9 @@ md_build_mark_char_map(MD_CTX* ctx) if(ctx->parser.flags & MD_FLAG_STRIKETHROUGH) ctx->mark_char_map['~'] = 1; + if(ctx->parser.flags & MD_FLAG_HIGHLIGHT) + ctx->mark_char_map['='] = 1; + if(ctx->parser.flags & MD_FLAG_LATEXMATHSPANS) ctx->mark_char_map['$'] = 1; @@ -3353,6 +3359,23 @@ md_collect_marks(MD_CTX* ctx, const MD_LINE* lines, int n_lines, int table_mode) continue; } + /* A potential hghlight start/end. */ + if(ch == _T('=')) { + OFF tmp = off+1; + + while(tmp < line_end && CH(tmp) == _T('=')) + tmp++; + + if(tmp - off < 3) { + unsigned flags = md_get_potential_flags(ctx, off, tmp, line->beg, line_end); + if(flags != 0) + PUSH_MARK(ch, off, tmp, flags); + } + + off = tmp; + continue; + } + /* A potential equation start/end */ if(ch == _T('$')) { /* We can have at most two consecutive $ signs, @@ -4070,6 +4093,7 @@ md_analyze_marks(MD_CTX* ctx, const MD_LINE* lines, int n_lines, case '|': md_analyze_table_cell_boundary(ctx, i); break; case '_': /* Pass through. */ case '*': md_analyze_emph(ctx, i); break; + case '=': /* Pass through */ case '~': md_analyze_tilde(ctx, i); break; case '$': md_analyze_dollar(ctx, i); break; case '.': /* Pass through. */ @@ -4127,7 +4151,7 @@ md_analyze_link_contents(MD_CTX* ctx, const MD_LINE* lines, int n_lines, int i; md_analyze_marks(ctx, lines, n_lines, mark_beg, mark_end, _T("&")); - md_analyze_marks(ctx, lines, n_lines, mark_beg, mark_end, _T("*_~$@:.")); + md_analyze_marks(ctx, lines, n_lines, mark_beg, mark_end, _T("*_~$@:.=")); for(i = OPENERS_CHAIN_FIRST; i <= OPENERS_CHAIN_LAST; i++) { ctx->mark_chains[i].head = -1; @@ -4279,6 +4303,13 @@ md_process_inlines(MD_CTX* ctx, const MD_LINE* lines, int n_lines) } break; + case '=': + if(mark->flags & MD_MARK_OPENER) + MD_ENTER_SPAN(MD_SPAN_HIGHLIGHT, NULL); + else + MD_LEAVE_SPAN(MD_SPAN_HIGHLIGHT, NULL); + break; + case '~': if(mark->flags & MD_MARK_OPENER) MD_ENTER_SPAN(MD_SPAN_DEL, NULL); diff --git a/src/md4c.h b/src/md4c.h index 95f78f9..b088795 100644 --- a/src/md4c.h +++ b/src/md4c.h @@ -132,6 +132,11 @@ typedef enum MD_SPANTYPE { */ MD_SPAN_DEL, + /* <span class="highlight">...</span> + * Note: Recognized only when MD_FLAG_HIGHLIGHT is enabled. + */ + MD_SPAN_HIGHLIGHT, + /* For recognizing inline ($) and display ($$) equations * Note: Recognized only when MD_FLAG_LATEXMATHSPANS is enabled. */ @@ -316,6 +321,7 @@ typedef struct MD_SPAN_WIKILINK { #define MD_FLAG_LATEXMATHSPANS 0x1000 /* Enable $ and $$ containing LaTeX equations. */ #define MD_FLAG_WIKILINKS 0x2000 /* Enable wiki links extension. */ #define MD_FLAG_UNDERLINE 0x4000 /* Enable underline extension (and disables '_' for normal emphasis). */ +#define MD_FLAG_HIGHLIGHT 0x40000 /* Enable highlight extension */ #define MD_FLAG_PERMISSIVEAUTOLINKS (MD_FLAG_PERMISSIVEEMAILAUTOLINKS | MD_FLAG_PERMISSIVEURLAUTOLINKS | MD_FLAG_PERMISSIVEWWWAUTOLINKS) #define MD_FLAG_NOHTML (MD_FLAG_NOHTMLBLOCKS | MD_FLAG_NOHTMLSPANS)