[Templates-cvs] cvs commit: TT3/examples htmlt.pl

cvs@template-toolkit.org cvs@template-toolkit.org
Wed, 04 Feb 2004 15:21:48 +0000


cvs         04/02/04 15:21:48

  Added:       examples htmlt.pl
  Log:
  * added example showing how HTML::Template might be emulated.
  
  Revision  Changes    Path
  1.1                  TT3/examples/htmlt.pl
  
  Index: htmlt.pl
  ===================================================================
  #!/usr/bin/perl -w                                            # -*- perl -*-
  #
  # Example simulating HTML::Template
  # 
  # Perl script written by Andy Wardley.  This is free software.
  #
  # <TMPL_VAR>
  # <TMP_INCLUDE>
  # <TMPL_IF> ... <TMPL_ELSE> ... </TMPL_IF>
  # <TMPL_UNLESS> ... <TMPL_ELSE> ... </TMPL_UNLESS>
  # <TMPL_LOOP> ... </TMPL_LOOP>
  
  use strict;
  use warnings;
  use lib qw( ../lib ./lib );
  use Template::TT3::Compiler;
  use Template::TT3::Tag::Closed;
  
  package Template::TT3::Tag::HTMLTemplate;
  use base qw( Template::TT3::Tag::Closed );
  use vars qw( $TAG );
  
  $TAG = {
      name  => 'htmltemplate',
      start => qr/<\/?TMPL_\w+/i,
      end   => '>',
  };
  
  sub parse {
      my ($self, $textref, $handler, $match) = @_;
      my $start = $match->{ start };
      
      # remove leading '<' and TMPL
      $start =~ s/^<//;
      $start =~ s/TMPL_//i;
  
      # copy all arguments into hash
      my $args = {  };
      while ($$textref =~ /^\s*(\w+)="([^"]*)"/g) {
          $args->{ lc $1 } = $2;
      }
      
      my $dir;
      if ($start eq 'INCLUDE') {
          return $self->error("no NAME provided for TMPL_INCLUDE directive")
              unless $args->{ name };
          return $handler->directive( include => $args->{ name } )
              || $self->error($handler->error());
      }
      elsif ($start eq 'VAR') {
          return $self->error("no NAME provided for TMPL_VAR directive")
              unless $args->{ name };
          return $handler->directive( get => $args->{ name } )
              || $self->error($handler->error());
      }
      elsif ($start eq 'LOOP') {
          return $self->error("no NAME provided for TMPL_LOOP directive")
              unless $args->{ name };
          return $handler->start_block( loop => $args->{ name } )
              ? $handler : $self->error($handler->error());
      }
      elsif ($start eq '/LOOP') {
          return $handler->end_block('loop')
              ? $handler : $self->error($handler->error());
      }
  
      elsif ($start eq 'IF') {
          return $self->error("no NAME provided for TMPL_IF directive")
              unless $args->{ name };
          # tmp hack
          return $handler->start_block( if => $args->{ name } )
              ? $handler : $self->error($handler->error());
      }
      elsif ($start eq '/IF') {
          # tmp hack
          return $handler->end_block('if')
              ? $handler : $self->error($handler->error());
      }
      else {
          return $self->error("unknown directive: $start");
      }
  }
  
  package main;
  
  my $compiler = Template::TT3::Compiler->new({
      tags => [ Template::TT3::Tag::HTMLTemplate->new() ],
      generator   => 'Template::TT3::Generator::Debug',
  }) || die Template::TT3::Compiler->error();
  
  local $/ = undef;
  my $input = <DATA>;
  my $output = $compiler->compile($input)
      || die $compiler->error();
  
  print "-- input --\n",
        $input, "\n",
        "-- output --\n",
        $output, "\n";
  
  __DATA__
  <html>
    <head>
      <title>Template Toolkit / HTML::Template Test</title>
    </head>
    <body>
      <TMPL_INCLUDE NAME="header">
  
      <p>
        my name is <TMPL_VAR NAME="myname">.
      </p>
      <TMPL_IF NAME="interesting">
        I am very interesting.
      <TMPL_LOOP NAME="interest">
        I like <TMPL_VAR NAME="interest"/>
      </TMPL_LOOP>
      </TMPL_IF>
    </body>
  </html>