NAME
Text::Template::Library - a derived class of Text::Template
SYNOPSIS
use Text::Template::Library;
my $tmpl=Text::Template::Library->new(...);
$tmpl->fill_in(...);
in the template:
{ define macro1 }
macro text
{ /define }
...
{ define macro2 }
macro text
{ /define }
...
{ fill_in_module('macro2') }
DESCRIPTION
I have used Text::Template
for several years in different projects. Allways I have missed the possibility to create macros. For example suppose this template:
<table>
[%
for (@rows) {
$OUT.="<<EOR";
<tr>...</tr>
EOR
}
%]
</table>
This works perfectly well but all my HTML editors get confused by the <<EOR
construct. One solution would be to create a new template for the table row and use it:
<table>
[%
for (@rows) {
$OUT.=fill_in_file('/path/to/row.tmpl');
}
%]
</table>
But that would mean to have hundreds of small files laying about.
Text::Template::Library
allows you to include these subtemplates in the main template:
[% define row %]
<tr>...</tr>
[% /define %]
<table>
[%
for (@rows) {
$OUT.=fill_in_module('row');
}
%]
</table>
Details
To make this module work with Text::Template
as base class I had to enhance it a bit. I have tried to contact the author M-J. Dominus several times to get my patches into Text::Template
but never got a reply. In the end I decided to include a renamed and patched version of Text::Template
1.45 with this distribution. It is named Text::Template::Base. For more information about the changes see "Text::Template
patches" below.
So, strictly speaking Text::Template::Library
is not anymore a derived class of Text::Template
but of Text::Template::Base
.
Other than with Text::Template::Base
custom delimiters must be passed to the new()
method. Passing them to fill_in()
is not supported. Further, SAFE
compartments are not (yet) supported.
The Text::Template::Library
module inherits from Text::Template::Base
. It overrides 2 methods, _acquire_data
and fill_in
. The first one reads the template and converts it to type STRING
. After that is done our own _acquire_data
greps out all parts of the template that are included in a DEFINE.../DEFINE
sequence.
The DEFINE
statement consists of the current opening delimiter followed by literally one space (except newline), the string define
, again one space (except newline), the name of the macro that must match ^\w+$
, another space (except newline) and the closing delimiter. For example:
{ define name } # assuming default delimiters
or
[% define name %] # assuming DELIMITERS=>[qw/[% %]/]
The /DEFINE
statement accordingly consists of the opening delimiter followed by one space, the string /define
, another space and the closing delimiter.
White spaces including newlines following the closing /DEFINE
statement are cut out of the template. So subsequent definitions like these:
{ define m1 }
...
{ /define }
{ define m2 }
...
{ /define }
do not create additional white spaces (newlines) in the main template. Otherwise you would have to write that this way:
{ define m1 }
...
{ /define }{ define m2 }
...
{ /define }
Also, white spaces up to the first newline (including) following the opening DEFINE
statement are cut out. Hence, you can write
{ define m1 }
...
{ /define }
instead of
{ define m1 }...
{ /define }
The subtemplates are created as Text::Template::Base
objects not Text::Template::Library
objects. This made the parsing process a lot simpler. But it denies nesting of DEFINE
statements.
Subtemplates are evaluated in the same package as the parent template. OUTPUT
, EVALCACHE
, BROKEN
, BROKEN_ARG
, PREPEND
and FILENAME
settings are also passed from the parent template to subtemplates.
Methods
- new
-
creates a
Text::Template::Library
object. - fill_in
-
evaluates the template. Almost all parameters for
Text::Template::Base::fill_in
are supported exceptDELIMITERS
(which must be passed tonew()
) andSAFE
.Prior to calling
Text::Template::Base::fill_in
this method localizes$Text::Template::Library::T
and stores there the current template.This variable can be used in subtemplates directly or indirectly via
fill_in_module()
. - module($name)
-
returns the compiled subtemplate named
$name
. The subtemplate is aText::Template::Base
object, notText::Template::Library
. - library($name, @params)
-
evaluates the subtemplate
$name
.@params
are passed toText::Template::Base::fill_in
.Unlike
Text::Template::Base::fill_in
this method throws an exception if there was an error. So, it can be used in combination withOUTPUT
, see Text::Template::Base.If the
OUTPUT
option was given to the parent templatelibrary
returns an empty string on success, otherwise the computed string.In templates you can use it this way:
$Text::Template::Library::T->library($name, @params);
- fill_in_module($name, @params)
-
Shortcut for
$Text::Template::Library::T->library($name, @params);
to be used in templates.
But calling
Text::Template::Library::fill_in_module(...)
is not much of a shortcut. To make it work normally you can import it into the package in which the template is evaluated:
{ package Q; use Text::Template::Library qw/fill_in_module/; } $tmpl->fill_in(PACKAGE=>'Q', ...);
or even simpler:
local *Q::call_module=\&Text::Template::Library; $tmpl->fill_in(PACKAGE=>'Q', ...);
This way you can use
call_module()
likefill_in_module()
in your templates.
EXPORT
fill_in_module
on demand.
Text::Template
patches
While working on the module I have dicovered a few bugs in Text::Template
1.45. Further, some improvements were made. You'll find all patches in the patches
directory. For more information see the doc.diff patch.
I have sent these patches to the author of Text::Template
, Mark Jason Dominus but haven't yet received an answer.
None of my changes should break existing code working with Text::Template
1.45.
Please apply all the patches to the Text::Template
distribution prior to running make test
with this distribution.
The patches are applied in this order:
cd Text-Template-1.45
cp /path/to/Text-Template-Library-0.01/patches/*.diff .
patch -p0 <fi_ofn.diff
patch -p0 <evalcache.diff
patch -p0 <set_lineno.diff
patch -p0 <filename.diff
patch -p0 <newline_in_delimiter.diff
patch -p0 <doc.diff
patch -p0 <local_underscore.diff
make test
make install
SEE ALSO
Normally you won't want to use this module directly. See TX for a more convenient way.
AUTHOR
Torsten Foertsch, <torsten.foertsch@gmx.net>
COPYRIGHT AND LICENSE
Copyright (C) 2008-2009 by Torsten Foertsch
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.10.0 or, at your option, any later version of Perl 5 you may have available.