2012-08-04 4 views
5

Ich verwende AvalonEdit in einer App, die meine eigene Sprache verwendet. Ich möchte eine entsprechende Hervorhebung der Syntax in Avalon Edit einfügen. Normalerweise geschieht dies, indem die Hervorhebungsregeln in einer XML-Datei von Hand definiert werden.AvalonEdit programmgesteuert Syntaxhervorhebungsregeln hinzufügen

Allerdings möchte ich nicht, dass die Hervorhebungsregeln immer mit der Sprachgrammatik nicht mehr synchron sind, wenn ich die Sprache erweitere. Ich hoffe also, dass ich die in meinem coco/R-Parser enthaltenen Grammatik-Informationen verwenden kann, um diese Regeln automatisch zu generieren. Gibt es also eine Möglichkeit, programmatische Syntaxhervorhebungsregeln zu Avalon Edit hinzuzufügen?

Dank

Antwort

3

Sie können eine .xshd Datei im Speicher mit dem Objektmodell in ICSharpCode.AvalonEdit.Highlighting.Xshd (XshdSyntaxDefinition etc.) erzeugen.

Um es in eine IHighlightingDefinition zu konvertieren, verwenden Sie die HighlightingLoader.Load() Methode. Sie können es auch auf Festplatte speichern (für Debugging-Zwecke), indem Sie SaveXshdVisitor anwenden.

Alternativ können Sie IHighlightingDefinition selbst implementieren und HighlightingRuleSet Instanzen direkt erstellen.

4

Der folgende Code funktionierte für mich zumindest.

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