Шаблонизатор VMX::Template — различия между версиями

Материал из YourcmcWiki
Перейти к: навигация, поиск
(Новая: Данный модуль представляет собой новую версию VMX::Template, построенную на некоторых новых идеях, ликвиди...)
 
Строка 5: Строка 5:
 
Уйти от assign_vars(), assign_block_vars(). Передавать, как и в обычных движках, просто хеш с данными $vars. Как, например, в Template::Toolkit. При этом сохранить данные методы для совместимости.
 
Уйти от assign_vars(), assign_block_vars(). Передавать, как и в обычных движках, просто хеш с данными $vars. Как, например, в Template::Toolkit. При этом сохранить данные методы для совместимости.
  
Почистить синтаксис: ликвидировать "преобразования", "вложенный путь по переменной" (->key->index->key->и т.п.), специальный синтаксис для окончания SET, неочевидное обращение к счётчику block.#, tr_assign_* и т.п.
+
Почистить синтаксис: ликвидировать «преобразования», «вложенный путь по переменной» (->key->index->key->и т. п.), специальный синтаксис для окончания SET, неочевидное обращение к счётчику block.#, tr_assign_* и т. п.
  
 
Переписать с нуля компилятор.
 
Переписать с нуля компилятор.
Строка 15: Строка 15:
 
== Реализация ==
 
== Реализация ==
  
Путь к переменной теперь может включать в себя числа. Это будут обращения к элементам массивов, в то время как всё остальное - обращения к элементам хешей.
+
Путь к переменной теперь может включать в себя числа. Это будут обращения к элементам массивов, в то время как всё остальное — обращения к элементам хешей.
  
Вне блока {block} будет иметь значение ARRAY(0x...) т.е. массив всех итераций блока block, а {block.0} будет иметь значение HASH(0x...), т.е. первую итерацию блока block.
+
Вне блока {block} будет иметь значение ARRAY(0x…) то есть массив всех итераций блока block, а {block.0} будет иметь значение HASH(0x…), то есть первую итерацию блока block.
  
 
<nowiki><!-- BEGIN block --></nowiki>
 
<nowiki><!-- BEGIN block --></nowiki>
  
А внутри блока {block} теперь будет иметь значение HASH(0x...), т.е. уже значение текущей итерации блока block, а {block.#} будет иметь значением номер текущей итерации блока, отсчитываемый с 0, а не с 1, как в старой версии.
+
А внутри блока {block} теперь будет иметь значение HASH(0x…), то есть уже значение текущей итерации блока block, а {block.#} будет иметь значением номер текущей итерации блока, отсчитываемый с 0, а не с 1, как в старой версии.
  
 
<nowiki><!-- END block --></nowiki>
 
<nowiki><!-- END block --></nowiki>
  
На <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.
  
 
Операторов '''нет''', но есть функции. Пример:
 
Операторов '''нет''', но есть функции. Пример:
Строка 53: Строка 53:
 
  <!-- IF function(block.key) --><!-- ELSEIF ... --><!-- END -->
 
  <!-- IF function(block.key) --><!-- ELSEIF ... --><!-- END -->
 
  <!-- IF NOT block.key -->...<!-- END -->                       
 
  <!-- IF NOT block.key -->...<!-- END -->                       
</pre>                                                      
+
</pre>
  
 
Запись значения переменной:
 
Запись значения переменной:

Версия 14:21, 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-сущности,

Удаление всех HTML/XML тегов,

Удаление только запрещённых тегов.

Q=QUOTE, REQUOTE=RE_QUOTE=PREG_QUOTE

Экранирование символов " ' \

А также экранирование символов, являющихся специальными в регулярных выражениях (см. perldoc perlre).