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

Материал из YourcmcWiki
Перейти к: навигация, поиск
м
Строка 1: Строка 1:
 
Данный модуль представляет собой новую версию VMX::Template, построенную на некоторых новых идеях, ликвидировавшую безобразие и legacy-код, накопленный в [[Шаблонизатор VMX::Template/Старая версия|старой версии]], однако сохранившую высокую производительность и простоту.
 
Данный модуль представляет собой новую версию VMX::Template, построенную на некоторых новых идеях, ликвидировавшую безобразие и legacy-код, накопленный в [[Шаблонизатор VMX::Template/Старая версия|старой версии]], однако сохранившую высокую производительность и простоту.
 +
 +
Есть [{{SVN|vitaphoto/branch/php/template.php}} PHP-версия] и [{{SVN|vitaphoto/branch/solstice/lib-sway/VMX/Template.php Perl-версия] шаблонизатора. Реализация, естественно, несколько отличается по причине различий языков — например, в Perl’е для кэширования кода используются coderef’ы, а в PHP предполагается, что кэшированием занимается какой-нибудь [http://xcache.lighttpd.net/ XCache] или [http://eaccelerator.net/ eAccelerator], ибо там сохранить coderef между запросами, по-видимому, невозможно.
 +
 +
Развивается то одна, то другая, в зависимости от проекта, над которым я работаю в моменте.
 +
 +
<span style="border: 2px #FF8000 dashed">VMX::Template — это что-то в духе «ох уж эти перлисты — что ни пишут, всё Template::Toolkit получается».</span> Это к тому, что идея вообще-то схожая, но реализация гораздо проще и быстрее.
  
 
== Идеи ==
 
== Идеи ==
Строка 66: Строка 72:
 
=== OR, AND, NOT ===
 
=== OR, AND, NOT ===
  
Логические ИЛИ, И, НЕ, действующие аналогично Perl операторам || && !.
+
Логические ИЛИ, И, НЕ, действующие аналогично Perl операторам ||, &&, !.
  
 
=== EVEN, ODD ===
 
=== EVEN, ODD ===
Строка 72: Строка 78:
 
Истина в случае, если аргумент чётный или нечётный соответственно.
 
Истина в случае, если аргумент чётный или нечётный соответственно.
  
=== INT, ADD, MUL, DIV, MOD ===
+
=== INT=I, ADD, MUL, DIV, MOD ===
  
 
Преобразование к целому числу и арифметические операции.
 
Преобразование к целому числу и арифметические операции.
  
=== EQ, SEQ, GT, LT, GE, LE, SGT, SLT, SGE, SLE ===
+
=== EQ, NE, SEQ, SNE, GT, LT, GE, LE, SGT, SLT, SGE, SLE ===
  
 
Действуют аналогично Perl операторам == eq > < >= <= gt lt ge le.
 
Действуют аналогично Perl операторам == eq > < >= <= gt lt ge le.
  
=== CONCAT, JOIN=IMPLODE, SPLIT, COUNT ===
+
В PHP-версии на данный момент такого многообразия нет, есть просто EQ NE GT LT GE LE.
  
Конкатенация всех своих аргументов - concat(аргументы).
+
=== CONCAT, JOIN=IMPLODE, SPLIT ===
 +
 
 +
Конкатенация всех своих аргументов - concat(аргументы). Конкатенирует также все элементы всех переданных массивов.
  
 
Конкатенация элементов массива через разделитель - join(строка,аргументы). Причём если какие-то аргументы - массивы, конкатенирует все их элементы, а не их самих.
 
Конкатенация элементов массива через разделитель - join(строка,аргументы). Причём если какие-то аргументы - массивы, конкатенирует все их элементы, а не их самих.
  
 
Разделение строки по регулярному выражению и лимиту - split(РЭ,аргумент,лимит). Лимит необязателен. (см. [http://perldoc.perl.org/functions/split.html perldoc -f split])
 
Разделение строки по регулярному выражению и лимиту - split(РЭ,аргумент,лимит). Лимит необязателен. (см. [http://perldoc.perl.org/functions/split.html perldoc -f split])
 +
 +
=== COUNT, SUBARRAY=ARRAY_SLICE, SUBARRAY_DIVMOD ===
  
 
Количество элементов массива, или 0, если аргумент - не массив - count(аргумент).
 
Количество элементов массива, или 0, если аргумент - не массив - count(аргумент).
 +
 +
Аналог функции [http://php.net/manual/en/function.array-slice.php array_slice] из PHP.
 +
 +
Выбор из массива каждого div'того элемента, начиная с номера mod или нуля по умолчанию - subarray_divmod(массив, div, mod).
 +
 +
=== ARRAY, HASH ===
 +
 +
Создание массива или хэша из всех атрибутов.
 +
 +
Соответственно в хеше атрибуты идут парами КЛЮЧ, ЗНАЧЕНИЕ, КЛЮЧ, ЗНАЧЕНИЕ и т.п. (специального синтаксиса "=>" нет).
 +
 +
=== GET, AGET, HGET ===
 +
 +
Получение элемента массива/хэша по «динамическому» ключу. По-моему, это лучше, чем зюки-хрюки Template Toolkit’а: <tt>hash.${hash2.$key}</tt> и т. п.
 +
 +
GET(откуда, что) автоматически решает, «откуда» — это массив или хеш, AGET служит только для массивов, а HGET только для хешей. В PHP-версии все три идентичны.
  
 
=== LC=LOWER=LOWERCASE, UC=UPPER=UPPERCASE ===
 
=== LC=LOWER=LOWERCASE, UC=UPPER=UPPERCASE ===
  
 
Нижний и верхний регистр.
 
Нижний и верхний регистр.
 +
 +
=== STRLIMIT(s, l) ===
 +
 +
(пока только PHP-версия, в Perl будет в будущем) Ограничение длины строки s максимальной длиной l. Если строка превышает заданную длину, она обрезается предпочтительно по пробелу или Tab’у, а в конец добавляется «…» (троеточие).
  
 
=== S=HTML, T=STRIP, H=STRIP_UNSAFE ===
 
=== S=HTML, T=STRIP, H=STRIP_UNSAFE ===
  
Преобразование символов < > & " ' в HTML-сущности,
+
Преобразование символов < > & " ' в HTML-сущности.
  
Удаление всех [[lib:HTML|HTML]]/[[lib:XML|XML]] тегов,
+
Удаление всех [[lib:HTML|HTML]]/[[lib:XML|XML]] тегов.
  
 
Удаление только запрещённых тегов.
 
Удаление только запрещённых тегов.
Строка 104: Строка 134:
 
=== Q=QUOTE, REQUOTE=RE_QUOTE=PREG_QUOTE ===
 
=== Q=QUOTE, REQUOTE=RE_QUOTE=PREG_QUOTE ===
  
Экранирование символов " ' \
+
Экранирование символов " ' \ бэкслэшем.
  
 
А также экранирование символов, являющихся специальными в регулярных выражениях (см. [http://perldoc.perl.org/perlre.html perldoc perlre]).
 
А также экранирование символов, являющихся специальными в регулярных выражениях (см. [http://perldoc.perl.org/perlre.html perldoc perlre]).

Версия 19:29, 18 марта 2010

Данный модуль представляет собой новую версию VMX::Template, построенную на некоторых новых идеях, ликвидировавшую безобразие и legacy-код, накопленный в старой версии, однако сохранившую высокую производительность и простоту.

Есть PHP-версия и [{{SVN|vitaphoto/branch/solstice/lib-sway/VMX/Template.php Perl-версия] шаблонизатора. Реализация, естественно, несколько отличается по причине различий языков — например, в Perl’е для кэширования кода используются coderef’ы, а в PHP предполагается, что кэшированием занимается какой-нибудь XCache или eAccelerator, ибо там сохранить coderef между запросами, по-видимому, невозможно.

Развивается то одна, то другая, в зависимости от проекта, над которым я работаю в моменте.

VMX::Template — это что-то в духе «ох уж эти перлисты — что ни пишут, всё Template::Toolkit получается». Это к тому, что идея вообще-то схожая, но реализация гораздо проще и быстрее.

Идеи

Уйти от 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=I, ADD, MUL, DIV, MOD

Преобразование к целому числу и арифметические операции.

EQ, NE, SEQ, SNE, GT, LT, GE, LE, SGT, SLT, SGE, SLE

Действуют аналогично Perl операторам == eq > < >= <= gt lt ge le.

В PHP-версии на данный момент такого многообразия нет, есть просто EQ NE GT LT GE LE.

CONCAT, JOIN=IMPLODE, SPLIT

Конкатенация всех своих аргументов - concat(аргументы). Конкатенирует также все элементы всех переданных массивов.

Конкатенация элементов массива через разделитель - join(строка,аргументы). Причём если какие-то аргументы - массивы, конкатенирует все их элементы, а не их самих.

Разделение строки по регулярному выражению и лимиту - split(РЭ,аргумент,лимит). Лимит необязателен. (см. perldoc -f split)

COUNT, SUBARRAY=ARRAY_SLICE, SUBARRAY_DIVMOD

Количество элементов массива, или 0, если аргумент - не массив - count(аргумент).

Аналог функции array_slice из PHP.

Выбор из массива каждого div'того элемента, начиная с номера mod или нуля по умолчанию - subarray_divmod(массив, div, mod).

ARRAY, HASH

Создание массива или хэша из всех атрибутов.

Соответственно в хеше атрибуты идут парами КЛЮЧ, ЗНАЧЕНИЕ, КЛЮЧ, ЗНАЧЕНИЕ и т.п. (специального синтаксиса "=>" нет).

GET, AGET, HGET

Получение элемента массива/хэша по «динамическому» ключу. По-моему, это лучше, чем зюки-хрюки Template Toolkit’а: hash.${hash2.$key} и т. п.

GET(откуда, что) автоматически решает, «откуда» — это массив или хеш, AGET служит только для массивов, а HGET только для хешей. В PHP-версии все три идентичны.

LC=LOWER=LOWERCASE, UC=UPPER=UPPERCASE

Нижний и верхний регистр.

STRLIMIT(s, l)

(пока только PHP-версия, в Perl будет в будущем) Ограничение длины строки s максимальной длиной l. Если строка превышает заданную длину, она обрезается предпочтительно по пробелу или Tab’у, а в конец добавляется «…» (троеточие).

S=HTML, T=STRIP, H=STRIP_UNSAFE

Преобразование символов < > & " ' в HTML-сущности.

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

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

Q=QUOTE, REQUOTE=RE_QUOTE=PREG_QUOTE

Экранирование символов " ' \ бэкслэшем.

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

SUBST, SPRINTF, STRFTIME

Подстановка на места подстрок вида $ЧИСЛО соответствующих параметров функции или элементов переданного массива.

sprintf.

strftime.