Skip to content

كيف يعمل Markdown ​

فهم آلية عمل Markdown يساعدك على استثماره جيداً. يشرح هذا الفصل كيف يتحول نص Markdown إلى مستند منسّق وجميل.

سير العمل الأساسي ​

يمكن تلخيص سير العمل بالخطوات التالية:

ملف Markdown (.md) → مُحلِّل Markdown → مستند HTML → عرض المتصفح

1) كتابة ملف Markdown ​

اكتب ملف .md بأي محرر نصوص مستخدماً قواعد Markdown:

markdown
# مستندي

هذه فقرة **مهمة**.

## مثال على قائمة

- عنصر 1
- عنصر 2
- عنصر 3

2) معالجة مُحلِّل 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 مع إضافات مثل:

  • دعم الجداول
  • الشطب
  • قوائم المهام
  • التعرّف التلقائي على الروابط
  • إبراز الشيفرة في الكتل

محللات أخرى ​

المُحلِّلاللغةالميزات
markedJavaScriptسريع وخفيف
markdown-itJavaScriptقابل للإضافة وقابلية توسعة
Python-MarkdownPythonغني بالميزات ونظام إضافات
kramdownRubyيدعم مخرجات متعددة
PandocHaskellمحوّل وثائق عام

محركات العرض ​

العرض على الطرف العميل ​

تحليل 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 → مولّد موقع ساكن → موقع HTML

2) مواقع الوثائق ​

.md مستند → VitePress/Docusaurus → وثائق على الويب

3) ملفات README ​

README.md → GitHub/GitLab → صفحة المشروع الرئيسية

4) تطبيقات الملاحظات ​

ملاحظات Markdown → عرض لحظي → نص منسّق

الخطوة التالية ​

الآن وقد فهمت آلية العمل، يمكنك:

بُني بواسطة www.markdownlang.com