Шаблонизатор VMX::Template — различия между версиями
м |
|||
Строка 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. | ||
− | + | В 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 получается». Это к тому, что идея вообще-то схожая, но реализация гораздо проще и быстрее.
Содержание
- 1 Идеи
- 2 Реализация
- 3 Функции
- 3.1 OR, AND, NOT
- 3.2 EVEN, ODD
- 3.3 INT=I, ADD, MUL, DIV, MOD
- 3.4 EQ, NE, SEQ, SNE, GT, LT, GE, LE, SGT, SLT, SGE, SLE
- 3.5 CONCAT, JOIN=IMPLODE, SPLIT
- 3.6 COUNT, SUBARRAY=ARRAY_SLICE, SUBARRAY_DIVMOD
- 3.7 ARRAY, HASH
- 3.8 GET, AGET, HGET
- 3.9 LC=LOWER=LOWERCASE, UC=UPPER=UPPERCASE
- 3.10 STRLIMIT(s, l)
- 3.11 S=HTML, T=STRIP, H=STRIP_UNSAFE
- 3.12 Q=QUOTE, REQUOTE=RE_QUOTE=PREG_QUOTE
- 3.13 SUBST, SPRINTF, STRFTIME
Идеи
Уйти от 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-сущности.
Удаление только запрещённых тегов.
Q=QUOTE, REQUOTE=RE_QUOTE=PREG_QUOTE
Экранирование символов " ' \ бэкслэшем.
А также экранирование символов, являющихся специальными в регулярных выражениях (см. perldoc perlre).
SUBST, SPRINTF, STRFTIME
Подстановка на места подстрок вида $ЧИСЛО соответствующих параметров функции или элементов переданного массива.