Подсветка синтаксиса AvalonEdit XSHD - завершение диапазона - PullRequest
0 голосов
/ 02 августа 2020

Я использую AvalonEdit и работаю над добавлением подсветки синтаксиса для файла (с синтаксисом, немного похожим на бритву). Я впервые использую файлы XSHD, поэтому, пожалуйста, простите меня, если это действительно легко.

Проблема, с которой я столкнулся, можно увидеть в следующем примере кода:

Not C#

@{
    public void DoStuff() {
        // C# highlighting here
    }

    public void DoMoreStuff() {
        // C# highlighting here
    }
}

В @{ и } Мне нужно применить подсветку синтаксиса C#. Итак, я делаю это в xshd: (упрощенно)

<Span ruleSet="RazorCode" multiline="true">
    <Begin color="CodeBlockStartEndTags">\@\{</Begin>
    <End color="CodeBlockStartEndTags">\}</End>
</Span>
<RuleSet name="RazorCode">
    <Import ruleSet="C#/" />
</RuleSet>

И вот что я наблюдаю:

enter image description here

Clearly what's happening is the \} тег завершение диапазона, как только будет найдена следующая закрывающая скобка }. Когда на самом деле следует пропустить эту скобку, потому что перед ней стоит открытая скобка.

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

Возможно ли это в XSHD?

Спасибо

1 Ответ

0 голосов
/ 02 августа 2020

Подсветка синтаксиса XML отслеживает стек активаций RuleSet. Вы можете подсчитывать фигурные скобки, рекурсивно активировав набор правил:

<Span ruleSet="RazorCode" multiline="true">
    <Begin color="CodeBlockStartEndTags">\@\{</Begin>
    <End color="CodeBlockStartEndTags">\}</End>
</Span>
<RuleSet name="RazorCode">
    <Import ruleSet="C#/" />
    <Span ruleSet="RazorCode" multiline="true">
        <Begin>\{</Begin>
        <End>\}</End>
    </Span>
</RuleSet>
...