2012-08-04 19 views
5

पर सिंटैक्स हाइलाइटिंग नियम जोड़ना मैं एक ऐप में AvalonEdit का उपयोग कर रहा हूं जो मेरी अपनी कस्टम-निर्मित भाषा चलाता है। मैं Avalon संपादन में हाइलाइटिंग उचित वाक्यविन्यास में रखना चाहता हूँ। आम तौर पर यह एक एक्सएमएल फ़ाइल में हाइलाइटिंग नियमों को हाथ से परिभाषित करके किया जाता है।एवलॉन एडिट प्रोग्रामेटिक

हालांकि, मैं नहीं चाहता कि जब भी मैं भाषा का विस्तार करता हूं तो भाषा व्याकरण के साथ हाइलाइटिंग नियम हमेशा सिंक हो जाएंगे। तो मैं उन नियमों को स्वचालित रूप से उत्पन्न करने के लिए पहले से ही अपने कोको/आर पार्सर में व्याकरण की जानकारी का उपयोग करने की उम्मीद कर रहा हूं। तो क्या एवलॉन संपादित करने के लिए प्रोग्रामेटिक रूप से सिंटैक्स हाइलाइटिंग नियम जोड़ने का कोई तरीका है?

धन्यवाद

उत्तर

3

आप स्मृति में एक .xshd फ़ाइल ICSharpCode.AvalonEdit.Highlighting.Xshd में ऑब्जेक्ट मॉडल का उपयोग कर (XshdSyntaxDefinition आदि) उत्पन्न कर सकते हैं।

इसे IHighlightingDefinition में बदलने के लिए, HighlightingLoader.Load() विधि का उपयोग करें। आप इसे SaveXshdVisitor लागू करके डिस्क (डिबगिंग उद्देश्यों के लिए) में भी सहेज सकते हैं।

वैकल्पिक रूप से, आप IHighlightingDefinition स्वयं को लागू कर सकते हैं और सीधे HighlightingRuleSet उदाहरण बना सकते हैं।

4

नीचे दिया गया कोड कम से कम मेरे लिए काम करता है।

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