[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>