qemacs-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemacs-commit] qemacs markdown.c


From: Charlie Gordon
Subject: [Qemacs-commit] qemacs markdown.c
Date: Fri, 30 Jun 2017 12:21:55 -0400 (EDT)

CVSROOT:        /sources/qemacs
Module name:    qemacs
Changes by:     Charlie Gordon <chqrlie>        17/06/30 12:21:55

Modified files:
        .              : markdown.c 

Log message:
        markdown-mode: improve highlighting
        - space disables matching of bold, emphasis and italics
        - highlight link addresses

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/qemacs/markdown.c?cvsroot=qemacs&r1=1.30&r2=1.31

Patches:
Index: markdown.c
===================================================================
RCS file: /sources/qemacs/qemacs/markdown.c,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -b -r1.30 -r1.31
--- markdown.c  15 May 2017 08:00:20 -0000      1.30
+++ markdown.c  30 Jun 2017 16:21:55 -0000      1.31
@@ -40,6 +40,7 @@
     MKD_STYLE_CODE        = QE_STYLE_STRING,
     MKD_STYLE_IMAGE_LINK  = QE_STYLE_KEYWORD,
     MKD_STYLE_REF_LINK    = QE_STYLE_KEYWORD,
+    MKD_STYLE_REF_HREF    = QE_STYLE_COMMENT,
     MKD_STYLE_DLIST       = QE_STYLE_NUMBER,
     MKD_STYLE_LIST        = QE_STYLE_NUMBER,
 };
@@ -76,11 +77,15 @@
         if (str[i] != begin[i])
             return 0;
     }
+    if (qe_isspace(str[i]))
+        return 0;
+
     for (j = 0; j < min_width; j++) {
         if (str[i + j] == '\0')
             return 0;
     }
     for (i += j; str[i] != '\0'; i++) {
+        if (!qe_isspace(str[i - 1])) {
         for (j = 0; end[j]; j++) {
             if (str[i + j] != end[j])
                 break;
@@ -88,6 +93,7 @@
         if (!end[j])
             return i + j;
     }
+    }
     return 0;
 }
 
@@ -355,34 +361,36 @@
         case '#':
             break;
         case '*':  /* bold */
-            if (str[i + 1] == '*') {
                 chunk_style = MKD_STYLE_STRONG2;
                 chunk = mkd_scan_chunk(str + i, "**", "**", 1);
-            } else {
+            if (chunk)
+                break;
                 chunk_style = MKD_STYLE_STRONG1;
                 chunk = mkd_scan_chunk(str + i, "*", "*", 1);
-            }
+            if (chunk)
+                break;
             break;
         case '_':  /* emphasis */
-            if (str[i + 1] == '_') {
                 chunk_style = MKD_STYLE_EMPHASIS2;
                 chunk = mkd_scan_chunk(str + i, "__", "__", 1);
-            } else {
+            if (chunk)
+                break;
                 chunk_style = MKD_STYLE_EMPHASIS1;
                 chunk = mkd_scan_chunk(str + i, "_", "_", 1);
-            }
+            if (chunk)
+                break;
             break;
         case '`':  /* code */
             chunk_style = MKD_STYLE_CODE;
-            if (str[i + 1] == '`') {
-                if (str[i + 2] == ' ') {
                     chunk = mkd_scan_chunk(str + i, "`` ", " ``", 1);
-                } else {
+            if (chunk)
+                break;
                     chunk = mkd_scan_chunk(str + i, "``", "``", 1);
-                }
-            } else {
+            if (chunk)
+                break;
                 chunk = mkd_scan_chunk(str + i, "`", "`", 1);
-            }
+            if (chunk)
+                break;
             break;
         case '!':  /* image link ^[...: <...>] */
             chunk_style = MKD_STYLE_IMAGE_LINK;
@@ -391,30 +399,35 @@
         case '[':  /* link ^[...: <...>] */
             chunk_style = MKD_STYLE_REF_LINK;
             chunk = mkd_scan_chunk(str + i, "[", "]", 1);
+            if (chunk && str[i + chunk] == '(') {
+                i += chunk;
+                SET_COLOR(str, start, i, chunk_style);
+                chunk_style = MKD_STYLE_REF_HREF;
+                chunk = mkd_scan_chunk(str + i, "(", ")", 1);
+            }
             break;
         case '<':  /* automatic link <http://address> */
             chunk_style = MKD_STYLE_REF_LINK;
             chunk = mkd_scan_chunk(str + i, "<http", ">", 1);
             if (chunk)
                 break;
+            /* match an email address */
             for (flags = 0, j = i + 1; j < n;) {
-                if (str[j] == '@')
-                    flags |= 1;
-                if (str[j++] == '>') {
-                    flags |= 2;
-                    break;
+                int d = str[j++];
+                if (d == '@')
+                    flags++;
+                if (d == '>') {
+                    if (flags == 1) {
+                        chunk = j - i;
                 }
-            }
-            if (flags == 3) {
-                chunk = j;
                 break;
             }
+            }
             break;
         case '\\':  /* escape */
             if (strchr("\\`*_{}[]()#+-.!", str[i + 1])) {
-                i += 2;
-                SET_COLOR(str, start, i, base_style);
-                continue;
+                chunk = 2;
+                break;
             }
             break;
         }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]