0

我正在尝试为 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 行之间的空行。有什么方法可以做到这一点?

4

2 回答 2

2

codemirror 的文档说:

默认情况下,标记文档时会跳过空白行。对于具有重要空行的语言,您可以在您的模式上定义一个 blankLine(state) 方法,每当传递一个空行时就会调用该方法,以便它可以更新解析器状态。

( 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";
    }
  };
});
于 2014-10-20T07:10:25.600 回答
2

[\b]您可以在 javascript 正则表达式中检测退格: https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions

顺便说一句,如果您想检测“空行或仅包含空格的行”,/\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

于 2014-10-19T09:50:37.970 回答