Динамически обновлять правила режима подсветки синтаксиса для редактора Ace

совершенно новый для Ace editor dev, чтобы динамически добавлять дополнительные правила в файл режима для подсветки синтаксиса, я выполняю вызов ajax, который устанавливает глобальную переменную, доступную внутри файла режима для обработки.

вот настройка и первоначальный вызов 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");
});

файл режима исправлен следующим образом:

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

когда страница загружается initallly редактор ace получает все ключевые слова для подсветки синтаксиса. Эта работа отличный.

проблема в том, что у нас есть правила, изменяющиеся при возникновении определенных событий, и мы хотели бы, чтобы редактор ace обновил свои правила синтаксиса.

повторный вызов ajax и вызов setMode ничего не делают - это связано с тем, что js не перезагружает файл.

я опубликовал вопрос на GitHub без разрешения:

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

"Если вы действительно хотите сохранить глобальная переменная, вы можете обернуть все в функции вызовите эту функцию, чтобы получить обновленный конструктор режима, и затем вызовите setMode (новый режим)."

Я не знаю, как это сделать, любая помощь будет оценили.

кто-нибудь с методами о том, как динамически обновлять правила подсветки синтаксиса редактора ace?

1 ответов


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

setMode режимы кэширования, если у них нет опций так что вы можете позвонить

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

чтобы заставить его создать новый режим.

другой способ сделать

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

а затем всякий раз, когда изменить правила выделения сделать

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

см.http://jsbin.com/ojijeb/445/edit