Шаблонизатор VMX::Template — различия между версиями
Строка 19: | Строка 19: | ||
Вне блока {block} будет иметь значение ARRAY(0x…) то есть массив всех итераций блока block, а {block.0} будет иметь значение HASH(0x…), то есть первую итерацию блока block. | Вне блока {block} будет иметь значение ARRAY(0x…) то есть массив всех итераций блока block, а {block.0} будет иметь значение HASH(0x…), то есть первую итерацию блока block. | ||
− | < | + | <pre><!-- BEGIN block --></pre> |
А внутри блока {block} теперь будет иметь значение HASH(0x…), то есть уже значение текущей итерации блока block, а {block.#} будет иметь значением номер текущей итерации блока, отсчитываемый с 0, а не с 1, как в старой версии. | А внутри блока {block} теперь будет иметь значение HASH(0x…), то есть уже значение текущей итерации блока block, а {block.#} будет иметь значением номер текущей итерации блока, отсчитываемый с 0, а не с 1, как в старой версии. | ||
− | < | + | <pre><!-- END block --></pre> |
На <nowiki><!-- END другоеимя --></nowiki> после <nowiki><!-- BEGIN block --></nowiki> шаблонизатор выдаст ошибку, «ибо нефиг» (c). Если block в хеше данных — не массив, а хеш — это значит, что итерация у блока только одна, и тогда <nowiki><!-- BEGIN block --></nowiki> работает как for($expression) {} в Perl. | На <nowiki><!-- END другоеимя --></nowiki> после <nowiki><!-- BEGIN block --></nowiki> шаблонизатор выдаст ошибку, «ибо нефиг» (c). Если block в хеше данных — не массив, а хеш — это значит, что итерация у блока только одна, и тогда <nowiki><!-- BEGIN block --></nowiki> работает как for($expression) {} в Perl. | ||
Строка 29: | Строка 29: | ||
Операторов '''нет''', но есть функции. Пример: | Операторов '''нет''', но есть функции. Пример: | ||
− | < | + | <pre><!-- IF OR(function(block.key1),AND(block.key2,block.key3)) --></pre> |
Синтаксис вызова функции нескольких аргументов: | Синтаксис вызова функции нескольких аргументов: | ||
− | < | + | <pre><!-- function(block.key, 0, "abc") --></pre> |
Подстановка: | Подстановка: | ||
− | < | + | <pre>{function(block.key, 0, "abc")}</pre> |
Синтаксис вызова функции одного аргумента: | Синтаксис вызова функции одного аргумента: | ||
<pre> | <pre> | ||
− | + | <!-- function(block.key) --> | |
− | + | <!-- function block.key --> | |
− | + | {block.key/L} | |
− | + | {L block.key} | |
</pre> | </pre> | ||
Строка 51: | Строка 51: | ||
<pre> | <pre> | ||
− | + | <!-- IF function(block.key) --><!-- ELSEIF ... --><!-- END --> | |
− | + | <!-- IF NOT block.key -->...<!-- END --> | |
</pre> | </pre> | ||
Строка 58: | Строка 58: | ||
<pre> | <pre> | ||
− | + | <!-- SET block.key -->...<!-- END --></nowiki> | |
− | + | <!-- SET block.key = выражение --> | |
</pre> | </pre> | ||
Версия 14:22, 13 июля 2009
Данный модуль представляет собой новую версию VMX::Template, построенную на некоторых новых идеях, ликвидировавшую безобразие и legacy-код, накопленный в старой версии, однако сохранившую высокую производительность и простоту.
Содержание
Идеи
Уйти от assign_vars(), assign_block_vars(). Передавать, как и в обычных движках, просто хеш с данными $vars. Как, например, в Template::Toolkit. При этом сохранить данные методы для совместимости.
Почистить синтаксис: ликвидировать «преобразования», «вложенный путь по переменной» (->key->index->key->и т. п.), специальный синтаксис для окончания SET, неочевидное обращение к счётчику block.#, tr_assign_* и т. п.
Переписать с нуля компилятор.
Добавить в употребление функции, но только самые необходимые.
Добавить обработку ошибок и диагностические сообщения.
Реализация
Путь к переменной теперь может включать в себя числа. Это будут обращения к элементам массивов, в то время как всё остальное — обращения к элементам хешей.
Вне блока {block} будет иметь значение ARRAY(0x…) то есть массив всех итераций блока block, а {block.0} будет иметь значение HASH(0x…), то есть первую итерацию блока block.
<!-- BEGIN block -->
А внутри блока {block} теперь будет иметь значение HASH(0x…), то есть уже значение текущей итерации блока block, а {block.#} будет иметь значением номер текущей итерации блока, отсчитываемый с 0, а не с 1, как в старой версии.
<!-- END block -->
На <!-- END другоеимя --> после <!-- BEGIN block --> шаблонизатор выдаст ошибку, «ибо нефиг» (c). Если block в хеше данных — не массив, а хеш — это значит, что итерация у блока только одна, и тогда <!-- BEGIN block --> работает как for($expression) {} в Perl.
Операторов нет, но есть функции. Пример:
<!-- IF OR(function(block.key1),AND(block.key2,block.key3)) -->
Синтаксис вызова функции нескольких аргументов:
<!-- function(block.key, 0, "abc") -->
Подстановка:
{function(block.key, 0, "abc")}
Синтаксис вызова функции одного аргумента:
<!-- function(block.key) --> <!-- function block.key --> {block.key/L} {L block.key}
Условный вывод:
<!-- IF function(block.key) --><!-- ELSEIF ... --><!-- END --> <!-- IF NOT block.key -->...<!-- END -->
Запись значения переменной:
<!-- SET block.key -->...<!-- END --></nowiki> <!-- SET block.key = выражение -->
Функции
OR, AND, NOT
Логические ИЛИ, И, НЕ, действующие аналогично Perl операторам || && !.
EVEN, ODD
Истина в случае, если аргумент чётный или нечётный соответственно.
INT, ADD, MUL, DIV, MOD
Преобразование к целому числу и арифметические операции.
EQ, SEQ, GT, LT, GE, LE, SGT, SLT, SGE, SLE
Действуют аналогично Perl операторам == eq > < >= <= gt lt ge le.
CONCAT, JOIN, SPLIT, COUNT
Конкатенация всех своих аргументов - concat(аргументы).
Конкатенация элементов массива через разделитель - join(строка,аргументы). Причём если какие-то аргументы - массивы, конкатенирует все их элементы, а не их самих.
Разделение строки по регулярному выражению и лимиту - split(РЭ,аргумент,лимит). Лимит необязателен. (см. perldoc -f split)
Количество элементов массива, или 0, если аргумент - не массив - count(аргумент).
LC=LOWER=LOWERCASE, UC=UPPER=UPPERCASE
Нижний и верхний регистр.
L=TRANSLATE, LZ=TRANSLATE_NULL
Контекстный перевод и он же либо пустое значение в случае отсутствия перевода.
S=HTML, T=STRIP, H=STRIP_UNSAFE
Преобразование символов < > & " ' в HTML-сущности,
Удаление только запрещённых тегов.
Q=QUOTE, REQUOTE=RE_QUOTE=PREG_QUOTE
Экранирование символов " ' \
А также экранирование символов, являющихся специальными в регулярных выражениях (см. perldoc perlre).