Вложенный 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].

Включённый шаблон может сам содержать перечисления, перестановки, переменные и даже дальнейшие включения. Обнаружение циклических ссылок сохраняет всё в безопасности.

ИИ + вложенный Spintax

Большие языковые модели отлично справляются с написанием сложных вложенных шаблонов. Один промпт может создать шаблон с несколькими уровнями вложенности, условными блоками по значению ({?VAR?…}), плюралами с учётом локали и переиспользуемыми секциями через включения.

Рабочий процесс прост: используйте ИИ для создания шаблона один раз, затем используйте Spintax для генерации уникальных вариантов практически бесплатно. Один вызов API для создания шаблона. Ноль вызовов API для генерации каждого варианта. Вложенный spintax делает это экономически оправданным — чем глубже вложенность, тем больше уникальных результатов на шаблон.

Начало работы

Готовы использовать вложенный spintax в своих проектах? Попробуйте вживую в песочнице — вставьте любой пример выше и посмотрите, как он разрешается. Полная спецификация — в справочнике синтаксиса, а для продакшена выберите один из четырёх open-source движков — или плагин для WordPress, если ваш рантайм — WordPress.