0

我正在尝试为 CodeMirror 创建一个模式覆盖。

我有一堆经过测试的正则表达式匹配行的各个部分(来自流),我想我是否可以使用这些来匹配和标记行的一部分。

例如:

# h1

变成:

<span class="..."><span class="cm-overlay cm-markup">#</span> h1</span>

除了simplemode插件之外,我找不到在模式中使用正则表达式的任何示例。这个问题与我正在做的非常相似,但是没有关于如何仅为流线的一个子集返回令牌的答案:CodeMirror - Using RegEx with overlay

我设法创建了以下有效的模式,但与整行匹配,因此生成的 html 如下:<span class="cm-overlay cm-markup"># h1</span>

CodeMirror.defineMode("markdown-extra", function() {
    return {
        token: function(stream, state) {
            markup = stream.match(/^([#]{1,6})[^#]/g); // matches markdown header syntax
            stream.skipToEnd();

            if (markup){
                console.log(markup, stream)
                return "markup"
            }

            return null
        }
    };
});

文档希望我用来stream.match“吃掉”匹配的字符,但没有提到如何在仍然使用正则表达式的同时只标记一个小节。

我真的不知道如何继续。

4

1 回答 1

0

我有点想通了。

我仍然不完全理解它为什么起作用,但以下代码与正则表达式匹配,但由于某种原因不会将自身限制为捕获组(数组大小仅为 1)。

CodeMirror.defineMode("markdown-extra", function() {
        return {
            token: function(stream, state) {

                // ## header matching
                matchArray = stream.match(/^([#]{1,6}) /g);
                if (matchArray != null) {
                        var match = matchArray[0];
                        console.log(matchArray);
                        stream.match(match);
                        return "markup"
       }
                while (stream.next() != null && !stream.match(/^([#]{1,6})[^#]/g, false)) {}
      return null;

            }
        };
    });
于 2017-07-03T04:42:42.453 回答