2012-08-04 23 views
5

Tôi đang sử dụng AvalonEdit trong một ứng dụng chạy ngôn ngữ được xây dựng tùy chỉnh của riêng tôi. Tôi muốn đưa vào cú pháp thích hợp làm nổi bật trong Avalon Edit. Thông thường, điều này được thực hiện bằng cách xác định các quy tắc làm nổi bật trong tệp xml bằng tay.Thêm quy tắc làm nổi bật cú pháp vào AvalonEdit theo lập trình

Tuy nhiên, tôi không muốn các quy tắc làm nổi bật luôn rơi ra khỏi đồng bộ với ngữ pháp ngôn ngữ bất cứ khi nào tôi mở rộng ngôn ngữ. Vì vậy, tôi hy vọng sẽ sử dụng thông tin ngữ pháp đã được chứa trong trình phân tích cú pháp coco/R của tôi để tự động tạo ra các quy tắc này. Vậy có cách nào để thêm các quy tắc làm nổi bật cú pháp vào Avalon Edit theo cách lập trình không?

Cảm ơn

Trả lời

3

Bạn có thể tạo một tập tin .xshd trong bộ nhớ bằng cách sử dụng mô hình đối tượng trong ICSharpCode.AvalonEdit.Highlighting.Xshd (XshdSyntaxDefinition vv).

Để chuyển đổi nó thành một IHighlightingDefinition, hãy sử dụng phương pháp HighlightingLoader.Load(). Bạn cũng có thể lưu nó vào đĩa (cho mục đích gỡ lỗi) bằng cách áp dụng SaveXshdVisitor. Bạn cũng có thể tự mình thực hiện IHighlightingDefinition và tạo trực tiếp HighlightingRuleSet trường hợp.

4

Mã bên dưới đã làm việc cho tôi ít nhất.

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; 
    } 
} 
Các vấn đề liên quan