我正在尝试为codemirror开发一个简单的模式。 此模式将以蓝色和绿色交替显示段落。段落之间的分隔是空行或仅包含空格的行。
这是一个有效的代码版本,但是没有检测到空行的重大问题:
CodeMirror.defineMode("rt", function() {
return {
startState: function() {return {state1: true};},
token: function(stream, state) {
if (stream.match(/\s\s*/)!=null){ # this fails to detect empty lines
state.state1 = !state.state1;
}
stream.skipToEnd();
if (state.state1) { return "status1"; }
return "status2";
}
};
});
如果我将其应用于以下文字:
line 1
line 2 # the next line is just a backspace and is not detected
line 3
line 4 # the next line is a few spaces followed by a backspace, it is detected
line 5
line 6
它在一种颜色中从第1行到第4行的颜色,在另一种颜色中从第5行到第6行的颜色,这是预期的。
我正在尝试找到一种方法来更新我的代码,以便它检测到第2行和第3行之间的空行。任何方法都可以这样做?
答案 0 :(得分:2)
您可以在javascript regexp中使用[\b]
检测退格:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
BTW /\s\s*/
可以简化为/\s+/
但是如果您要检测"空行或仅包含空格"的行,您可以使用/\s*/
。
此外,如果您不关心正则表达式的实际结果数组,则可以改为使用test()
:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test
您可以使用^
表示行的开头,并使用$
表示行结束。
因此代码将大致,如下所示:
CodeMirror.defineMode("rt", function() {
return {
startState: function() {
return {
state1: true
};
},
token: function(stream, state) {
if ( /^\s*$/m.test(stream) ) {
state.state1 = !state.state1;
}
stream.skipToEnd();
return state.state1 ? "status1" : "status2";
}
};
});
m标志用于指定多行输入字符串应被视为多行。如果使用m标志,则^和$匹配输入字符串中任何行的开头或结尾,而不是整个字符串的开头或结尾。示例:http://www.w3schools.com/jsref/jsref_regexp_m.asp
答案 1 :(得分:2)
codemirror的文档说:
默认情况下,在标记文档时,只会跳过空行。 对于具有重要空白行的语言,您可以定义a 您的模式上的 blankLine(状态)方法,无论什么时候都会被调用 空行被传递,以便它可以更新解析器状态。
(http://codemirror.net/doc/manual.html#modeapi)
以下代码有效(添加了blankLine函数):
CodeMirror.defineMode("rt", function() {
return {
startState: function() {return {state1: true};},
blankLine: function (state){ state.state1 = !state.state1; },
token: function(stream, state) {
console.log(stream)
if (stream.match(/^\s*$/)!=null){
state.state1 = !state.state1;
}
stream.skipToEnd();
if (state.state1) { return "status1"; }
return "status2";
}
};
});