在CodeMirror中查找自定义语言模式的段落的第一个和最后一个单词

时间:2014-10-22 12:55:31

标签: javascript codemirror

我试图在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";
          }
        }
      }
    }
  };
});

知道如何实现这一目标?提前谢谢。

1 个答案:

答案 0 :(得分:0)

你不能用CodeMirror的当前模式系统做到这一点 - 要知道一行是否是段落中的最后一行,你必须向前看下一行,这不是可能。另请参阅https://github.com/codemirror/CodeMirror/issues/839