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).
Куда дальше
- Открыть песочницу и вставить свой готовый текст для факторинга.
- Серия гайдов — каждый приём выше, в глубину.
- Справочник синтаксиса и вложенный spintax.
- Запусти где угодно — четыре движка с открытым кодом.