आप मार्केडस को पार्स करने के बारे में कैसे जाएंगे? [बन्द है]


126

संपादित करें: मैंने हाल ही में कॉमनमार्क नामक एक परियोजना के बारे में सीखा है, जो मूल मार्काडाउन विनिर्देश में अस्पष्टता के साथ सही ढंग से पहचान और व्यवहार करता है। http://commonmark.org/ इसमें महान C # लाइब्रेरी समर्थन है।

आप यहां सिंटैक्स पा सकते हैं ।

डाउनलोड के साथ आने वाला स्रोत पर्ल में लिखा गया है , जिसका मेरे पास सम्मान करने का कोई इरादा नहीं है। यह नियमित अभिव्यक्तियों से भरा हुआ है, और यह कुछ पात्रों से बचने के लिए एमडी 5 हैश पर निर्भर करता है । उसके बारे में कुछ गलत है!

मैं मार्कडाउन के लिए एक कठिन कोड पार्सर के बारे में हूं । इसके साथ क्या अनुभव है?

यदि आपके पास मार्कडाउन के वास्तविक पार्सिंग के बारे में कहने के लिए कुछ भी सार्थक नहीं है, तो मुझे समय दें। (यह कठोर लग सकता है, लेकिन हां, मैं अंतर्दृष्टि की तलाश कर रहा हूं, समाधान नहीं, अर्थात, तृतीय-पक्ष पुस्तकालय)।

उत्तरों के साथ थोड़ी मदद करने के लिए, नियमित अभिव्यक्ति पैटर्न की पहचान करने के लिए होती है ! संपूर्ण व्याकरण को पार्स करने के लिए नहीं। कि लोग ऐसा करने पर विचार कर रहे हैं।

  • यदि आप मार्कडाउन के बारे में सोचते हैं, तो यह मूल रूप से पैराग्राफ की अवधारणा के आसपास आधारित है।
  • जैसे, इनपुट में पैराग्राफ को विभाजित करने के लिए एक उचित दृष्टिकोण हो सकता है।
  • कई प्रकार के पैराग्राफ हैं, उदाहरण के लिए, हेडिंग, टेक्स्ट, लिस्ट, ब्लॉकक्वाइट और कोड।
  • चुनौती इस प्रकार है कि इन अनुच्छेदों की पहचान की जाए और वे किस संदर्भ में घटित हों।

मैं एक समाधान के साथ वापस आऊंगा, एक बार जब मुझे लगता है कि यह साझा करने योग्य है।


2
@ क्लेटस मार्कडाउन पार्सर लिख रहा है, cforcoding.com/search/label/markdown
एलेक्स एंगस

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

@JohnLeidegren, कोई भी मौका जैसे अन्य जिज्ञासु उपयोगकर्ता अपने आप को मार्कशीट पर अपना प्रयास देख सकते हैं?
jmlopez

@jmlopez क्षमा करें, मेरे पास अब उस स्रोत तक पहुंच नहीं है, अगर आपको मार्कटेशन पार्सर की आवश्यकता है, तो एक NuGet पैकेज उपलब्ध है जिसका उपयोग किया जा सकता है। हालांकि यह विचार काफी सरल है, बस पास में नियमित अभिव्यक्ति की एक श्रृंखला लागू करें, पैराग्राफ में इनपुट को पार करके शुरू करें फिर पहचानने की कोशिश करें कि यह किस तरह का पैराग्राफ है, और इसी तरह। अंत में, पैराग्राफ के भीतर लिंक और चरित्र शैलियों को पार्स करें।
जॉन लेडिग्रेन

2
आपको पार्सडाउन देखना चाहिए । यह लाइनों में पाठ को विभाजित करता है। फिर यह देखता है कि ये रेखाएं कैसे शुरू होती हैं और एक-दूसरे से संबंधित हैं।
इमानुएल रूसेव

जवाबों:


69

एकमात्र मार्कडाउन कार्यान्वयन, जिसके बारे में मुझे पता है, जो एक वास्तविक पार्सर का उपयोग करता है, वह है जॉन मैकफर्लेन का खूंटी- मार्कडाउनइसका पार्सर एक पार्सिंग एक्सप्रेशन ग्रामर पार्सर जनरेटर पर आधारित है जिसे पेग कहा जाता है ।


EDIT: मौरिसियो फर्नांडीज ने हाल ही में अपना सिंपल मार्कअप मार्काडाउन पार्सर जारी किया , जिसे उन्होंने अपने ऑक्सिओब्लॉग वेबलॉग इंजन के हिस्से के रूप में लिखा था । क्योंकि Parser OCaml में लिखा गया है , यह अत्यंत सरल और छोटा है ( Parser के लिए 268 SLOC , HTML emitter के लिए 43 SLOC ), फिर भी धधकते हुए तेज़ ( डिस्काउंट से 20% तेज़ (हाथ से अनुकूलित C में लिखा गया) और छः सौ गुना तेज़ी से ब्लूक्लोथ ( रूबी) की तुलना में)), इस तथ्य के बावजूद कि यह अभी तक प्रदर्शन के लिए अनुकूलित नहीं है। क्योंकि यह केवल अपने वेबलॉग के लिए मौरिसियो द्वारा आंतरिक उपयोग के लिए है, आधिकारिक मार्काडाउन विनिर्देश से कुछ विचलन हैं , लेकिन मौरिसियो ने एक शाखा बनाई है जो उन परिवर्तनों में से अधिकांश का सम्मान करती है


1
दिलचस्प। शायद मैं कोशिश करूँगा कि एक f # प्रोजेक्ट के रूप में
ShuggyCoUk

@ बेंजोल एक ही पुरानी कहानी: कोई समय नहीं: /
ShuggyCoUk

1
टेरेंस पर्र (ANTLR के सह लेखक) ने ANTLR 4 के लिए एक लिखा है: github.com/parrt/mini-markdown
क्रिस एस

17

मैंने पिछले हफ्ते एक नया पार्सर-आधारित मार्कडाउन जावा कार्यान्वयन जारी किया, जिसे पेगडाउन कहा जाता है । पेगडाउन पहले एक सार सिंटैक्स ट्री बनाने के लिए एक पीईजी पार्सर का उपयोग करता है, जिसे बाद में HTML में लिखा जाता है। जैसा कि यह काफी साफ है और रेगेक्स आधारित दृष्टिकोण की तुलना में पढ़ने, बनाए रखने और विस्तार करने में बहुत आसान है। खूंटी व्याकरण जॉन मैकफ़र्लेनस सी कार्यान्वयन "पेग-मार्कडाउन" पर आधारित है।

हो सकता है कि आप के लिए ब्याज की कुछ ...


1
यह अब आधिकारिक तौर पर पदावनत कर दिया गया है
Fabich

7

अगर मुझे मार्कडाउन (और इसके विस्तार मार्काडाउन अतिरिक्त ) को पार्स करने की कोशिश करनी थी, तो मुझे लगता है कि मैं एक राज्य मशीन का उपयोग करने की कोशिश करूंगा और इसे एक बार में एक बार पार्स करूंगा, कुछ आंतरिक संरचनाओं को एक साथ जोड़कर पाठ के बिट्स का प्रतिनिधित्व करता हूं जैसा कि मैं तब जाता हूं, एक बार सभी को पार्स किया जाता है, सभी स्ट्रिंग को एक साथ ऑब्जेक्ट से आउटपुट जेनरेट करता है।

मूल रूप से, मैं एक छोटा-डोम जैसा वृक्ष बनाऊंगा जैसा कि मैंने इनपुट फाइल को पढ़ा है।
एक आउटपुट उत्पन्न करने के लिए, मैं बस ट्री और आउटपुट HTML या कुछ और (PS, LaTex, RTF, ...) को पार करूंगा।

चीजें जो जटिलता बढ़ा सकती हैं:

  • तथ्य यह है कि आप HTML और मार्कडाउन को मिला सकते हैं, हालांकि नियम को लागू करना आसान हो सकता है: बस दो संतुलित टैग के बीच कुछ भी अनदेखा करें और इसे शब्दशः आउटपुट करें।

  • URL और नोट्स पाठ के निचले भाग में अपना संदर्भ दे सकते हैं। हाइपरलिंक्स के लिए डेटा स्ट्रक्चर्स का उपयोग करके कुछ ऐसा रिकॉर्ड किया जा सकता है:

    [my text to a link][linkkey]
    results in a structure like: 
        URLStructure: 
        |  InnerText : "my text to a link"
        |  Key       : "linkkey"
        |  URL       : <null>
    
  • हेडर्स को एक अंडरलाइन के साथ परिभाषित किया जा सकता है, जो हमें एक सामान्य पैराग्राफ के लिए एक सरल डेटा संरचना का उपयोग करने और इसके गुणों को संशोधित करने के लिए मजबूर कर सकता है, जैसा कि हमने फ़ाइल को पढ़ा:

    ParagraphStructure:
    |  InnerText    : the current paragraph text 
    |                 (beginning of line until end of line).
    |  HeadingLevel : <null> or 1-4 when we can assess 
    |                 that paragraph heading level, if any.
    

वैसे भी, बस कुछ विचार।

मुझे यकीन है कि देखभाल करने के लिए कई छोटे विवरण हैं और मुझे पूरा यकीन है कि रेगेक्स प्रक्रिया के दौरान काम कर सकता है।
आखिरकार, वे पाठ को संसाधित करने के लिए थे।


3

मैं शायद इसे जानने के लिए वाक्यविन्यास विनिर्देश को पर्याप्त बार पढ़ूंगा, और इसे पार्स करने का तरीका महसूस करूंगा।

मौजूदा पार्सर कोड पढ़ना निश्चित रूप से शानदार है, दोनों यह देखने के लिए कि जटिलता का मुख्य स्रोत क्या प्रतीत होता है, और यदि कोई विशेष चतुर चाल का उपयोग किया जा रहा है। एमडी 5 चेकसमिंग का उपयोग थोड़ा अजीब लगता है, लेकिन मैंने यह समझने के लिए कोड का पर्याप्त अध्ययन नहीं किया है कि ऐसा क्यों किया जा रहा है। _EscapeSpecialChars()राज्यों की दिनचर्या में एक टिप्पणी :

हम प्रत्येक ऐसे चरित्र को उसके संबंधित MD5 चेकसम मान के साथ बदल रहे हैं; यह संभावना अधिक है, लेकिन यह हमें दुर्घटना से बचने के मूल्यों से टकराने से रोकना चाहिए।

किसी एकल वर्ण को पूर्ण MD5 द्वारा प्रतिस्थापित करना असाधारण प्रतीत होता है, लेकिन शायद यह वास्तव में समझ में आता है।

बेशक, यह एक "सच" वाक्यविन्यास बनाने पर विचार करने के लिए चतुर होगा, जैसे फ्लेक्स जैसे कि रेगीक्स कोहरे से बाहर निकलने के लिए।


एमडी 5 की बात अभी भी मुझे परेशान करती है, यह भी है कि अत्यधिक स्ट्रिंग हेरफेर आपको अपने आप को लिखने वाले किसी भी वास्तविक सभ्य पार्सर की तुलना में धीमा होना चाहिए।
जॉन लेडिग्रेन 7

2
फ्लेक्स वास्तव में केवल आधा पार्सर है; एक बार जब आप इनपुट को टोकन कर लेते हैं, तो आपको यह निर्धारित करने की आवश्यकता होती है कि टोकन का क्या मतलब है। यह एक पार्सर जनरेटर है। यहां उनमें से बहुत सारे हैं। ("पार्सर कॉम्बिनेटर", "पुनरावर्ती-वंश" और "एलएएलआर (1)" गूगल के लिए महत्वपूर्ण हैं।)
जर्कवे

1
@ जिक्रवे: यह बिल्कुल सच है, मुझे लगता है कि मैंने झिड़क दिया और सोचा "लेकिन अगर वह फ्लेक्स पर पढ़ता है, तो वह बाइसन को स्वचालित रूप से ढूंढ लेगा"। :) धन्यवाद।
खोलना



1

यदि आप एक प्रोग्रामिंग भाषा का उपयोग कर रहे हैं जिसमें तीन से अधिक अन्य उपयोगकर्ता हैं, तो आपको इसे पार्स करने के लिए एक पुस्तकालय खोजने में सक्षम होना चाहिए। एक त्वरित Google-ing सीएल, हास्केल, पायथन, जावास्क्रिप्ट, रूबी, और इतने पर पुस्तकालयों का खुलासा करता है। यह अत्यधिक संभावना नहीं है कि आपको इस पहिया को फिर से स्थापित करने की आवश्यकता होगी।

यदि आपको वास्तव में इसे स्क्रैच से लिखना है, तो मैं एक उचित पार्सर लिखने की सलाह देता हूं। इस तकनीक के साथ, आपको एमडी 5 हैश वाली चीजों से बचना नहीं होगा। (मैं मानता हूं कि अगर आपको ऐसा कुछ करना है, तो अपने डिजाइन पर पुनर्विचार करने का समय आ गया है।)


मैं चुनौती के लिए तैयार हूं। मैंने पुस्तकालयों को देखा लेकिन वे सिर्फ भयानक हैं। कुरूप और मूर्ख। मैं एफ # में पार्सर लिखने पर विचार कर रहा हूं क्योंकि मुझे एफ # प्रोजेक्ट की आवश्यकता है लेकिन मैं शायद इसे सी # में करूंगा।
जॉन लीडग्रेन 7

उम्मीद है कि F # में पारसेक जैसी लाइब्रेरी है; यदि हां, तो यह एक मजेदार परियोजना होगी;)
मारक

0

पीएचपी, रूबी, जावा, सी #, जावास्क्रिप्ट सहित कई भाषाओं में पुस्तकालय उपलब्ध हैं। मेरा सुझाव है कि इनमें से कुछ को विचारों के लिए देखें।

यह निर्भर करता है कि आप किस भाषा का उपयोग करना चाहते हैं, इसे लागू करने का सबसे अच्छा तरीका है, इसे करने के लिए मुहावरेदार और गैर मुहावरेदार तरीके होंगे।

Regexes perl में काम करते हैं, क्योंकि perl और regex सबसे अच्छे दोस्त हैं।


1
रेगेक्स और पर्ल सबसे अच्छे दोस्त हैं क्योंकि किसी ने ऐसा कहा। इस तथ्य से अधिक कोई तथ्य नहीं है कि यह ऐतिहासिक वंश है, कि इसका उपयोग इस तरह किया गया है। मुझे पर्ल जैसी किसी चीज का कोई फायदा नहीं है।
जॉन लीडग्रेन ने

7
तब इसका उपयोग न करें .. इसके अलावा, विडंबना सीखें।
गरबा करें

0

मार्कडाउन एक JAWL है (सिर्फ एक और विकि भाषा)

वहाँ खुले स्रोत विकी के बहुत सारे हैं जो आप पार्सर के कोड की जांच कर सकते हैं। अधिकांश REGEX का उपयोग करते हैं

स्क्रैच विकी की जांच करें, एक दिलचस्प मल्टी पास फॉर्मैटर पाइपलाइन है, एक बहुत अच्छी तकनीक है - देखें /core /Formatter.cs और /core/FormatterPipeline.cs।

किसी मौजूदा परियोजना में उपयोग / शामिल होने के लिए सबसे अच्छा है, इस प्रकार की चीजें हमेशा दिखाई देने की तुलना में बहुत कठिन होती हैं


0

यहां आप मार्कडाउन का जावास्क्रिप्ट-कार्यान्वयन पा सकते हैं। यह नियमित अभिव्यक्तियों पर भी काफी निर्भर करता है, क्योंकि यह पाठ को पार्स करने का सबसे तेज़ और आसान तरीका है।

लेकिन यह एमडी 5 पार्ट को बख्शता है।

मैं सीधे पार्सिंग के कोडिंग में मदद नहीं कर सकता, लेकिन शायद यह लिंक आपको एक या दूसरे तरीके से मदद कर सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.