[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