【问题标题】:Adding syntax highlighting rules to AvalonEdit programmatically以编程方式向 AvalonEdit 添加语法高亮规则
【发布时间】:2012-08-02 03:41:44
【问题描述】:

我在运行我自己的定制语言的应用程序中使用 AvalonEdit。我想在 Avalon Edit 中加入适当的语法高亮。通常这是通过在 xml 文件中手动定义突出显示规则来完成的。

但是,我不希望在扩展语言时突出显示规则总是与语言语法不同步。所以我希望使用我的 coco/R 解析器中已经包含的语法信息来自动生成这些规则。 那么有没有办法以编程方式向 Avalon Edit 添加语法高亮规则?

谢谢

【问题讨论】:

    标签: syntax-highlighting avalonedit


    【解决方案1】:

    下面的代码至少对我有用。

    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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用ICSharpCode.AvalonEdit.Highlighting.XshdXshdSyntaxDefinition 等)中的对象模型在内存中生成 .xshd 文件。

      要将其转换为IHighlightingDefinition,请使用HighlightingLoader.Load() 方法。您还可以通过应用SaveXshdVisitor 将其保存到磁盘(用于调试目的)。

      或者,您可以自己实现IHighlightingDefinition 并直接创建HighlightingRuleSet 实例。

      【讨论】:

        猜你喜欢
        • 2013-08-19
        • 2017-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-11
        • 2015-05-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多