2012-08-04 20 views
5

AvalonEdit'i kendi özel oluşturulmuş dilimi çalıştıran bir uygulamada kullanıyorum. Avalon Edit'e uygun sözdizimi vurgulamak istiyorum. Normalde bu, bir xml dosyasındaki vurgulama kurallarının elle tanımlanmasıyla yapılır.AvalonEdit'e sözdizimi vurgulama kuralları eklemek programlı olarak

Ancak, ben dili uzatmak her zaman dil grameri ile senkronize düşen edilecek vurgulayarak kuralları istemiyoruz. Bu yüzden coco/R ayrıştırıcımda bulunan dilbilgisi bilgisini otomatik olarak bu kuralları oluşturmak için kullanmayı umuyoruz. Yani, Avalon Düzenleme'ye sözdizimi vurgulama kurallarını programsal olarak eklemek için bir yol var mı?

Teşekkür

cevap

3

Sen (XshdSyntaxDefinition vs.) ICSharpCode.AvalonEdit.Highlighting.Xshd nesne modelini kullanarak bellekteki bir .xshd dosyası oluşturabilir.

IHighlightingDefinition'a dönüştürmek için HighlightingLoader.Load() yöntemini kullanın. Ayrıca SaveXshdVisitor'u uygulayarak diske kaydedebilirsiniz (hata ayıklama amacıyla).

Alternatif olarak, IHighlightingDefinition kendinizi uygulamak olabilir ve doğrudan HighlightingRuleSet örneklerini oluşturur.

4

Aşağıdaki kod benim için en az çalış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; 
    } 
} 
İlgili konular