Permutations на практике
Permutations перемешивают. Enumerations выбирают. Настоящая вариативность в хорошо написанном шаблоне живёт в permutations — а не в стопках синонимов. В этом гайде: синтаксис, правила сепараторов и один паттерн, который упускает большинство авторов — серийные списки в заголовках и мета-описаниях.
Простая permutation
[a|b|c]
Значения по умолчанию:
- включаются все элементы;
- порядок перемешивается при каждом рендере;
- сепаратор — один пробел.
Примеры вывода: a b c, c a b, b c a.
Короткая форма с одним сепаратором
Задать sep (и lastsep) одним движением:
[< и >a|b|c]
Возможные исходы: a и b и c, c и a и b. Короткая форма присваивает одну и ту же строку и sep, и lastsep — все склейки выглядят одинаково.
Полная конфигурация
Развёрнутая форма даёт полный контроль:
[<minsize=2;maxsize=4;sep=", ";lastsep=" и ">a|b|c|d|e]
Правила:
minsize— минимальное число выбираемых элементов;maxsize— максимальное число элементов;sep— склеивает все элементы, кроме последней пары;lastsep— склеивает последние два элемента (для естественного «A, B и C»).
Пропустите одно — второе подставится разумно:
- задан только
minsize→maxsizeравен «всем доступным»; - задан только
maxsize→minsizeравен 1; - оба больше количества элементов → урезается до общего числа;
- движок не может выбрать ноль элементов. Для «возможно, никакого списка» — обёртка с пустой веткой (см. ниже).
Сепараторы для отдельных элементов
Если нужен контроль тоньше, чем глобальные sep/lastsep, — один элемент может нести свой собственный сепаратор:
[<, >Visa|Mastercard < и >|Skrill]
Здесь:
- глобальный сепаратор —
", "; - элемент после
Mastercardнесёт свой локальный сепаратор" и ".
Переопределения на уровне элемента редки, но полезны, когда конкретному слоту нужен другой союз.
Автоматическое разделение пробелами
Обычные словесные сепараторы автоматически дополняются пробелами с двух сторон:
[<и>a|b|c]
ведёт себя как:
a и b и c
Пунктуационные сепараторы пробелами не дополняются:
[<,>a|b|c]
даёт:
a,b,c
Нужен пробел после запятой — включите его явно: [<, >a|b|c].
Необязательные списки
Поскольку permutation не может выдать ноль элементов, сделать список «возможно, отсутствующим» можно только обёрткой всей permutation в перечисление с пустой веткой:
{|[<minsize=2;maxsize=3;sep=", ";lastsep=" и ">Postgres|Redis|Kafka|MongoDB]}
Возможные исходы: Postgres и Redis, Kafka, Postgres и Redis или пустая строка. Не забудьте про пробелы вокруг — когда список может исчезнуть, пробел нужно класть внутрь ветки.
Серийные списки в заголовках и мета-описаниях
Это тот паттерн, который упускает большинство авторов. Заголовки и H2/H3 часто обещают несколько параллельных тем:
Преимущества, интеграции и как начать
Это не замороженная строка — это список из трёх параллельных блоков. Узнавайте паттерн и авторите как permutation:
[<minsize=3;maxsize=3;sep=", ";lastsep=" и ">Преимущества|Интеграции|Как начать]
Хорошо в рамке заголовка с брендом:
%product_name%: [<minsize=3;maxsize=3;sep=", ";lastsep=" и ">Преимущества|Интеграции|Как начать]
Плохо:
%product_name%: {Преимущества, интеграции и как начать|Полное руководство для команд}
Почему второй вариант слабее:
- он относится к структурированному списку как к одной замороженной строке;
- он теряет паттерн сепаратора, который движок и так умеет;
- он подталкивает модель к альтернативам целых строк вместо переиспользуемой структуры;
- он даёт единицы вариантов там, где permutation даёт десятки.
Паттерн серийных списков применяйте в:
- заголовках, перечисляющих три и более обещания;
- мета-описаниях, называющих несколько блоков статьи;
- H1/H2/H3, перечисляющих параллельные темы разделов.
Не применяйте, когда последовательность — процедурная и должна оставаться в порядке:
Создайте аккаунт, подтвердите email и внесите депозит
Это шаги, а не свободно переставляемый заголовочный список.
Регистр в заголовках — вручную
Обычное правило для основного текста говорит: элементы permutation должны начинаться со строчной буквы, потому что пост-обработка капитализирует начало предложения.
К серийным заголовкам это правило не применяется. Каждый элемент нужно писать сразу в нужном регистре отображения:
[<minsize=3;maxsize=3;sep=", ";lastsep=" и ">Преимущества|Интеграции|Как начать]
а не:
[<minsize=3;maxsize=3;sep=", ";lastsep=" и ">преимущества|интеграции|как начать]
Пост-обработка не преобразует список, склеенный запятыми, в title case за вас.
Типичные ошибки с permutations
| Не надо | Почему | Вместо этого |
|---|---|---|
| Хардкодить фиксированный список из 4+ элементов | Фиксированный порядок становится отпечатком на всех рендерах. | Использовать permutation, даже с minsize=maxsize, если состав обязателен. |
| Замораживать серийный заголовок одной строкой | Теряется паттерн сепаратора; пространство вариантов резко сужается. | Выдавать как permutation с sep и lastsep. |
Указывать minsize=0 | Движок клэмпит к 1; ожидание молча нарушено. | Обернуть список в {|[...]} для «возможно, списка нет». |
Заканчивать элементы точкой при sep=". " | Двойная пунктуация: «факт. . следующий факт». | Пусть пунктуацию добавляет сепаратор; элементы оставляйте «голыми». |
| Добавлять пробелы вокруг словесного сепаратора, который и так дополняется | Получается aиb или лишние пробелы. | Доверяйте автодополнению для словесных сепараторов; пробелы ставьте только у пунктуационных. |
| Писать элементы в разном регистре | Итоговый текст выглядит как случайная капитализация. | Body-text — строчные, заголовки — title case. Внутри одной permutation — консистентно. |
| Делать каждый элемент целым предложением со своим подлежащим | Серийный поток ломается — каждый элемент читается отдельным абзацем. | Элементы на уровне фразы; подлежащее выносите за скобки permutation. |
Чеклист по permutations
- Любой список из трёх и более элементов — это permutation, а не замороженная строка.
- Серийные списки в заголовках используют permutations с явными
sep/lastsep. - Необязательные списки обёрнуты в
{|[...]}, а не попытаны черезminsize=0. - Элементы permutation не заканчиваются пунктуацией, которую уже добавляет сепаратор.
- Permutations в заголовках написаны в отображаемом регистре.
- Permutations в основном тексте начинаются со строчной, если пост-обработка капитализирует.
- Все элементы внутри одной permutation грамматически параллельны.
Структура на месте — остаётся финальный проход по грамматике: грамматически безопасная синонимизация.