Règles de mise à jour de la syntaxe de mise à jour dynamique pour l'éditeur d'Ace

Totalement nouveau pour ace editor dev, pour ajouter dynamiquement des règles supplémentaires à un fichier de mode pour la mise en surbrillance de syntaxe. Je fais un appel ajax qui définit une variable globale disponible dans le fichier de mode à traiter.

Voici la configuration et l'appel initial d'ajax:

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

Le fichier en mode est corrigé avec les éléments suivants:

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

Lorsque la page est chargée initallly, l'éditeur Ace obtient tous les mots-clés en surbrillance. Cela fonctionne très bien.

Le problème est que nous avons les règles qui changent lorsque certains événements se produisent et que l'éditeur Ace devrait actualiser ses règles de syntaxe.

Faire l'appel ajax à nouveau et appeler setMode ne fait rien – cela nécessite de ne pas recharger le fichier js.

J'ai encore posté un problème sur GitHub sans résolution:

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

"Si vous souhaitez vraiment garder une variable globale, vous pouvez envelopper tout dans une fonction, appeler cette fonction pour obtenir un constructeur de mode mis à jour, puis appeler setMode (nouveau mode)".

Je ne sais pas comment faire et toute aide serait appréciée.

Quelqu'un a-t-il des techniques sur la façon de mettre à jour dynamiquement les règles de mise en évidence de la syntaxe de l'éditeur?

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

    setMode met en cache les modes, sauf s'ils ont des options afin que vous puissiez appeler

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

    Pour le forcer à créer un nouveau mode.

    Une autre façon est de faire

     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() }; 

    Et alors chaque fois que les règles changent change

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

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