我想只突出显示如下的关键字:{KEYWORD}
(基本上大写的单词包含在{}
个括号中)
我通过复制Mustache Overlay demo中的代码并将双括号替换为单个括号来尝试此操作:
CodeMirror.defineMode('mymode', function(config, parserConfig) {
var mymodeOverlay = {
token: function(stream, state) {
if (stream.match("{")) {
while ((ch = stream.next()) != null)
if (ch == "}" && stream.next() == "}") break;
return 'mymode';
}
while (stream.next() != null && !stream.match("{", false)) {}
return null;
}
};
return CodeMirror.overlayParser(CodeMirror.getMode(config, parserConfig.backdrop || "text/html"), mymodeOverlay);
});
但它不能很好地工作:)
有什么想法吗?
答案 0 :(得分:6)
Mustache示例中有特殊处理,因为它需要处理2个字符的分隔符(例如'{{'
和'}}'
中有两个字符)。我之前从未使用过CodeMirror,所以这只是猜测,但尝试这样的事情:
CodeMirror.defineMode("mymode", function(config, parserConfig) {
var mymodeOverlay = {
token: function(stream, state) {
if (stream.match("{")) {
while ((ch = stream.next()) != null)
if (ch == "}") break;
return "mymode";
}
while (stream.next() != null && !stream.match("{", false)) {}
return null;
}
};
return CodeMirror.overlayParser(CodeMirror.getMode(config, parserConfig.backdrop || "text/html"), mymodeOverlay);
});
它有效(虽然它也突出显示小写字母的单词)
此应该工作:
token: function(stream, state) {
if (stream.match("{")) {
while ((ch = stream.next()) != null && ch === ch.toUpperCase())
if (ch == "}") break;
return "mymode";
}
while (stream.next() != null && !stream.match("{", false)) {}
return null;
}
答案 1 :(得分:3)
接受的答案突出显示括号中的每个字符。
我的版本,如果其他人遇到同样的问题。
CodeMirror.defineMode('mymode', function (config, parserConfig) {
return {
/**
* @param {CodeMirror.StringStream} stream
*/
token: function (stream) {
// check for {
if (stream.match('{')) {
// trying to find }
// if not a char
if (!stream.eatWhile(/[\w]/)) {
return null;
}
if (stream.match('}')) {
return 'mymode';
}
}
while (stream.next() && !stream.match('{', false)) {}
return null;
}
};
});