Хм... а Mako то чем не угодил?
К сожалению или к счастью, реализация TT2 для Python появилась сравнительно поздно. Потребность в мощном шаблонизаторе для таких языков, как Perl, Python и Ruby, в которых удобные средства генерации HTML не реализованных на языковом уровня, выражается особо остро, по сравнению, например, с PHP, который сам является мощным шаблонизатором. Такая потребность и повлекла за собой появление различных шаблонизаторов на любой вкус и цвет. Один шаблонный движок покрывает функциональность другого. Вся разница лишь в философии движка и его синтаксисе.
TT2 практически не отличается от Mako или любого другого известного шаблонного движка по функциональности, но зато он здорово отличается в подходах создания шаблонов и их взаимодействия с основным кодом приложения.
Синтаксический сахар и собственный язык для шаблонов
TT2 использует свой простой язык для построения шаблонов. На этом языке можно описать практически все, что вам нужно не прибегая к использованию чистого Python в шаблонах. Но, между тем, Template toolkit поддерживает специальные блоки, в которых может быть использован код на чистом Питоне (PYTHON / RAWPYTHON).
Новые языковые конструкции: UNLESS и SWITCH / CASE
Конструкция UNLESS, подобна IF, только наоборот :). Блок unless выполняется, если условие ложно. Это наследство от языка Perl. Такая конструкция есть в Ruby. Просматривая буржуйский Перловый код, я не раз замечал, что эта конструкция используется очень часто. Мне же больше по душе старый добрый IF.
Пример:
[% name = 'Билл' %]
[% surname = 'Гейтс' %]
[% UNLESS name == 'Билл' && surname == 'Гейтс' %]
Нам сказали таких не пущать! :(
[% ELSE %]
Захады, дарагой, гостэм будешь! :)
[% END %]
[% IF !(name == 'Билл' && surname == 'Гейтс') %]
Нам сказали таких не пущать! :(
[% ELSE %]
Захады, дарагой, гостэм будешь! :)
[% END %]
Результат:
Захады, дарагой, гостэм будешь! :)
Захады, дарагой, гостэм будешь! :)
А вот конструкция SWITCH / CASE будет полезной заменой цепочек if-elif-else и извращений с анонимными ассоциативными массивами.
Пример:
[% age = 16 %]
[% SWITCH age %]
[% CASE 0 %]
Это шутка такая, да?
[% CASE [1..17] %]
А может лучше на футбол, чем на этом сайте сидеть?
[% CASE [18, 19, 20, 21, 22, 23, 24 ] %]
В двери стучат из военкомата...
[% CASE DEFAULT %]
Фух, хоть сейчас можно на сайте спокойно посидеть :)
[% END %]
Результат:
А может лучше на футбол, чем на этом сайте сидеть?
Template toolkit поддерживает и другие языковые конструкции и операторы, аналоги которых есть в Питоне:
- FOREACH – аналог for. Поддерживается несколько форм записи.
- WHILE – аналог обычного, старого доброго while.
- IF / UNLESS / ELSIF / ELSE – ветвление
- USE – это аналог import. Служит для загрузкигрузки плагинов, написанных на Python.
- TRY / THROW / CATCH / FINAL – Обработка исключений непосредственно внутри шаблона.
- NEXT, LAST – управление итерациями цикла. NEXT == continue; LAST ==break.
- RETURN, STOP – Это остановка обработки только включаемого шаблона и полная остановка обработки всех шаблонов соответственно.
Манипуляция блоками текста: фильтры, включения, блоки, обвертки и макросы
Удобство при работе с блоками текста – это, на мой взгляд, самая необходимая функциональность, предоставляемая шаблонным движком. И у Template toolkit она развита на достаточно высоком уровне.
Включения позволяют собирать шаблон страницы из частей, разбросанных по разным файлам либо вызывать именованные шаблоны. Template toolkit поддерживает 3 вида включения:
INSERT – включить шаблон без обработки
INCLUDE – включить и обработать шаблон. Все переменные включаемого файла или именованного шаблона будут находиться в локальном пространстве имен.
PROCESS – аналог INCLUDE, при этом все переменные будут жить в глобальном пространстве имен “главного” шаблона.
Кроме этого, PROCESS и INCLUDE используются для обработки текстовых блоков BLOCK.
Обвертки и блоки
BLOCK – это именованный шаблон, вызываемый с помощью директив PROCESS, INCLUDE, INSERT, WRAPPER. По принципу действия блок похож на функцию, которая возвращает текстовые данные. Блок можно вызывать как с параметрами, так и без, в любом месте обрабатываемого шаблона.
Обвертки – это специальный вид блоков, один из параметров которого есть текст, который был заключен в директиву WRAPPER. Этот текст доступен через специальную переменную [% content %] внутри BLOCK. Сначала обрабатывается содержимое переменной [% content %], и лишь потом оно обрамляется в данные блока.
К примеру, в блоке может быть реализована шапка и подвал страницы (т.е. ее макет; layout). А содержимое страницы может непосредственно попадать в готовый макет посредствам директивы WRAPPER.
Пример:
[% BLOCK layout %]
Это шапка сайта
Заголовок: [% title or 'Без имени' %]
---------------
[% content %]
---------------
А это подвал
[% END %]
[% WRAPPER layout title='My title' %]
А тут содержимое страницы!
[% END %]
Результат:
Это шапка сайта
Заголовок: My title
---------------
А тут содержимое страницы!
---------------
А это подвал
В отличие от блоков – макросы возвращают результаты вычислений, описанных непосредственно в шаблоне, это обычная функция. Для объявления макроса используется директива MACRO. Вызываются макросы по имени и могут участвовать в условиях и вычислениях.
Директива FILTER по принципу действия подобна WRAPPER. Отличие состоит в том, что FILTER вызывает специальную функцию, написанную на Python для обработки куска текста, а не именованный шаблон, как это делает WRAPPER.
Есть еще много того, о чем я не рассказал: о включение кода на Python внутри шаблона, о богатых возможностях конфигурирования шаблонного движка, о некоторых директивах... Все это вы можете узнать из руководств по Template toolkit’у, ссылки на которые я приведу в конце заметки.
Так зачем же нужен еще один шаблонизатор?
Template toolkit предоставляет свой подход при работе с шаблонами. Основная изюминка TT в том, что он использует свой, простой для изучения язык для составления шаблонов, который, при обработке движком, компилируется в Perl или Python. Так что вы не много потеряете в производительности, получая при этом удобство при программировании шаблонов. Хоть этот язык и прост для освоения, но при этом он поддерживает необходимые конструкции ветвления, циклы и управление временем выполнения шаблона, вызов методов переданных объектов и подключенных Питоновских модулей.
Template toolkit будет очень удобен для программистов, которые после освоения Перла изучают Питон, так как теперь шаблонизатор можно использовать в обоих языках.
Template toolkit – это мощь, скорость и гибкость в одном флаконе.
Что почитать дальше?
Конечно же, официальный ресурс Template toolkit 2 и не забыть зайти на страницу Template toolkit для Python – там есть ссылка на svn-репозиторий, откуда можно взять свежий релиз. Когда вам наскучат эти английские буковки – почитайте русскоязычную документацию. Информация о TT есть и в Wiki.
Скачав TT с svn-репозитория – читайте документацию в файле template/ __init__.py.
В папке t – вы обнаружите кучу тестов, а тесты, как известно – лучшая документация для программиста.
Установка
$ python setup.py install
Приятного тэмплэйтинга!
1 коммент.:
У них на сайте указана неверная команда для чекаута, надо так:
svn co svn://svn.tt2.org/tt/Template-Python/trunk Template-Python
Отправить комментарий