如果嵌入需要适当的括号嵌套,如何在Ace编辑器中嵌入突出显示? [英] How to do embedded highlightings in Ace editor if embedding requires proper brace nesting?
本文介绍了如果嵌入需要适当的括号嵌套,如何在Ace编辑器中嵌入突出显示?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
请考虑以下Razor代码:
Consider the following Razor code:
<div>@(Model.GetSomething())</div>
很明显,只有考虑了所有括号后才能正确识别Razor块。
如果我确实天真地嵌入(基于PHP的功能):
Obviously, the Razor block can only be properly identified if all parentheses are accounted for.
If I do naive embed (based on what PHP does):
var RazorLangHighlightRules = function() {
CSharpHighlightRules.call(this);
};
oop.inherits(RazorLangHighlightRules, CSharpHighlightRules);
var RazorHighlightRules = function() {
HtmlHighlightRules.call(this);
var razorStartRules = [{
token : "meta.block-marker.razor",
regex : "@\\(",
push : "csharp-start"
}];
var endRules = [{
token : "meta.block-marker.razor",
regex : "\\)",
next : "pop"
}];
console.log(this.$rules);
for (var key in this.$rules)
this.$rules[key].unshift.apply(this.$rules[key], razorStartRules);
this.embedRules(RazorLangHighlightRules, "csharp-", endRules, ["start"]);
this.normalizeRules();
};
oop.inherits(RazorHighlightRules, HtmlHighlightRules);
我从<$获得第一个)
c $ c> GetSomething()被认为是Razor块的结尾括号,这是不正确的。
I get the first )
from GetSomething()
being recognized as the closing brace for Razor block, which is incorrect.
正确的方法是
推荐答案
您需要为每个(
并删除)
endRules = [{
regex: "[()]",
onMatch: function(val, state, stack) {
this.next = "";
console.log(stack, this.next, val);
if (val == "(") {
stack.unshift("csharp-start", state);
return "paren";
}
// val == ")"
stack.shift();
this.next = stack.shift() || "start";
return this.next == "csharp-start" ? "paren" : "meta.block-marker.razor";
}
}]
另请参见将Javascript添加到自定义语言-ACE编辑器
这篇关于如果嵌入需要适当的括号嵌套,如何在Ace编辑器中嵌入突出显示?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文