我试图在Codemirror中编写自定义语言模式。我开始使用"简单模式" (http://codemirror.net/demo/simplemode.html),但看起来我无法检查段落的开头或结尾(如果我错了,请纠正我)。 (段落的定义只是在文本之前/之后有双断行。)
所以我切换到正常模式(http://codemirror.net/doc/manual.html#modeapi),但我真的很难理解整个状态机系统的工作原理。
我开始尝试通过定义" blankLine"来检测第一段的单词。方法和设置" prevLineBlank"那里的状态变量,然后在"令牌"方法我检查该变量,找到下一个空格(或行尾)并返回适当的样式。这个似乎有效。
现在,试着找到段落的最后一个字,我在圈子里跑...我已经设法检测到每一行的最后一个字,但是它有效,但正如所说的那样,我只需要用段落的最后一个字来做同样的事情。到目前为止,这是我的代码:
CodeMirror.defineMode("netlang", function() {
return {
// This will detect empty lines to be used when detecting paragraph's first word
blankLine: function(state){
console.log( "netlang: BLANK line: ", state );
state.prevLineBlank = true;
},
// Just initialise state object
startState: function(){
console.log( "netlang: start state");
return {
prevLineBlank: true
};
},
token: function(stream, state) {
console.log( "netlang: token ", stream );
// Detect if we are starting a paragraph
if( state.prevLineBlank ){
// If we are, reset the variable since it is not a "start of paragraph" anymore
state.prevLineBlank = false;
// Find the next blank space
var nextSpace = stream.string.indexOf(" ");
// If found, move position there to style only the first word
if( nextSpace > -1 ){
stream.pos = nextSpace;
// If not, it means there's only one word, so tak the whole line
}else{
stream.skipToEnd();
}
// Return the style name
return "firstWord"
}
// If we're not at start of paragraph...
else
{
var lastSpace = stream.string.lastIndexOf(" ");
// No blank spaces, so only one word in line
if( lastSpace == -1 )
{
stream.skipToEnd();
return "lastWord";
}else{
// Still not in last word...
if( stream.pos < lastSpace ){
stream.next();
return null;
}else{
// Last word in line
stream.skipToEnd();
return "lastWord";
}
}
}
}
};
});
知道如何实现这一目标?提前谢谢。
答案 0 :(得分:0)
你不能用CodeMirror的当前模式系统做到这一点 - 要知道一行是否是段落中的最后一行,你必须向前看下一行,这不是可能。另请参阅https://github.com/codemirror/CodeMirror/issues/839