2012-08-04 222 views
5

我在运行我自己的自定义语言的应用程序中使用AvalonEdit。我想在Avalon Edit中加入恰当的语法高亮。通常这是通过手动定义xml文件中的高亮规则来完成的。以编程方式将语法高亮规则添加到AvalonEdit

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

由于

回答

3

可以使用对象模型中生成ICSharpCode.AvalonEdit.Highlighting.Xshd在存储器中.xshd文件(XshdSyntaxDefinition等)。

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

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

4

以下代码至少适用于我。

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; 
    } 
} 
相关问题