2012-08-04 221 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; 
    } 
} 
相關問題