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


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


            май 18, 2010
Виды шаблонизаторов



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



Мы к ним уже привыкли. Верстка...
Текстовые шаблонизаторы с синтаксисом основанным на
отступах


Явление довольно новое (свежее). Позволяют более тонко набл...
Список требований, с учетом опыта использования


   Управление потоком представления
   Возможность повторного использова...
Контроль валидности




   Автоматическое экранирование выводимых в шаблон данных
   должно быть включено по умолчанию
   ...
Контроль валидности




При этом надо учитывать, что существует несколько контекстов, в
которых вставляются данные. А имен...
Возможность повторного использования




Есть несколько способов повторного применения шаблонов:
    макрос (включение, in...
Возможность повторного использования




При использовании наследования мы по сути объявляем базовый
шаблон, в котором опи...
Возможность повторного использования




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




   Перевезенцев Т. ()    Современные шаблонизаторы   м...
Возможность повторного использования




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




   Перевезенцев Т. ()   Совр...
Область видимости данных шаблона




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




   Перевезенцев Т. ()   Современные ...
Область видимости данных шаблона




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




Давайте признаем, что термин "блок"( {% block content %} ) не
пригоден! Что это?
    ...
Область видимости данных шаблона




{% block content %}
    {% set a = ’value’ %}
    {% block inner_block %}
        {{ ...
Область видимости данных шаблона




Правильнее было бы называть - "метод"шаблона. И вызывать метод
"как следует": {% self...
Область видимости данных шаблона




   Появляется определенность в терминологии
   Становится понятна ситуация с областью...
Область видимости данных шаблона



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

{% def content() %}
    {% set a = ...
Область видимости данных шаблона


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

<ul>
{% fo...
Область видимости данных шаблона



<ul>
{% for part in parts %}
     <li {% if loop.first %}class="first"{% endif %}>
   ...
Область видимости данных шаблона

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

<ul>
{% for l1, part in looper(parts) %}
  ...
Качество диагностики ошибок




   При возникновении исключений в шаблоне, строка шаблона с
   вызовом повлекшим исключени...
Делаем свой шаблонизатор




Зачем? Развитие шаблонизаторов остановилось. Почти все
популярные представители имеют одинако...
Делаем свой шаблонизатор




Для этого нам понадобятся
    лексер (токенайзер)
    парсер




   Перевезенцев Т. ()     Со...
Делаем свой шаблонизатор



В информатике лексический анализ процесс аналитического
разбора входной последовательности сим...
Делаем свой шаблонизатор




В информатике, синтаксический анализ (парсинг) это процесс
сопоставления линейной последовате...
Встречайте mint




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




   Перевезенцев Т. ()   Современные шаблонизаторы   май 18, 2010   28...
Тимофей Перевезенцев. Кухня современных python шаблонизаторов
Upcoming SlideShare
Loading in …5
×

Тимофей Перевезенцев. Кухня современных python шаблонизаторов

1,349 views
1,301 views

Published on

Доклад на DevConf 2010

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,349
On SlideShare
0
From Embeds
0
Number of Embeds
41
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Тимофей Перевезенцев. Кухня современных python шаблонизаторов

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

×