2014-03-04 7 views
5

Total neu für Ace-Editor dev, um einer Modendatei für Syntax-Highlighting dynamisch zusätzliche Regeln hinzuzufügen Ich mache einen Ajax-Aufruf, der eine globale Variable festlegt, die im Modus verfügbar ist Datei zu verarbeiten. HierDynamische Aktualisierung der Syntax-Hervorhebungsmodus-Regeln für den Ace-Editor

ist die Einrichtung und erste Ajax-Aufruf:

var editor = ace.edit("editor"); 

$.ajax({ 
    url: "json-mode-rules.php", 
    dataType: "json" 
}).done(function(data) { 
    window.myModeRules=data; // ("foo","bar","etc") 
    editor.getSession().setMode("ace/mode/python"); 
}); 

Die Modus-Datei gepatcht wird mit den folgenden:

// keywords has already been initialised as an array 
// e.g. var keywords = ("and|as|assert...etc") 
var extraRules=window.codebenderModeLibrary["myModeRules"].join("|"); 
keywords=(keywords[0]+"|"+ extraRules); 

Wenn die Seite geladen wird initallly das Ass-Editor erhält alle Schlüsselwörter Syntax-Highlight. Das funktioniert großartig.

Das Problem ist, dass wir die Regeln ändern, wenn bestimmte Ereignisse auftreten und möchten, dass der Ace-Editor seine Syntaxregeln aktualisiert.

Das erneute Ausführen des Ajax-Aufrufs und das Aufrufen von setMode tun nichts - dies erfordert, dass js die Datei nicht erneut lädt.

Ich habe ein Problem auf GitHub ohne Beschluss noch geschrieben:

https://github.com/ajaxorg/ace/issues/1835

„Wenn Sie wirklich globale Variable behalten möchten, können Sie alles in einer Funktion wickeln können, rufen Sie diese Funktion auf Holen Sie sich den Moduskonstruktor und rufen Sie dann setMode (neuer Modus). "

Ich weiß nicht, wie man das macht und jede Hilfe würde geschätzt werden.

Jeder mit Techniken zur dynamischen Aktualisierung von Ace-Editor Syntaxhervorhebungsregeln?

Antwort

12

Siehe https://github.com/ajaxorg/ace/blob/9cbcfb35d3/lib/ace/edit_session.js#L888

setMode Caches Modi, es sei denn, sie haben Optionen so können Sie anrufen

session.setMode({ 
    path: "ace/mode/python", 
    v: Date.now() 
}) 

es zu zwingen, einen neuen Modus zu erstellen.

Ein anderer Weg ist

var DynHighlightRules = function() { 
    // add function to change keywords 
    this.setKeywords = function(kwMap) { 
     this.keywordRule.onMatch = this.createKeywordMapper(kwMap, "identifier") 
    } 
    this.keywordRule = { 
     regex : "\\w+", 
     onMatch : function() {return "text"} 
    } 

    this.$rules = { 
     "start" : [ 
      { 
       token: "string", 
       start: '"', 
       end: '"', 
       next: [{ token : "language.escape", regex : /\\[tn"\\]/}] 
      }, 
      this.keywordRule 
     ] 
    }; 
    this.normalizeRules() 
}; 

und dann zu tun, wenn Highlight Regeln tun ändern

// update keywords 
editor.session.$mode.$highlightRules.setKeywords({"keyword": "foo|bar|baz"}) 
// force rehighlight whole document 
editor.session.bgTokenizer.start(0) 

siehe http://jsbin.com/ojijeb/445/edit

+0

Danke. Ich werde beide Methoden so schnell wie möglich überprüfen und melden. – zaf

+0

Hinzufügen der Option mit dem Datum funktioniert. Ich werde die andere Methode überprüfen, wenn ich mehr Zeit habe. Prost. – zaf

+0

Ist es möglich, die Schlüsselwörter in ace/mode/javascript zu ändern? – techdog

Verwandte Themen