2. Виды шаблонизаторов
Текстовые, использующие собственный синтаксис шаблонов
текстовые, которые работают с любым текстом и не имеют
понятия о семантике (jinja2, django, mako, chetah и др.)
с синтаксисом основанным на отступах (haml-подобные, daml,
ghrml )
Использующие обычные python объекты и собственный API (Stan,
werkzeug и др.)
DOM ориентированные (шаблон - (x)html документ, данные
заносятся с помощью DOM-подобных API из кода)
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 2 / 28
3. Текстовые шаблонизаторы, которые работают с любым
текстом и не имеют понятия о семантике
Мы к ним уже привыкли. Верстка пишется как есть, с вкраплениями
специального синтаксиса шаблона.
мы можем верстать с ошибками (экранирование)
мы можем получать невалидную верстку
при внесении изменений в уже готовую верстку нужно быть очень
внимательным
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 3 / 28
4. Текстовые шаблонизаторы с синтаксисом основанным на
отступах
Явление довольно новое (свежее). Позволяют более тонко наблюдать
и контролировать структуру документа. Т.к. они владеют семантикой,
могут быть более умными.
получается еще один язык разметки, который преобразуется в
xml, а не текст
на практике шаблоны могут быть совершенно непонятными
я не встречал шаблонизатор, который бы пользовался знанием
семантики (это грустно)
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 4 / 28
6. Список требований, с учетом опыта использования
Управление потоком представления
Возможность повторного использования
Контроль валидности (autoescape, правильная вложенность тегов)
Области видимости данных шаблона
Качество диагностики ошибок
Возможность использования в тексте символов специальных с
точки зрения результата
Быстродействие (всех ли волнует быстродействие?)
Тонкий контроль whitespace
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 6 / 28
7. Контроль валидности
Автоматическое экранирование выводимых в шаблон данных
должно быть включено по умолчанию
Что бы указать, что данные представляют из себя валидную
верстку надо каким-то образом пометить объект с данными
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 7 / 28
8. Контроль валидности
При этом надо учитывать, что существует несколько контекстов, в
которых вставляются данные. А именно:
тэг
атрибут
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 8 / 28
9. Возможность повторного использования
Есть несколько способов повторного применения шаблонов:
макрос (включение, include)
наследование шаблонов
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 9 / 28
10. Возможность повторного использования
При использовании наследования мы по сути объявляем базовый
шаблон, в котором описываем вызов методов и реализацию методов, а
уже в дочернем шаблоне мы переопределяем реализацию методов
базового шаблона или наоборот реализуем.
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 10 / 28
13. Область видимости данных шаблона
Все данные попадающие в шаблон - глобальные.
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 13 / 28
14. Область видимости данных шаблона
Бывает удобно объявить переменную прямо в шаблоне. Если это
логика представления. Если используется одна "вьюха"с разными
шаблонами и одни и те же данные надо представлять по разному.
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 14 / 28
15. Область видимости данных шаблона
Давайте признаем, что термин "блок"( {% block content %} ) не
пригоден! Что это?
блок кода
макрос
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 15 / 28
16. Область видимости данных шаблона
{% block content %}
{% set a = ’value’ %}
{% block inner_block %}
{{ a }}
{% endblock %}
{% endblock %}
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 16 / 28
17. Область видимости данных шаблона
Правильнее было бы называть - "метод"шаблона. И вызывать метод
"как следует": {% self.content() %}
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 17 / 28
18. Область видимости данных шаблона
Появляется определенность в терминологии
Становится понятна ситуация с областью видимости
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 18 / 28
19. Область видимости данных шаблона
{% def inner_block(a) %}
{{ a }}
{% enddef %}
{% def content() %}
{% set a = ’value’ %}
{{ self.inner_block(a) }}
{% enddef %}
{{ self.content() }}
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 19 / 28
20. Область видимости данных шаблона
Вспомагательные (контекстные) переменные в шаблоне - не самый
лучший выбор.
<ul>
{% for item in items %}
<li {% if loop.first %}class="first"{% endif %}>
{{ item.title }}
</li>
{% endfor %}
</ul>
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 20 / 28
21. Область видимости данных шаблона
<ul>
{% for part in parts %}
<li {% if loop.first %}class="first"{% endif %}>
{% for item in part %}
{{ loop ??? }}
{% endfor %}
</li>
{% endfor %}
</ul>
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 21 / 28
22. Область видимости данных шаблона
Решение очень простое. (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 22 / 28
23. Качество диагностики ошибок
При возникновении исключений в шаблоне, строка шаблона с
вызовом повлекшим исключение должна отображаться в стеке
вызовов
Шаблонизатор не должен маскировать исключения
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 23 / 28
24. Делаем свой шаблонизатор
Зачем? Развитие шаблонизаторов остановилось. Почти все
популярные представители имеют одинаковый синтаксис и подход.
При этом никто не хочет учитывать уже накопившийся опыт и
эволюционировать.
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 24 / 28
25. Делаем свой шаблонизатор
Для этого нам понадобятся
лексер (токенайзер)
парсер
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 25 / 28
26. Делаем свой шаблонизатор
В информатике лексический анализ процесс аналитического
разбора входной последовательности символов (например, такой как
исходный код на одном из языков программирования) с целью
получения на выходе последовательности символов, называемых
токенами (подобно группировке букв в словах). При этом, группа
символов входной последовательности, идентифицируемая на выходе
процесса как токен, называется лексема, то есть в процессе
лексического анализа производится распознавание и выделение лексем
из входной последовательности символов. wikipedia
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 26 / 28
27. Делаем свой шаблонизатор
В информатике, синтаксический анализ (парсинг) это процесс
сопоставления линейной последовательности лексем (слов, токенов)
языка с его формальной грамматикой. Результатом обычно является
дерево разбора (синтаксическое дерево). wikipedia
Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 27 / 28