我正在尝试为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
来&#34;吃&#34;匹配的字符,但没有提到如何在仍然使用正则表达式时仅标记子部分。
我真的不知道如何继续。
答案 0 :(得分: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;
}
};
});