SlideShare une entreprise Scribd logo
1  sur  28
Télécharger pour lire hors ligne
Современные шаблонизаторы
Какие они бывают и почему этого мало.


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


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



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




   Перевезенцев Т. ()      Современные шаблонизаторы      май 18, 2010   2 / 28
Текстовые шаблонизаторы, которые работают с любым
текстом и не имеют понятия о семантике



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




   Перевезенцев Т. ()   Современные шаблонизаторы   май 18, 2010   3 / 28
Текстовые шаблонизаторы с синтаксисом основанным на
отступах


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




   Перевезенцев Т. ()   Современные шаблонизаторы    май 18, 2010   4 / 28
Тимофей Перевезенцев. Кухня современных python шаблонизаторов
Список требований, с учетом опыта использования


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




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




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




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




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




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




Есть несколько способов повторного применения шаблонов:
    макрос (включение, include)
    наследование шаблонов




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




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




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




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




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




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




   Перевезенцев Т. ()   Современные шаблонизаторы   май 18, 2010   12 / 28
Область видимости данных шаблона




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




   Перевезенцев Т. ()   Современные шаблонизаторы   май 18, 2010   13 / 28
Область видимости данных шаблона




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




   Перевезенцев Т. ()   Современные шаблонизаторы   май 18, 2010   14 / 28
Область видимости данных шаблона




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




   Перевезенцев Т. ()   Современные шаблонизаторы   май 18, 2010   15 / 28
Область видимости данных шаблона




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




   Перевезенцев Т. ()   Современные шаблонизаторы   май 18, 2010   16 / 28
Область видимости данных шаблона




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




   Перевезенцев Т. ()   Современные шаблонизаторы   май 18, 2010   17 / 28
Область видимости данных шаблона




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




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



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

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

{{ self.content() }}




   Перевезенцев Т. ()   Современные шаблонизаторы   май 18, 2010   19 / 28
Область видимости данных шаблона


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

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




   Перевезенцев Т. ()   Современные шаблонизаторы   май 18, 2010   20 / 28
Область видимости данных шаблона



<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
Область видимости данных шаблона

Решение очень простое. (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
Качество диагностики ошибок




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




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




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




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




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




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



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




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




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




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




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




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

Contenu connexe

En vedette (13)

Profesion
ProfesionProfesion
Profesion
 
Admon org
Admon orgAdmon org
Admon org
 
Professional Highlights
Professional HighlightsProfessional Highlights
Professional Highlights
 
Resume Kathy Gause 2010
Resume Kathy Gause 2010Resume Kathy Gause 2010
Resume Kathy Gause 2010
 
Furniture Rental & Sales
Furniture Rental & SalesFurniture Rental & Sales
Furniture Rental & Sales
 
Trade Show Presentation J
Trade Show Presentation JTrade Show Presentation J
Trade Show Presentation J
 
Logeion presentatie iii
Logeion presentatie iiiLogeion presentatie iii
Logeion presentatie iii
 
Profesion
ProfesionProfesion
Profesion
 
Derecho procesal romano
Derecho procesal romanoDerecho procesal romano
Derecho procesal romano
 
Cranial nerves pptslidesearchengine
Cranial nerves pptslidesearchengine Cranial nerves pptslidesearchengine
Cranial nerves pptslidesearchengine
 
Negotiating for project success
Negotiating for project successNegotiating for project success
Negotiating for project success
 
Game script writer Zen: plot, text and characters in casual game
Game script writer Zen: plot, text  and characters in casual gameGame script writer Zen: plot, text  and characters in casual game
Game script writer Zen: plot, text and characters in casual game
 
Building your Center of Excellence
Building your Center of ExcellenceBuilding your Center of Excellence
Building your Center of Excellence
 

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

Fact Extraction (ideograph)
Fact Extraction (ideograph)Fact Extraction (ideograph)
Fact Extraction (ideograph)NLPseminar
 
Ситуационная инженерия методов
Ситуационная инженерия методовСитуационная инженерия методов
Ситуационная инженерия методовAnatoly Levenchuk
 
Прикладная эконометрика. Лекция 2
Прикладная эконометрика. Лекция 2Прикладная эконометрика. Лекция 2
Прикладная эконометрика. Лекция 2Vladimir Tcherniak
 
MT as a Translator's Tool (TFR_11) - in Russian
MT as a Translator's Tool (TFR_11) - in RussianMT as a Translator's Tool (TFR_11) - in Russian
MT as a Translator's Tool (TFR_11) - in Russianoleg_vigodsky
 
автоматическое построение оригинал макетов учебников как отч
автоматическое построение оригинал макетов учебников как отчавтоматическое построение оригинал макетов учебников как отч
автоматическое построение оригинал макетов учебников как отчanna_vereshchagina
 
Ainl 2013 bogatyrev_математическая и лингвистическая
Ainl 2013 bogatyrev_математическая и лингвистическаяAinl 2013 bogatyrev_математическая и лингвистическая
Ainl 2013 bogatyrev_математическая и лингвистическаяAINL Conferences
 
4я лекция - Прототипирование.
4я лекция - Прототипирование.4я лекция - Прототипирование.
4я лекция - Прототипирование.allileja
 
Теория и практика обработки естественного языка
Теория и практика обработки естественного языкаТеория и практика обработки естественного языка
Теория и практика обработки естественного языкаNikolay Karpov
 
Алгоритмы аннотирования, влияние на сниппеты (IBC 14)
Алгоритмы аннотирования, влияние на сниппеты (IBC 14)Алгоритмы аннотирования, влияние на сниппеты (IBC 14)
Алгоритмы аннотирования, влияние на сниппеты (IBC 14)Стас Поломарь
 
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...7bits
 
Открытые форматы и открытое ПО: достоинства и проблемы
Открытые форматы и открытое ПО: достоинства и проблемыОткрытые форматы и открытое ПО: достоинства и проблемы
Открытые форматы и открытое ПО: достоинства и проблемыNatasha Khramtsovsky
 
Применение статического анализа при разработке программ
Применение статического анализа при разработке программПрименение статического анализа при разработке программ
Применение статического анализа при разработке программTatyanazaxarova
 
Ai lab
Ai labAi lab
Ai labaaa
 
C++ осень 2013 лекция 6
C++ осень 2013 лекция 6C++ осень 2013 лекция 6
C++ осень 2013 лекция 6Technopark
 

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

Fact Extraction (ideograph)
Fact Extraction (ideograph)Fact Extraction (ideograph)
Fact Extraction (ideograph)
 
Ситуационная инженерия методов
Ситуационная инженерия методовСитуационная инженерия методов
Ситуационная инженерия методов
 
Прикладная эконометрика. Лекция 2
Прикладная эконометрика. Лекция 2Прикладная эконометрика. Лекция 2
Прикладная эконометрика. Лекция 2
 
MT as a Translator's Tool (TFR_11) - in Russian
MT as a Translator's Tool (TFR_11) - in RussianMT as a Translator's Tool (TFR_11) - in Russian
MT as a Translator's Tool (TFR_11) - in Russian
 
Авиком
АвикомАвиком
Авиком
 
автоматическое построение оригинал макетов учебников как отч
автоматическое построение оригинал макетов учебников как отчавтоматическое построение оригинал макетов учебников как отч
автоматическое построение оригинал макетов учебников как отч
 
Ainl 2013 bogatyrev_математическая и лингвистическая
Ainl 2013 bogatyrev_математическая и лингвистическаяAinl 2013 bogatyrev_математическая и лингвистическая
Ainl 2013 bogatyrev_математическая и лингвистическая
 
4я лекция - Прототипирование.
4я лекция - Прототипирование.4я лекция - Прототипирование.
4я лекция - Прототипирование.
 
Теория и практика обработки естественного языка
Теория и практика обработки естественного языкаТеория и практика обработки естественного языка
Теория и практика обработки естественного языка
 
Шаблонизация
ШаблонизацияШаблонизация
Шаблонизация
 
Алгоритмы аннотирования, влияние на сниппеты (IBC 14)
Алгоритмы аннотирования, влияние на сниппеты (IBC 14)Алгоритмы аннотирования, влияние на сниппеты (IBC 14)
Алгоритмы аннотирования, влияние на сниппеты (IBC 14)
 
Lect1
Lect1Lect1
Lect1
 
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...
 
Открытые форматы и открытое ПО: достоинства и проблемы
Открытые форматы и открытое ПО: достоинства и проблемыОткрытые форматы и открытое ПО: достоинства и проблемы
Открытые форматы и открытое ПО: достоинства и проблемы
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Применение статического анализа при разработке программ
Применение статического анализа при разработке программПрименение статического анализа при разработке программ
Применение статического анализа при разработке программ
 
Ai lab
Ai labAi lab
Ai lab
 
C++ осень 2013 лекция 6
C++ осень 2013 лекция 6C++ осень 2013 лекция 6
C++ осень 2013 лекция 6
 
Tomita
TomitaTomita
Tomita
 

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

  • 1. Современные шаблонизаторы Какие они бывают и почему этого мало. Перевезенцев Тимофей май 18, 2010
  • 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
  • 11. Возможность повторного использования Какой же способ лучше? Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 11 / 28
  • 12. Возможность повторного использования Совмещение обеих методик - самый гибкий вариант. Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 12 / 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
  • 28. Встречайте mint http://github.com/riffm/mint/ Перевезенцев Т. () Современные шаблонизаторы май 18, 2010 28 / 28