Довідник синтаксису 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
Авто-пробіли: Словесні роздільники на кшталт <і> чи <або> автоматично доповнюються пробілами: <і> дає і . Розділові знаки (<,>) не доповнюються.
Перестановки з комбінаціями
Налаштовувана мін./макс. кількість елементів і роздільники:
[<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-елементи можуть бути варіантами
Змінні %var%
Визначає змінну для багаторазового використання, яка підставляється всюди, де трапляється.
#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%.
/# %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% - Імена змінних складаються з літер, цифр і підкреслень
- Значення можуть містити будь-який синтаксис spintax (переліки, перестановки, інші змінні)
#set-змінні розкриваються при зверненні, а не при визначенні (ліниве обчислення)#set— макрос: його значення підставляється заново, і spintax усередині перекидається, при кожному посиланні.#defрозкриває значення один раз за рендер і тримає результат скрізь- Рядки
#setта#defвидаляються з результату
Області видимості змінних у плагіні WordPress
Плагін підтримує три області видимості змінних. Якщо одне й те саме ім’я існує в кількох областях, перемагає найсильніша:
- Runtime-змінні (найсильніші) — передаються через шорткод:
[spintax slug="greeting" name="Alice"] - Локальні змінні — визначаються через
#setчи#defусередині шаблону - Глобальні змінні (найслабші) — визначаються на сторінці налаштувань
Умови {?VAR?then|else}
Умовний синтаксис — відмітне розширення spintax.net над родиною GTW. Якщо {a|b} — це рівномірний випадковий вибір, який не дивиться на змінні, то {?VAR?then|else} вибирає за тим, чи має %VAR% значення.
Використовуйте для рішень за значенням: показувати рядок про безкоштовний тариф лише коли тариф є, рендерити блок про-можливостей лише коли користувач на платному тарифі, ховати CTA, який зараз не застосовний.
Pre-pass відпрацьовує до розкриття %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?немає даних} - Перший
|на нульовій глибині розділяєthenіelse; наступні|лишаються літералами вelse - Вкладені умови розкриваються outer-first — falsy-гілки короткозамикаються
- Складена логіка (
&&,||, порівняння) не підтримується — обчисліть guard-змінну в асемблері - Криві форми (
{??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
Форми за локалями
Локаль зіставляється за мовним субтегом, тож uk-UA та uk поводяться однаково:
| Локаль | Форм | Вибір за числом |
|---|---|---|
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 "hero-text"
Правила включень
- Посилання на шаблон указується в подвійних лапках
- Розв’язується за slug або числовим ID шаблону
- Включені шаблони можуть містити власні змінні та синтаксис spintax
- Рекурсивні включення підтримуються
- Циклічні посилання виявляються та блокуються
- Дочірні шаблони успадковують глобальні та runtime-змінні, але не локальні
#set/#defбатька
Коментарі /#...#/
Текст між маркерами коментарів видаляється з результату до будь-якої іншої обробки.
/#
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, email-адрес, доменів, десяткових чисел та абревіатур від зміни регістру
- Видалення повторюваних пробілів і табуляцій
- Видалення пробілів перед розділовими знаками (
,.!?) - Додавання пробілу після розділових знаків там, де його бракує
- Велика літера на початку результату (з пропуском HTML-тегів)
- Велика літера після знаків кінця речення
- Велика літера після блокових HTML-тегів
- Велика літера після переносів рядків
- Відновлення захищених заповнювачів
Зведення синтаксису
| Можливість | Синтаксис | Поведінка |
|---|---|---|
| Перелік | {a|b|c} | Вибрати один випадковий варіант |
| Перестановка | [a|b|c] | Вибрати N, перемішати, об’єднати |
| Роздільник | [<sep> a|b|c] | Перестановка з єдиним роздільником |
| Роздільник елемента | [<,> a|b <x>|c] | Перестановка з власними роздільниками |
| Комбінації | [<config> a|b|c] | Перестановка з мін./макс. кількістю |
| Змінна | #set %var% = val | Багаторазова підстановка |
| Змінна (раз за рендер) | #def %var% = val | Розкривається один раз за рендер |
| Умова | {?VAR?then|else} | then, якщо truthy; інакше else |
| Плюрал | {plural %n%: мова|мови|мов} | Узгоджує форму слова з числом за локаллю |
| Включення | #include "slug" | Вбудовування іншого шаблону |
| Коментар | /#...#/ | Видаляється з результату |
Синтаксис сумісний зі стандартом Generating The Web (GTW).