[Moscow.pm] Валидация шаблонов Mojo::Template
Alexander M. Pravkin
pfduch на yandex.ru
Чт Июн 15 06:17:04 PDT 2017
Уважаемые почитатели 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