2011-12-10 11 views
1

CodeMirrorエディタにVisual Basic .NETの構文強調を追加するにはどうすればよいですか?この言語のモードはどのライブラリにも存在しますか? keywords,blockKeywordsatoms以外は修正する必要がありますか?CodeMirrorエディタにVisual Basic .NET構文の強調表示を追加する方法はありますか?

パスカル例:助けを

CodeMirror.defineMode("pascal", function(config) { 
    function words(str) { 
    var obj = {}, words = str.split(" "); 
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true; 
    return obj; 
    } 
    var keywords = words("and array begin case const div do downto else end file for forward integer " + 
         "boolean char function goto if in label mod nil not of or packed procedure " + 
         "program record repeat set string then to type until var while with"); 
    var blockKeywords = words("case do else for if switch while struct then of"); 
    var atoms = {"null": true}; 

    var isOperatorChar = /[+\-*&%=<>!?|\/]/; 
    var curPunc; 

    function tokenBase(stream, state) { 
    var ch = stream.next(); 
    if (ch == "#" && state.startOfLine) { 
     stream.skipToEnd(); 
     return "meta"; 
    } 
    if (ch == '"' || ch == "'") { 
     state.tokenize = tokenString(ch); 
     return state.tokenize(stream, state); 
    } 
    if (ch == "(" && stream.eat("*")) { 
     state.tokenize = tokenComment; 
     return tokenComment(stream, state); 
    } 
    if (/[\[\]{}\(\),;\:\.]/.test(ch)) { 
     curPunc = ch; 
     return null 
    } 
    if (/\d/.test(ch)) { 
     stream.eatWhile(/[\w\.]/); 
     return "number"; 
    } 
    if (ch == "/") { 
     if (stream.eat("/")) { 
     stream.skipToEnd(); 
     return "comment"; 
     } 
    } 
    if (isOperatorChar.test(ch)) { 
     stream.eatWhile(isOperatorChar); 
     return "operator"; 
    } 
    stream.eatWhile(/[\w\$_]/); 
    var cur = stream.current(); 
    if (keywords.propertyIsEnumerable(cur)) { 
     if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; 
     return "keyword"; 
    } 
    if (atoms.propertyIsEnumerable(cur)) return "atom"; 
    return "word"; 
    } 

    function tokenString(quote) { 
    return function(stream, state) { 
     var escaped = false, next, end = false; 
     while ((next = stream.next()) != null) { 
     if (next == quote && !escaped) {end = true; break;} 
     escaped = !escaped && next == "\\"; 
     } 
     if (end || !escaped) state.tokenize = null; 
     return "string"; 
    }; 
    } 

    function tokenComment(stream, state) { 
    var maybeEnd = false, ch; 
    while (ch = stream.next()) { 
     if (ch == ")" && maybeEnd) { 
     state.tokenize = null; 
     break; 
     } 
     maybeEnd = (ch == "*"); 
    } 
    return "comment"; 
    } 

    function Context(indented, column, type, align, prev) { 
    this.indented = indented; 
    this.column = column; 
    this.type = type; 
    this.align = align; 
    this.prev = prev; 
    } 
    function pushContext(state, col, type) { 
    return state.context = new Context(state.indented, col, type, null, state.context); 
    } 
    function popContext(state) { 
    var t = state.context.type; 
    if (t == ")" || t == "]") 
     state.indented = state.context.indented; 
    return state.context = state.context.prev; 
    } 

    // Interface 

    return { 
    startState: function(basecolumn) { 
     return { 
     tokenize: null, 
     context: new Context((basecolumn || 0) - config.indentUnit, 0, "top", false), 
     indented: 0, 
     startOfLine: true 
     }; 
    }, 

    token: function(stream, state) { 
     var ctx = state.context; 
     if (stream.sol()) { 
     if (ctx.align == null) ctx.align = false; 
     state.indented = stream.indentation(); 
     state.startOfLine = true; 
     } 
     if (stream.eatSpace()) return null; 
     curPunc = null; 
     var style = (state.tokenize || tokenBase)(stream, state); 
     if (style == "comment" || style == "meta") return style; 
     if (ctx.align == null) ctx.align = true; 

     if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state); 
     else if (curPunc == "[") pushContext(state, stream.column(), "]"); 
     else if (curPunc == "(") pushContext(state, stream.column(), ")"); 
     else if (curPunc == ctx.type) popContext(state); 
     else if (ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement")) 
     pushContext(state, stream.column(), "statement"); 
     state.startOfLine = false; 
     return style; 
    }, 

    electricChars: "{}" 
    }; 
}); 

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

ありがとう!これは私のために働いた

答えて

1

- 私はCLIKEモードのjsファイルで

CodeMirror.defineMIME("text/x-vb", { 
    name: "clike", 
    keywords: words("AddHandler AddressOf Alias And AndAlso Ansi As Assembly Auto Boolean ByRef Byte " + 
    "ByVal Call Case Catch CBool CByte CChar CDate CDec CDbl Char CInt Class CLng CObj Const CShort CSng CStr CType " + 
    "Date Decimal Declare Default Delegate Dim DirectCast Do Double Each Else ElseIf End Enum Erase Error Event Exit False Finally "+ 
    "For Friend Function Get GetType GoSub GoTo Handles If Implements Imports In Inherits Integer Interface Is " + 
    "Let Lib Like Long Loop Me Mod Module MustInherit MustOverride MyBase MyClass Namespace New Next Not "+ 
    "Nothing NotInheritable NotOverridable Object On Option Optional Or OrElse Overloads Overridable Overrides " + 
    "ParamArray Preserve Private Property Protected Public RaiseEvent ReadOnly ReDim REM RemoveHandler Resume " + 
    "Return Select Set Shadows Shared Short Single Static Step Stop String Structure Sub SyncLock Then Throw " + 
    "To True Try TypeOf Unicode Until Variant When While With WithEvents WriteOnly Xor"), 
    //blockKeywords: words("catch class do else finally for if switch try while"), 
    atoms: words("True False Null"), 
    hooks: { 
     "@": function(stream, state) { 
     stream.eatWhile(/[\w\$_]/); 
     return "meta"; 
     } 
    } 
    }); 
をこの定義を追加
関連する問題