مرجع صياغة Spintax
مرجع كامل لترميز قوالب spintax.
التعدادات { }
يختار عشوائيًا خيارًا واحدًا من القائمة.
{option1|option2|option3}
أمثلة
{blue|grey|clear}
{|free|paid} plan ← empty option = sometimes nothing
{Acme {Pro|Lite}} ← nested enumerations
{order {|#42-A} confirmed} ← nesting with empty option
القواعد
- المحددات:
{و} - الفاصل:
| - يدعم التداخل إلى عمق عشوائي
- الخيارات الفارغة صالحة (تنتج سلسلة فارغة)
- الحل يبدأ من التعبير الأعمق نحو الخارج
التباديل [ ]
يختار N عنصرًا ويخلطها ويجمعها بفواصل.
تباديل بسيطة
جميع العناصر مضمنة، مفصولة بمسافات:
[1|2|3|4]
أمثلة المخرجات: 1 4 3 2، 2 3 4 1، 3 2 4 1
مع فاصل
فاصل موحد محدد في < > في البداية:
[<, > 1|2|3|4]
أمثلة المخرجات: 2, 1, 4, 3، 4, 3, 2, 1
مهم: لا مسافة بين [ و <الفاصل>.
فواصل لكل عنصر
يمكن لكل خيار أن يكون له فاصل خاص به محدد بـ <sep> قبل | السابق. ينتقل الفاصل مع عنصره أثناء الخلط.
[<, > 1|2|3 < and >|4]
أمثلة المخرجات: 1, 3, 2 and 4، 3, 1, 2 and 4
التباعد التلقائي: فواصل الكلمات مثل <and> أو <or> تُحاط تلقائياً بمسافات: <and> ينتج and . فواصل علامات الترقيم (<,>) لا تُكمَّل.
تباديل مع تركيبات
عدد أدنى/أقصى قابل للتكوين من العناصر والفواصل:
[<minsize=1;maxsize=3;sep=", ";lastsep=" and "> apple|plum|orange|apricot]
أمثلة المخرجات: apple, plum and orange، apple and apricot، orange
معاملات التكوين
| المعامل | الافتراضي | الوصف |
|---|---|---|
minsize | عدد الكل | الحد الأدنى لعدد العناصر المطلوب اختيارها |
maxsize | عدد الكل | الحد الأقصى لعدد العناصر المطلوب اختيارها |
sep | " " (مسافة) | الفاصل بين العناصر غير الأخيرة |
lastsep | مثل sep | الفاصل قبل العنصر الأخير |
قواعد التباديل
- المحددات:
[و] - كتلة التكوين
<...>يجب أن تتبع مباشرة[ - معاملات التكوين مفصولة بفاصلة منقوطة
- قيم السلاسل النصية في التكوين بين علامتي اقتباس:
sep=", " - يمكن تداخل التعدادات والتباديل داخل الخيارات
- عناصر HTML يمكن أن تكون خيارات
sepيصل كل ما قبل الزوج الأخير، وlastsepيصل ذلك الزوج: عند اختيار عنصرين يظهرlastsepوحده، وعند عنصر واحد لا يظهر أي منهما
المتغيرات %var%
يعرّف متغيّرًا قابلًا لإعادة الاستخدام يُستبدل أينما ظهر. يعلنه أمران، والاختيار بينهما ليس تجميليًا: #set ماكرو — تُستبدل قيمته من جديد عند كل إشارة، فيُعاد اختيار الـ spintax بداخلها؛ أما #def فيختار القيمة مرة واحدة لكل تصيير ويسلّم تلك النتيجة الواحدة لكل الإشارات. (التصيير الواحد مخرَج واحد؛ والبذرة نفسها تعيد إنتاجه.) وما دامت القيمة نصًّا بسيطًا فالأمران متطابقان؛ الفرق يظهر لحظة احتواء القيمة على خيار.
#set %VARIABLE_NAME% = value or spintax structure
#def %VARIABLE_NAME% = value or spintax structure
أمثلة
#set %name% = John
#set %greeting% = {Hello|Hi|Hey}
#set %items% = [<minsize=2;maxsize=3;sep=", ";lastsep=" and "> apples|oranges|bananas]
Some text with %name% and %greeting%, also %items%.
And once more, %greeting% — a second reference.
/# %greeting% above may differ between the two references — #set re-rolls.
#def picks once and keeps it: #/
#def %tone% = {friendly|warm|upbeat}
A %tone% intro, and a %tone% outro — always the same word.
قواعد المتغيرات
- يجب أن يبدأ
#setو#defمن بداية السطر - تُحاط أسماء المتغيّرات بـ
%:%name% - الأسماء حروف وأرقام وشرطة سفلية، والإشارات لا تفرّق بين الحالة الكبيرة والصغيرة:
%Tone%و%tone%متغيّر واحد - يمكن أن تحتوي القيم على أي صياغة spintax (تعدادات، تباديل، متغيّرات أخرى)
#setماكرو: يتوسّع عند الإشارة لا عند التعريف، وتُستبدل قيمته — بما فيها الـ spintax بداخلها — من جديد ويُعاد اختيارها عند كل إشارة#defيحسب قيمته مرة واحدة لكل تصيير ويحتفظ بالنتيجة في كل مكان. وهذا ما يبقي التكرارات متوافقة: اسم والصيغ المبنية عليه، وعدد يغذّي كتلة{plural}، وأي عبارة يجب أن تتطابق تكراراتها كلمة بكلمة#defيجعل المتغيّر متسقًا مع نفسه، لكنه لا يربط متغيّرين.#def %Noun%و#def %NounGen%اختياران مستقلان وقد يقعان على كلمتين مختلفتين — فالصيغ التي يجب أن تتوافق ينبغي أن تأتي من اختيار واحد: جذر واحد في#defتشير إليه كل صيغة، أو مرادفات تتصرّف بالطريقة نفسها مع كتابة النهاية خارج التعريف- يُعرَّف الاسم مرة واحدة. أي تعريف ثانٍ للاسم نفسه يُبلَّغ عنه بـ
definition.duplicate-nameويستمر التصيير رغم ذلك: بين أمرين من النوع نفسه يفوز الأخير، وإذا تشارك#setو#defالاسم نفسه فاز#defأيًّا كان الذي جاء أولًا - الإشارة بلا تعريف تطبع نفسها: يبقى
%missing%في المخرج بدل أن يختفي - لا يعبر أي من الأمرين حدود
#include: القالب المضمَّن لا يرى متغيّرات الأب المحلية، ومتغيّراته لا تتسرّب إلى الأعلى. الصيغة المختارة تصل إلى الابن فقط كمتغيّر وقت تشغيل - تُحذف أسطر
#setو#defمن المخرج - التعمق: راجع دليل المتغيّرات (النطاقات وفخّ إعادة الاختيار) والترادف الآمن نحويًا (عائلات الحالات الإعرابية)
نطاقات المتغيّرات
يستطيع المضيف تزويد المتغيّرات من أكثر من مصدر. وإذا وُجد الاسم نفسه في أكثر من مصدر، يفوز الأقوى:
- متغيّرات وقت التشغيل (الأقوى) — ما يمرّره المضيف إلى نداء التصيير:
contextفي@spintax/core، وسمات الشورتكود في إضافة ووردبريس:[spintax slug="greeting" name="Alice"] - المتغيّرات المحلية — المعرّفة بـ
#setأو#defداخل القالب - المتغيّرات العامة (الأضعف) — قيم افتراضية على مستوى المضيف، مثل صفحة إعدادات الإضافة
الشروط {?VAR?then|else}
الشروط بناء خاص باللغة نفسها — لم يكن في نموذج GTW الأولي شيء من هذا القبيل. بينما {a|b} هو اختيار عشوائي موحد يتجاهل المتغيرات، يختار {?VAR?then|else} بناءً على ما إذا كانت %VAR% تحمل قيمة.
استخدمه للاختيارات المعتمدة على القيم: إظهار سطر الخطة المجانية فقط عند وجودها، عرض كتلة الميزات الاحترافية فقط عندما يكون المستخدم على خطة مدفوعة، إخفاء CTA غير قابل للتطبيق.
يُنفَّذ التمرير المسبق قبل توسيع %var% وقبل منتقي الفرع العشوائي، فتُسقَط الفرعية falsy بالكامل — لا يُقيَّم شيء بداخلها.
الأشكال
{?VAR?then} ← truthy ⇒ then; falsy ⇒ empty
{?VAR?then|else} ← truthy ⇒ then; falsy ⇒ else
{?!VAR?then|else} ← inverted
{?HasFreeTier? — free tier available since %founded%|, trusted since %founded%}
Truthy و falsy
القاعدة أبسط عمدًا من JavaScript — truthy = حرف واحد على الأقل غير فراغي:
قيمة %VAR% | Truthy؟ |
|---|---|
| غير مُعلَنة | falsy |
| سلسلة فارغة | falsy |
| فراغات فقط | falsy |
"0"، "false" | truthy (غير فارغة) |
| أي نص آخر أو HTML | truthy |
قواعد الشروط
- تتبع أسماء المتغيرات نفس regex التابعة لـ
%var%(غير حساسة لحالة الأحرف) - البادئة
!تعكس الفحص:{?!VAR?غائبة} - أول
|على عمق 0 يفصلthenعنelse؛ ما بعده يبقى حرفيًا فيelse - تُقَيَّم الشروط المتداخلة من الخارج إلى الداخل — الفرع falsy يقصر الدائرة
- المنطق المركب (
&&،||، المقارنات) غير مدعوم — احسب متغير حماية في المُجمّع - الأشكال المشوهة (
{??yes}،{?VAR}) لا ترمي أبدًا — ملعب التجريب يميزها كتحذيرات - التعمق: راجع دليل spintax الشرطي مع أمثلة وأنماط مضادة
الجمع {plural %n%: لغة|لغات}
يختار الصيغة الصحيحة نحويًا للكلمة حسب العدد. العدّاد يسبق النقطتين، والصيغ تليهما مفصولة بـ |.
الصيغة تحددها لغة الإخراج لا القالب، لذا عدد الصيغ المطلوب يعتمد على تلك اللغة: الإنجليزية تحتاج صيغتين والروسية ثلاثًا.
{plural %n%: form1|form2} ← 2-form locale (en, de, es…)
{plural %n%: form1|form2|form3} ← 3-form locale (ru, uk, sr…)
#def %LangCount% = 5
supports %LangCount% {plural %LangCount%: language|languages}
← supports 5 languages
الصيغ حسب اللغة
تُطابَق اللغة عبر وسمها الفرعي، لذا تتصرف ru-RU وru بالطريقة نفسها:
| اللغة | الصيغ | الاختيار حسب |
|---|---|---|
ru، uk، be، sr، hr، bs | 3 | 1 · 2–4 · 5 فأكثر |
كل ما عداها، بما فيها en | 2 | 1 بالضبط · كل ما عدا ذلك |
إذا لم يطابق عدد الصيغ ما تحتاجه اللغة، يبلّغ المحرك عن plural.arity ويترك الكتلة ظاهرة بأقواس كاملة العرض — فلا يمر جمع خاطئ بصمت.
قواعد الجمع
- الافتتاح حرفي بما فيه المسافة:
{plural. أما{plural: x}و{pluralN: x}فليستا كتلتَي جمع - النقطتان إلزاميتان — فهما تفصلان العدّاد عن الصيغ
- العدّاد إما إشارة
%Var%أو عدد صحيح حرفي؛ وتُستبدل المتغيرات داخل العدّاد قبل اختيار الصيغة - الأعداد السالبة تُؤخذ بقيمتها المطلقة، و
0يأخذ صيغة «كل ما عدا ذلك» - متغير العدّاد يجب أن يكون
#defلا#set— فـ#setماكرو، وقيمة مثل{1|4|9}تبقى spintax غير محلول لحظة اختيار الصيغة فتُعرض الكتلة فارغة. تشير الساحة إلى ذلك بالرمزplural.count-macro - العدّاد غير الرقمي أو غير المعرّف يمحو الكتلة بدل التخمين
- التعمق: راجع دليل الجمع لقواعد الصيغ الثلاث في الروسية وأمثلة مشروحة
التضمينات #include
يُضمّن قالبًا آخر في موضع الأمر. #include هو التركيب الوحيد الذي لا يستطيع المحرّك تلبيته وحده: فهو لا يحتفظ بمخزن قوالب، لذا يوفّر المضيف محلِّلًا يحوّل الإشارة إلى نص قالب. وحيث لا محلِّل مثبَّت — في الملعب التجريبي وخادم MCP في هذا الموقع، وكلاهما عن قصد — يبقى الأمر خاملًا ويظهر في المخرج كنص حرفي.
#include "hero-text"
/# wrong: text before the directive on the same line leaves it literal #/
Intro: #include "hero-text"
قواعد التضمين
- يجب أن يشغل الأمر السطر كاملًا. المسافة البادئة مقبولة، أما النص بعد الإشارة فلا —
نص #include "hero"يبقى حرفيًا - تُكتب الإشارة بين علامتي اقتباس مزدوجتين؛ ومع علامة مفردة أو بدون علامات لا يعود أمرًا
- الحلّ مسؤولية المضيف: إضافة ووردبريس تحلّ بالـ slug أو بالمعرّف الرقمي، ومضيف JavaScript يمرّر
includeResolver - بلا محلِّل يبقى السطر حرفيًا في المخرج؛ وإذا لم يكن لدى المحلِّل ذلك القالب فإن السطر يُحذف بدلًا من ذلك — الهدف المجهول يكلّفك الكتلة بصمت
- يمكن أن تحتوي القوالب المضمَّنة على متغيّراتها وspintax الخاص بها، وعلى
#includeخاص بها - تُحلّ التضمينات بعد اختيار التعدادات والتباديل في القالب الأب: التضمين داخل الفرع الفائز يُدمج — والذي داخل فرع مرفوض لا يحدث أصلًا
- السلاسل تعمل (قالب يضمّن قالبًا يضمّن آخر)؛ أما القالب الذي يضمّن نفسه، مباشرة أو عبر دورة، فيُقطع عند أول تكرار — بلا خطأ وبلا تشخيص
- ترث القوالب الأبناء المتغيّرات العامة ومتغيّرات وقت التشغيل، لكن لا ترث محلّيات الأب
#set/#def، ولا تتسرّب متغيّراتها إلى الأعلى - لا يصلح التضمين قيمةً لتعريف:
#def %x% = #include "y"يُرفض بالرمزdef.include-in-value - قبل التصيير، لا يبلّغ
validate()عن هدف مجهول إلا إذا مرّر المضيف قائمة الإشارات المعروفة؛ ويعيدextract()الإشارات التي يحتاجها القالب، وبها يجلبها المضيف مسبقًا - التعمق: راجع دليل تركيب القوالب ونمط المجمِّع الذي تستخدمه معظم خطوط الإنتاج بدلًا من ذلك
التعليقات /#...#/
النص بين علامات التعليق يُزال من المخرجات قبل أي معالجة أخرى.
/#
This is a comment section.
It can span multiple lines.
It won't appear in output.
#/
قواعد التعليقات
- محدد البداية:
/# - محدد النهاية:
#/ - يمكن أن تمتد على عدة أسطر
- لا يمكن تداخلها
- تُزال قبل أي معالجة أخرى
التداخل
جميع عناصر الصياغة يمكن تداخلها مع بعضها البعض إلى عمق عشوائي:
{option1|[<, > sub1|sub2|sub3]|option3}
[<minsize=2;maxsize=3;sep=", ";lastsep=" and "> {red|blue} apples|{big|small} oranges|bananas]
#set %var% = {a|[b|c]}
المعالجة اللاحقة
يطبق المحرك تصحيحًا تلقائيًا للنص بعد التوليد:
- يحمي عناوين URL والبريد الإلكتروني والنطاقات والأعداد العشرية والاختصارات من التكبير
- يزيل المسافات وعلامات التبويب المكررة
- يزيل المسافات قبل علامات الترقيم (
,.!?) - يضيف مسافة بعد علامات الترقيم عند فقدانها
- يجعل الحرف الأول من المخرجات كبيرًا (مع تخطي وسوم HTML)
- تكبير بعد علامات ترقيم نهاية الجملة
- تكبير بعد وسوم HTML على مستوى الكتلة
- تكبير بعد فواصل الأسطر
- استعادة العناصر النائبة المحمية
ملخص الصياغة
| الميزة | الصياغة | السلوك |
|---|---|---|
| التعداد | {a|b|c} | يختار خيارًا عشوائيًا |
| التبديل | [a|b|c] | يختار N، يخلط، يجمع |
| الفاصل | [<sep> a|b|c] | تبديل مع فاصل موحد |
| فاصل لكل عنصر | [<, > a|b <x>|c] | تبديل مع فواصل مخصصة |
| التركيبات | [<config> a|b|c] | تبديل مع عدد أدنى/أقصى |
| المتغير | #set %var% = {a|b} | تُستبدل من جديد عند كل إشارة — ويُعاد اختيار الـ spintax بداخلها |
| المتغير (مرة واحدة) | #def %var% = {a|b} | اختيار واحد لكل تصيير يُحتفظ به في كل مكان — وبه تتوافق الصيغ والنهايات |
| شرطي | {?VAR?then|else} | then إذا كانت صحيحة، else إذا كانت زائفة |
| جمع | {plural %n%: لغة|لغات} | يوافق صيغة الكلمة مع العدد حسب اللغة |
| التضمين | #include "slug" | يدمج قالبًا آخر — والمضيف هو من يحلّ الإشارة |
| التعليق | /#...#/ | يُزال من المخرجات |
تجاوزت اللغة نموذجها الأولي Generating The Web (GTW)؛ والقوالب المكتوبة لـ GTW ما زالت تعمل دون تغيير.