Spintax на примере

Быстрее всего понять spintax — увидеть, как готовый текст становится шаблоном. Поэтому мы взяли настоящий абзац — блок О Spintax с нашей же главной — и разметили его по шагам, ровно как описано в гайде по обратному факторингу. Каждая конструкция ниже покрашена так же, как её красят наши расширения для редакторов; каждый шаг ведёт в свой гайд.

Готовый текст

Обратный факторинг начинается с текста, которым вы уже довольны, — разметку добавляем последней. Вот одно предложение источника — те же слова, что в блоке О Spintax:

Spintax — это наш собственный язык шаблонов для создания множества по-настоящему уникальных вариаций текста из одного источника, который вы контролируете.

Ниже мы не придумываем новых слов — только размечаем выборы, которые у автора уже были в голове.

1. Словарь выборов

Прежде чем трогать предложение, объявите переиспользуемые слова один раз. #set перекатывается при каждом употреблении; #def катится один раз и запоминается (чтобы число и его существительное были согласованы). Поправите строку здесь — изменится каждое предложение, где она используется.

#set %UniqueGen% = {по-настоящему уникальных|неповторимых|по-настоящему разных}
#set %Engine% = {движок|spintax-движок|рендерер}
#def %pages% = {1|3|48}

Полный гайд: Переменные →

2. Меняем слова и целые клаузы

Базовый оператор — {a|b|c}. Разрезайте наименьший отличающийся фрагмент — одно слово — либо целую вводную клаузу, всегда оставляя общий хвост за пределами разреза, чтобы грамматика не рассинхронилась.

Spintax {(spin syntax)|, «spin syntax»,} — это %OwnLang% для создания множества %UniqueGen% вариаций текста.

Различается только вставка в скобках — её и разрезаем; общее Spintax…это остаётся снаружи. Разрезать целиком {Spintax…это|Spintax…это} значило бы дублировать неизменное и провоцировать рассинхрон.

Полный гайд: Грамматически безопасная синонимизация →

3. Выбираем и переставляем

Перестановка [<…> a|b|c] берёт случайное подмножество и тасует порядок — вариативности куда больше, чем от стопки синонимов. Список фич ниже берёт по 3–6 пунктов за рендер. Список движков сохраняет все четыре и лишь переставляет — перестановка без minsize/maxsize включает все элементы по умолчанию, так что размеры задают только когда список должен меняться по длине.

Он добавляет [<minsize=3;maxsize=6;sep=", ";lastsep=" и "> перестановки|переменные|условия|согласование с числом|include|постобработку].

… для [<sep=", ";lastsep=" и "> JavaScript|PHP|Python|Object Pascal]

Полный гайд: Перестановки →

4. Ветвимся по значению

Условие {?VAR?тогда|иначе} выбирает по значению переменной, а не случайно. Переключите один #def — и целая клауза меняется целиком.

#def %ai% = {да|}{?ai?Пусть ИИ соберёт шаблон один раз|Напишите шаблон вручную}; дальше %Engine% рендерит сколько угодно вариантов.

Полный гайд: Условия →

5. Согласуемся с числом

{plural %n%: одна|две|пять} подбирает нужную форму существительного под число. Русский — трёхформный: 1 страницу, 3 страницы, 48 страниц. Так как %pages% — это #def, число и форма всегда совпадают, и плюрал спокойно вкладывается в перестановку.

на [<minsize=1;maxsize=3;sep=", ";lastsep=" или "> %pages% {plural %pages%: страницу|страницы|страниц}|десятки сайтов|разные локали]

Даёт 1 страницу, 3 страницы, 48 страниц — никогда «1 страниц». Полный гайд: Плюралы →

6. Склоняем по падежам

Английскому хватает одной формы существительного, русскому — нет: в каждом падеже своё окончание. Приём — выбрать сущность один раз и заставить все падежи согласоваться с этим выбором: держим её в одном #def и дописываем падежное окончание к корню:

#def %e% = {магазин|сайт|проект}
… о %e%е … для %e%а … к %e%у

Раз #def катится один раз, всё предложение остаётся на одной сущности — о магазине… для магазина… к магазину. Поменяйте на #set — он перекатывается на каждой ссылке, и сущность прыгает по предложению: о проекте… для магазина… к сайту — грамматично, но бессмыслица. Этот контраст и есть весь смысл #def. (Приём «корень + окончание» работает, потому что эти три слова склоняются одинаково; для нерегулярного слова держите по одному #def на полную форму.) Полный гайд: Русские падежи →

Шаблон целиком

#set %OwnLang% = {наш собственный язык шаблонов|разметка, которую мы сделали|наш язык шаблонов}
#set %UniqueGen% = {по-настоящему уникальных|по-настоящему разных|неповторимых}
#set %UniqueAcc% = {уникальный|по-настоящему разный|неповторимый}
#set %Engine% = {движок|spintax-движок|рендерер}
#set %N% = {сотни|тысячи|миллионы}
#def %ai% = {да|}
#def %pages% = {1|3|48}
#def %e% = {магазин|сайт|проект}

<p>Spintax {(spin syntax)|, «spin syntax»,} — это %OwnLang% для создания множества %UniqueGen% вариаций текста из одного источника, который вы контролируете. Вы пишете один шаблон, который кодирует [<sep=", ";lastsep=" и "> альтернативы|порядок|условия|переменные], а %Engine% разворачивает его в %N% вариантов.</p>
<p>{Расскажите о %e%е|Напишите о {вашем |}%e%е}%Engine% {соберёт|сгенерирует} [<minsize=2;maxsize=3;sep=", ";lastsep=" и "> сотни описаний|тексты страниц|наполнение разделов] для %e%а и {приведёт|доведёт} посетителя к %e%у.</p>
<p>Так вы раскатываете %UniqueAcc% контент на [<minsize=1;maxsize=3;sep=", ";lastsep=" или "> %pages% {plural %pages%: страницу|страницы|страниц}|десятки сайтов|разные локали] — уникальный по построению.</p>
<p>{И он работает везде|Он запускается где угодно}: четыре независимых реализации с открытым кодом — для [<sep=", ";lastsep=" и "> JavaScript|PHP|Python|Object Pascal].</p>

Как покрашено (те же scope-категории, что в наших расширениях для редакторов):

  • #set директива (#set / #def)
  • {a|b} альтернатива {a|b}
  • [<…>] перестановка [<…> a|b]
  • %VAR% переменная %VAR%
  • {?…} условие {?…}
  • {plural} плюрал {plural …}

Откроет песочницу с этим шаблоном — жмите Generate для бесконечных вариантов вживую или правьте.

Такая же подсветка в твоём редакторе

Цвета выше — это грамматика, которую мы поставляем как расширения для редакторов; поставь её, и твои шаблоны подсветятся так же: VS Code (301st.spintax) или Sublime Text (Package Control: Spintax).

Куда дальше