AvalonEdit: Каскадное Выделение Цветов


Я хочу каскадировать SyntaxHighlighting двигатель AvalonEdit. У меня есть 2 HighlightingDefinitions. Первый-это основной синтаксис. Второй-сложный многострочный препроцессор-язык разметки. По этой причине слишком сложно встроить вторую грамматику в первую. Более простой способ-это визуализация первого синтаксиса и последующее изменение затронутых частей строки (на основе второго синтаксиса).

поэтому я создал новый HighlightingColorizer со вторым языком и добавил его к LineTransformers. Но второй язык окрашивает весь документ, а не только линейные части с директивами препроцессора: код без препроцессора черный.

как я отладил ColorizeLine-метод второй линии трансформатора, строки не выделенного кода (=нет кода препроцессора) не были раскрашены, как ожидалось. Но цвет линий черный.

так же HighlightingColorizer сбросить все предыдущие выделения всего документа, прежде чем он начнет раскрасить?

или в чем еще может быть проблема? Как я могу правильно каскадировать 2 HighlightingColorizers?

1 67

1 ответ:

проблема в том, что HighlightingColorizer не хранит непосредственно ссылку на DocumentHighlighter, но вместо этого сохраняет его через TextView.Services. Это делается для того, чтобы прикреплять же colorizer с несколькими редакторами, так что каждый редактор имеет свой собственный DocumentHighlighter.

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

кроме того, обратите внимание, что логика "копировать в буфер обмена" в HtmlClipboard прямой доступ к IHighlighter службы, он не использует никаких colorizers. (копирование текста в Word сохраняет только подсветку синтаксиса, никаких других преобразований, таких как маркеры сгиба)

есть по существу два подхода к решению этой проблемы:

  1. не храните дополнительный маркер в качестве сервиса. Вы можете сделать это, создав свою собственную копию HighlightingColorizer класс, и использовать поле в этом классе вместо доступа textView.Services. Это простое изменение, но дополнительные маркеры не будут использоваться при копировании текста в буфер обмена.

  2. создать IHighlighter реализация, которая сочетает в себе HighlightedLine s от нескольких DocumentHighlighters. это подход, который мы используем для семантического выделения C# в SharpDevelop 5 ,который работает как дополнительный маркер, который расширяет существующий.подсветка C# на основе xshd. Однако этот подход является сложным (слияние HighlightedLines нетривиально с учетом ограничений упорядочения и вложенности в разделах), и требует изменения API на IHighlighter интерфейс для того, чтобы разобраться с OnHighlightStateChanged уведомление (AvalonEdit 4.x использует производный класс, вложенный в HighlightingColorizer чтобы получить доступ к этому обратному вызову; AvalonEdit 5.0 будет использовать событие).