2012-01-24 8 views
67

मैं AvalonEdit के सिंटेक्स हाइलाइटिंग इंजन को कैस्केड करना चाहता हूं। मेरे पास 2 HighlightingDefinitions है। पहला मुख्य वाक्यविन्यास है। दूसरा एक जटिल मल्टीलाइन-प्रीप्रोसेसर-मार्कअप-भाषा है। इस कारण से पहले व्याकरण को दूसरे व्याकरण में लपेटना बहुत जटिल है। पहला वाक्यविन्यास प्रस्तुत करना आसान तरीका है, और प्रभावित लाइन-पार्ट्स (दूसरे वाक्यविन्यास के आधार पर) को बाद में बदलें।AvalonEdit: कैस्केडिंग हाइलाइटिंग कोलोराइज़र

इसलिए मैंने दूसरी भाषा के साथ एक नया HighlightingColorizer तुरंत चालू किया और इसे LineTransformers में जोड़ा। लेकिन दूसरी भाषा पूरे दस्तावेज़ को रंग देती है और न केवल प्रीप्रोसेसर-निर्देशों के साथ लाइनपर्ट्स: गैर प्रीप्रोसेसर-कोड काला है।

जैसा कि मैंने दूसरी पंक्ति ट्रांसफार्मर के ColorizeLine -method डिबग, गैर प्रकाश डाला कोड (= कोई पूर्वप्रक्रमक कोड) की तर्ज, colorized नहीं किया गया है के रूप में उम्मीद। लेकिन रेखाओं का रंग काला है।

तो क्या HighlightingColorizer रंगीन होने से पहले पूरे दस्तावेज़ की सभी पिछली हाइलाइटिंग को रीसेट करता है?

या समस्या क्या हो सकती है? मैं 2 HighlightingColorizers को सही ढंग से कैस्केड कैसे कर सकता हूं?

+8

मैंने एवलॉन एडिट- और आईआईआरसी के साथ थोड़ा सा काम किया है, जब आप एक और रंगीन रंग लागू करते हैं तो यह सभी हाइलाइटिंग रीसेट करता है। इसके आस-पास का सबसे अच्छा तरीका दूसरे व्याकरण को पहले के भीतर एम्बेड करने का फिर से प्रयास करना होगा- असफल होने के कारण आपको एवलॉन एडिट के कोडबेस के साथ गड़बड़ करनी होगी ताकि यह बदल सके कि यह रंग योजना का व्याख्या कैसे करता है और फिर से लागू होता है।उत्तरार्द्ध शायद गैर-तुच्छ होगा क्योंकि मुझे नहीं लगता कि यह 'रीसेट पर टिप्पणी करना' या ऐसा कुछ आसान होगा। –

+7

@Xeno ठीक है। यदि आप XML परिभाषा फ़ाइलों का उपयोग नहीं करना चाहते हैं तो आपको निश्चित रूप से कोड बेस को संपादित करना होगा। हालांकि, मुझे यकीन नहीं है कि आप ऐसा क्यों नहीं करना चाहते हैं - वे तब तक हो सकते हैं जब तक आप चाहें और छोटे विवरण को रंगीन करने के लिए उपयोग किया जा सके। मैंने अभी एम्बेडेड एसक्यूएल के साथ एक सिमलर चीज करने के लिए एक फाइल लिखी है; यह तेज़ है और अच्छी तरह से काम करता है ... – MoonKnight

उत्तर

6

समस्या यह है कि HighlightingColorizer सीधे DocumentHighlighter का संदर्भ संग्रहीत नहीं करता है, लेकिन इसके बजाय इसे TextView.Services के माध्यम से संग्रहीत करता है। यह एक ही रंगीन यंत्र को एकाधिक संपादकों को जोड़ने की अनुमति देने के लिए किया जाता है, ताकि प्रत्येक संपादक को अपना DocumentHighlighter प्राप्त हो सके।

जब आप एक दूसरा रंगीन यंत्र संलग्न करते हैं, तो यह सेवा कंटेनर में संग्रहीत IHighlighter को ओवरराइट करता है; और दोनों रंगीनकार नए हाइलाइटर का उपयोग कर समाप्त होते हैं।

यह भी ध्यान दें कि HtmlClipboard में 'क्लिपबोर्ड पर प्रतिलिपि' तर्क सीधे IHighlighter सेवा तक पहुंचता है, यह किसी भी रंगीन यंत्र का उपयोग नहीं करता है। (वर्ड पर कॉपी पाठ वाक्य रचना केवल प्रकाश डाला को बरकरार रखता है, गुना मार्कर की तरह कोई अन्य परिवर्तनों)

अनिवार्य इस समस्या को हल करने के लिए दो दृष्टिकोण हैं:

  1. एक सेवा के रूप में अतिरिक्त हाइलाइटर की दुकान मत करो। आप HighlightingColorizer कक्षा की अपनी प्रति बनाकर ऐसा कर सकते हैं, और textView.Services तक पहुंचने के बजाय उस कक्षा में फ़ील्ड का उपयोग कर सकते हैं। यह एक आसान परिवर्तन है, लेकिन क्लिपबोर्ड पर टेक्स्ट कॉपी करते समय अतिरिक्त हाइलाइटर्स का उपयोग नहीं किया जाएगा।

  2. IHighlighter कार्यान्वयन बनाएं जो एस को DocumentHighlighter से जोड़ता है। यह वह दृष्टिकोण है जिसका हम शार्प डेवलपमेंट 5 में सी # अर्थात् हाइलाइटिंग के लिए उपयोग कर रहे हैं, जो एक अतिरिक्त हाइलाइटर के रूप में काम करता है जो मौजूदा .xshd- आधारित सी # हाइलाइटिंग को बढ़ाता है। हालांकि, यह दृष्टिकोण जटिल है (HighlightedLine एस विलयों पर ऑर्डरिंग और घोंसले की बाधाओं को देखते हुए गैर-तुच्छ है), और OnHighlightStateChanged अधिसूचना से निपटने के लिए IHighlighter इंटरफ़ेस में एपीआई परिवर्तन की आवश्यकता है (AvalonEdit 4.x व्युत्पन्न का उपयोग करता है इस कॉलबैक तक पहुंच प्राप्त करने के लिए HighlightingColorizer में कक्षा नेस्टेड; AvalonEdit 5.0 एक ईवेंट का उपयोग करेगा)।

+0

+1 वास्तव में अच्छा और जानकारीपूर्ण उत्तर – Wh1T3h4Ck5

संबंधित मुद्दे