SlideShare une entreprise Scribd logo
1  sur  72
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

Contenu connexe

Similaire à Template Toolkit – зло!?

Django шахрай. версия 4
Django шахрай. версия 4Django шахрай. версия 4
Django шахрай. версия 4
smikler
 
Алексей Бережной — «HTTP-протокл»
Алексей Бережной — «HTTP-протокл»Алексей Бережной — «HTTP-протокл»
Алексей Бережной — «HTTP-протокл»
Yandex
 
Архитектура 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 2011
Alexey Kakunin
 
PHP 5.4 - особенности перехода
PHP 5.4 - особенности переходаPHP 5.4 - особенности перехода
PHP 5.4 - особенности перехода
Roman Pronskiy
 
Join the python_side
Join the python_sideJoin the python_side
Join the python_side
Paul Dmitryev
 
Информационная безопасность в веб - основы
Информационная безопасность в веб - основыИнформационная безопасность в веб - основы
Информационная безопасность в веб - основы
Alex Chistyakov
 

Similaire à 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
 
Информационная безопасность в веб - основы
Информационная безопасность в веб - основыИнформационная безопасность в веб - основы
Информационная безопасность в веб - основы
 

Plus de Anatoly Sharifulin

Plus 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

Notes de l'éditeur