2012-08-04 13 views
5

Uso AvalonEdit in un'app che esegue la mia lingua personalizzata. Voglio inserire l'evidenziazione della sintassi appropriata in Avalon Edit. Normalmente questo viene fatto definendo manualmente le regole di evidenziazione in un file xml.Aggiunta di regole di evidenziazione della sintassi a AvalonEdit a livello di programmazione

Tuttavia, non desidero che le regole di evidenziazione non siano sempre sincronizzate con la grammatica della lingua ogni volta che estendo la lingua. Quindi spero di usare le informazioni sulla grammatica che sono già contenute nel mio parser coco/R per generare automaticamente queste regole. Quindi c'è un modo per aggiungere programmaticamente le regole di evidenziazione della sintassi a Avalon Edit?

Grazie

risposta

3

È possibile generare un file .xshd in memoria utilizzando il modello oggetto di ICSharpCode.AvalonEdit.Highlighting.Xshd (XshdSyntaxDefinition etc.).

Per convertirlo in un IHighlightingDefinition, utilizzare il metodo HighlightingLoader.Load(). È inoltre possibile salvarlo su disco (a scopo di debug) applicando lo SaveXshdVisitor.

In alternativa, è possibile implementare direttamente IHighlightingDefinition e creare istanze HighlightingRuleSet.

4

Il codice seguente ha funzionato almeno per me.

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