Вкладений 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 реалізує вкладеність як першокласну можливість, а не як доважок. П’ять проєктних рішень роблять це можливим:

  1. Довільна глибина — обмежень на вкладеність немає. Десять рівнів працюють так само, як два.
  2. Міжелементна вкладеність — переліки всередині перестановок, перестановки всередині переліків, змінні з вкладеними структурами, включення, що вбудовують цілі вкладені шаблони. Будь-який елемент усередині будь-якого іншого.
  3. Розв’язання зсередини назовні — рушій завжди розв’язує від найглибшого рівня назовні. Це робить обчислення передбачуваним і зручним для налагодження.
  4. Розумна постобробка — після розв’язання всієї вкладеності рушій автоматично виправляє великі літери, прибирає подвійні пробіли, коригує пунктуацію та обробляє межі речень. На виході — чистий текст, а не сира конкатенація.
  5. Безпека — виявлення циклічних посилань для #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.