2015-10-07 144 views
2

所以我最近刚刚进入codemirror,因为我需要一个文本编辑器为我的网站,但这意味着我不知道有关程序。我让编辑工作在javascript模式下,但我需要为编辑器创建一些语法,我相信这意味着我必须为编辑器创建一个模式,并且在执行此操作时遇到问题。我已经阅读了几次手册,但是没有点击我,可能是因为我从来没有用过这样的东西。无论如何,我只需要通过创建简单的加,减,乘函数来获得它的挂起。如果有人能让我滚动,我会非常感激。Codemirror如何创建一个模式

回答

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"); 

}); 

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

我希望这会有所帮助。

+0

很多很棒的信息,唯一需要注意的是为什么简单模式与差异模式看起来如此不同? – Markus

+1

**差异**模式**是从简单模式开始。 **简单模式addon **是一种更通用的工具模式,允许您使用声明格式创建模式,因此它的通用性足以支持您可能遇到的一些简单模式,而无需编写自己的模式。插件不像从头开始编写自己的模式那样灵活,这就是** diff **模式,尽管它是一种非常简单的模式。 –

+0

非常感谢,我仍然对如何开展这项工作感到失望,但这只是因为这对我来说都是如此的新鲜,但是您绝对会把我放在正确的道路上 – Markus