Codemirror如何创建模式

时间:2015-10-07 12:14:59

标签: javascript regex editor codemirror codemirror-modes

所以我最近刚进入codemirror,因为我的网站需要一个文本编辑器,但这意味着我对该程序了解不多。我让编辑器使用javascript模式,但我需要为编辑器创建一些语法,我相信这意味着我必须为编辑器创建一个模式,而我在执行此操作时遇到了麻烦。我已经阅读了几本手册,但有些事情并没有为我点击,可能是因为我从未使用过类似的东西。不管怎样,现在我只需要通过创建简单的加,减和乘法函数来获得它。如果有人能够让我感动,我会非常感激。

1 个答案:

答案 0 :(得分:3)

首先,您确定需要新模式吗?您是否尝试支持许多内置模式之一尚未提供的自定义DSL语法?

Manual为此提供了良好的信息。它提到了使用simple mode addon作为声明方法的简单情况。它讨论了使用CodeMirror.defineMode创建新模式并提及模式开发最重要的功能token(stream, state)

  

一个函数,它将字符流作为输入,使其超过令牌,并返回该令牌的样式。

本手册还提供了两种示例模式。对于一个非常简单的模式,它建议diff和更复杂的模式clike。还可以查看模式目录中的可用模式,看看是否不能只修改现有模式以满足您的需求。

仅供参考,我将在下面列出内联差异模式:

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.defineMode("diff", function() {

  var TOKEN_NAMES = {
    '+': 'positive',
    '-': 'negative',
    '@': 'meta'
  };

  return {
    token: function(stream) {
      var tw_pos = stream.string.search(/[\t ]+?$/);

      if (!stream.sol() || tw_pos === 0) {
        stream.skipToEnd();
        return ("error " + (
          TOKEN_NAMES[stream.string.charAt(0)] || '')).replace(/ $/, '');
      }

      var token_name = TOKEN_NAMES[stream.peek()] || stream.skipToEnd();

      if (tw_pos === -1) {
        stream.skipToEnd();
      } else {
        stream.pos = tw_pos;
      }

      return token_name;
    }
  };
});

CodeMirror.defineMIME("text/x-diff", "diff");

});

这是一个非常简单的模式,甚至不包含任何状态信息(因此不包括'token'方法的第二个参数)。

我希望这会有所帮助。