2015-10-07 57 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