0

我正在为 CodeMirror 编写一个无上下文的解析器,它一次解析一个字符的代码,并根据所采用的状态转换输出一种样式。代码使用换行符 \n 来触发状态转换,但 CodeMirror 似乎从输入文本中删除了这些(console.log (char === '\n') 总是返回 false)

无论如何配置 CodeMirror 给我 \n 作为输入?文档似乎没有提到这个问题。

我的状态对象格式如下

{
    state1: {
       active: true,
       edges: {
           '\n': 'state2'
       }
    },
    state2: {
       active: false,
       edges: {
           '#': 'state1'
       }
    }
}

如果需要任何其他信息或澄清,请告诉我

4

1 回答 1

2

console.log (char === '\n')总是返回false并不一定意味着 CodeMirror 去除换行符 - 文本按原样传递,即将\n作为两个字符传递 -\n.

尝试并利用token您的模式中的方法在\n流中进行检测:

var newLine = '\\n';

token : function(stream) {

    var next = stream.next();
    var tokenName = null;

    if ('\\' === next) {
        var match = stream.match(new RegExp(newLine.charAt(1)));
        match && (tokenName = 'some-style' || null);
    }
    return tokenName;
}

您还可以推广该方法以处理任何序列,而不仅仅是\n

var sequence = 'some-sequence';

token : function(stream) {

    var next = stream.next();
    var tokenName = null;

    var ch = sequence.charAt(0);
    // search for the first letter
    if (next === ch) {
        // try to match the rest of the sequence
        var match = stream.match(new RegExp(sequence.substring(1)));
        match && (tokenName = 'some-style' || null);
    }
    return tokenName;
}

这尚未经过测试,但我怀疑足以做到这一点。请让我知道你的情况如何。

于 2013-04-14T15:00:54.777 回答