I want to highlight only keywords that look like this: {KEYWORD}
(basically UPPERCASE words wrapped between single {}
parentheses)
I tried this by copying the code from the Mustache Overlay demo, and by replacing the double brackets with single ones:
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);
});
but it doesn't work very good :)
Any ideas?
If you don't want to kill the CodeMirror instance, just change the entire document holding the text, data on markers etc. This can be done by calling cm. swapDoc(doc: CodeMirror. Doc) .
CodeMirror is open source under a permissive license (MIT). It is being developed on GitHub. Contributions are welcome.
The view module provides functionality for adding gutters (vertical bars in front of the code) to your editor. The simplest use of gutters is to simply dump lineNumbers() into your configuration to get a line number gutter.
There is special handling in the Mustache example because it needs to handle 2-character delimiters (e.g. there are two characters in '{{'
and '}}'
). I've never used CodeMirror before, so this is just a guess, but try something like this:
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);
});
it works (though it highlights words with lowercase letters too)
This should work:
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;
}
Accepted answer highlight every chars in brackets.
My version, if someone else encounter same issue.
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;
}
};
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With