Динамически обновлять правила режима подсветки синтаксиса для редактора 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)