SlideShare una empresa de Scribd logo
1 de 72
Descargar para leer sin conexión
Template Toolkit – зло?!


     Анатолий Шарифулин
Специально
для РИТ++ 2010
     вышел
   Perl 5.12!
Каждый год
на «May Perl»
Я рассказываю
  про «зло» :)
CGI
  «CGI.pm – зло?!», May Perl 2008
LWP
«Модули Net::*, использующие LWP::UserAgent – зло?!», May Perl 2009
POE
 Такого блица не было, но это так :)
PHP
ой :)
TT
 «Template Toolkit – зло?!», May Perl 2010
– зло?!
– зло?!
Есть два типа
  шаблонизаторов:
простые и удобные :)
Есть два типа
шаблонизаторов:
   простые
Есть два типа
  шаблонизаторов:
простые и удобные :)
Удобные: позволяют
 писать быстро, но
 заставляют писать
   не оптимально
И из-за этого сложно
тестировать логику –
   всё в шаблонах
Да-да, но...
Template Toolkit
• Cамый популярный шаблонизатор для Perl
• Простой, гибкий и многофункциональный
• Большое количество плагинов (Filter, Dumper, CGI и даже DBI)
• Верстальщик-френдли синтаксис и возможность use Perl :)
• Хорошая и полная документация
• Портирован на Python – Template-Python
Template Toolkit
• Cамый популярный шаблонизатор для Perl
• Простой, гибкий и многофункциональный
• Большое количество плагинов (Filter, Dumper, CGI и даже DBI)
• Верстальщик-френдли синтаксис и возможность use Perl :)
• Хорошая и полная документация
• Портирован на Python – Template-Python
Template Toolkit
• Cамый популярный шаблонизатор для Perl
• Простой, гибкий и многофункциональный
• Большое количество плагинов (Filter, Dumper, CGI и даже DBI)
• Верстальщик-френдли синтаксис и возможность use Perl :)
• Хорошая и полная документация
• Портирован на Python – Template-Python
Template Toolkit
• Cамый популярный шаблонизатор для Perl
• Простой, гибкий и многофункциональный
• Большое количество плагинов (Filter, Dumper, CGI и даже DBI)
• Верстальщик-френдли синтаксис и возможность use Perl :)
• Хорошая и полная документация
• Портирован на Python – Template-Python
Template Toolkit
• Cамый популярный шаблонизатор для Perl
• Простой, гибкий и многофункциональный
• Большое количество плагинов (Filter, Dumper, CGI и даже DBI)
• Верстальщик-френдли синтаксис и возможность use Perl :)
• Хорошая и полная документация
• Портирован на Python – Template-Python
Template Toolkit
• Cамый популярный шаблонизатор для Perl
• Простой, гибкий и многофункциональный
• Большое количество плагинов (Filter, Dumper, CGI и даже DBI)
• Верстальщик-френдли синтаксис и возможность use Perl :)
• Хорошая и полная документация
• Портирован на Python – Template-Python
[% PROCESS '_design/header.tt' %]

<ul>
[% FOREACH item = list %]

 <li>[% item.title %]</li>
[% END %]
</ul>

[% PROCESS '_design/footer.tt' %]
Недостатки TT
• Очень медленный (на сайте написано «The TT is a fast» :)
Недостатки TT
• Очень медленный (на сайте написано «The TT is a fast» :)
• Тормозят фильтры
Недостатки TT
• Очень медленный (на сайте написано «The TT is a fast» :)
• Тормозят фильтры
• Макро-язык TT– зло, еще и капс :)
Недостатки TT
• Очень медленный (на сайте написано «The TT is a fast» :)
• Тормозят фильтры
• Макро-язык TT– зло, еще и капс :)
• ОО синтаксис вызова методов – not like Perl
Недостатки TT
• Очень медленный (на сайте написано «The TT is a fast» :)
• Тормозят фильтры
• Макро-язык TT– зло, еще и капс :)
• ОО синтаксис вызова методов – not like Perl
• Нет разницы между вызовом метода и ключом хеша
Недостатки TT
• Очень медленный (на сайте написано «The TT is a fast» :)
• Тормозят фильтры
• Макро-язык TT– зло, еще и капс :)
• ОО синтаксис вызова методов – not like Perl
• Нет разницы между вызовом метода и ключом хеша
• Сортировка – это пипец, нет map и grep – ааааа
Недостатки TT
• Нет разницы между строкой и массивом, проверять .size >0
Недостатки TT
• Нет разницы между строкой и массивом, проверять .size >0
• Нет возможности создавать анонимные структуры, нужно
  всё именовать
Недостатки TT
• Нет разницы между строкой и массивом, проверять .size >0
• Нет возможности создавать анонимные структуры, нужно
  всё именовать

• В циклах нет переменной по умолчанию (верните $_)
Недостатки TT
• Нет разницы между строкой и массивом, проверять .size >0
• Нет возможности создавать анонимные структуры, нужно
  всё именовать

• В циклах нет переменной по умолчанию (верните $_)
• Можно использовать $var, $var vs. jQuery – аааааа
Недостатки TT
• Нет разницы между строкой и массивом, проверять .size >0
• Нет возможности создавать анонимные структуры, нужно
  всё именовать

• В циклах нет переменной по умолчанию (верните $_)
• Можно использовать $var, $var vs. jQuery – аааааа
• Странное TTL кеширование шаблонов (почему 1 секунда?)
Template::Toolkit::Simple
    A Simple Interface to Template Toolkit
Многие вещи не
делаются, т.к. иногда лень
или долго писать сложный
        синтаксис
Мы привыкли
к удобному и красивому
        Perl :)
Существует ли идеальный
    шаблонизатор?
HTML::ChainParser
       Автор Павел Кудинов
 Чисто ростовский непередаваемый юмор :)
~~>[

 <ul>

 
 ~~>list~@@~[

 
 
 <li>~~>title~</li>

 
 ]~

 </ul>
]~[

 <design>

 
 ~~>

 </design>
]~
Mojo::Template EpRenderer
      Mojolicious. Веб в коробке!
% layout 'design';

<ul>
% for (@$list) {

 <li><%= $_->{title} %></li>
%}
</ul>
Сравнение
Template::Toolkit
     Сравнение
[% PROCESS '_design/header.tt' %]

<ul>
[% FOREACH item = list.nsort('id') %]

 <li>[% item.title %]</li>
[% END %]
</ul>

[% PROCESS '_design/footer.tt' %]
[% PROCESS '_design/header.tt' %]

<ul>
[% FOREACH item = list.mnsort('hash.id') %]

 <li>[% item.title %]</li>
[% END %]
</ul>

[% PROCESS '_design/footer.tt' %]
$Template::Stash::LIST_OPS->{'mnsort'} = sub { ... };
    Нужно дописывать функции для сортировок
                    like PHP
[% PROCESS '_design/header.tt' %]

<ul>
[% FOREACH item = list %]

 <li>[% item.title %] [% my_round(item.count) %]</li>
[% END %]
</ul>

[% PROCESS '_design/footer.tt' %]
[% MACRO my_round(count) PERL %]

 print sprintf "%.0f", $stash->get('count');
[% END %]

<ul>
[% FOREACH item = list %]

 <li>[% item.title %] [% my_round(item.count) %]</li>
[% END %]
</ul>
[% USE Util %]

<ul>
[% FOREACH item = list %]

 <li>[% item.title %] [% Util.my_round(item.count) %]</li>
[% END %]
</ul>
Иногда получается очень
  жесткий код на TT :)
[% FOREACH l=region.locations %]
  [% NEXT IF region.metro.location_id==l.location_id %]
  [% NEXT IF l.room_type == 'prison' %]
  [% NEXT UNLESS map.show_on_this_dusk_level( l.location_id,person) %]
   [% IF cut_name.${l.name} %][% cname = cut_name.${l.name} %]
   [% ELSE %][% cname = l.name %]
   [% END %]
  [% IF region.center.location_id == l.location_id %][% macro.0 = {...} %]
  [% ELSE %]
  [% macro.$i = {name=>l.name, id=>l.location_id}; i = i+1 %]
  [% END %]
[% END %]
[% IF region.metro && region.metro.size > 0 &&
location.location_id==region.center.location_id && person.dusk_level == 0 %]
  [% IF cut_name.${region.metro.name} %][% cname = cut_name.${region.metro.name} %]
HTML::ChainParser
     Сравнение
~~>[

 <ul>

 
 ~~>list~@sort~<D>(id)~@@~[

 
 
 <li>~~>title~</li>

 
 ]~

 </ul>
]~[

 <design>

 
 ~~>

 </design>
]~
~~>[

 <ul>

 
 ~~>list~@sort~<D>(hash~id)~@@~[

 
 
 <li>~~>title~</li>

 
 ]~

 </ul>
]~[

 <design>

 
 ~~>

 </design>
]~
~~>[

 <ul>

 
 ~~>list~@@~[

 
 
 <li>~~>title~ ~~>count~&~(PMath~Round)~</li>

 
 ]~

 </ul>
]~[

 <design>

 
 ~~>

 </design>
]~
push @ExParser,'Round';

sub MyRound {

 sprintf("%.0f", ${RSPR $_[0]});
};
Иногда получается очень
    жесткий код :)
~~>#~[:/.design/.lang.iphone]~[
~~>&~(Public~Video~Main)~main.new~video~[
~~>%~(

 ~title~
 
 
 ~(content~$~(::~LANG)~title~&~(PT~Escape))~

 ~content~
 
 ~#[info]~

 ~back~
 
 
 ~(%~(

 
 ~title~
 
 
 ~(..~menu~back)~

 
 ~url~

 
 ~[javascript: history.back();]~

 ))~

 ~menu~

 
 ~(..~(::~COOKIE~menu~#~[../.menu]))~
)~#~[../.main]~
]~
]~
Mojo::Template EpRenderer
         Сравнение
% layout 'design';

<ul>
% for (sort { $a->{id} <=> $b->{id} } @$list) {

 <li><%= $_->{title} %></li>
%}
</ul>
% layout 'design';

<ul>
% for (@$list) {

 <li>
      <%= $_->{title} %>
      <%= sprintf "%.0f", $_->{count} %>
    </li>
%}
</ul>
Жесткость кода зависит
   от упоротости
   разработчика :)
Мои шаблоны на
  Mojolicious очень
простые и красивые! :)
Template Toolkit
Template Toolkit – зло!
Template Toolkit – зло!?
use Perl
  or die;
JFDI
Спасибо за внимание!
     Анатолий Шарифулин
    http://twitter.com/sharifulin

Más contenido relacionado

Similar a Template Toolkit – зло!?

Cоздание приложений со знанием Perl
Cоздание приложений со знанием PerlCоздание приложений со знанием Perl
Cоздание приложений со знанием PerlAnatoly Sharifulin
 
Архитектура Apache HAWQ Highload++ 2015
Архитектура Apache HAWQ Highload++ 2015Архитектура Apache HAWQ Highload++ 2015
Архитектура Apache HAWQ Highload++ 2015Alexey Grishchenko
 
Django шахрай. версия 4
Django шахрай. версия 4Django шахрай. версия 4
Django шахрай. версия 4smikler
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Mail.ru Group
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)Alexander Gornik
 
SPA инструменты
SPA инструментыSPA инструменты
SPA инструментыRoman Dvornov
 
Алексей Бережной — «HTTP-протокл»
Алексей Бережной — «HTTP-протокл»Алексей Бережной — «HTTP-протокл»
Алексей Бережной — «HTTP-протокл»Yandex
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demomegakott
 
RESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentationRESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentationMikhail Shcherbakov
 
Архитектура HAWQ / Алексей Грищенко (Pivotal)
Архитектура HAWQ / Алексей Грищенко (Pivotal)Архитектура HAWQ / Алексей Грищенко (Pivotal)
Архитектура HAWQ / Алексей Грищенко (Pivotal)Ontico
 
Building corporate portals with liferay JEEConf 2011
Building corporate portals with liferay   JEEConf 2011Building corporate portals with liferay   JEEConf 2011
Building corporate portals with liferay JEEConf 2011Alexey Kakunin
 
Алексей Бережной - http-протокол
Алексей Бережной - http-протоколАлексей Бережной - http-протокол
Алексей Бережной - http-протоколYandex
 
PHP 5.4 - особенности перехода
PHP 5.4 - особенности переходаPHP 5.4 - особенности перехода
PHP 5.4 - особенности переходаRoman Pronskiy
 
Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference
Выступление Андрея Сумина, Mail.Ru Group, на High Performance ConferenceВыступление Андрея Сумина, Mail.Ru Group, на High Performance Conference
Выступление Андрея Сумина, Mail.Ru Group, на High Performance ConferenceEYevseyeva
 
основы нтмл
основы нтмлосновы нтмл
основы нтмлolgaoov
 
Join the python_side
Join the python_sideJoin the python_side
Join the python_sidePaul Dmitryev
 
Информационная безопасность в веб - основы
Информационная безопасность в веб - основыИнформационная безопасность в веб - основы
Информационная безопасность в веб - основыAlex Chistyakov
 

Similar a Template Toolkit – зло!? (20)

About Python
About PythonAbout Python
About Python
 
Django
DjangoDjango
Django
 
Cоздание приложений со знанием Perl
Cоздание приложений со знанием PerlCоздание приложений со знанием Perl
Cоздание приложений со знанием Perl
 
Архитектура Apache HAWQ Highload++ 2015
Архитектура Apache HAWQ Highload++ 2015Архитектура Apache HAWQ Highload++ 2015
Архитектура Apache HAWQ Highload++ 2015
 
Django шахрай. версия 4
Django шахрай. версия 4Django шахрай. версия 4
Django шахрай. версия 4
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
SPA инструменты
SPA инструментыSPA инструменты
SPA инструменты
 
Алексей Бережной — «HTTP-протокл»
Алексей Бережной — «HTTP-протокл»Алексей Бережной — «HTTP-протокл»
Алексей Бережной — «HTTP-протокл»
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
 
RESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentationRESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentation
 
Архитектура HAWQ / Алексей Грищенко (Pivotal)
Архитектура HAWQ / Алексей Грищенко (Pivotal)Архитектура HAWQ / Алексей Грищенко (Pivotal)
Архитектура HAWQ / Алексей Грищенко (Pivotal)
 
Building corporate portals with liferay JEEConf 2011
Building corporate portals with liferay   JEEConf 2011Building corporate portals with liferay   JEEConf 2011
Building corporate portals with liferay JEEConf 2011
 
Алексей Бережной - http-протокол
Алексей Бережной - http-протоколАлексей Бережной - http-протокол
Алексей Бережной - http-протокол
 
Visual studio toolbox
Visual studio toolboxVisual studio toolbox
Visual studio toolbox
 
PHP 5.4 - особенности перехода
PHP 5.4 - особенности переходаPHP 5.4 - особенности перехода
PHP 5.4 - особенности перехода
 
Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference
Выступление Андрея Сумина, Mail.Ru Group, на High Performance ConferenceВыступление Андрея Сумина, Mail.Ru Group, на High Performance Conference
Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference
 
основы нтмл
основы нтмлосновы нтмл
основы нтмл
 
Join the python_side
Join the python_sideJoin the python_side
Join the python_side
 
Информационная безопасность в веб - основы
Информационная безопасность в веб - основыИнформационная безопасность в веб - основы
Информационная безопасность в веб - основы
 

Más de Anatoly Sharifulin

Ещё один способ привлекать и удерживать пользователей в играх
Ещё один способ привлекать и удерживать пользователей в играхЕщё один способ привлекать и удерживать пользователей в играх
Ещё один способ привлекать и удерживать пользователей в играхAnatoly Sharifulin
 
ASO Аудит для приложений и игр
ASO Аудит для приложений и игрASO Аудит для приложений и игр
ASO Аудит для приложений и игрAnatoly Sharifulin
 
ASO для iOS 11 (продвижение In-App Prurchases)
ASO для iOS 11 (продвижение In-App Prurchases)ASO для iOS 11 (продвижение In-App Prurchases)
ASO для iOS 11 (продвижение In-App Prurchases)Anatoly Sharifulin
 
AppFollow митап в Москве
AppFollow митап в МосквеAppFollow митап в Москве
AppFollow митап в МосквеAnatoly Sharifulin
 
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...Anatoly Sharifulin
 
Аналитика приложений конкурентов в Google Play
Аналитика приложений конкурентов в Google PlayАналитика приложений конкурентов в Google Play
Аналитика приложений конкурентов в Google PlayAnatoly Sharifulin
 
Конкурентный анализ мобильных приложений
Конкурентный анализ мобильных приложенийКонкурентный анализ мобильных приложений
Конкурентный анализ мобильных приложенийAnatoly Sharifulin
 
Аналитика приложений конкурентов
Аналитика приложений конкурентовАналитика приложений конкурентов
Аналитика приложений конкурентовAnatoly Sharifulin
 
Аналитика магазинов приложений
Аналитика магазинов приложенийАналитика магазинов приложений
Аналитика магазинов приложенийAnatoly Sharifulin
 
Аналитика мобильных приложений
Аналитика мобильных приложенийАналитика мобильных приложений
Аналитика мобильных приложенийAnatoly Sharifulin
 
Анализ приложений конкурентов
Анализ приложений конкурентовАнализ приложений конкурентов
Анализ приложений конкурентовAnatoly Sharifulin
 
ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»
ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»
ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»Anatoly Sharifulin
 
Продвижение мобильных приложений: с чего начать?
Продвижение мобильных приложений: с чего начать?Продвижение мобильных приложений: с чего начать?
Продвижение мобильных приложений: с чего начать?Anatoly Sharifulin
 
Основной продукт vs. мобильный на примере Ostrovok.ru
Основной продукт vs. мобильный на примере Ostrovok.ruОсновной продукт vs. мобильный на примере Ostrovok.ru
Основной продукт vs. мобильный на примере Ostrovok.ruAnatoly Sharifulin
 
ASO оптимизация и продвижение мобильных приложений
ASO  оптимизация и продвижение мобильных приложенийASO  оптимизация и продвижение мобильных приложений
ASO оптимизация и продвижение мобильных приложенийAnatoly Sharifulin
 

Más de Anatoly Sharifulin (20)

Ещё один способ привлекать и удерживать пользователей в играх
Ещё один способ привлекать и удерживать пользователей в играхЕщё один способ привлекать и удерживать пользователей в играх
Ещё один способ привлекать и удерживать пользователей в играх
 
ASO Аудит для приложений и игр
ASO Аудит для приложений и игрASO Аудит для приложений и игр
ASO Аудит для приложений и игр
 
ASO для iOS 11 (продвижение In-App Prurchases)
ASO для iOS 11 (продвижение In-App Prurchases)ASO для iOS 11 (продвижение In-App Prurchases)
ASO для iOS 11 (продвижение In-App Prurchases)
 
ASO для iOS 11
ASO для iOS 11ASO для iOS 11
ASO для iOS 11
 
AppFollow митап в Москве
AppFollow митап в МосквеAppFollow митап в Москве
AppFollow митап в Москве
 
ASO Best Practices 2016
ASO Best Practices 2016ASO Best Practices 2016
ASO Best Practices 2016
 
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...
 
Аналитика приложений конкурентов в Google Play
Аналитика приложений конкурентов в Google PlayАналитика приложений конкурентов в Google Play
Аналитика приложений конкурентов в Google Play
 
ASO FAQ
ASO FAQASO FAQ
ASO FAQ
 
ASO: Best Practices 2015
ASO: Best Practices 2015ASO: Best Practices 2015
ASO: Best Practices 2015
 
AppFollow Demo Day ФРИИ
AppFollow Demo Day ФРИИAppFollow Demo Day ФРИИ
AppFollow Demo Day ФРИИ
 
Конкурентный анализ мобильных приложений
Конкурентный анализ мобильных приложенийКонкурентный анализ мобильных приложений
Конкурентный анализ мобильных приложений
 
Аналитика приложений конкурентов
Аналитика приложений конкурентовАналитика приложений конкурентов
Аналитика приложений конкурентов
 
Аналитика магазинов приложений
Аналитика магазинов приложенийАналитика магазинов приложений
Аналитика магазинов приложений
 
Аналитика мобильных приложений
Аналитика мобильных приложенийАналитика мобильных приложений
Аналитика мобильных приложений
 
Анализ приложений конкурентов
Анализ приложений конкурентовАнализ приложений конкурентов
Анализ приложений конкурентов
 
ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»
ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»
ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»
 
Продвижение мобильных приложений: с чего начать?
Продвижение мобильных приложений: с чего начать?Продвижение мобильных приложений: с чего начать?
Продвижение мобильных приложений: с чего начать?
 
Основной продукт vs. мобильный на примере Ostrovok.ru
Основной продукт vs. мобильный на примере Ostrovok.ruОсновной продукт vs. мобильный на примере Ostrovok.ru
Основной продукт vs. мобильный на примере Ostrovok.ru
 
ASO оптимизация и продвижение мобильных приложений
ASO  оптимизация и продвижение мобильных приложенийASO  оптимизация и продвижение мобильных приложений
ASO оптимизация и продвижение мобильных приложений
 

Template Toolkit – зло!?

  • 1. Template Toolkit – зло?! Анатолий Шарифулин
  • 4. Я рассказываю про «зло» :)
  • 5. CGI «CGI.pm – зло?!», May Perl 2008
  • 6. LWP «Модули Net::*, использующие LWP::UserAgent – зло?!», May Perl 2009
  • 7. POE Такого блица не было, но это так :)
  • 8. PHP
  • 10. TT «Template Toolkit – зло?!», May Perl 2010
  • 13. Есть два типа шаблонизаторов: простые и удобные :)
  • 15. Есть два типа шаблонизаторов: простые и удобные :)
  • 16. Удобные: позволяют писать быстро, но заставляют писать не оптимально
  • 17. И из-за этого сложно тестировать логику – всё в шаблонах
  • 19. Template Toolkit • Cамый популярный шаблонизатор для Perl • Простой, гибкий и многофункциональный • Большое количество плагинов (Filter, Dumper, CGI и даже DBI) • Верстальщик-френдли синтаксис и возможность use Perl :) • Хорошая и полная документация • Портирован на Python – Template-Python
  • 20. Template Toolkit • Cамый популярный шаблонизатор для Perl • Простой, гибкий и многофункциональный • Большое количество плагинов (Filter, Dumper, CGI и даже DBI) • Верстальщик-френдли синтаксис и возможность use Perl :) • Хорошая и полная документация • Портирован на Python – Template-Python
  • 21. Template Toolkit • Cамый популярный шаблонизатор для Perl • Простой, гибкий и многофункциональный • Большое количество плагинов (Filter, Dumper, CGI и даже DBI) • Верстальщик-френдли синтаксис и возможность use Perl :) • Хорошая и полная документация • Портирован на Python – Template-Python
  • 22. Template Toolkit • Cамый популярный шаблонизатор для Perl • Простой, гибкий и многофункциональный • Большое количество плагинов (Filter, Dumper, CGI и даже DBI) • Верстальщик-френдли синтаксис и возможность use Perl :) • Хорошая и полная документация • Портирован на Python – Template-Python
  • 23. Template Toolkit • Cамый популярный шаблонизатор для Perl • Простой, гибкий и многофункциональный • Большое количество плагинов (Filter, Dumper, CGI и даже DBI) • Верстальщик-френдли синтаксис и возможность use Perl :) • Хорошая и полная документация • Портирован на Python – Template-Python
  • 24. Template Toolkit • Cамый популярный шаблонизатор для Perl • Простой, гибкий и многофункциональный • Большое количество плагинов (Filter, Dumper, CGI и даже DBI) • Верстальщик-френдли синтаксис и возможность use Perl :) • Хорошая и полная документация • Портирован на Python – Template-Python
  • 25. [% PROCESS '_design/header.tt' %] <ul> [% FOREACH item = list %] <li>[% item.title %]</li> [% END %] </ul> [% PROCESS '_design/footer.tt' %]
  • 26. Недостатки TT • Очень медленный (на сайте написано «The TT is a fast» :)
  • 27. Недостатки TT • Очень медленный (на сайте написано «The TT is a fast» :) • Тормозят фильтры
  • 28. Недостатки TT • Очень медленный (на сайте написано «The TT is a fast» :) • Тормозят фильтры • Макро-язык TT– зло, еще и капс :)
  • 29. Недостатки TT • Очень медленный (на сайте написано «The TT is a fast» :) • Тормозят фильтры • Макро-язык TT– зло, еще и капс :) • ОО синтаксис вызова методов – not like Perl
  • 30. Недостатки TT • Очень медленный (на сайте написано «The TT is a fast» :) • Тормозят фильтры • Макро-язык TT– зло, еще и капс :) • ОО синтаксис вызова методов – not like Perl • Нет разницы между вызовом метода и ключом хеша
  • 31. Недостатки TT • Очень медленный (на сайте написано «The TT is a fast» :) • Тормозят фильтры • Макро-язык TT– зло, еще и капс :) • ОО синтаксис вызова методов – not like Perl • Нет разницы между вызовом метода и ключом хеша • Сортировка – это пипец, нет map и grep – ааааа
  • 32. Недостатки TT • Нет разницы между строкой и массивом, проверять .size >0
  • 33. Недостатки TT • Нет разницы между строкой и массивом, проверять .size >0 • Нет возможности создавать анонимные структуры, нужно всё именовать
  • 34. Недостатки TT • Нет разницы между строкой и массивом, проверять .size >0 • Нет возможности создавать анонимные структуры, нужно всё именовать • В циклах нет переменной по умолчанию (верните $_)
  • 35. Недостатки TT • Нет разницы между строкой и массивом, проверять .size >0 • Нет возможности создавать анонимные структуры, нужно всё именовать • В циклах нет переменной по умолчанию (верните $_) • Можно использовать $var, $var vs. jQuery – аааааа
  • 36. Недостатки TT • Нет разницы между строкой и массивом, проверять .size >0 • Нет возможности создавать анонимные структуры, нужно всё именовать • В циклах нет переменной по умолчанию (верните $_) • Можно использовать $var, $var vs. jQuery – аааааа • Странное TTL кеширование шаблонов (почему 1 секунда?)
  • 37. Template::Toolkit::Simple A Simple Interface to Template Toolkit
  • 38. Многие вещи не делаются, т.к. иногда лень или долго писать сложный синтаксис
  • 39. Мы привыкли к удобному и красивому Perl :)
  • 40. Существует ли идеальный шаблонизатор?
  • 41. HTML::ChainParser Автор Павел Кудинов Чисто ростовский непередаваемый юмор :)
  • 42. ~~>[ <ul> ~~>list~@@~[ <li>~~>title~</li> ]~ </ul> ]~[ <design> ~~> </design> ]~
  • 43. Mojo::Template EpRenderer Mojolicious. Веб в коробке!
  • 44. % layout 'design'; <ul> % for (@$list) { <li><%= $_->{title} %></li> %} </ul>
  • 46. Template::Toolkit Сравнение
  • 47. [% PROCESS '_design/header.tt' %] <ul> [% FOREACH item = list.nsort('id') %] <li>[% item.title %]</li> [% END %] </ul> [% PROCESS '_design/footer.tt' %]
  • 48. [% PROCESS '_design/header.tt' %] <ul> [% FOREACH item = list.mnsort('hash.id') %] <li>[% item.title %]</li> [% END %] </ul> [% PROCESS '_design/footer.tt' %]
  • 49. $Template::Stash::LIST_OPS->{'mnsort'} = sub { ... }; Нужно дописывать функции для сортировок like PHP
  • 50. [% PROCESS '_design/header.tt' %] <ul> [% FOREACH item = list %] <li>[% item.title %] [% my_round(item.count) %]</li> [% END %] </ul> [% PROCESS '_design/footer.tt' %]
  • 51. [% MACRO my_round(count) PERL %] print sprintf "%.0f", $stash->get('count'); [% END %] <ul> [% FOREACH item = list %] <li>[% item.title %] [% my_round(item.count) %]</li> [% END %] </ul>
  • 52. [% USE Util %] <ul> [% FOREACH item = list %] <li>[% item.title %] [% Util.my_round(item.count) %]</li> [% END %] </ul>
  • 53. Иногда получается очень жесткий код на TT :)
  • 54. [% FOREACH l=region.locations %] [% NEXT IF region.metro.location_id==l.location_id %] [% NEXT IF l.room_type == 'prison' %] [% NEXT UNLESS map.show_on_this_dusk_level( l.location_id,person) %] [% IF cut_name.${l.name} %][% cname = cut_name.${l.name} %] [% ELSE %][% cname = l.name %] [% END %] [% IF region.center.location_id == l.location_id %][% macro.0 = {...} %] [% ELSE %] [% macro.$i = {name=>l.name, id=>l.location_id}; i = i+1 %] [% END %] [% END %] [% IF region.metro && region.metro.size > 0 && location.location_id==region.center.location_id && person.dusk_level == 0 %] [% IF cut_name.${region.metro.name} %][% cname = cut_name.${region.metro.name} %]
  • 55. HTML::ChainParser Сравнение
  • 56. ~~>[ <ul> ~~>list~@sort~<D>(id)~@@~[ <li>~~>title~</li> ]~ </ul> ]~[ <design> ~~> </design> ]~
  • 57. ~~>[ <ul> ~~>list~@sort~<D>(hash~id)~@@~[ <li>~~>title~</li> ]~ </ul> ]~[ <design> ~~> </design> ]~
  • 58. ~~>[ <ul> ~~>list~@@~[ <li>~~>title~ ~~>count~&~(PMath~Round)~</li> ]~ </ul> ]~[ <design> ~~> </design> ]~
  • 59. push @ExParser,'Round'; sub MyRound { sprintf("%.0f", ${RSPR $_[0]}); };
  • 61. ~~>#~[:/.design/.lang.iphone]~[ ~~>&~(Public~Video~Main)~main.new~video~[ ~~>%~( ~title~ ~(content~$~(::~LANG)~title~&~(PT~Escape))~ ~content~ ~#[info]~ ~back~ ~(%~( ~title~ ~(..~menu~back)~ ~url~ ~[javascript: history.back();]~ ))~ ~menu~ ~(..~(::~COOKIE~menu~#~[../.menu]))~ )~#~[../.main]~ ]~ ]~
  • 62. Mojo::Template EpRenderer Сравнение
  • 63. % layout 'design'; <ul> % for (sort { $a->{id} <=> $b->{id} } @$list) { <li><%= $_->{title} %></li> %} </ul>
  • 64. % layout 'design'; <ul> % for (@$list) { <li> <%= $_->{title} %> <%= sprintf "%.0f", $_->{count} %> </li> %} </ul>
  • 65. Жесткость кода зависит от упоротости разработчика :)
  • 66. Мои шаблоны на Mojolicious очень простые и красивые! :)
  • 70. use Perl or die;
  • 71. JFDI
  • 72. Спасибо за внимание! Анатолий Шарифулин http://twitter.com/sharifulin

Notas del editor