2012-08-04 16 views
5

Estoy usando AvalonEdit en una aplicación que ejecuta mi propio lenguaje personalizado. Quiero poner el resaltado de sintaxis apropiado en Avalon Edit. Normalmente esto se hace definiendo las reglas de resaltado en un archivo xml a mano.Agregar reglas de resaltado de sintaxis a AvalonEdit mediante programación

Sin embargo, no quiero que las reglas de resaltado siempre estén desfasadas con la gramática del lenguaje cada vez que extiendo el idioma. Así que espero usar la información de gramática que ya está contenida en mi analizador Coco/R para generar automáticamente estas reglas. Entonces, ¿hay alguna forma de agregar programáticamente reglas de resaltado de sintaxis a Avalon Edit?

Gracias

Respuesta

3

Puede generar un archivo .xshd en la memoria usando el modelo de objetos en ICSharpCode.AvalonEdit.Highlighting.Xshd (XshdSyntaxDefinition etc.).

Para convertirlo en IHighlightingDefinition, utilice el método HighlightingLoader.Load(). También puede guardarlo en el disco (para fines de depuración) aplicando el SaveXshdVisitor.

O bien, puede implementar IHighlightingDefinition usted mismo y crear directamente HighlightingRuleSet instancias.

4

El siguiente código funcionó para mí al menos.

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