Jemplate
view release on metacpan or search on metacpan
my $hash = shift @$args;
local $" = ', ';
return $self->multi_wrapper($file, $hash, $block)
if @$file > 1;
$file = shift @$file;
$block = pad($block, 1) if $PRETTY;
push(@$hash, "'content'", '$output');
$file .= @$hash ? ', { ' . join(', ', @$hash) . ' }' : '';
return <<EOF;
$OUTPUT do {
my \$output = '';
$block
\$context->include($file);
};
EOF
}
sub multi_wrapper {
my ($self, $file, $hash, $block) = @_;
$block = pad($block, 1) if $PRETTY;
push(@$hash, "'content'", '$output');
$hash = @$hash ? ', { ' . join(', ', @$hash) . ' }' : '';
$file = join(', ', reverse @$file);
return <<EOF;
$OUTPUT do {
my \$output = '';
$block
foreach ($file) {
\$output = \$context->include(\$_$hash);
}
\$output;
};
EOF
}
sub while {
my ($self, $expr, $block, $label) = @_;
$block = pad($block, 2) if $PRETTY;
$label ||= 'LOOP';
return <<EOF;
do {
my \$_tt_failsafe = $WHILE_MAX;
$label:
while (--\$_tt_failsafe && ($expr)) {
$block
}
die "WHILE loop terminated (> $WHILE_MAX iterations)\\n"
unless \$_tt_failsafe;
};
EOF
}
sub switch {
my ($self, $expr, $case) = @_;
my @case = @$case;
my ($match, $block, $default);
my $caseblock = '';
$default = pop @case;
foreach $case (@case) {
$match = $case->[0];
$block = $case->[1];
$block = pad($block, 1) if $PRETTY;
$caseblock .= <<EOF;
\$_tt_match = $match;
\$_tt_match = [ \$_tt_match ] unless ref \$_tt_match eq 'ARRAY';
if (grep(/^\\Q\$_tt_result\\E\$/, \@\$_tt_match)) {
$block
last SWITCH;
}
EOF
}
$caseblock .= $default
if defined $default;
$caseblock = pad($caseblock, 2) if $PRETTY;
return <<EOF;
do {
my \$_tt_result = $expr;
my \$_tt_match;
SWITCH: {
$caseblock
}
};
EOF
}
sub try {
my ($self, $block, $catch) = @_;
my @catch = @$catch;
my ($match, $mblock, $default, $final, $n);
my $catchblock = '';
my $handlers = [];
$block = pad($block, 2) if $PRETTY;
$final = pop @catch;
$final = "# FINAL\n" . ($final ? "$final\n" : '')
. 'die $_tt_error if $_tt_error;' . "\n" . '$output;';
$final = pad($final, 1) if $PRETTY;
sub wrapper {
my ($class, $nameargs, $block) = @_;
my ($file, $args) = @$nameargs;
my $hash = shift @$args;
s/ => /: / for @$hash;
return $class->multi_wrapper($file, $hash, $block)
if @$file > 1;
$file = shift @$file;
push(@$hash, "'content': output");
$file .= @$hash ? ', { ' . join(', ', @$hash) . ' }' : '';
return <<EOF;
// WRAPPER
$OUTPUT (function() {
var output = '';
$block;
return context.include($file);
})();
EOF
}
sub multi_wrapper {
my ($class, $file, $hash, $block) = @_;
push(@$hash, "'content': output");
$hash = @$hash ? ', { ' . join(', ', @$hash) . ' }' : '';
$file = join(', ', reverse @$file);
return <<EOF;
// WRAPPER
$OUTPUT (function() {
var output = '';
$block;
var files = new Array($file);
for (var i = 0; i < files.length; i++) {
output = context.include(files[i]$hash);
}
return output;
})();
EOF
}
sub while {
my ($class, $expr, $block) = @_;
return <<EOF;
// WHILE
var failsafe = $WHILE_MAX;
while (--failsafe && ($expr)) {
$block
}
if (! failsafe)
throw("WHILE loop terminated (> $WHILE_MAX iterations)\\n")
EOF
}
sub javascript {
my ( $class, $javascript ) = @_;
return $javascript;
}
sub no_javascript {
my ( $class ) = @_;
die "EVAL_JAVASCRIPT has not been enabled, cannot process [% JAVASCRIPT %] blocks";
}
sub switch {
my ($class, $expr, $case) = @_;
my @case = @$case;
my ($match, $block, $default);
my $caseblock = '';
$default = pop @case;
foreach $case (@case) {
$match = $case->[0];
$block = $case->[1];
$caseblock .= <<EOF;
case $match:
$block
break;
EOF
}
if (defined $default) {
$caseblock .= <<EOF;
default:
$default
break;
EOF
}
return <<EOF;
switch($expr) {
$caseblock
}
EOF
}
sub throw {
my ($class, $nameargs) = @_;
my ($type, $args) = @$nameargs;
my $hash = shift(@$args);
my $info = shift(@$args);
$type = shift @$type;
return qq{throw([$type, $info]);};
( run in 0.336 second using v1.01-cache-2.11-cpan-5511b514fd6 )