[Moscow.pm] Валидация шаблонов Mojo::Template

Alexander M. Pravkin pfduch на yandex.ru
Чт Июн 15 06:57:21 PDT 2017


Спасибо за наводку, но нет.

Я имел в виду штатные плагины: Mojolicious::Plugin::DefaultHelpers,
Mojolicious::Plugin::TagHelpers. use их бесполезен, они не экспортят
свои хелперы. Писать обёртку вокруг них с экспортом каждого хелпера?
Жуть какая...

В "штатном" режиме это же работает как-то.


On Thu, Jun 15, 2017 at 04:25:44PM +0300, Akzhan Abdulin wrote:
> прочтое чтение доки подсказывает
> 
> $template_processor = Mojo::Template->new()->prepend("use YourHelpers;");
> 
> package YourHelpers'
> 
> use Exporter qw( import );
> 
> our @EXPORT = qw( my_helper );
> 
> 1;
> 
> 
> 15 июня 2017 г., 16:17 пользователь Alexander M. Pravkin via Moscow-pm <
> moscow-pm на pm.org> написал:
> 
> > Уважаемые почитатели Mojolicious, помогите с такой проблемой.
> >
> > Есть некоторое число проектов, которые благополучно работают на perl
> > 5.16-5.20, но на свежем валятся, ибо там повсеместно используются
> > конструкции, не рекомендованные к использованию. Собственно, встала
> > задача исправить это безобразие.
> >
> > С самим кодом проблем нет, проблемы есть с embedded-perl-шаблонами Mojo.
> > Если бы их была пара штук или хотя бы пара десятков, можно было бы и
> > вручную обойти. Но их около сотни только в одном проекте.
> >
> > В общем, понадобилась автоматическая валидация, хотя бы по синтаксису.
> > На просторах, увы, не нашёл ничего, решил попробовать сам.
> >
> > Простые шаблоны нормально обрабатываются вот таким скриптом:
> >
> >
> > use strict;
> > use open qw(:std :utf8);
> > use Mojo::Template;
> >
> > my $file = $ARGV[0]
> >     or die "Usage: $0 mojo-template.ep\n";
> >
> > my $mt = Mojo::Template->new(vars => 1);
> >
> > my $res;
> > # Проход первый: ищем необъявленные переменные
> > {
> >     local $SIG{__WARN__} = sub {};
> >     $res = $mt->render_file($file)
> >         or die "render_file $file returned nothing\n";
> > }
> >
> > # Если ошибок не было -- всё OK
> > ref $res and $res->isa('Mojo::Exception')
> >     or exit 0;
> >
> > # Ищем все переменные, используемые шаблоном
> > # Считаем, что автор кода тоже передаёт render'у все нужные
> > my $errors = "$res";
> > my %stash = map { $_ => undef }
> >     ($errors =~ /Global symbol "\$(\w+)" requires explicit package name/g);
> > delete $stash{_O}; # подставная переменная Mojo::Template
> >
> > print "+++ $file variables: ", join(' ', sort keys %stash), "\n";
> >
> > # Проход второй, настоящие ошибки
> > $res = $mt->render_file($file, \%stash);
> > if (ref $res and $res->isa('Mojo::Exception')) {
> >     die "\n--- $file has errors:\n$res\n";
> > }
> >
> >
> > Но он, как минимум, не понимает helper'ов от всяких плагинов (layout,
> > include и прочие form_for). Присобачить использование плагинов к
> > одинокому Mojo::Template я ниасилил. Кто-нибудь может подсказать?
> >
> >
> > --
> > Правкин Александр
> > --
> > Moscow.pm mailing list
> > moscow-pm на pm.org | http://moscow.pm.org
> >

-- 
Правкин Александр


Подробная информация о списке рассылки Moscow-pm