Remove stray block.ROW-> from templates and modules

databind
vitalif 2009-02-01 16:37:33 +00:00 committed by Vitaliy Filippov
parent 088e5c02a2
commit 5eb26799a2
1 changed files with 76 additions and 48 deletions

View File

@ -13,6 +13,7 @@ my $mtimes = {}; # время изменения файлов
my $uncompiled_code = {}; # нескомпилированный код
my $compiled_code = {}; # скомпилированный код (sub'ы)
my $langhashes = {}; # хеши ленгпаков
my %assigncache = {}; # кэш eval'ов присвоений
# Конструктор
# $obj = new VMX::Template, %params
@ -202,44 +203,58 @@ sub loadfile
# Функция присваивает переменные блока в новую итерацию
# $obj->assign_block_vars ($block, varname1 => value1, varname2 => value2, ...)
# Так тоже можно (при этом избежим лишнего копирования хеша!):
# $obj->assign_block_vars ($block, { varname1 => value1, varname2 => value2, ... })
sub assign_block_vars
{
my $self = shift;
my $block = shift;
my $vararray = { @_ };
my $vararray;
if (@_ > 1)
{
# копирование хеша, да...
$vararray = { @_ };
}
else
{
# а так можно и не копировать
($vararray) = @_;
}
$block =~ s/^\.+//so;
$block =~ s/\.+$//so;
if (!$block)
{
# если не блок, а корневой уровень
$self->assign_vars (@_);
$self->assign_vars($vararray);
}
elsif ($block !~ /\.[^\.]/)
elsif ($block !~ /\.[^\.]/so)
{
# если блок, но не вложенный
$block =~ s/\.*$/./; # добавляем . в конец, если надо
$block =~ s/\.*$/./so; # добавляем . в конец, если надо
$self->{tpldata}->{$block} ||= [];
push @{$self->{tpldata}->{$block}}, $vararray;
}
else
{
# если вложенный блок
my $ev = '$self->{tpldata}';
$block =~ s/\.+$//; # обрезаем точки в конце (хоть их 10 там)
my $ev;
$block =~ s/\.+$//so; # обрезаем точки в конце (хоть их 10 там)
unless ($ev = $assigncache{"=$block"})
{
$ev = '$_[0]';
my @blocks = split /\./, $block;
my $lastblock = pop @blocks;
foreach (@blocks)
{
$ev .= "{'$_.'}";
$ev .= "[-1+\@\{$ev\}]";
$ev .= "[\$\#\{$ev\}]";
}
$ev .= "{'$lastblock.'}";
$ev = "$ev = [] unless $ev; push \@\{$ev\}, \$vararray;";
eval ($ev);
$ev = "sub { $ev = [] unless $ev; push \@\{$ev\}, \$_[1]; }";
$ev = $assigncache{"=$block"} = eval $ev;
}
&$ev($self->{tpldata}, $vararray);
}
return 1;
}
@ -256,31 +271,35 @@ sub append_block_vars
# если не блок, а корневой уровень
$self->assign_vars(@_);
}
elsif ($block !~ /\../)
elsif ($block !~ /\../so)
{
# если блок, но не вложенный
$block =~ s/\.*$/./; # добавляем . в конец, если надо
$block =~ s/\.*$/./so; # добавляем . в конец, если надо
$self->{tpldata}{$block} ||= [];
$lastit = @{$self->{tpldata}{$block}} - 1;
$lastit = $#{$self->{tpldata}{$block}};
$lastit = 0 if $lastit < 0;
$self->{tpldata}{$block}[$lastit]{$_} = $vararray{$_}
foreach keys %vararray;
for keys %vararray;
}
else
{
# если вложенный блок
my $ev = '$self->{tpldata}';
$block =~ s/\.+$//; # обрезаем точки в конце (хоть их 10 там)
my $ev;
$block =~ s/\.+$//so; # обрезаем точки в конце (хоть их 10 там)
unless ($ev = $assigncache{"+$block"})
{
$ev = '$_[0]';
my @blocks = split /\.+/, $block;
foreach (@blocks)
{
$ev .= "{'$_.'}";
$ev .= "[-1+\@\{$ev\}]";
$ev .= "[\$#\{$ev\}]";
}
$ev = "\$ev{\$k} = \$vararray{\$k} foreach \$k (keys \%vararray);";
eval ($ev);
$ev = "sub { my \$k; \$ev{\$k} = \$_[1]->{\$k} for \$k (keys \%{$_[1]}); }";
$ev = $assigncache{"+$block"} = eval $ev;
}
&$ev($self->{tpldata}, \%vararray);
}
return 1;
}
@ -289,8 +308,17 @@ sub append_block_vars
sub assign_vars
{
my $self = shift;
$self->{tpldata}{'.'}[0] = {} unless $self->{tpldata}{'.'}[0];
%{$self->{tpldata}{'.'}[0]} = (%{$self->{tpldata}{'.'}[0]}, @_);
my %h;
if (@_ > 1)
{
%h = @_;
}
else
{
%h = %{$_[0]};
}
$self->{tpldata}{'.'}[0] ||= {};
$self->{tpldata}{'.'}[0]{$_} = $h{$_} for keys %h;
return 1;
}
@ -301,7 +329,7 @@ sub tr_assign_vars
$self->assign_vars($self->tr_vars(@_));
}
# Аналог assign_block_vars, но преобазует имена переменных
# Аналог assign_block_vars, но преобразует имена переменных
sub tr_assign_block_vars
{
my $self = shift;
@ -309,7 +337,7 @@ sub tr_assign_block_vars
$self->assign_block_vars($block, $self->tr_vars(@_));
}
# Аналог append_block_vars, но преобазует имена переменных
# Аналог append_block_vars, но преобразует имена переменных
sub tr_append_block_vars
{
my $self = shift;