Встроенные последовательности
TDC автоматически создаёт несколько последовательностей — они доступны без
объявления в <env>. По конвенции их имена начинаются с символа подчёркивания.
Их можно использовать в
интерполяции (${{_count}}) и в
выражениях if (if="_first").
Часто нужны не сами данные карточки, а её место в наборе: какой это по счёту элемент, первый он или последний, сколько всего элементов. TDC считает всё это сам и кладёт результат в четыре готовых имени.
Список встроенных
| Имя | Значение |
|---|---|
_count | Номер текущей карточки, начиная с 1 |
_first | "true" на первой карточке, "false" — на остальных |
_last | "true" на последней карточке, "false" — на остальных |
_total | Общее число карточек (то же, что count), повторяется на каждой строке |
_first и _last — это строки "true" и "false", а не булевы значения.
Это сделано сознательно: чтобы ${{_last}} подставилось как читаемое слово
"false" (удобно для "isLast": ${{_last}} в JSON), а условие if="!_last"
всё равно корректно трактовало это как ложь.
Всё сразу
<block>
<line><data>_count=${{_count}} _first=${{_first}} _last=${{_last}} _total=${{_total}} ${{Name}}</data></line>
</block>
_count=1 _first=true _last=false _total=5 Александр _count=2 _first=false _last=false _total=5 Дмитрий _count=3 _first=false _last=false _total=5 Максим _count=4 _first=false _last=false _total=5 Иван _count=5 _first=false _last=true _total=5 Сергей
_count идёт 1..5, _total на каждой строке равен 5, _first истинно
только на первой карточке, _last — только на последней.
Частые применения
Нумерация — ${{_count}} из ${{_total}}: ${{Name}}.
JSON без висящей запятой — второй <data if="!_last">, ставит запятую на
всех карточках, кроме последней:
<line><data>{"id": ${{_count}}, "name": "${{Name}}"}</data><data if="!_last">,</data></line>
{"id": 1, "name": "Артём"},
{"id": 2, "name": "Кирилл"},
{"id": 3, "name": "Никита"},
{"id": 4, "name": "Егор"}Заголовок только на первой карточке — <line if="_first"><data>=== START ===</data></line>.
Подсветка второй половины — встроенные работают внутри арифметики выражений,
поэтому if="_count * 2 > _total" становится истинным, как только номер
переваливает за середину.
Внутри строки с each=: _item и _item_id
Строка <line each="List"> повторяется по одному разу на
каждый элемент списка, и там доступны ещё два встроенных имени — только там; полный
приём см. в Реляционных таблицах:
| Имя | Значение |
|---|---|
_item | Позиция внутри этой карточки — 1, 2, 3, заново на каждой карточке |
_item_id | Число, уникальное на весь прогон, — готовый первичный ключ |
Они существуют только в строке с each=; в обычной строке ничего не именуют.
Зарезервированные имена
Не начинайте имена своих последовательностей с _ — это зарезервировано.
Перекрыть встроенную не получится: TDC откажется запускаться и скажет, какие
имена заняты:
error[TDC033]: sequence name "_count" collides with a builtin note: Builtins: _count, _first, _last, _total. Pick a different name.
См. также
- Вывод и форматирование — интерполяция и
if.