HTML-YaTmpl
view release on metacpan or search on metacpan
lib/HTML/YaTmpl.pm view on Meta::CPAN
}
sub _eval_control {
my $I=shift;
my $v=shift;
my $el=shift;
my $h=shift;
if( 0==length $el->[1] ) { # <: code />
#my $rc=$I->_eval_v( $v, $el, $h );
#use Data::Dumper; warn "$el->[1]: ", Dumper( $rc );
#return $rc;
return $I->_eval_v( $v, $el, $h );
} elsif( $el->[1] eq 'include' ) {
my $file;
foreach my $f (@{$el->[2]}) {
if( !ref($f) and length($f) ) {
$file=$I->_eval_list( $v, $h, $I->_parse_cached($f) );
last;
}
}
my $nh=+{$I->_make_include_param_list( $v, $el, $h )};
my ($sv_file, $sv_eprefix, $sv_template)=
($I->file, $I->eprefix, $I->template); # save
$I->file=$file;
$I->eprefix=join( ' ', $I->eprefix, "While including $file" );
defined($I->open) or do {
($I->file, $I->eprefix, $I->template)=
($sv_file, $sv_eprefix, $sv_template); # restore
return $I->_report_error( "<:include $file>", "$!" );
};
my $rc=eval {
$I->_eval_list( $v, $nh, $I->_parse_cached( defined($I->template)
? $I->template
: '' ) );
};
my $msg=$@;
undef $@;
($I->file, $I->eprefix, $I->template)=
($sv_file, $sv_eprefix, $sv_template); # restore
die $msg if( $msg ); # propagate
return $rc;
} elsif( $el->[1] eq 'for' ) {
my $nh=+{$I->_make_include_param_list( $v, $el, $h )};
#warn "FOR FOR FOR: ";
#use Data::Dumper; warn Dumper($nh);
return $I->_eval_list( $v, $nh, $I->__get_code_list($el) );
} elsif( $el->[1] eq 'm' or $el->[1] eq 'macro' ) { # invoke macro
my $macro;
foreach my $f (@{$el->[2]}) {
if( !ref($f) and length($f) ) {
$macro=$I->_eval_list( $v, $h, $I->_parse_cached($f) );
last;
}
}
unless( exists $I->_macros->{$macro} ) {
return $I->_report_error( "<:macro $macro>", "Macro not defined" );
}
$macro=$I->_macros->{$macro};
my $nh=+{$I->_make_include_param_list( $v, $el, $h )};
#warn "M M M: ";
#use Data::Dumper; warn Dumper($nh);
return $I->_eval_list( $v, $nh, @{$macro} );
} elsif( $el->[1] eq 'eval' ) {
my $nh=+{$I->_make_include_param_list( $v, $el, $h )};
my $new_tmpl=$I->_eval_list( $v, $nh, $I->__get_code_list($el) );
#warn "new_tmpl: $new_tmpl\n";
#use Data::Dumper; warn Dumper($nh);
return $I->_eval_list( $v, $h, $I->_parse_cached( defined $new_tmpl
? $new_tmpl
: '' ) );
} elsif( $el->[1] eq 'cond' ) {
my $vdecl='';
foreach my $x (@{$el->[2]}) {
unless( ref($x) ) {
$vdecl.=q{my $}.$x.q(=$_->[2]->{').$x.q('}; );
}
}
foreach my $c ($I->_parse_cached( defined $el->[3] ? $el->[3] : '' )) {
if( $c->[0] eq ':' and
($c->[1] eq '' or $c->[1] eq 'case') ) {
my $eval=$c->[5];
$eval=~s/\\(.)|"/$1/g; #";#
$eval="$vdecl $eval";
if( $I->__eval_cached( $eval, $v, $h, 1 ) ) {
return $I->_eval_list( $v, $h, $I->__get_code_list($c) )
}
}
}
} elsif( $el->[1] eq 'set' ) {
my $name;
foreach my $f (@{$el->[2]}) {
next if( ref($f) );
$name=$f;
last;
}
my @l=$I->_make_one_param( $v, $el, $h, [$name=>$el->[3]] );
$h->{$l[0]}=$l[1];
} elsif( $el->[1] eq 'defmacro' ) { # define macro
my $macro;
foreach my $f (@{$el->[2]}) {
if( !ref($f) and length($f) ) {
$macro=$I->_eval_list( $v, $h, $I->_parse_cached($f) );
last;
}
}
$I->_macros->{$macro}=[$I->__get_code_list($el)];
}
return;
}
sub _make_one_param {
my $I=shift;
my $v=shift;
my $el=shift;
my $h=shift;
my $p=shift;
( run in 1.032 second using v1.01-cache-2.11-cpan-e1769b4cff6 )