Вы находитесь на странице: 1из 30

Современные шаблонизаторы

Какие они бывают и почему этого мало.

Перевезенцев Тимофей

май 18, 2010


Виды шаблонизаторов

Текстовые, использующие собственный синтаксис шаблонов


I текстовые, которые работают с любым текстом и не имеют
понятия о семантике (jinja2, django, mako, chetah и др.)
I с синтаксисом основанным на отступах (haml-подобные, daml,
ghrml )
Использующие обычные python объекты и собственный API (Stan,
werkzeug и др.)
DOM ориентированные (шаблон - (x)html документ, данные
заносятся с помощью DOM-подобных API из кода)

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 2 / 31


Текстовые шаблонизаторы, которые работают с любым
текстом и не имеют понятия о семантике

Мы к ним уже привыкли. Верстка пишется как есть, с вкраплениями


специального синтаксиса шаблона.
мы можем верстать с ошибками (экранирование)
мы можем получать невалидную верстку
при внесении изменений в уже готовую верстку нужно быть очень
внимательным

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 3 / 31


Примеры

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 4 / 31


Примеры

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 6 / 31


Шаблонизаторы использующие обычные python объекты
и собственный API

Это обычный python код. Из-за чего они получаются быть быстрыми.
структура документа может быть не наглядной
write only

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 7 / 31


Примеры

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 8 / 31


Список требований, с учетом опыта использования

Управление потоком представления


Возможность повторного использования
Контроль валидности (autoescape, правильная вложенность тегов)
Области видимости данных шаблона
Качество диагностики ошибок
Возможность использования в тексте символов специальных с
точки зрения результата
Быстродействие (всех ли волнует быстродействие?)
Тонкий контроль whitespace

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 9 / 31


Контроль валидности

Автоматическое экранирование выводимых в шаблон данных


должно быть включено по умолчанию
Что бы указать, что данные представляют из себя валидную
верстку надо каким-то образом пометить объект с данными

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 10 / 31


Контроль валидности

При этом надо учитывать, что существует несколько контекстов, в


которых вставляются данные. А именно:
тэг
атрибут

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 11 / 31


Возможность повторного использования

Есть несколько способов повторного применения шаблонов:


макрос (включение, include)
наследование шаблонов

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 12 / 31


Возможность повторного использования

При использовании наследования мы по сути объявляем базовый


шаблон, в котором описываем вызов методов и реализацию методов, а
уже в дочернем шаблоне мы переопределяем реализацию методов
базового шаблона или наоборот реализуем.

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 13 / 31


Возможность повторного использования

Какой же способ лучше?

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 14 / 31


Возможность повторного использования

Совмещение обеих методик - самый гибкий вариант.

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 15 / 31


Область видимости данных шаблона

Все данные попадающие в шаблон - глобальные.

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 16 / 31


Область видимости данных шаблона

Бывает удобно объявить переменную прямо в шаблоне. Если это


логика представления. Если используется одна "вьюха"с разными
шаблонами и одни и те же данные надо представлять по разному.

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 17 / 31


Область видимости данных шаблона

Давайте признаем, что термин "блок"( {% block content %} ) не


пригоден! Что это?
блок кода
макрос

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 18 / 31


Область видимости данных шаблона

{% block content %}
{% set a = ’value’ %}
{% block inner_block %}
{{ a }}
{% endblock %}
{% endblock %}

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 19 / 31


Область видимости данных шаблона

Правильнее было бы называть - "метод"шаблона. И вызывать метод


"как следует": {% self.content() %}

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 20 / 31


Область видимости данных шаблона

Появляется определенность в терминологии


Становится понятна ситуация с областью видимости

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 21 / 31


Область видимости данных шаблона

{% def inner_block(a) %}
{{ a }}
{% enddef %}

{% def content() %}
{% set a = ’value’ %}
{{ self.inner_block(a) }}
{% enddef %}

{{ self.content() }}

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 22 / 31


Область видимости данных шаблона

Вспомагательные (контекстные) переменные в шаблоне - не самый


лучший выбор.

<ul>
{% for item in items %}
<li {% if loop.first %}class="first"{% endif %}>
{{ item.title }}
</li>
{% endfor %}
</ul>

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 23 / 31


Область видимости данных шаблона

<ul>
{% for part in parts %}
<li {% if loop.first %}class="first"{% endif %}>
{% for item in part %}
{{ loop ??? }}
{% endfor %}
</li>
{% endfor %}
</ul>

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 24 / 31


Область видимости данных шаблона

Решение очень простое. (Tempita, Ян Бикинг)

<ul>
{% for l1, part in looper(parts) %}
<li {% if l1.first %}class="first"{% endif %}>
{% for l2, item in looper(part) %}
{{ l1.index }}
{{ l2.index }}
{% endfor %}
</li>
{% endfor %}
</ul>

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 25 / 31


Качество диагностики ошибок

При возникновении исключений в шаблоне, строка шаблона с


вызовом повлекшим исключение должна отображаться в стеке
вызовов
Шаблонизатор не должен маскировать исключения

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 26 / 31


Делаем свой шаблонизатор

Зачем? Развитие шаблонизаторов остановилось. Почти все


популярные представители имеют одинаковый синтаксис и подход.
При этом никто не хочет учитывать уже накопившийся опыт и
эволюционировать.

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 27 / 31


Делаем свой шаблонизатор

Для этого нам понадобятся


лексер (токенайзер)
парсер

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 28 / 31


Делаем свой шаблонизатор

В информатике лексический анализ — процесс аналитического


разбора входной последовательности символов (например, такой как
исходный код на одном из языков программирования) с целью
получения на выходе последовательности символов, называемых
«токенами» (подобно группировке букв в словах). При этом, группа
символов входной последовательности, идентифицируемая на выходе
процесса как токен, называется лексема, то есть в процессе
лексического анализа производится распознавание и выделение лексем
из входной последовательности символов. wikipedia

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 29 / 31


Делаем свой шаблонизатор

В информатике, синтаксический анализ (парсинг) — это процесс


сопоставления линейной последовательности лексем (слов, токенов)
языка с его формальной грамматикой. Результатом обычно является
дерево разбора (синтаксическое дерево). wikipedia

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 30 / 31


Встречайте mint

http://github.com/riffm/mint/

Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 31 / 31

Вам также может понравиться