كيف تفتح ملف ‎.mmd

ملف ‎.mmd ملف نصي عادي يحتوي على مخطط Mermaid. وهو ليس صورة ولا صيغة ثنائية — تستطيع فتحه بأي محرر نصوص وقراءته. ولرؤيته مخططًا، أفلِته على الإطار أدناه. يُرسم داخل متصفحك أنت، ولا يذهب شيء إلى أي خادم.

أفلِت ملف ‎.mmd هنا

يقبل أيضًا ‎.mermaid و‎.md و‎.txt. يُقرأ الملف في المتصفح ولا يُرسل أبدًا.

ما ملف ‎.mmd

Mermaid صياغة نصية للمخططات. تصف المخطط بالكلمات فيرسمه المحرك — تمامًا كما يصف Markdown التنسيق فينتج المحرك الصفحة. وملف ‎.mmd يحتوي على ذلك النص ولا شيء غيره: لا تنسيق، ولا بيانات صورة، ولا بيانات وصفية.

وهذا كل سبب وجود هذه الصيغة. فلكونه نصًا، يستطيع المخطط أن يسكن مستودع Git إلى جانب الشيفرة التي يصفها، ويظهر التغيير فرقًا مقروءًا لا ملفًا ثنائيًا مستبدلًا. وهذا ملف ‎.mmd كامل وصالح:

نشر.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, ٠١/٠٣/٢٠٢٦, 10d
صحيح
gantt
    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[بداية] --> end
صحيح
flowchart TD
    A[بداية] --> نهاية[اكتمل]

ما تراه

يُرسم المخطط، لكن في مخطط الحالات صارت حالة واحدة عدة مربعات

لماذا

مسافة داخل معرّف الحالة. فبخلاف مخطط التدفق لا يعترض مخطط الحالات: بل ينشئ مربعًا مستقلًا لكل كلمة ويرسمه دون أن يرفّ له جفن. قِيس — `[*] --> في انتظار الدفع` ينتج ثلاث حالات هي `في` و`انتظار` و`الدفع`، ولا يتصل بالسهم إلا أولها. وأسماء الحالات العربية لا تكاد تسع كلمة واحدة، فيتكرر هذا كثيرًا دون أي إشارة.

الحل

صرّح بالحالة عبر `state "التسمية" as المعرّف` وأشر إليها بالمعرّف وحده.

خطأ
stateDiagram-v2
    [*] --> في انتظار الدفع
    في انتظار الدفع --> مغلق
صحيح
stateDiagram-v2
    state "في انتظار الدفع" as بانتظارالدفع
    [*] --> بانتظارالدفع
    بانتظارالدفع --> مغلق

ما تراه

يُرسم المخطط، لكن في مخطط الكيانات كيانات لم تكتبها

لماذا

تسمية العلاقة فيها مسافة وليست بين علامتَي اقتباس. وهذا أكثر ما يعترض الكتابة بالعربية، لأن عبارات العلاقة عندنا مركّبة: «ينتمي إلى»، «يظهر في». ولا يبلّغ Mermaid عن خطأ: بل يقتطع التسمية عند أول مسافة ويحوّل كل كلمة باقية إلى كيان فارغ.

الحل

ضع بين علامتَي اقتباس كل تسمية علاقة فيها مسافة. وهذا في العربية يعني كل تسمية عمليًا.

خطأ
erDiagram
    عميل ||--o{ طلب : ينتمي إلى
صحيح
erDiagram
    عميل ||--o{ طلب : "ينتمي إلى"

ما تراه

يُرسم المخطط، لكن الرسالة تخرج بلا نص

لماذا

لا نص بعد النقطتين في مخطط تسلسل. قِيس: لا يرفض Mermaid ذلك بل يرسم الرسالة بتسمية فارغة. والذي يسقط فعلًا هو حذف النقطتين أصلًا: فـ `A->>B` وحدها تعطي `Expecting 'TXT', got 'NEWLINE'`. إذن النقطتان إلزاميتان والنص ليس كذلك.

الحل

اكتب شيئًا بعد النقطتين، ولو كلمة واحدة.

خطأ
sequenceDiagram
    العميل->>الواجهة:
    الواجهة-->>العميل: 200
صحيح
sequenceDiagram
    العميل->>الواجهة: أنشئ طلبًا
    الواجهة-->>العميل: 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 --> B
صحيح
flowchart 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؟
المصدر يعرضه أي محرر نصوص، لأن الملف نص عادي. ولرؤية المخطط تحتاج شيئًا يرسم Mermaid: هذا الموقع، أو المحرر هنا، أو أداة سطر الأوامر mermaid-cli. ولا يوجد تطبيق سطح مكتب يملك الامتداد ‎.mmd.
هل ملف ‎.mmd هو نفسه ‎.mermaid؟
نعم. الامتدادان يحملان المحتوى نفسه ويتبادلان المواضع. و‎.mmd أشيع، وهو ما تستعمله أداة سطر الأوامر الرسمية افتراضيًا.
لماذا لا يُرسم ملف ‎.mmd على GitHub؟
لأن GitHub لا يرسم Mermaid إلا داخل كتل ```mermaid المسيَّجة في ملفات Markdown والمسائل والمناقشات وطلبات الدمج والويكي. أما ملف ‎.mmd القائم بذاته فيُعرض نص مصدر. ضع المخطط نفسه في كتلة مسيَّجة داخل ملف ‎.md ليظهر على GitHub.
هل أستطيع فتح ‎.mmd دون تثبيت شيء؟
نعم — ولهذا وُجد هذا الموقع. فالرسم يجري بلغة JavaScript داخل متصفحك، فلا شيء يُثبَّت، والملف لا يغادر جهازك أبدًا.
مخططي يعطي خطأً ولا أرى فيه شيئًا خاطئًا
في العربية السبب غالبًا أحد اثنين. الأول مسافة داخل معرّف — وهو الأشيع، لأن أسماءنا مركّبة. والثاني علامة تشكيل داخل معرّف: النص يبدو سليمًا تمامًا والمعرّف يسقط بـ `Lexical error`. وفي الحالتين، ترك المعرّفات كلمةً واحدة بلا تشكيل ووضع النص المقروء في التسمية يحسم الأمر.
الحروف العربية تظهر رموزًا غريبة
الملف ليس بترميز UTF-8. فهذا الموقع يقرأ الملفات بترميز UTF-8 ويتعامل مع علامة BOM دون مشكلة، أما الملف المحفوظ بترميز Windows-1256 أو ISO-8859-6 فيصل والحروف فيه ممزّقة. احفظه من جديد بترميز UTF-8 من محررك.
هل يدعم Mermaid الكتابة من اليمين إلى اليسار؟
يرسم Mermaid النص العربي رسمًا صحيحًا في كل مكان، لكنه لا يعكس اتجاه التخطيط. فمع `flowchart LR` تسير الأسهم من اليسار إلى اليمين وإن كان النص عربيًا. والاتجاه `RL` مدعوم فعلًا وهو الأنسب للقراءة العربية — جُرّب ويعمل.

أنواع المخططات التي يمكنك فتحها هنا

بقلم Dominik Malsch · آخر تحديث:

افتح المحرر ←