SlideShare ist ein Scribd-Unternehmen logo
1 von 72
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Andere mochten auch (6)

Mojolicious
MojoliciousMojolicious
Mojolicious
 
Apresentação EstAção RH 2016
Apresentação EstAção RH 2016Apresentação EstAção RH 2016
Apresentação EstAção RH 2016
 
บทที่8dd
บทที่8ddบทที่8dd
บทที่8dd
 
Frodio
FrodioFrodio
Frodio
 
28 profecias cumplidas
28 profecias cumplidas28 profecias cumplidas
28 profecias cumplidas
 
Modern Perl
Modern  PerlModern  Perl
Modern Perl
 

Ähnlich wie TT

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
 

Ähnlich wie TT (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
 
Информационная безопасность в веб - основы
Информационная безопасность в веб - основыИнформационная безопасность в веб - основы
Информационная безопасность в веб - основы
 

TT

  • 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