[Templates-cvs] cvs commit: TT3/lib/Template/Generator Perl.pm
cvs@template-toolkit.org
cvs@template-toolkit.org
Wed, 01 Dec 2004 17:56:53 +0000
cvs 04/12/01 17:56:53
Modified: lib/Template/Generator Perl.pm
Log:
* improved generation of MY variables
Revision Changes Path
1.8 +38 -36 TT3/lib/Template/Generator/Perl.pm
Index: Perl.pm
===================================================================
RCS file: /template-toolkit/TT3/lib/Template/Generator/Perl.pm,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- Perl.pm 2004/12/01 11:16:32 1.7
+++ Perl.pm 2004/12/01 17:56:53 1.8
@@ -18,7 +18,7 @@
# modify it under the same terms as Perl itself.
#
# REVISION
-# $Id: Perl.pm,v 1.7 2004/12/01 11:16:32 abw Exp $
+# $Id: Perl.pm,v 1.8 2004/12/01 17:56:53 abw Exp $
#
#========================================================================
@@ -27,10 +27,11 @@
use strict;
use warnings;
use POSIX qw(strftime);
+use Template::Context;
use Template::Generator;
use base qw( Template::Generator );
-our $VERSION = sprintf("%d.%02d", q$Revision: 1.7 $ =~ /(\d+)\.(\d+)/);
+our $VERSION = sprintf("%d.%02d", q$Revision: 1.8 $ =~ /(\d+)\.(\d+)/);
our $DEBUG = 0 unless defined $DEBUG;
our $ERROR = '';
#our $DEFAULT = '_default';
@@ -40,6 +41,7 @@
our $WHILE_MAX = 1000 unless defined $WHILE_MAX;
our $PRETTY = 0 unless defined $PRETTY;
our $OUTPUT = '$output .= ';
+our $CONTEXT = 'Template::Context';
our $COMPONENT = 'Template::Component';
our $OPERATORS = {
'&' => '&&',
@@ -126,7 +128,7 @@
sub generate_line {
my ($self, $line) = @_;
$line ||= 1;
- return "#line $line \"$self->{ file } (compiled Perl code)\"";
+ return "#line $line \"$self->{ file }\"";
}
@@ -333,7 +335,7 @@
sub generate_hash {
my ($self, $list) = @_;
- return '{ ' . join(', ', map { $self->generate($_) } @$list) . ' }';
+ return '{ ' . join(', ', map { $self->generate_tuple(@$_) } @$list) . ' }';
}
@@ -394,7 +396,7 @@
sub generate_root {
my ($self, $term) = @_;
$term = $self->generate($term);
- return "{ 'root' => $term }";
+ return "{ root => $term }";
}
@@ -407,21 +409,24 @@
sub generate_variable {
my ($self, $nodes) = @_;
- if (@$nodes == 1) {
- my $node = $nodes->[0];
- my ($name, $args) = @$node;
- if ($name->[0] eq 'ident') {
- $name = $name->[1];
- if (my $code = $self->{ variables }->{ $name }) {
- $self->debug("got code for $name: $code\n");
+ my $root = $nodes->[0];
+ my ($name, $args) = @$root;
+
+ if ($name->[0] eq 'ident') {
+ $name = $name->[1];
+ if (my $code = $self->{ context }->find( variable => $name )) {
+ $self->debug("found static variable: $name => $code\n") if $DEBUG;
+ if (@$nodes == 1) {
return $code;
}
- }
- else {
- $self->debug("not an ident; $name->[0]\n");
+ else {
+ $nodes->[0] = [ [root => $code] ];
+ }
}
}
+
return '$stash->get(' . $self->variable_nodes($nodes) . ')';
+
}
@@ -474,6 +479,10 @@
sub generate_block {
my $self = shift;
+
+ # create a localised variable scope for this block
+ local $self->{ context } = $self->{ context }->child( variable => { } );
+
return join("\n", map { $self->generate($_) } @_);
}
@@ -518,28 +527,15 @@
#------------------------------------------------------------------------
sub generate_my {
- my ($self, @list) = @_;
+ my ($self, $list) = @_;
my @items;
- foreach my $assign (@list) {
- my ($type, $var, $value) = @$assign;
- return $self->error("non-assign node in MY: $assign->[0]")
- unless $type eq 'assign';
- ($type, $var) = @$var;
- return $self->error("cannot create non-variable MY variable")
- unless $type eq 'variable';
- return $self->error("cannot create complex MY variable")
- if @$var > 1;
- $var = $var->[0];
- my ($name, $args) = @$var;
- return $self->error("cannot create MY variable with arguments: $args")
- if $args && @$args;
- return $self->error("cannot create non-identifier MY variable: $var->[0]->[0]")
- unless $name->[0] eq 'ident';
- $name = $name->[1];
+ foreach my $tuple (@$list) {
+ my ($name, $value) = @$tuple;
$value = $self->generate($value);
push(@items, "my \$var_$name = $value");
- $self->{ variables }->{ $name } = "\$var_$name";
+ $self->debug("setting local variable $name to $value\n") if $DEBUG;
+ $self->{ context }->{ variable }->{ $name } = "\$var_$name";
}
return join('; ', @items) . ';';
}
@@ -588,9 +584,15 @@
#------------------------------------------------------------------------
sub generate_template {
- my ($self, $block) = @_;
- my $code = join("\n", map { $self->generate($_) } @$block);
+ my $self = shift;
+ my $block = shift;
+ my $config = @_ && UNIVERSAL::isa($_[0], 'HASH') ? shift : { @_ };
+ my $context = $config->{ context } || $self->pkgvar( CONTEXT => $CONTEXT );
+ local $self->{ context } = $context->child( variable => { });
+# print "context: $self->{ context }\n: ", $self->{ context }->dump(), "\n";
+
+ my $code = join("\n", map { $self->generate($_) } @$block);
return <<EOF;
sub {
@@ -1531,7 +1533,7 @@
=head1 VERSION
-$Revision: 1.7 $
+$Revision: 1.8 $
=head1 COPYRIGHT