كيف تفتح ملف .mmd
ملف .mmd ملف نصي عادي يحتوي على مخطط Mermaid. وهو ليس صورة ولا صيغة ثنائية — تستطيع فتحه بأي محرر نصوص وقراءته. ولرؤيته مخططًا، أفلِته على الإطار أدناه. يُرسم داخل متصفحك أنت، ولا يذهب شيء إلى أي خادم.
أفلِت ملف .mmd هنا
يقبل أيضًا .mermaid و.md و.txt. يُقرأ الملف في المتصفح ولا يُرسل أبدًا.
ما ملف .mmd
Mermaid صياغة نصية للمخططات. تصف المخطط بالكلمات فيرسمه المحرك — تمامًا كما يصف Markdown التنسيق فينتج المحرك الصفحة. وملف .mmd يحتوي على ذلك النص ولا شيء غيره: لا تنسيق، ولا بيانات صورة، ولا بيانات وصفية.
وهذا كل سبب وجود هذه الصيغة. فلكونه نصًا، يستطيع المخطط أن يسكن مستودع Git إلى جانب الشيفرة التي يصفها، ويظهر التغيير فرقًا مقروءًا لا ملفًا ثنائيًا مستبدلًا. وهذا ملف .mmd كامل وصالح:
flowchart LR
Commit[دفع إلى main] --> Build[شغّل الاختبارات]
Build -->|نجح| Deploy[انشر إلى الإنتاج]
Build -->|فشل| Alert[أبلغ صاحب التغيير]
Deploy --> Smoke[اختبار سريع]
Smoke --> Done[اكتمل الإصدار]بماذا يُفتح ملف .mmd
باختصار: لا يكاد شيء يفتح ملف .mmd بنقرة مزدوجة، لأن الامتداد غير مرتبط بأي تطبيق. والذي تحتاجه فعلًا شيء يستطيع رسم Mermaid. وفيما يلي ما جرّبته والمواضع التي لا ينفع فيها.
هذا الموقعيفتحه
يرسم الملف فورًا
أفلِت الملف على الإطار أعلاه فتحصل على المخطط. ولا توجد خطوة رفع: يُقرأ الملف في المتصفح عبر File API ويُرسم محليًا، وهو ما ينفع أيضًا للمخططات التي لا يُسمح لك بإخراجها.
وإن أردت تعديل المخطط لا مجرد رؤيته، فاستعمل الرابط أسفل المعاينة لفتحه في المحرر.
أي محرر نصوصيفتحه
يعرض المصدر لا المخطط
المفكرة أو Notepad++ أو vim — أيّها كان. فملف .mmd نص بترميز UTF-8، وسترى المصدر فورًا. ولن ترى المخطط، وليس في الأمر عطب — ببساطة لا توجد داخل الملف صورة تُعرض.
وهذه أسرع طريقة للتحقق من أن ملفًا أرسله إليك أحدهم هو Mermaid فعلًا: افتحه وانظر هل أول سطر غير فارغ كلمة مفتاحية لمخطط مثل flowchart أو sequenceDiagram أو classDiagram أو stateDiagram-v2 أو erDiagram أو gantt.
GitHubلا يفتحه
يرسم كتل ```mermaid داخل Markdown، ولا يرسم ملفات .mmd
يرسم GitHub مخططات Mermaid داخل كتل الشيفرة المسيَّجة. ويعدّد التوثيق المواضع بدقة: المسائل والمناقشات وطلبات الدمج والويكي وملفات Markdown. أما ملف .mmd القائم بذاته فليس في تلك القائمة، وفتحه في متصفح ملفات المستودع يعرض نص المصدر.
فإن أردت أن يظهر المخطط على GitHub وجب أن يكون داخل كتلة ```mermaid في ملف .md لا في ملف .mmd مستقل. والاحتفاظ بملف .mmd مصدرًا وتكرار المحتوى نفسه في README ازدواج شائع ومعقول.
GitLabلا يفتحه
يرسم كتل ```mermaid ولا يرسم ملفات .mmd، وعلى نسخة أقدم من Mermaid
النمط نفسه كما في GitHub: يُرسم Mermaid داخل الكتل المسيَّجة في Markdown والمسائل وطلبات الدمج والويكي، لكن لا يُذكر في أي موضع أن ملف .mmd القائم بذاته يُرسم.
وثمة أمر ثانٍ يستحق المعرفة لأنه يثير التباسًا حقيقيًا. يذكر GitLab.com أنه يدعم Mermaid بنسخته العاشرة. وهذا الموقع يعمل على 11.12.2. فالصياغة المضافة بعد النسخة العاشرة تُرسم هنا وتسقط هناك — وهذا عادةً ما يفسّر «يعمل في المتصفح ولا يعمل على GitLab عندنا». وفي GitLab المُستضاف ذاتيًا مزلق ثالث: حين تُضبط ترويسة Cross-Origin-Resource-Policy على same-site أو same-origin تسقط مخططات Mermaid بصمت — لا خطأ ولا مخطط.
.mmd و.mermaid و.md
.mmd و.mermaid شيء واحد. كلاهما لا يحتوي إلا مصدر Mermaid، وكل الأدوات التي أعرفها وتقبل أحدهما تقبل الآخر. و.mmd أقصر وأشيع؛ وأداة سطر الأوامر الرسمية تستعمله افتراضيًا. اختر واحدًا والزمه داخل المشروع الواحد — فليس للاختيار أي أثر تقني.
أما .md فمختلف في جنسه. فملف Markdown مستند قد يحتوي مخطط Mermaid، ملفوفًا في كتلة تبدأ بثلاث علامات اقتباس خلفية وكلمة mermaid. والمخطط جزء داخل نص أكبر.
وهذا الفرق هو أشيع سبب لعدم رسم ملف، وهو يعمل في الاتجاهين. ألصق محتوى ملف .md في عارض Mermaid فيسقط، لأن سطر السياج ليس صياغة Mermaid. واحفظ مخطط Mermaid عاريًا في ملف .md بلا سياج فيعرضه GitHub فقرةَ نص. والقاعدة بسيطة: ملف .mmd يجب أن يبدأ بكلمة مفتاحية لمخطط، وملف .md يجب أن يضع المخطط داخل كتلة مسيَّجة.
ويقبل هذا العارض .mmd و.mermaid و.md و.txt، لكنه يعامل كل ما يقرؤه بوصفه Mermaid خامًا. فإن كنت تُفلت ملف Markdown فيه كلام حول المخطط، فاحذف أولًا كل ما ليس مخططًا.
لا يُرسم — ما الخطأ حقًا
رسائل خطأ Mermaid دقيقة وغير ودودة. والحيلة النافعة هي قراءة آخر الرسالة وحده: فبعد `got` يسمّي Mermaid الرمز الذي تعثّر عنده، وذلك الرمز يدل على المشكلة أفضل بكثير من رقم السطر. وكل حالة أدناه أعدت إنتاجها على mermaid 11.12.2: النسخة الخاطئة تسقط فعلًا، والمصححة تُرسم فعلًا.
ما تراه
No diagram type detected matching given configuration for text: ```mermaid
لماذا
نسخت المخطط من ملف Markdown أو من محادثة وأخذت معه السياج. فعلامات الاقتباس الخلفية الثلاث هي Markdown لا Mermaid، ولذلك لا يصل المحلل إلى المخطط أبدًا.
الحل
احذف سطر الفتح ```mermaid وسطر الإغلاق ```. ويجب أن يبدأ الملف بكلمة مفتاحية لمخطط.
```mermaid
flowchart TD
A[بداية] --> B[نهاية]
```flowchart TD
A[بداية] --> B[نهاية]ما تراه
Lexical error on line N. Unrecognized text. — والمعرّف يبدو سليمًا
لماذا
في المعرّف علامة تشكيل. فالشدّة والفتحة والكسرة محارف تركيبية مستقلة، لا جزء من الحرف الذي تعلوه، ويرفضها المحلل في موضع المعرّف. قِيس: `حوّل` بالشدّة يسقط، و`حول` بدونها يعمل ويخرج المعرّف `flowchart-حول`. والفرق على الشاشة علامة صغيرة قد لا تُلحظ أصلًا. أما في التسميات فالتشكيل مقبول تمامًا.
الحل
اترك المعرّفات بلا تشكيل وضع المشكول في التسمية. والمعرّف لا يُعرض للقارئ أصلًا، فلا خسارة في ذلك.
flowchart TD
حوّل[تحويل البيانات] --> B[انتهى]flowchart TD
تحويل[حوّل البيانات] --> B[انتهى]ما تراه
Invalid date:٠١/٠٣/٢٠٢٦
لماذا
كتبت تاريخ مخطط جانت بالأرقام العربية الهندية. وهذا مزلق خاص بالكتابة العربية، ومن القلائل التي تسقط صراحةً بدل أن تصمت. والتمييز دقيق: الأرقام العربية الهندية ممنوعة في التواريخ وحدها، ومقبولة تمامًا داخل اسم المهمة لأن الاسم تسمية تُعرض لا قيمة تُحلَّل.
الحل
اكتب التواريخ بالأرقام اللاتينية، واحتفظ بالأرقام العربية الهندية في العناوين وأسماء المهام إن شئت.
gantt
dateFormat DD/MM/YYYY
section س
مهمة :a1, ٠١/٠٣/٢٠٢٦, 10dgantt
dateFormat DD/MM/YYYY
section س
مهمة :a1, 01/03/2026, 10dما تراه
Parse error ينتهي بـ: got 'PS'
الخطأ ينتهي بـ: got 'PS'
لماذا
قوس دائري مفتوح داخل تسمية عقدة. ففي Mermaid الأقواس الدائرية صياغة شكل — إذ A(نص) عقدة مستديرة — ولذلك يُقرأ القوس المجرد داخل القوسين المربعين بداية شكل.
الحل
ضع التسمية بين علامتَي اقتباس. فكل ما بينهما يُعامل نصًا، بما في ذلك الأقواس.
flowchart TD
A[نادِ اخصم(الطلب)] --> B[انتهى]flowchart TD
A["نادِ اخصم(الطلب)"] --> B[انتهى]ما تراه
Parse error في السطر الذي سمّيت فيه العقدة
لماذا
معرّف العقدة فيه مسافة. وفي العربية هذا سهل الوقوع، لأن الأسماء الطبيعية مركّبة: «خدمة التوثيق»، «قاعدة البيانات». فالمعرّف هو الرمز السابق للسهم، والمسافة تقطعه فتترك كلمة لا موضع لها.
الحل
امنح العقدة معرّفًا من كلمة واحدة وضع النص المقروء في التسمية. والحروف العربية تعمل في المعرّفات؛ المسافة وحدها هي التي تُفسد.
flowchart TD
خدمة التوثيق --> قاعدة البياناتflowchart TD
توثيق[خدمة التوثيق] --> قاعدة[قاعدة البيانات]ما تراه
Parse error ينتهي بـ: got 'end'
الخطأ ينتهي بـ: got 'end'
لماذا
استعملت end معرّفًا لعقدة. فكلمة end بحروف صغيرة تُغلق مجموعة فرعية، ولذلك يرى المحلل نهاية كتلة في موضع كان ينتظر فيه عقدة. ويحدث هذا كثيرًا عند اتباع الأمثلة الإنجليزية.
الحل
اكتبها بحرف كبير أو امنح العقدة معرّفًا آخر وانقل الكلمة إلى التسمية. و`نهاية` لا تسبب إشكالًا.
flowchart TD
A[بداية] --> endflowchart TD
A[بداية] --> نهاية[اكتمل]ما تراه
يُرسم المخطط، لكن في مخطط الحالات صارت حالة واحدة عدة مربعات
لماذا
مسافة داخل معرّف الحالة. فبخلاف مخطط التدفق لا يعترض مخطط الحالات: بل ينشئ مربعًا مستقلًا لكل كلمة ويرسمه دون أن يرفّ له جفن. قِيس — `[*] --> في انتظار الدفع` ينتج ثلاث حالات هي `في` و`انتظار` و`الدفع`، ولا يتصل بالسهم إلا أولها. وأسماء الحالات العربية لا تكاد تسع كلمة واحدة، فيتكرر هذا كثيرًا دون أي إشارة.
الحل
صرّح بالحالة عبر `state "التسمية" as المعرّف` وأشر إليها بالمعرّف وحده.
stateDiagram-v2
[*] --> في انتظار الدفع
في انتظار الدفع --> مغلقstateDiagram-v2
state "في انتظار الدفع" as بانتظارالدفع
[*] --> بانتظارالدفع
بانتظارالدفع --> مغلقما تراه
يُرسم المخطط، لكن في مخطط الكيانات كيانات لم تكتبها
لماذا
تسمية العلاقة فيها مسافة وليست بين علامتَي اقتباس. وهذا أكثر ما يعترض الكتابة بالعربية، لأن عبارات العلاقة عندنا مركّبة: «ينتمي إلى»، «يظهر في». ولا يبلّغ Mermaid عن خطأ: بل يقتطع التسمية عند أول مسافة ويحوّل كل كلمة باقية إلى كيان فارغ.
الحل
ضع بين علامتَي اقتباس كل تسمية علاقة فيها مسافة. وهذا في العربية يعني كل تسمية عمليًا.
erDiagram
عميل ||--o{ طلب : ينتمي إلىerDiagram
عميل ||--o{ طلب : "ينتمي إلى"ما تراه
يُرسم المخطط، لكن الرسالة تخرج بلا نص
لماذا
لا نص بعد النقطتين في مخطط تسلسل. قِيس: لا يرفض Mermaid ذلك بل يرسم الرسالة بتسمية فارغة. والذي يسقط فعلًا هو حذف النقطتين أصلًا: فـ `A->>B` وحدها تعطي `Expecting 'TXT', got 'NEWLINE'`. إذن النقطتان إلزاميتان والنص ليس كذلك.
الحل
اكتب شيئًا بعد النقطتين، ولو كلمة واحدة.
sequenceDiagram
العميل->>الواجهة:
الواجهة-->>العميل: 200sequenceDiagram
العميل->>الواجهة: أنشئ طلبًا
الواجهة-->>العميل: 200ما تراه
No diagram type detected matching given configuration for text: sequencediagram
لماذا
الكلمة المفتاحية للمخطط مكتوبة خطأً أو بحالة أحرف خاطئة. فكلمات Mermaid المفتاحية حساسة لحالة الأحرف: sequenceDiagram يعمل وsequencediagram لا يعمل. وكذلك stateDiagram-v2 وerDiagram.
الحل
صحّح حالة الأحرف. ولاحظ أن graph ما زال مقبولًا اسمًا قديمًا لـ flowchart، فتلك الصياغة القديمة ليست مشكلتك.
sequencediagram
A->>B: مرحبًاsequenceDiagram
A->>B: مرحبًاما تراه
Parse error يشير إلى السطر الأخير من المخطط
لماذا
كتلة فُتحت ولم تُغلق: alt وopt وloop وpar وsubgraph يطلب كل منها end الخاص به. ويبلّغ Mermaid عن الخطأ عند نفاد المدخل، فيشير رقم السطر إلى نهاية الملف لا إلى الكتلة المفتوحة.
الحل
عُدّ الكتل المفتوحة وما كتبته من end. فإن أشار الخطأ إلى السطر الأخير فهذا هو السبب دائمًا تقريبًا.
sequenceDiagram
A->>B: طلب
alt كل شيء سليم
B-->>A: تمامsequenceDiagram
A->>B: طلب
alt كل شيء سليم
B-->>A: تمام
endما تراه
Lexical error on line 1. Unrecognized text.
لماذا
اتجاه غير صالح بعد الكلمة المفتاحية للمخطط. فمخططات التدفق تقبل TB وTD وBT وLR وRL لا غير؛ وأي خطأ مطبعي يسقط في التحليل المعجمي قبل قراءة عقدة واحدة. ولمن يكتب بالعربية: RL مدعوم فعلًا وهو الاتجاه الأنسب للقراءة.
الحل
استعمل أحد الاتجاهات الخمسة الصالحة. وTD وLR وRL تغطي كل الحالات تقريبًا.
flowchart XY
A --> Bflowchart RL
A --> Bما تراه
يُرسم هنا ولا يُرسم على GitLab أو Confluence أو أداة قديمة
لماذا
فارق في النسخة. فهذا العارض يعمل على Mermaid 11.12.2؛ ويوثّق GitLab.com النسخة العاشرة، وقد تتأخر الويكي المُستضافة ذاتيًا سنوات. والصياغة المستحدثة بعد نسخة الأداة الأخرى تُحلَّل هنا وتسقط هناك.
الحل
اسأل المحرك الآخر عن نسخته. فكتابة كلمة info وحدها في مخطط تجعل Mermaid يرسم رقم نسخته، وهو أسرع من قراءة سجل التغييرات.
infoيستحق ترميز المحارف كلمة، لأنه ما زال يفاجئ في الملفات العربية. فهذا الموقع والمحرر يقرآن الملف بترميز UTF-8 ويسقطان علامة BOM إن وُجدت، ولذلك يُفتح الملف المحفوظ من مفكرة ويندوز بصيغة «UTF-8 مع BOM» دون مشكلة. أما الملف المحفوظ بترميز Windows-1256 أو ISO-8859-6 — وبعض الأدوات القديمة ما زالت تنتجه — فيصل والحروف العربية فيه ممزّقة. فإن رأيت رموزًا غريبة مكان الحروف، فاحفظ الملف من جديد بترميز UTF-8 من محررك.
وثمة حالة ألطف من ذلك تخص العربية وحدها: أن يكون الملف بترميز UTF-8 سليمًا لكن المعرّفات فيه مشكولة. عندئذ يظهر النص صحيحًا تمامًا بلا أي رمز غريب، لكن كل معرّف مشكول يسقط بـ `Lexical error`. والتسميات تعمل في الحالتين، فقد يُرسم جزء من المخطط ويتعطل جزء بلا سبب ظاهر. والحل ترك المعرّفات بلا تشكيل.
وأخيرًا أمر لا يعطي خطأً البتة: في GitLab المُستضاف ذاتيًا، ضبط ترويسة Cross-Origin-Resource-Policy على same-site أو same-origin يجعل مخططات Mermaid تسقط بصمت. لا رسالة ولا مخطط ولا شيء في الصفحة. فإن كان مخطط يُرسم في كل مكان إلا في تنصيب واحد بعينه، فهناك بالضبط موضع النظر.
التحويل إلى PNG أو SVG أو PDF
افتح الملف في المحرر واستعمل أزرار التصدير. يحفظ SVG المخطط نصًا متجهًا، فيبقى حادًا في أي حجم وتبقى التسميات قابلة للتحديد والبحث — وهو الخيار الصحيح للتوثيق ولكل ما قد يُعاد تصديره لاحقًا. أما PNG فصورة نقطية، تُصدَّر هنا بضعفَي حجم العرض إلى ثلاثة أضعافه ليصمد على الشاشات عالية الكثافة؛ استعمله حيث لا يُقبل SVG، وهو عمليًا أغلب تطبيقات المراسلة وبعض الويكي.
ولا يوجد زر PDF، وأفضّل كتابة ذلك على التظاهر بغيره. والطريق العملي أن تصدّر SVG ثم تدرجه في المستند الذي تكتبه أصلًا، أو تطبع هذه الصفحة إلى PDF من المتصفح. وSVG المتجه المدرَج في PDF يبقى متجهًا.
ولكل عمل متكرر — خطوة بناء، أو دفعة ملفات، أو خطّاف ما قبل الإيداع — هناك محرك سطر الأوامر الرسمي @mermaid-js/mermaid-cli: يأخذ ملف .mmd نفسه ويكتب الصورة مباشرة، بلا متصفح.
أسئلة متكررة
كيف أفتح ملف .mmd على الإنترنت؟
أي برنامج يفتح ملف .mmd؟
هل ملف .mmd هو نفسه .mermaid؟
لماذا لا يُرسم ملف .mmd على GitHub؟
هل أستطيع فتح .mmd دون تثبيت شيء؟
مخططي يعطي خطأً ولا أرى فيه شيئًا خاطئًا
الحروف العربية تظهر رموزًا غريبة
هل يدعم Mermaid الكتابة من اليمين إلى اليسار؟
أنواع المخططات التي يمكنك فتحها هنا
بقلم Dominik Malsch · آخر تحديث: