考虑以下 Razor 代码:
<div>@(Model.GetSomething())</div>
显然,只有考虑到所有括号,才能正确识别 Razor 块。
如果我进行朴素嵌入(基于 PHP 的做法):
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);
我得到第一个)
from GetSomething()
被识别为 Razor 块的右大括号,这是不正确的。
在 Ace 中这样做的正确方法是什么?
您需要为每个状态添加一个状态堆栈(
并删除)
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 编辑器 https://stackoverflow.com/questions/24513783/add-javascript-into-custom-language-ace-editor/24516791#24516791
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)