Welcome to little lamb

Code » md4c » commit 102f276

Add HIGHLIGHT extension so =foo= gets highlighted

author Olivier Brunel
2022-12-29 20:44:22 UTC
committer Olivier Brunel
2022-12-31 22:05:45 UTC
parent 954b51c1dcdfce2d552459e382c75cb76173cb17

Add HIGHLIGHT extension so =foo= gets highlighted

src/md4c.c +39 -3
src/md4c.h +6 -0

diff --git a/src/md4c.c b/src/md4c.c
index 190ad47..274b395 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[14];
+    MD_MARKCHAIN mark_chains[15];
 #define PTR_CHAIN                               (ctx->mark_chains[0])
 #define TABLECELLBOUNDARIES                     (ctx->mark_chains[1])
 #define ASTERISK_OPENERS_extraword_mod3_0       (ctx->mark_chains[2])
@@ -193,8 +193,9 @@ struct MD_CTX_tag {
 #define BRACKET_OPENERS                         (ctx->mark_chains[11])
 #define DOLLAR_OPENERS                          (ctx->mark_chains[12])
 #define ITALIC_OPENERS                          (ctx->mark_chains[13])
+#define HIGHLIGHT_OPENERS                       (ctx->mark_chains[14])
 #define OPENERS_CHAIN_FIRST                     1
-#define OPENERS_CHAIN_LAST                      13
+#define OPENERS_CHAIN_LAST                      14
 
     int n_table_cell_boundaries;
 
@@ -2437,6 +2438,7 @@ md_free_ref_defs(MD_CTX* ctx)
  *  '_': Maybe (strong) emphasis start/end.
  *  '~': Maybe strikethrough start/end (needs MD_FLAG_STRIKETHROUGH).
  *  '/': Maybe italic start/end (needs MD_FLAG_ITALIC).
+ *  '=': Maybe highlight start/end (needs MD_FLAG_HIGHLIGHT).
  *  '`': Maybe code span start/end.
  *  '&': Maybe start of entity.
  *  ';': Maybe end of entity.
@@ -2517,6 +2519,7 @@ md_mark_chain(MD_CTX* ctx, int mark_index)
         case _T('_'):   return &UNDERSCORE_OPENERS;
         case _T('~'):   return (mark->end - mark->beg == 1) ? &TILDE_OPENERS_1 : &TILDE_OPENERS_2;
         case _T('/'):   return &ITALIC_OPENERS;
+        case _T('='):   return &HIGHLIGHT_OPENERS;
         case _T('!'):   MD_FALLTHROUGH();
         case _T('['):   return &BRACKET_OPENERS;
         case _T('|'):   return &TABLECELLBOUNDARIES;
@@ -2745,6 +2748,9 @@ md_build_mark_char_map(MD_CTX* ctx)
     if(ctx->parser.flags & MD_FLAG_ITALIC)
         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;
 
@@ -3346,6 +3352,28 @@ 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 = 0;
+
+                    if(tmp < line_end  &&  !ISUNICODEWHITESPACE(tmp))
+                        flags |= MD_MARK_POTENTIAL_OPENER;
+                    if(off > line->beg  &&  !ISUNICODEWHITESPACEBEFORE(off))
+                        flags |= MD_MARK_POTENTIAL_CLOSER;
+                    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,
@@ -4064,6 +4092,7 @@ md_analyze_marks(MD_CTX* ctx, const MD_LINE* lines, int n_lines,
             case '_':   /* Pass through. */
             case '*':   md_analyze_emph(ctx, i); break;
             case '/':   /* Pass through */
+            case '=':   /* Pass through */
             case '~':   md_analyze_tilde(ctx, i); break;
             case '$':   md_analyze_dollar(ctx, i); break;
             case '.':   /* Pass through. */
@@ -4121,7 +4150,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;
@@ -4287,6 +4316,13 @@ md_process_inlines(MD_CTX* ctx, const MD_LINE* lines, int n_lines)
                         MD_LEAVE_SPAN(MD_SPAN_EM, NULL);
                     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 dd633e8..642148f 100644
--- a/src/md4c.h
+++ b/src/md4c.h
@@ -135,6 +135,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.
      */
@@ -328,6 +333,7 @@ typedef struct MD_SPAN_WIKILINK {
 #define MD_FLAG_ITALIC                      0x8000  /* Enable italic (/foo/) extension. */
 #define MD_FLAG_BOLD                        0x10000 /* Enable bold extension */
 #define MD_FLAG_BOX                         0x20000 /* Enable box extension */
+#define MD_FLAG_HIGHLIGHT                   0x40000 /* Enable box extension */
 
 #define MD_FLAG_PERMISSIVEAUTOLINKS         (MD_FLAG_PERMISSIVEEMAILAUTOLINKS | MD_FLAG_PERMISSIVEURLAUTOLINKS | MD_FLAG_PERMISSIVEWWWAUTOLINKS)
 #define MD_FLAG_NOHTML                      (MD_FLAG_NOHTMLBLOCKS | MD_FLAG_NOHTMLSPANS)