Вкладений Spintax
Як вкладеність перетворює просте обертання на потужний шаблонізатор — і чому підхід Spintax.Net став стандартом.
Що таке вкладений Spintax?
Звичайний spintax вибирає випадковий варіант зі списку: {червоний|синій|зелений} дає один із трьох кольорів. Вкладений spintax кладе spintax усередину spintax — як матрьошка, де кожен шар відкриває всередині ще більше варіацій.
Коли рушій натрапляє на вкладені структури, він розв’язує їх від найглибшого виразу назовні. Внутрішні фігурні дужки обчислюються першими, і їхній результат стає частиною зовнішнього виразу.
{red|{dark|light} blue} car
Тут {dark|light} розв’язується першим (наприклад, dark), даючи {red|dark blue}. Потім зовнішній перелік вибирає один варіант: red або dark blue.
Чому вкладеність важлива
Без вкладеності ваші варіанти плоскі. Три переліки по три варіанти кожен дають 3 + 3 + 3 = 9 фрагментів. З вкладеністю ті самі елементи комбінуються мультиплікативно: 3 × 3 × 3 = 27 унікальних варіантів з одного компактного шаблону.
Це експоненційне зростання — ключ до генерації по-справжньому унікального контенту. Помірно складний шаблон із вкладеними переліками та перестановками може створити тисячі чи мільйони різних результатів — і все з одного ретельно складеного джерела.
Типові обмеження інших інструментів
Більшість інструментів для spintax дають раду лише з основами. Ось що зазвичай іде не так:
- Лише перелік у переліку — вони підтримують
{a|{b|c}}, але більше нічого. Немає перестановок, змінних, включень усередині інших елементів. - Обмеження глибини — багато парсерів ламаються після 2–3 рівнів вкладеності, мовчки видаючи пошкоджений результат.
- Немає очищення — після розв’язання вкладених структур пробіли злипаються, пунктуація дублюється, великі літери ламаються. Результат потребує ручного редагування.
- Немає композиції — без змінних і включень кожен шаблон — це острів. Повторне використання спільних блоків означає копіювання та вставлення.
Підхід Spintax.Net
Spintax.Net реалізує вкладеність як першокласну можливість, а не як доважок. П’ять проєктних рішень роблять це можливим:
- Довільна глибина — обмежень на вкладеність немає. Десять рівнів працюють так само, як два.
- Міжелементна вкладеність — переліки всередині перестановок, перестановки всередині переліків, змінні з вкладеними структурами, включення, що вбудовують цілі вкладені шаблони. Будь-який елемент усередині будь-якого іншого.
- Розв’язання зсередини назовні — рушій завжди розв’язує від найглибшого рівня назовні. Це робить обчислення передбачуваним і зручним для налагодження.
- Розумна постобробка — після розв’язання всієї вкладеності рушій автоматично виправляє великі літери, прибирає подвійні пробіли, коригує пунктуацію та обробляє межі речень. На виході — чистий текст, а не сира конкатенація.
- Безпека — виявлення циклічних посилань для
#includeзапобігає нескінченним циклам. Правила області видимості змінних (runtime > local > global) запобігають випадковим перезаписам.
Від простого до складного
1. Перелік у переліку
{{premium|luxury} sedan|{compact|mid-size} SUV}
Внутрішні переліки розв’язуються першими, потім зовнішній вибирає результат. Можливі результати: premium sedan, luxury sedan, compact SUV, mid-size SUV.
2. Перелік усередині перестановки
[<minsize=2;maxsize=3;sep=", ";lastsep=" and "> {red|blue} apples|{big|small} oranges|bananas]
Кожен елемент перестановки містить власний перелік. Рушій спершу розв’язує внутрішні переліки, потім перемішує та об’єднує. Приклад результату: blue apples, bananas and small oranges.
3. Змінні #set із вкладеним spintax
#set %product% = {{premium|budget} {laptop|tablet}|{smart|classic} phone}
#set %action% = {Buy|Get|Order}
%action% your new %product% today!
#set — макрос: він зберігає вкладений spintax нерозв’язаним і перекидає його при кожному посиланні, тому два згадування %product% можуть дати два різні продукти. У поєднанні з кількома змінними кількість варіантів росте стрімко.
4. #def — кидок один раз, результат скрізь
#def %brand% = {{Nord|Prime} Tools|Acme {Labs|Works}}
%brand% ships today. Order %brand% now!
#def розв’язує вкладений spintax один раз за рендер і тримає результат у всіх посиланнях — тут обидва згадування називають той самий бренд. Використовуйте #def, коли повторні посилання мають збігатися (бренди, лічильники); #set — коли кожне посилання має варіюватися саме по собі.
5. Умови навколо вкладених блоків
{?PLAN?{Upgrade to|Unlock} {Pro|Premium} features|{Try|Start with} the free tier}
Pre-pass {?VAR?then|else} вибирає гілку за тим, чи має %PLAN% значення, — до будь-яких випадкових виборів. Програшна гілка відкидається цілком: ніщо всередині неї не обчислюється й не перекидається.
6. Плюрали із вкладеним лічильником
#def %n% = {2|5|21}
Renders %n% {plural %n%: variant|variants} per click.
Лічильник сам є spintax — і його змінна має бути #def, а не #set: форма вибирається після розв’язання лічильника, а макрос у цей момент усе ще нерозв’язаний spintax. Скільки форм указувати, вирішує локаль рендера: в англійській дві, в українській чи російській — три.
7. Включення з вкладеністю
/# main template #/
#include "hero-text"
{Check out|Discover|Explore} our [<, > features|plans|pricing].
Включений шаблон може сам містити переліки, перестановки, змінні й навіть подальші включення. Виявлення циклічних посилань зберігає все в безпеці.
AI + вкладений Spintax
Великі мовні моделі чудово справляються з написанням складних вкладених шаблонів. Один промпт може створити шаблон із кількома рівнями вкладеності, умовними блоками за значенням ({?VAR?…}), плюралами з урахуванням локалі та перевикористовуваними секціями через включення.
Робочий процес простий: використайте AI для створення шаблону один раз, а далі використовуйте Spintax для генерації унікальних варіантів майже безкоштовно. Один виклик API для створення шаблону. Нуль викликів API для генерації кожного варіанта. Вкладений spintax робить це економічно виправданим — що глибша вкладеність, то більше унікальних результатів на шаблон.
Початок роботи
Готові використовувати вкладений spintax у своїх проєктах? Спробуйте наживо в пісочниці — вставте будь-який приклад вище й подивіться, як він розв’язується. Повна специфікація — у довіднику синтаксису, а для продакшену виберіть один із чотирьох open-source рушіїв — або плагін для WordPress, якщо ваш рантайм — WordPress.