[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;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemacs-commit] qemacs markdown.c,
Charlie Gordon <=