एक वाक्य में
Markdown एक सिंटैक्स है जो आपको कॉम्प्लेक्स कोड या अजीब बटनों के बजाय सरल, पढ़ने में आसान चिह्नों का उपयोग करके रिच फॉर्मेट वाला टेक्स्ट (जैसे बोल्ड, लिस्ट्स, और लिंक्स) लिखने देता है।
यह कौनसी समस्या हल करता है
चलिए, समय में पीछे चलते हैं, 2000 के दशक की शुरुआत में। अगर आप वेब के लिए कुछ लिखना चाहते थे, तो आपके पास दो बुरे विकल्प थे। विकल्प A: रॉ HTML लिखें। इसका मतलब था कि आपको मैनुअली <p>, <strong>, <ul>, <li>, और ऐसे ही अनगिनत दूसरे टैग्स टाइप करने पड़ते थे। यह धीमा था, इसमें गलतियाँ होने की संभावना ज़्यादा थी, और आपका सोर्स टेक्स्ट किसी रोबोट की छींक जैसा दिखता था। विकल्प B: एक "What You See Is What You Get" (WYSIWYG) एडिटर का उपयोग करें, जैसे शुरुआती ब्लॉगिंग प्लेटफॉर्म्स या Microsoft Word के "Save as HTML" फीचर में होते थे। ये फालतू, गंदे, और नॉन-स्टैंडर्ड HTML उगलने के लिए कुख्यात थे जो रहस्यमय तरीकों से टूट जाते थे।
दोनों में से कोई भी विकल्प असल लेखक के लिए अच्छा नहीं था।
2004 में, लेखक जॉन ग्रूबर ने, स्वर्गीय आरोन स्वार्ट्ज के योगदान के साथ, इस दुविधा को हल करने के लिए Markdown बनाया। उनका मूल सिद्धांत क्रांतिकारी था: किसी डॉक्यूमेंट का रॉ, प्लेन टेक्स्ट वर्ज़न जितना संभव हो उतना पठनीय (readable) होना चाहिए, जिसमें कोई भी फॉर्मेटिंग टैग रास्ते में न आए। लक्ष्य HTML को रिप्लेस करना नहीं था, बल्कि लिखने पर केंद्रित एक ऐसा सिंटैक्स बनाना था जिसे आसानी से साफ़-सुथरे HTML में बदला जा सके।
<strong>Look at this!</strong> लिखने के बजाय, आप बस **Look at this!** लिख सकते थे। एक लिस्ट के लिए <ul> और <li> टैग्स के जंजाल के बजाय, आप बस एस्टरिस्क (*) का उपयोग कर सकते थे। इसे पहले इंसानों के लिए, और बाद में कंप्यूटरों के लिए डिज़ाइन किया गया था। इसने इसे ब्लॉग पोस्ट्स, कमेंट्स, फ़ोरम और विशेष रूप से, प्रोजेक्ट डॉक्यूमेंटेशन के लिए एकदम सही बना दिया।
अंदर की कहानी: यह कैसे काम करता है
जब आप किसी एडिटर में Markdown टाइप करते हैं और बगल में एक सुंदर प्रीव्यू देखते हैं, तो आप दो-स्टेप वाले एक डांस को देख रहे हैं: पार्सिंग और रेंडरिंग। एक "Markdown व्यूअर" या "एडिटर" बस एक टूल है जो इस डांस को रियल-टाइम में करता है।
पार्सर: सिंबल्स से स्ट्रक्चर तक
पहला स्टेप है पार्सिंग। एक प्रोग्राम जिसे पार्सर कहा जाता है, आपके प्लेन टेक्स्ट डॉक्यूमेंट को ऊपर से नीचे तक पढ़ता है। यह सिर्फ शब्द नहीं पढ़ रहा है; यह उन स्पेशल कैरेक्टर्स की तलाश में है जो Markdown के सिंटैक्स को परिभाषित करते हैं।
- यह एक लाइन की शुरुआत में
## My Great Ideaदेखता है और सोचता है, "अरे वाह! यह सिर्फ टेक्स्ट नहीं है; यह एक लेवल-2 हेडिंग है।" - यह एक लाइन देखता है जो
*से शुरू होती है और इसे एक लिस्ट आइटम की शुरुआत के रूप में पहचानता है। - यह डबल एस्टरिस्क से घिरे टेक्स्ट को ढूंढता है, जैसे
**this**, और इसे "स्ट्रांग एम्फेसिस" (बोल्ड) के लिए फ़्लैग करता है।
ऐसा करते समय, पार्सर सीधे HTML नहीं बना रहा होता है। इसके बजाय, यह आमतौर पर आपके डॉक्यूमेंट के स्ट्रक्चर का एक इंटरनल रिप्रेजेंटेशन बनाता है, जिसे अक्सर एब्स्ट्रैक्ट सिंटेक्स ट्री (AST) कहा जाता है। इसे एक ब्लूप्रिंट की तरह समझें। ब्लूप्रिंट में <h2> टैग्स नहीं होते हैं; इसमें "Heading" नोड होता है जिसका "level" 2 होता है, और इसका कंटेंट "My Great Idea" होता है।
यहाँ इस प्रक्रिया पर एक सरल नज़र है:
आपका Markdown:
## Shopping List
- Milk
- **Important**: Bread
सरलीकृत AST (ब्लूप्रिंट):
Document
└── Heading (level 2, content: "Shopping List")
└── UnorderedList
├── ListItem (content: "Milk")
└── ListItem
└── Text (content: " ")
└── Strong (content: "Important")
└── Text (content: ": Bread")
रेंडरर: स्ट्रक्चर से HTML तक
एक बार जब पार्सर AST ब्लूप्रिंट बना लेता है, तो रेंडरर काम संभाल लेता है। रेंडरर का काम उस ट्री स्ट्रक्चर से गुजरना और प्रत्येक नोड को उसके अंतिम फॉर्मेट में बदलना है, जो आमतौर पर HTML होता है।
- यह
Headingनोड (लेवल 2) को देखता है और<h2>Shopping List</h2>प्रिंट करता है। - यह
UnorderedListनोड को देखता है और उसके कंटेंट को<ul>और</ul>से घेरता है। - यह
ListItemनोड को ढूंढता है और उसे<li>और</li>में लपेटता है। - यह
Strongनोड को देखता है और उसके कंटेंट को<strong>और</strong>में लपेटता है।
परिणामी HTML:
<h2>Shopping List</h2>
<ul>
<li>Milk</li>
<li><strong>Important</strong>: Bread</li>
</ul>
यह साफ़-सुथरा HTML फिर वेब ब्राउज़र को (या जो भी फाइनल आउटपुट दिखा रहा है) दिया जाता है, जो इसका उपयोग उस फॉर्मेटेड टेक्स्ट को रेंडर करने के लिए करता है जिसे आप वास्तव में देखते हैं।
फ्लेवर्स और एक्सटेंशंस ("CommonMark" समझौता)
ग्रूबर का ओरिजिनल स्पेसिफिकेशन कुछ जगहों पर थोड़ा अस्पष्ट था। क्या होता है अगर आप एक लिस्ट के अंदर एक ब्लॉककोट के अंदर दूसरी लिस्ट डालते हैं? अलग-अलग पार्सर्स ने अलग-अलग जवाब दिए। इससे Markdown के "फ्लेवर्स" का उदय हुआ, जिनमें से प्रत्येक में अपने छोटे-मोटे बदलाव और एक्सटेंशन थे।
| फ़ीचर | ओरिजिनल Markdown | GitHub Flavored Markdown (GFM) |
|---|---|---|
| टेबल्स | नहीं | हाँ |
स्ट्राइकथ्रू (~~text~~) |
नहीं | हाँ |
टास्क लिस्ट्स (- [x]) |
नहीं | हाँ |
| फेंस्ड कोड ब्लॉक्स (``````) | नहीं | हाँ |
अब तक का सबसे लोकप्रिय फ्लेवर GitHub Flavored Markdown (GFM) है, जिसने डेवलपर कोलेबोरेशन के लिए आवश्यक फीचर्स जोड़े जैसे कि टेबल्स, सिंटैक्स-हाइलाइटेड कोड ब्लॉक्स, और टास्क लिस्ट्स। फ्लेवर्स की भरमार ने अपनी एक अलग समस्या पैदा कर दी: आपका टेक्स्ट GitHub पर Stack Overflow की तुलना में अलग दिख सकता है।
इसे ठीक करने के लिए, डेवलपर्स के एक समूह ने CommonMark पहल शुरू की, जो Markdown के लिए एक अत्यंत विस्तृत, स्पष्ट स्पेसिफिकेशन बनाने की एक परियोजना है। अधिकांश आधुनिक Markdown पार्सर्स अब CommonMark कम्पैटिबिलिटी का लक्ष्य रखते हैं, जिसमें GFM इसका एक लोकप्रिय सुपरसेट है।
असल दुनिया की कहानियाँ
वो README जिसने प्रोजेक्ट को बचाया
एक डेवलपर, मान लीजिए उसका नाम प्रिया है, एक नई टीम में शामिल हुई। कोडबेस जटिल था और मूल लेखक बहुत पहले जा चुके थे। घबराहट होने ही वाली थी कि उसे वह मिल गया: प्रोजेक्ट के रूट में README.md। यह सिर्फ एक फ़ाइल नहीं थी; यह एक जीवन रेखा थी। स्पष्ट हेडिंग्स का उपयोग करते हुए, इसने प्रोजेक्ट के उद्देश्य को समझाया। एक "Getting Started" सेक्शन ने नंबर्ड लिस्ट का उपयोग करके सटीक सेटअप स्टेप्स बताए। महत्वपूर्ण कमांड्स को पूरी तरह से सिंटैक्स-हाइलाइटेड कोड ब्लॉक्स में प्रस्तुत किया गया था। यहाँ तक कि एक "Troubleshooting" सेक्शन भी था जिसमें आम एरर्स और उनके समाधान थे। प्रिया एक घंटे से भी कम समय में अपने मशीन पर प्रोजेक्ट चलाने में सक्षम हो गई, दिनों में नहीं।
सबक: README.md फ़ाइल में Markdown डेवलपर्स को ऑनबोर्ड करने और किसी प्रोजेक्ट को सुलभ बनाने के लिए सबसे प्रभावी टूल है। इसकी सादगी डेवलपर्स को वास्तव में इसे लिखने और बनाए रखने के लिए प्रोत्साहित करती है।
वो ब्लॉगर जिसने WYSIWYG को छोड़ दिया
एलेक्स एक टेक्निकल ब्लॉग चलाता था, लेकिन उसे अपने कंटेंट मैनेजमेंट सिस्टम (CMS) के बिल्ट-इन एडिटर से नफरत थी। यह धीमा था, कोड स्निपेट्स पेस्ट करना टूटी हुई फॉर्मेटिंग का एक बुरा सपना था, और जो HTML यह उत्पन्न करता था वह एक गड़बड़झाला था। एलेक्स ने Markdown की खोज की और उसे एक दिव्य ज्ञान हुआ। उसने अपने सभी आर्टिकल्स को अपनी लोकल मशीन पर एक सरल, डिस्ट्रैक्शन-फ्री टेक्स्ट एडिटर में लिखना शुरू कर दिया। टेक्स्ट साफ़ था, कोड ब्लॉक्स एकदम सही थे, और चूँकि यह सिर्फ एक .md फ़ाइल थी, यह Git पर बैकअप हो जाती थी। जब कोई आर्टिकल तैयार हो जाता, तो वह बस रॉ Markdown को अपने CMS में कॉपी-पेस्ट कर देता (जिसमें सौभाग्य से एक Markdown इनपुट मोड था)। वह तेज़ था, कम निराश था, और उसका कंटेंट अब पूरी तरह से पोर्टेबल था, किसी एक प्लेटफॉर्म में बंद नहीं था।
सबक: Markdown आपके कंटेंट को आपकी प्रेजेंटेशन से अलग करता है। एक यूनिवर्सल, प्लेन-टेक्स्ट फॉर्मेट में लिखकर, आप अपने काम के मालिक होते हैं और इसे आसानी से टूल्स और प्लेटफॉर्म्स के बीच ले जा सकते हैं।
नॉन-डेवलपर का पुल रिक्वेस्ट
एक छोटे स्टार्टअप में मार्केटिंग टीम ने पब्लिक-फेसिंग API डॉक्यूमेंटेशन वेबसाइट पर एक बड़ी टाइपो देखी। डॉक्स GitHub पर होस्ट किए गए थे, और सारी फाइलें Markdown में थीं। एक प्रोडक्ट मैनेजर, जिसे शून्य HTML या Git आता था, GitHub की वेबसाइट पर सही फ़ाइल पर नेविगेट करने, "Edit" बटन पर क्लिक करने और मानव-पठनीय Markdown टेक्स्ट को देखने में सक्षम था। उसने टाइपो को ठीक किया, बदलाव को समझाते हुए एक कमेंट जोड़ा, और "Propose changes" पर क्लिक किया। इससे एक पुल रिक्वेस्ट बन गया जिसे एक डेवलपर ने जल्दी से रिव्यू किया और मर्ज कर दिया। फिक्स मिनटों में लाइव हो गया।
सबक: Markdown की पठनीयता कोलेबोरेशन के लिए एंट्री बैरियर को कम कर देती है। यह नॉन-टेक्निकल टीम के सदस्यों को डेवलपर बनने की आवश्यकता के बिना, डॉक्यूमेंटेशन, वेबसाइट्स, और बहुत कुछ में सीधे योगदान करने के लिए सशक्त बनाता है।
आम गलतियाँ और जाल
खाली लाइन (blank line) भूल जाना। यह "मेरी लिस्ट रेंडर क्यों नहीं हो रही?!" का #1 कारण है। कई Markdown एलिमेंट्स, जैसे लिस्ट्स, ब्लॉककोट्स, और कोड ब्लॉक्स, को सही ढंग से पार्स किए जाने के लिए अपने से पहले एक खाली लाइन की आवश्यकता होती है। आपकी आँख एक लिस्ट देख सकती है, लेकिन पार्सर को कॉन्टेक्स्ट बदलने के लिए उस खाली लाइन की ज़रूरत होती है।
असंगत लिस्ट इंडेंटेशन। सब-लिस्ट बनाते समय, इंडेंट करने के लिए आप कितने स्पेस का उपयोग करते हैं, यह मायने रखता है। CommonMark स्पेक कहता है कि 2 या 4 स्पेस का इंडेंट आम है। टैब्स और स्पेस को मिलाना या असंगत इंडेंटेशन का उपयोग करना लिस्ट स्ट्रक्चर को तोड़ देगा।
यह मान लेना कि आपका फ्लेवर यूनिवर्सल है। आप GFM के पाइप सिंटैक्स (
| Head | Head |) का उपयोग करके एक सुंदर टेबल बनाते हैं, फिर उसे एक ऐसे सिस्टम में पेस्ट करते हैं जो केवल वैनिला Markdown को सपोर्ट करता है। नतीजा: पाइप्स और डैश का एक उलझा हुआ जंजाल। हमेशा इस बात से अवगत रहें कि आपका टारगेट प्लेटफॉर्म कौन सा फ्लेवर सपोर्ट करता है।लाइन ब्रेक पैराग्राफ नहीं होते हैं। अपनी सोर्स फ़ाइल में, आप अगली लाइन पर जाने के लिए एक बार Enter दबाते हैं। रेंडर किए गए आउटपुट में, यह आमतौर पर एक नया पैराग्राफ नहीं बनाता है। यह सिर्फ लाइनों को जोड़ता है। एक सच्चा पैराग्राफ ब्रेक (
<p>टैग) बनाने के लिए, आपको एक पूरी खाली लाइन चाहिए (यानी, दो बार Enter दबाएं)। एक साधारण लाइन ब्रेक (<br>टैग) को फोर्स करने के लिए, Enter दबाने से पहले एक लाइन को दो स्पेस के साथ समाप्त करें।स्पेशल कैरेक्टर्स को एस्केप न करना। क्या आप
*literally*टेक्स्ट को इटैलिक में बदले बिना लिखना चाहते हैं? आपको स्पेशल कैरेक्टर को बैकस्लैश से "एस्केप" करना होगा:\*literally\*। यह#,_,[,], और सिंटैक्टिक अर्थ वाले अन्य कैरेक्टर्स पर लागू होता है।
यह आपके रडार पर क्यों होना चाहिए
आपको Markdown के बारे में तब सोचना चाहिए जब भी आपको ऐसा फॉर्मेटेड टेक्स्ट लिखने की आवश्यकता हो जो लिखने में आसान हो, पढ़ने में आसान हो, और किसी प्रोप्राइटरी फॉर्मेट में बंद न हो। यह डेवलपर कम्युनिकेशन की लिंग्वा फ़्रैंका (lingua franca) है।
- प्रोजेक्ट डॉक्यूमेंटेशन: हर
README.md,CONTRIBUTING.md, और विकी पेज। - नोट लेना: Obsidian, Joplin, और Bear जैसे टूल्स Markdown पर बने हैं, जो आपको एक पोर्टेबल, लिंक करने योग्य व्यक्तिगत ज्ञान का आधार बनाने देते हैं।
- कंटेंट क्रिएशन: एक स्टैटिक साइट जनरेटर (जैसे Jekyll, Hugo, Eleventy) या "हेडलेस" CMS के लिए लिखना।
- रोजमर्रा का कम्युनिकेशन: GitHub/GitLab पर इश्यूज, पुल रिक्वेस्ट्स, और कमेंट्स लिखना; Stack Overflow पर सवाल पूछना और जवाब देना; Slack या Discord में चैट करना।
Markdown, .txt की दर्दनाक सादगी और .docx या रॉ HTML की ज़रूरत से ज़्यादा जटिलता के बीच एकदम सही संतुलन बनाता है। यह आधुनिक सॉफ्टवेयर डेवलपमेंट और डिजिटल कम्युनिकेशन के लिए एक मौलिक टूल है।
और गहराई में जाएँ
- [Daring Fireball: Markdown] (https://daringfireball.net/projects/markdown/): जॉन ग्रूबर द्वारा मूल घोषणा और सिंटैक्स गाइड। ऐतिहासिक स्रोत।
- [CommonMark Spec] (https://spec.commonmark.org/): आधुनिक Markdown के लिए अत्यंत विस्तृत, आधिकारिक स्पेसिफिकेशन। पार्सर बनाने वाले किसी भी व्यक्ति के लिए आवश्यक।
- [GitHub Flavored Markdown Spec] (https://github.github.com/gfm/): CommonMark के सबसे लोकप्रिय सुपरसेट के लिए स्पेक, जिसमें टेबल्स, टास्क लिस्ट्स, और बहुत कुछ का विवरण है।
- [MDN: Markdown] (https://developer.mozilla.org/en-US/docs/Glossary/Markdown): Mozilla डेवलपर नेटवर्क से एक संक्षिप्त अवलोकन।
- [The Markdown Guide] (https://www.markdownguide.org/): एक उत्कृष्ट और संपूर्ण गाइड जिसमें बेसिक सिंटैक्स, एक्सटेंडेड सिंटैक्स और चीट शीट्स शामिल हैं।