improves markdown mode

* made verbatim block coloring completely generic using language name lookup
* removed global references to most snytax coloring modes
This commit is contained in:
Charlie Gordon 2015-06-19 14:34:30 +00:00
commit a80d4e2dd4
6 changed files with 64 additions and 71 deletions

View file

@ -1753,7 +1753,7 @@ ModeDef as_mode = {
.fallback = &c_mode,
};
ModeDef java_mode = {
static ModeDef java_mode = {
.name = "Java",
.extensions = "jav|java",
.colorize_func = c_colorize_line,
@ -1765,7 +1765,7 @@ ModeDef java_mode = {
.fallback = &c_mode,
};
ModeDef scala_mode = {
static ModeDef scala_mode = {
.name = "Scala",
.extensions = "scala|sbt",
.colorize_func = c_colorize_line,

View file

@ -1708,7 +1708,7 @@ static void lua_colorize_line(QEColorizeContext *cp,
cp->colorize_state = state;
}
ModeDef lua_mode = {
static ModeDef lua_mode = {
.name = "Lua",
.extensions = "lua",
.shell_handlers = "lua",
@ -2183,7 +2183,7 @@ static void haskell_colorize_line(QEColorizeContext *cp,
cp->colorize_state = state;
}
ModeDef haskell_mode = {
static ModeDef haskell_mode = {
.name = "Haskell",
.extensions = "hs|haskell",
.shell_handlers = "haskell",
@ -2401,7 +2401,7 @@ static void python_colorize_line(QEColorizeContext *cp,
cp->colorize_state = state;
}
ModeDef python_mode = {
static ModeDef python_mode = {
.name = "Python",
.extensions = "py|pyt",
.shell_handlers = "python|python2.6|python2.7",
@ -2882,7 +2882,7 @@ static int ruby_mode_probe(ModeDef *mode, ModeProbeData *p)
return 1;
}
ModeDef ruby_mode = {
static ModeDef ruby_mode = {
.name = "Ruby",
.extensions = "rb|gemspec",
.keywords = ruby_keywords,

View file

@ -49,26 +49,12 @@ enum {
IN_MKD_HTML_BLOCK = 0x8000,
IN_MKD_HTML_COMMENT = 0xC000,
MKD_LANG_SHIFT = 11,
MKD_LANG_MAX = 16,
MKD_LANG_MAX = (IN_MKD_BLOCK >> MKD_LANG_SHIFT),
MKD_LEVEL_SHIFT = 8,
MKD_LEVEL_MAX = 7,
};
ModeDef *mkd_lang_def[MKD_LANG_MAX - 1] = {
NULL,
&js_mode,
&java_mode,
&scala_mode,
&php_mode,
&csharp_mode,
&python_mode,
&ruby_mode,
&haskell_mode,
&lua_mode,
&swift_mode,
&cpp_mode,
&c_mode,
};
ModeDef *mkd_lang_def[MKD_LANG_MAX + 1];
#define MKD_BULLET_STYLES 4
static int MkdBulletStyles[MKD_BULLET_STYLES] = {
@ -127,27 +113,6 @@ static void mkd_colorize_line(QEColorizeContext *cp,
return;
}
if (colstate & IN_MKD_HTML_BLOCK) {
if (str[i] != '<' && str[i] != '\0' && !qe_isblank(str[i])) {
/* formating error, exit html block */
colstate = 0;
}
}
if ((colstate & IN_MKD_HTML_BLOCK)
|| (str[i] == '<' && str[i + 1] != '/')) {
/* block level HTML markup */
colstate &= ~IN_MKD_HTML_BLOCK;
cp->colorize_state = colstate;
htmlsrc_mode.colorize_func(cp, str, n, &htmlsrc_mode);
colstate = cp->colorize_state;
colstate |= IN_MKD_HTML_BLOCK;
if ((str[i] & CHAR_MASK) == '<' && (str[i + 1] & CHAR_MASK) == '/')
colstate = 0;
cp->colorize_state = colstate;
return;
}
if (str[i] == '>') {
if (str[++i] == ' ')
i++;
@ -167,7 +132,7 @@ static void mkd_colorize_line(QEColorizeContext *cp,
cp->colorize_state = colstate & IN_MKD_LANG_STATE;
if (lang < countof(mkd_lang_def) && mkd_lang_def[lang]) {
if (mkd_lang_def[lang]) {
mkd_lang_def[lang]->colorize_func(cp, str + i, n - i, mkd_lang_def[lang]);
} else {
SET_COLOR(str, i, n, MKD_STYLE_CODE);
@ -180,6 +145,27 @@ static void mkd_colorize_line(QEColorizeContext *cp,
return;
}
if (colstate & IN_MKD_HTML_BLOCK) {
if (i < n && str[i] != '<' && !qe_isblank(str[i])) {
/* formating error, exit html block */
colstate = 0;
}
}
if ((colstate & IN_MKD_HTML_BLOCK)
|| (str[i] == '<' && (str[i + 1] == '!' || str[i + 1] == '?' || qe_isalpha(str[i + 1])))) {
/* block level HTML markup */
colstate &= ~IN_MKD_HTML_BLOCK;
cp->colorize_state = colstate;
htmlsrc_mode.colorize_func(cp, str, n, &htmlsrc_mode);
colstate = cp->colorize_state;
colstate |= IN_MKD_HTML_BLOCK;
if ((str[i] & CHAR_MASK) == '<' && (str[i + 1] & CHAR_MASK) == '/')
colstate = 0;
cp->colorize_state = colstate;
return;
}
if (str[i] == '#') {
/* Check for heading: initial string of '#' followed by ' ' */
for (i++; str[i] == '#'; i++)
@ -218,15 +204,25 @@ static void mkd_colorize_line(QEColorizeContext *cp,
if (ustrstart(str + i, "~~~", NULL)
|| ustrstart(str + i, "```", NULL)) {
/* verbatim block */
int lang;
char lang_name[16];
int lang = MKD_LANG_MAX, len;
ModeDef *m;
colstate &= ~(IN_MKD_BLOCK | IN_MKD_LANG_STATE);
for (j = i + 3; qe_isspace(str[j]); j++)
for (i += 3; qe_isspace(str[i]); i++)
continue;
for (lang = 1; lang < countof(mkd_lang_def); lang++) {
if (mkd_lang_def[lang]
&& ustristart(str + j, mkd_lang_def[lang]->name, NULL))
break;
for (len = 0; i < n && qe_isalnum_(str[i]); i++) {
if (len < countof(lang_name) - 1)
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;
}
}
colstate |= lang << MKD_LANG_SHIFT;
i = n;

29
qe.c
View file

@ -90,6 +90,21 @@ static int generic_mode_probe(ModeDef *mode, ModeProbeData *p)
return 1;
}
ModeDef *qe_find_mode(const char *name, int flags)
{
QEmacsState *qs = &qe_state;
ModeDef *m;
for (m = qs->first_mode; m; m = m->next) {
if ((m->flags & flags) == flags) {
if ((m->name && !strcasecmp(m->name, name))
|| (m->mode_name && !strcasecmp(m->mode_name, name)))
break;
}
}
return m;
}
void qe_register_mode(ModeDef *m, int flags)
{
QEmacsState *qs = &qe_state;
@ -183,18 +198,6 @@ void mode_completion(CompleteState *cp)
}
}
static ModeDef *find_mode(const char *name)
{
QEmacsState *qs = &qe_state;
ModeDef *m;
for (m = qs->first_mode; m != NULL; m = m->next) {
if (strequal(m->mode_name, name))
break;
}
return m;
}
/* commands handling */
CmdDef *qe_find_cmd(const char *cmd_name)
@ -1890,7 +1893,7 @@ void do_set_mode(EditState *s, const char *name)
ModeDef *m;
/* XXX: should check if mode is appropriate */
m = find_mode(name);
m = qe_find_mode(name, 0);
if (m)
edit_set_mode(s, m);
else

8
qe.h
View file

@ -1510,6 +1510,7 @@ typedef struct CmdDef {
#define CMD_DEF_END \
{ 0, 0, NULL, { NULL }, CMD_void, 0 }
ModeDef *qe_find_mode(const char *name, int flags);
void qe_register_mode(ModeDef *m, int flags);
void mode_completion(CompleteState *cp);
void qe_register_cmd_table(CmdDef *cmds, ModeDef *m);
@ -1987,18 +1988,11 @@ void do_dired(EditState *s);
extern ModeDef c_mode;
extern ModeDef cpp_mode;
extern ModeDef js_mode;
extern ModeDef java_mode;
extern ModeDef scala_mode;
extern ModeDef php_mode;
extern ModeDef csharp_mode;
extern ModeDef css_mode;
extern ModeDef swift_mode;
extern ModeDef xml_mode;
extern ModeDef htmlsrc_mode;
extern ModeDef lua_mode;
extern ModeDef haskell_mode;
extern ModeDef python_mode;
extern ModeDef ruby_mode;
/* html.c */

View file

@ -328,7 +328,7 @@ static const char swift_types[] = {
"CChar32|CFloat|CDouble|"
};
ModeDef swift_mode = {
static ModeDef swift_mode = {
.name = "Swift",
.extensions = "swift",
.shell_handlers = "swift",