كيف يعمل Markdown
فهم آلية عمل Markdown يساعدك على استثماره جيداً. يشرح هذا الفصل كيف يتحول نص Markdown إلى مستند منسّق وجميل.
سير العمل الأساسي
يمكن تلخيص سير العمل بالخطوات التالية:
ملف Markdown (.md) → مُحلِّل Markdown → مستند HTML → عرض المتصفح1) كتابة ملف Markdown
اكتب ملف .md بأي محرر نصوص مستخدماً قواعد Markdown:
markdown
# مستندي
هذه فقرة **مهمة**.
## مثال على قائمة
- عنصر 1
- عنصر 2
- عنصر 32) معالجة مُحلِّل Markdown
يقرأ المُحلِّل الملف ويحوّل العناصر إلى HTML:
html
<h1>مستندي</h1>
<p>هذه فقرة <strong>مهمة</strong>.</p>
<h2>مثال على قائمة</h2>
<ul>
<li>عنصر 1</li>
<li>عنصر 2</li>
<li>عنصر 3</li>
</ul>3) عرض المتصفح
يُعرَض HTML الناتج في المتصفح كمستند منسّق.
آلية عمل المُحلِّل
التحليل المعجمي
يبدأ المُحلِّل بتحليل معجمي لتقسيم النص إلى رموز (tokens):
#عنوان**text**غامق- itemعنصر قائمة
التحليل النحوي وبناء AST
ثم تحليل نحوي وبناء شجرة بناء مجردة (AST):
وثيقة
├── عنوان (المستوى 1): "مستندي"
├── فقرة
│ ├── نص: "هذه"
│ ├── غامق: "فقرة مهمة"
│ └── نص: "."
├── عنوان (المستوى 2): "مثال على قائمة"
└── قائمة غير مرتبة
├── عنصر: "عنصر 1"
├── عنصر: "عنصر 2"
└── عنصر: "عنصر 3"توليد HTML
أخيراً تُجتاز الشجرة لتوليد HTML المناظر.
مُحلِّلات شائعة
CommonMark
- 标准规范 - 提供统一的 Markdown 解析标准
- 严格定义 - 消除不同实现之间的歧义
- 广泛支持 - 被多个解析器采用
GitHub Flavored Markdown (GFM)
مبني على CommonMark مع إضافات مثل:
- دعم الجداول
- الشطب
- قوائم المهام
- التعرّف التلقائي على الروابط
- إبراز الشيفرة في الكتل
محللات أخرى
| المُحلِّل | اللغة | الميزات |
|---|---|---|
| marked | JavaScript | سريع وخفيف |
| markdown-it | JavaScript | قابل للإضافة وقابلية توسعة |
| Python-Markdown | Python | غني بالميزات ونظام إضافات |
| kramdown | Ruby | يدعم مخرجات متعددة |
| Pandoc | Haskell | محوّل وثائق عام |
محركات العرض
العرض على الطرف العميل
تحليل Markdown آنياً في المتصفح:
javascript
// 使用 marked.js
const html = marked.parse('# Hello World');
document.body.innerHTML = html;المزايا:
- بلا معالجة خادمية
- معاينة فورية
- تخفيف حمل الخادم
العيوب:
- يعتمد على JavaScript
- غير ملائم لـ SEO
- تحميل أولي أبطأ
العرض على الخادم
توليد HTML مسبقاً على الخادم:
javascript
// Node.js 示例
const fs = require('fs');
const marked = require('marked');
const markdown = fs.readFileSync('document.md', 'utf8');
const html = marked.parse(markdown);المزايا:
- ملائم لـ SEO
- سرعة تحميل أعلى
- لا يعتمد على JavaScript على العميل
العيوب:
- كلفة معالجة خادمية
- تعقيد إدارة التخزين المؤقت
توليد مواقع ساكنة
توليد كل الصفحات وقت البناء:
bash
# 使用 VitePress
npm run buildالمزايا:
- أسرع تحميل
- أفضل SEO
- أمان مرتفع
- سهل النشر
العيوب:
- دعم محدود للمحتوى الديناميكي
- زمن بناء أطول
آلية التوسعات
نظام الإضافات
تدعم كثير من المُحلّلات إضافات توسعة:
javascript
// مثال إضافة markdown-it
const md = require('markdown-it')()
.use(require('markdown-it-footnote'))
.use(require('markdown-it-deflist'))
.use(require('markdown-it-abbr'));مُعرِض مخصّص
javascript
// توليد روابط مخصّصة
const renderer = new marked.Renderer();
renderer.link = function(href, title, text) {
return `<a href="${href}" target="_blank">${text}</a>`;
};تحسين الأداء
استراتيجيات التخزين المؤقت
javascript
const cache = new Map();
function parseMarkdown(content) {
const hash = generateHash(content);
if (cache.has(hash)) {
return cache.get(hash);
}
const result = marked.parse(content);
cache.set(hash, result);
return result;
}التحميل الكسول
javascript
// تحليل العناصر الظاهرة فقط
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
parseAndRender(entry.target);
}
});
});المعالجة المتدفقة
javascript
// تحليل متدفق للملفات الكبيرة
const fs = require('fs');
const { Transform } = require('stream');
const markdownTransform = new Transform({
transform(chunk, encoding, callback) {
const html = marked.parse(chunk.toString());
callback(null, html);
}
});
fs.createReadStream('large-document.md')
.pipe(markdownTransform)
.pipe(fs.createWriteStream('output.html'));مشكلات شائعة
1) مشكلة فواصل الأسطر
قد تختلف معاملة فواصل الأسطر بين المُحلّلات:
markdown
سطر 1
سطر 2 ← قد يُفسَّر كفقرة واحدة
سطر 1
سطر 2 ← مسافتان في نهاية السطر لكسر سطر
سطر 1
سطر 2 ← سطر فارغ يفصل الفقرات2) مزج HTML
markdown
هذا مزيج من **Markdown** و<em>HTML</em>.انتبه لإغلاق وسوم HTML وتشابكها الصحيح.
3) تهريب المحارف الخاصة
markdown
هنا نحتاج إلى تهريب المحرفين \* و\_.سيناريوهات تطبيق فعلية
1) أنظمة التدوين
مقال Markdown → مولّد موقع ساكن → موقع HTML2) مواقع الوثائق
.md مستند → VitePress/Docusaurus → وثائق على الويب3) ملفات README
README.md → GitHub/GitLab → صفحة المشروع الرئيسية4) تطبيقات الملاحظات
ملاحظات Markdown → عرض لحظي → نص منسّقالخطوة التالية
الآن وقد فهمت آلية العمل، يمكنك: