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: Sun, 06 Mar 2016 18:09:26 +0000

CVSROOT:        /sources/qemacs
Module name:    qemacs
Changes by:     Charlie Gordon <chqrlie>        16/03/06 18:09:26

Modified files:
        .              : markdown.c 

Log message:
        markdown: added support for literate modes
        - added mkd_add_lang() to handle language tags more generically
        - added default language for literate modes
        - added syntax colorizer for litcoffee

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

Patches:
Index: markdown.c
===================================================================
RCS file: /sources/qemacs/qemacs/markdown.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -b -r1.22 -r1.23
--- markdown.c  27 Aug 2015 23:03:40 -0000      1.22
+++ markdown.c  6 Mar 2016 18:09:26 -0000       1.23
@@ -20,6 +20,8 @@
 
 #include "qe.h"
 
+extern ModeDef litcoffee_mode;
+
 enum {
     /* TODO: define specific styles */
     MKD_STYLE_HEADING1    = QE_STYLE_FUNCTION,
@@ -88,12 +90,30 @@
     return 0;
 }
 
+static int mkd_add_lang(const char *lang_name) {
+    ModeDef *m;
+    int lang = 0;
+
+    if (lang_name && (m = qe_find_mode(lang_name, MODEF_SYNTAX)) != NULL) {
+        for (lang = 1; lang < MKD_LANG_MAX; lang++) {
+            if (mkd_lang_def[lang] == NULL)
+                mkd_lang_def[lang] = m;
+            if (mkd_lang_def[lang] == m)
+                break;
+        }
+    }
+    return lang;
+}
+
 static void mkd_colorize_line(QEColorizeContext *cp,
                               unsigned int *str, int n, ModeDef *syn)
 {
     int colstate = cp->colorize_state;
     int level, indent, i = 0, j, start = i, base_style = 0;
 
+    if (syn == &litcoffee_mode)
+        base_style = MKD_STYLE_COMMENT;
+
     if (str[i] == '<' && str[i + 1] == '!' && str[i + 2] == '-' && str[i + 3] 
== '-') {
         colstate |= IN_MKD_HTML_COMMENT;
         i += 3;
@@ -130,16 +150,15 @@
         } else {
             int lang = (colstate & IN_MKD_BLOCK) >> MKD_LANG_SHIFT;
 
-            cp->colorize_state = colstate & IN_MKD_LANG_STATE;
-
             if (mkd_lang_def[lang]) {
+                cp->colorize_state = colstate & IN_MKD_LANG_STATE;
                 mkd_lang_def[lang]->colorize_func(cp, str + i, n - i, 
mkd_lang_def[lang]);
+                colstate &= ~IN_MKD_LANG_STATE;
+                colstate |= cp->colorize_state & IN_MKD_LANG_STATE;
             } else {
                 SET_COLOR(str, i, n, MKD_STYLE_CODE);
             }
             i = n;
-            colstate &= ~IN_MKD_LANG_STATE;
-            colstate |= cp->colorize_state & IN_MKD_LANG_STATE;
         }
         cp->colorize_state = colstate;
         return;
@@ -205,8 +224,7 @@
     ||  ustrstart(str + i, "```", NULL)) {
         /* verbatim block */
         char lang_name[16];
-        int lang = MKD_LANG_MAX, len;
-        ModeDef *m;
+        int lang = syn->colorize_flags, len;  // was MKD_LANG_MAX
 
         colstate &= ~(IN_MKD_BLOCK | IN_MKD_LANG_STATE);
         for (i += 3; qe_isblank(str[i]); i++)
@@ -216,13 +234,8 @@
                 lang_name[len++] = str[i];
         }
         lang_name[len] = '\0';
-        if (len > 0 && (m = qe_find_mode(lang_name, MODEF_SYNTAX)) != NULL) {
-            for (lang = 1; lang < MKD_LANG_MAX; lang++) {
-                if (mkd_lang_def[lang] == NULL)
-                    mkd_lang_def[lang] = m;
-                if (mkd_lang_def[lang] == m)
-                    break;
-            }
+        if (len) {
+            lang = mkd_add_lang(lang_name);
         }
         colstate |= lang << MKD_LANG_SHIFT;
         i = n;
@@ -265,9 +278,18 @@
         indent -= level * 4;
 
         if (indent >= 4) {
+            int lang = syn->colorize_flags; /* default language */
+
             /* Should detect sequel lines in ordered/unordered lists */
+            if (mkd_lang_def[lang]) {
+                cp->colorize_state = colstate & IN_MKD_LANG_STATE;
+                mkd_lang_def[lang]->colorize_func(cp, str + 4, n - 4, 
mkd_lang_def[lang]);
+                colstate &= ~IN_MKD_LANG_STATE;
+                colstate |= cp->colorize_state & IN_MKD_LANG_STATE;
+            } else {
+                SET_COLOR(str, i, n, MKD_STYLE_CODE);
+            }
             i = n;
-            SET_COLOR(str, start, i, MKD_STYLE_CODE);
         }
     }
 
@@ -827,10 +849,30 @@
     .colorize_func = mkd_colorize_line,
 };
 
+static int litcoffee_mode_init(EditState *s, EditBuffer *b, int flags)
+{
+    if (s) {
+        s->b->tab_width = 4;
+        s->indent_tabs_mode = 0;
+        s->wrap = WRAP_WORD;
+        s->mode->colorize_flags = mkd_add_lang("coffee");
+    }
+    return 0;
+}
+
+ModeDef litcoffee_mode = {
+    .name = "LitCoffee",
+    .extensions = "litcoffee",
+    .mode_init = litcoffee_mode_init,
+    .colorize_func = mkd_colorize_line,
+};
+
 static int mkd_init(void)
 {
     qe_register_mode(&mkd_mode, MODEF_SYNTAX);
     qe_register_cmd_table(mkd_commands, &mkd_mode);
+    qe_register_mode(&litcoffee_mode, MODEF_SYNTAX);
+    qe_register_cmd_table(mkd_commands, &litcoffee_mode);
 
     return 0;
 }



reply via email to

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