ما هو YAML؟
YAML صيغة بيانات مريحة للقراءة تستخدم المسافات البادئة بدلاً من الأقواس، وتشيع في ملفات الإعداد (خطوط CI وKubernetes وOpenAPI). YAML 1.2 مجموعة شاملة لـ JSON: كل مستند JSON هو YAML صالح، لكن YAML يضيف التعليقات والمراسي والأنواع الضمنية، ومن هنا تأتي معظم المفاجآت.
كيفية استخدام منسّق YAML
- الصق YAML.
- اختر المسافة البادئة ونمط المجموعات وعلامات الاقتباس.
- أصلح أي خطأ يُبلَّغ عنه وانسخ المستند النظيف.
- 1نص YAMLمستند واحد أو أكثر تفصل بينها
--- - 2التحليلالمخطط الأساسي في YAML 1.2، الوضع الصارميجب ألا تتكرر المفاتيح؛ وتُطبَّق مفاتيح الدمج
<<فرع: خطأ صياغة أو مفتاح مكرر أو مسافة بادئة خاطئة (مع رقم السطر والعمود)، أو قنبلة أسماء مستعارة: خطأ ولا مخرجاتفشل
- 3بيانات عاديةاختياري: ترتيب المفاتيحتختفي التعليقات؛ وتصبح المراسي والأسماء المستعارة ومفاتيح الدمج نسخاً عادية؛ وتُحذف الوسوم الصريحة
- 4إعادة الإخراجالمسافة البادئة ونمط المجموعات وعلامات الاقتباس التي اخترتها؛ تحتفظ القيم بنوعها لكن ليس دائماً بطريقة كتابتها
1.0 → 1, 0x1F → 31YAML منسّق
بعد ذلك:يُعاد ضمّ المستندات بفواصل ---
يُحذف كذلك الوسم غير المعروف مثل !Ref، وتعرض الأداة تحذيراً بشأنه.
مزايا منسّق YAML
- تحليل YAML 1.2 والإبلاغ عن أخطاء الصياغة مع رقم السطر والعمود ومقتطف
- إعادة الإخراج بمسافة بادئة من مسافتين أو 4 مسافات وعلامات اقتباس متسقة
- النمط الكتلي (block) أو الانسيابي (flow) للمجموعات، وترتيب اختياري للمفاتيح
- دعم التدفقات متعددة المستندات (---)
- اكتشاف المفاتيح المكررة وقنابل الأسماء المستعارة (alias bombs)
- مثالي لملفات Kubernetes وDocker Compose وGitHub Actions وOpenAPI
مثال على منسّق YAML
توحيد المسافة البادئة
الإدخال:
services:
web:
image: nginx
ports: [ "80:80" ]النتيجة:
services:
web:
image: nginx
ports:
- 80:80الأسئلة الشائعة حول منسّق YAML
هل يحتفظ بالتعليقات؟
لا. يُحلَّل المستند ويُعاد إخراجه، ولذلك تُزال التعليقات وتُحلّ المراسي (anchors). استخدمه لتوحيد المسافات البادئة وعلامات الاقتباس لا للملفات الغنية بالتعليقات.
ما الأخطاء التي يُبلَّغ عنها؟
أخطاء الصياغة مع رقم السطر والعمود، والمفاتيح المكررة، والمسافات البادئة الخاطئة، وعلامات الاقتباس غير المغلقة. ويعرض مقتطف الخطأ الأسطر المحيطة.
هل يمكنني تنسيق ملفات متعددة المستندات؟
نعم. تُنسَّق المستندات المفصولة بـ --- كلٌّ على حدة ثم يُعاد ضمّها بفواصل ---.
لماذا تغيّرت قيم "yes"/"no" أو "1.0" لديّ؟
يحلّل المنسّق المستند إلى بيانات ثم يكتبها من جديد وفق المخطط الأساسي (core schema) في YAML 1.2، فتحتفظ القيم بنوعها لكن ليس دائماً بطريقة كتابتها. تُكتب الأرقام بصيغتها البسيطة (1.0 تصبح 1، و0x1F تصبح 31)، وتُقرَّب الأعداد الصحيحة الأكبر من 2^53 − 1 فتتغيّر قيمتها، وتُحذف علامات الاقتباس التي لا يحتاجها YAML 1.2: فـ "yes" و"on" سلاسل نصية عادية في YAML 1.2، ولذلك تعود بلا علامات اقتباس. أما السلسلة التي يقرؤها YAML 1.2 رقماً أو قيمة منطقية أو null، مثل "1.0" أو "true"، فتبقى مقتبسة. ومحللات YAML 1.1 مثل PyYAML تقرأ yes وno وon وoff غير المقتبسة قيماً منطقية، وتقرأ 22:22 عدداً بالأساس 60، ففعّل «وضع علامات اقتباس لجميع السلاسل النصية» عندما يقرأ الملفَّ محللٌ من هذا النوع.
ملاحظات تقنية
التنسيق هو تحليل ثم إعادة إخراج عبر حزمة yaml: تعمل parseAllDocuments في الوضع الصارم مع تفعيل uniqueKeys وmerge، ثم يُطبَّع كل مستند إلى قيم آمنة في JSON ويُطبع من جديد بقيمة lineWidth تساوي 0. ونتيجة لذلك تُوسَّع المراسي والأسماء المستعارة ومفاتيح الدمج << إلى نسخ عادية، ويتحوّل !!timestamp و!!binary إلى سلاسل ISO 8601 وbase64، وتُحذف الوسوم الصريحة، وتُقرَّب الأعداد الصحيحة التي تتجاوز 2^53 − 1. وفي مخطط 1.2 الأساسي تبقى yes/no/on/off سلاسل نصية.
ولأن كل مستند يصبح كائن JavaScript بين التحليل والطباعة، تُحاط المفاتيح الشبيهة بالأعداد الصحيحة (0 و1 و42) بعلامات اقتباس وتُقدَّم إلى المقدمة بترتيب تصاعدي حتى مع تعطيل الفرز؛ أما «فرز المفاتيح» فيرتّب وفق وحدات ترميز UTF-16، فتسبق الأحرف الكبيرة الصغيرة. وتُزاح التسلسلات الكتلية تحت مفتاحها الأب، وتتحوّل السلاسل متعددة الأسطر إلى كتل حرفية |، ويطوي «نمط التدفق» المستند كله في سطر واحد، ويُعاد وصل المستندات المتعددة بـ --- (ويُطبع المستند الفارغ كـ null).
المراجع
- YAML Ain't Markup Language (YAML™) version 1.2.2نموذج بيانات YAML 1.2 وصياغته وعلاقته بـ JSON (كل مستند JSON هو YAML 1.2 صالح).
- HTML Living Standardلغة HTML، بما فيها مراجع المحارف المسماة (الكيانات) وقواعد التحليل التي تتبعها المتصفحات.