Программное добавление правил подсветки синтаксиса в AvalonEdit

Я использую AvalonEdit в приложении, которое работает на моем собственном языке. Я хочу добавить соответствующую подсветку синтаксиса в Avalon Edit. Обычно это делается путем определения правил выделения в xml-файле вручную.

Однако я не хочу, чтобы правила выделения всегда рассинхронизировались с грамматикой языка всякий раз, когда я расширяю язык. Поэтому я надеюсь использовать информацию о грамматике, которая уже содержится в моем анализаторе coco/R, для автоматического создания этих правил. Итак, есть ли способ программно добавить правила подсветки синтаксиса в Avalon Edit?

Спасибо


person thund    schedule 04.08.2012    source источник


Ответы (2)


По крайней мере, приведенный ниже код работал для меня.

Assembly assembly = Assembly.GetExecutingAssembly();
using (Stream s = assembly.GetManifestResourceStream("Your.xshd"))
{
    using (XmlTextReader reader = new XmlTextReader(s))
    {
        //Load default Syntax Highlighting
        InternalEditor.SyntaxHighlighting = HighlightingLoader.Load(reader, HighlightingManager.Instance);

        // Dynamic syntax highlighting for your own purpose
        var rules = InternalEditor.SyntaxHighlighting.MainRuleSet.Rules;

        _HighlightingRule = new HighlightingRule();
        _HighlightingRule.Color = new HighlightingColor()
        {
                Foreground = new CustomizedBrush(SomeColor)
        };

        String[] wordList = PseudoGetKeywords(); // Your own logic
        String regex = String.Format(@"\b({0})\w*\b", String.Join("|", wordList));
        _HighlightingRule.Regex = new Regex(regex);

        rules.Add(_HighlightingRule);
    }
}


internal sealed class CustomizedBrush : HighlightingBrush
{
    private readonly SolidColorBrush brush; 
    public CustomizedBrush(Color color)
    {
        brush = CreateFrozenBrush(color);
    }

    public CustomizedBrush(System.Drawing.Color c)
    {
        var c2 = System.Windows.Media.Color.FromArgb(c.A, c.R, c.G, c.B);        
        brush = CreateFrozenBrush(c2);
    }

    public override Brush GetBrush(ITextRunConstructionContext context)
    {
        return brush;
    }

    public override string ToString()
    {
        return brush.ToString();
    }

    private static SolidColorBrush CreateFrozenBrush(Color color)
    {
        SolidColorBrush brush = new SolidColorBrush(color);
        brush.Freeze();
        return brush;
    }
}
person David    schedule 08.10.2012

Вы можете сгенерировать файл .xshd в памяти, используя объектную модель в ICSharpCode.AvalonEdit.Highlighting.Xshd (XshdSyntaxDefinition и т. д.).

Чтобы преобразовать его в IHighlightingDefinition, используйте метод HighlightingLoader.Load(). Вы также можете сохранить его на диск (в целях отладки), применив расширение SaveXshdVisitor.

В качестве альтернативы вы можете реализовать IHighlightingDefinition самостоятельно и напрямую создать экземпляры HighlightingRuleSet.

person Daniel    schedule 08.08.2012