13 786
правок
Изменения
Новая: Данный модуль представляет собой новую версию VMX::Template, построенную на некоторых новых идеях, ликвиди...
Данный модуль представляет собой новую версию VMX::Template, построенную на некоторых новых идеях, ликвидировавшую безобразие и legacy-код, накопленный в [[Шаблонизатор VMX::Template/Старая версия|старой версии]], однако сохранившую высокую производительность и простоту.
== Идеи ==
Уйти от assign_vars(), assign_block_vars(). Передавать, как и в обычных движках, просто хеш с данными $vars. Как, например, в Template::Toolkit. При этом сохранить данные методы для совместимости.
Почистить синтаксис: ликвидировать "преобразования", "вложенный путь по переменной" (->key->index->key->и т.п.), специальный синтаксис для окончания SET, неочевидное обращение к счётчику block.#, tr_assign_* и т.п.
Переписать с нуля компилятор.
Добавить в употребление функции, но только самые необходимые.
Добавить обработку ошибок и диагностические сообщения.
== Реализация ==
Путь к переменной теперь может включать в себя числа. Это будут обращения к элементам массивов, в то время как всё остальное - обращения к элементам хешей.
Вне блока {block} будет иметь значение ARRAY(0x...) т.е. массив всех итераций блока block, а {block.0} будет иметь значение HASH(0x...), т.е. первую итерацию блока block.
<nowiki><!-- BEGIN block --></nowiki>
А внутри блока {block} теперь будет иметь значение HASH(0x...), т.е. уже значение текущей итерации блока block, а {block.#} будет иметь значением номер текущей итерации блока, отсчитываемый с 0, а не с 1, как в старой версии.
<nowiki><!-- END block --></nowiki>
На <nowiki><!-- END другоеимя --></nowiki> после <nowiki><!-- BEGIN block --></nowiki> шаблонизатор выдаст ошибку, "ибо нефиг" (c). Если block в хеше данных - не массив, а хеш - это значит, что итерация у блока только одна, и тогда <nowiki><!-- BEGIN block --></nowiki> работает как for($expression) {} в Perl.
Операторов '''нет''', но есть функции. Пример:
<nowiki><!-- IF OR(function(block.key1),AND(block.key2,block.key3)) --></nowiki>
Синтаксис вызова функции нескольких аргументов:
<nowiki><!-- function(block.key, 0, "abc") --></nowiki>
Подстановка:
<nowiki>{function(block.key, 0, "abc")}</nowiki>
Синтаксис вызова функции одного аргумента:
<pre>
<!-- function(block.key) -->
<!-- function block.key -->
{block.key/L}
{L block.key}
</pre>
Условный вывод:
<pre>
<!-- IF function(block.key) --><!-- ELSEIF ... --><!-- END -->
<!-- IF NOT block.key -->...<!-- END -->
</pre>
Запись значения переменной:
<pre>
<!-- SET block.key -->...<!-- END --></nowiki>
<!-- SET block.key = выражение -->
</pre>
== Функции ==
=== 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(РЭ,аргумент,лимит). Лимит необязателен. (см. [http://perldoc.perl.org/functions/split.html perldoc -f split])
Количество элементов массива, или 0, если аргумент - не массив - count(аргумент).
=== LC=LOWER=LOWERCASE, UC=UPPER=UPPERCASE ===
Нижний и верхний регистр.
=== L=TRANSLATE, LZ=TRANSLATE_NULL ===
Контекстный перевод и он же либо пустое значение в случае отсутствия перевода.
=== S=HTML, T=STRIP, H=STRIP_UNSAFE ===
Преобразование символов < > & " ' в HTML-сущности,
Удаление всех [[lib:HTML|HTML]]/[[lib:XML|XML]] тегов,
Удаление только запрещённых тегов.
=== Q=QUOTE, REQUOTE=RE_QUOTE=PREG_QUOTE ===
Экранирование символов " ' \
А также экранирование символов, являющихся специальными в регулярных выражениях (см. perldoc perlre).
== Идеи ==
Уйти от assign_vars(), assign_block_vars(). Передавать, как и в обычных движках, просто хеш с данными $vars. Как, например, в Template::Toolkit. При этом сохранить данные методы для совместимости.
Почистить синтаксис: ликвидировать "преобразования", "вложенный путь по переменной" (->key->index->key->и т.п.), специальный синтаксис для окончания SET, неочевидное обращение к счётчику block.#, tr_assign_* и т.п.
Переписать с нуля компилятор.
Добавить в употребление функции, но только самые необходимые.
Добавить обработку ошибок и диагностические сообщения.
== Реализация ==
Путь к переменной теперь может включать в себя числа. Это будут обращения к элементам массивов, в то время как всё остальное - обращения к элементам хешей.
Вне блока {block} будет иметь значение ARRAY(0x...) т.е. массив всех итераций блока block, а {block.0} будет иметь значение HASH(0x...), т.е. первую итерацию блока block.
<nowiki><!-- BEGIN block --></nowiki>
А внутри блока {block} теперь будет иметь значение HASH(0x...), т.е. уже значение текущей итерации блока block, а {block.#} будет иметь значением номер текущей итерации блока, отсчитываемый с 0, а не с 1, как в старой версии.
<nowiki><!-- END block --></nowiki>
На <nowiki><!-- END другоеимя --></nowiki> после <nowiki><!-- BEGIN block --></nowiki> шаблонизатор выдаст ошибку, "ибо нефиг" (c). Если block в хеше данных - не массив, а хеш - это значит, что итерация у блока только одна, и тогда <nowiki><!-- BEGIN block --></nowiki> работает как for($expression) {} в Perl.
Операторов '''нет''', но есть функции. Пример:
<nowiki><!-- IF OR(function(block.key1),AND(block.key2,block.key3)) --></nowiki>
Синтаксис вызова функции нескольких аргументов:
<nowiki><!-- function(block.key, 0, "abc") --></nowiki>
Подстановка:
<nowiki>{function(block.key, 0, "abc")}</nowiki>
Синтаксис вызова функции одного аргумента:
<pre>
<!-- function(block.key) -->
<!-- function block.key -->
{block.key/L}
{L block.key}
</pre>
Условный вывод:
<pre>
<!-- IF function(block.key) --><!-- ELSEIF ... --><!-- END -->
<!-- IF NOT block.key -->...<!-- END -->
</pre>
Запись значения переменной:
<pre>
<!-- SET block.key -->...<!-- END --></nowiki>
<!-- SET block.key = выражение -->
</pre>
== Функции ==
=== 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(РЭ,аргумент,лимит). Лимит необязателен. (см. [http://perldoc.perl.org/functions/split.html perldoc -f split])
Количество элементов массива, или 0, если аргумент - не массив - count(аргумент).
=== LC=LOWER=LOWERCASE, UC=UPPER=UPPERCASE ===
Нижний и верхний регистр.
=== L=TRANSLATE, LZ=TRANSLATE_NULL ===
Контекстный перевод и он же либо пустое значение в случае отсутствия перевода.
=== S=HTML, T=STRIP, H=STRIP_UNSAFE ===
Преобразование символов < > & " ' в HTML-сущности,
Удаление всех [[lib:HTML|HTML]]/[[lib:XML|XML]] тегов,
Удаление только запрещённых тегов.
=== Q=QUOTE, REQUOTE=RE_QUOTE=PREG_QUOTE ===
Экранирование символов " ' \
А также экранирование символов, являющихся специальными в регулярных выражениях (см. perldoc perlre).