Синтаксис шаблона

разделители тегов
{ } либо <!-- --> . Они взаимозаменяемы. Я предлагаю, но не навязываю, использовать {} для вывода данных, а <!-- --> для операторов в тексте HTML.
При таком подходе верстка не ломается и можно оценить шаблон прямо в браузере. Далее в тексте буду писать только {}.

Внутри разделителей первый непробельный символ должен быть одним из:
. — начало "блочного оператора".
$ — вывод переменной
@ — вывод переменной с экранированием тегов
По этому символу парсер отличит свой тег от простого коментария HTML. Парсер оставляет нареспознанные или ошибочные теги в тексте в неизменном виде.
переменная
Любая последовательность символов, кроме разделителей и конвеера. Точка "." служит для ссылки на элемент структуры. Примеры валидных переменных:
myvar
myvar.element
lang.forum.New post
Фактически имена — это ключи (многомерного) ассоциативного массива параметров.
Последняя строка будет скомпилирована в
$data['lang']['forum']['New post']
конвеер
Перед выводом переменная может быть обработана одной или несколькими функциями-модификаторами. Имена функций перечисляются через символ "|" , могут быть дополнительные парамтры. Переменная будет подставляться как первый параметр функции:
{$str|strtolower}
{$mydate|format_date}
{@str|str_repeat,3|strtolower}
Последняя строка будет скомпилирована в
<?php echo htmlEscape(strtolower(str_repeat($data['str'],3))) ?>
то есть дополнительно вызывается функция-фильтр тегов.
блочные операторы

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

IF - ELSEIF - ELSE — ветвление
Синтаксис:
{.IF переменная} {.ELSEIF переменная} {.ELSE}
В условии не допускаются выражения. IF проверяет только на "непустоту" (выражение PHP !empty() ). Используется для проверки логических флажков или на непустой массив.
Можно проверять обратное условие IFNOT, а также ELSEIFNOT — "выполнять, если переменная неопределена или пустая".

FOREACH — перебор элементов массива
Синтаксис:
{.FOREACH переменная AS переменная} или
{.FOREACH переменная AS переменная=>переменная}
Переменные справа от AS создаются в том же массиве параметров. Никаких специальных служебных структур нет.

END — завершает блок IF или FOREACH
Синтаксис:
{.END}

INCLUDE — подключить под-шаблон
Синтаксис:
{.INCLUDE имя_шаблона}
Здесь имя шаблона не содержит ни путь, ни расширение файла. Только имя. Файл должен быть в той же папке, где родительский шаблон.
В скомпилированном коде будет присутствовать рекурсивный вызов функции parseTemplate(). Таким образом, дочерний шаблон проверяется на обновление независимо от родительского.

See also