我正在实现CodeMirror,以用作需要一些语法高亮的特殊文件的编辑器。我为它编写了自己的解析器,但现在我面临以下问题:有一种特定的令牌,我总是喜欢标记为原子范围(带doc.markText
)。
我原本以为在解析令牌时会存在一些事件处理程序,其开始和结束位置包含{line, ch}
个对象。通过文档阅读,这似乎不存在,所以我会自己写,但问题是似乎没有办法得到任何与解析器相关的位置数据。
最好的方法是什么?有很多粗糙的方法,例如注册变更处理程序或每隔几秒迭代整个内容,但当然应该避免这种情况。
答案 0 :(得分:0)
我已经分叉了CodeMirror github repo并发出了一个在解析令牌时触发的事件。
语法是:
"tokenParsed" (instance: CodeMirror, start: {ch, line}, end: {ch, line}, style: String, text: String)
然后我按照以下方式处理:
myCodeMirror.on("tokenParsed", function(instance, start, end, style, text) {
if(!instance.findMarksAt(end).length) { //check if the mark doesn't exist yet
if(style && style.indexOf("param") > -1) {
instance.markText(start, end, {atomic: true});
}
}
});
如果有人想要这个,see my repository。