158 lines
4.1 KiB
Perl
158 lines
4.1 KiB
Perl
|
|
||
|
package Text::Template::Preprocess;
|
||
|
$Text::Template::Preprocess::VERSION = '1.56';
|
||
|
# ABSTRACT: Expand template text with embedded Perl
|
||
|
|
||
|
use strict;
|
||
|
use warnings;
|
||
|
|
||
|
use Text::Template;
|
||
|
our @ISA = qw(Text::Template);
|
||
|
|
||
|
sub fill_in {
|
||
|
my $self = shift;
|
||
|
my (%args) = @_;
|
||
|
|
||
|
my $pp = $args{PREPROCESSOR} || $self->{PREPROCESSOR};
|
||
|
|
||
|
if ($pp) {
|
||
|
local $_ = $self->source();
|
||
|
my $type = $self->{TYPE};
|
||
|
|
||
|
# print "# fill_in: before <$_>\n";
|
||
|
&$pp;
|
||
|
|
||
|
# print "# fill_in: after <$_>\n";
|
||
|
$self->set_source_data($_, $type);
|
||
|
}
|
||
|
|
||
|
$self->SUPER::fill_in(@_);
|
||
|
}
|
||
|
|
||
|
sub preprocessor {
|
||
|
my ($self, $pp) = @_;
|
||
|
|
||
|
my $old_pp = $self->{PREPROCESSOR};
|
||
|
|
||
|
$self->{PREPROCESSOR} = $pp if @_ > 1; # OK to pass $pp=undef
|
||
|
|
||
|
$old_pp;
|
||
|
}
|
||
|
|
||
|
1;
|
||
|
|
||
|
__END__
|
||
|
|
||
|
=pod
|
||
|
|
||
|
=encoding UTF-8
|
||
|
|
||
|
=head1 NAME
|
||
|
|
||
|
Text::Template::Preprocess - Expand template text with embedded Perl
|
||
|
|
||
|
=head1 VERSION
|
||
|
|
||
|
version 1.56
|
||
|
|
||
|
=head1 SYNOPSIS
|
||
|
|
||
|
use Text::Template::Preprocess;
|
||
|
|
||
|
my $t = Text::Template::Preprocess->new(...); # identical to Text::Template
|
||
|
|
||
|
# Fill in template, but preprocess each code fragment with pp().
|
||
|
my $result = $t->fill_in(..., PREPROCESSOR => \&pp);
|
||
|
|
||
|
my $old_pp = $t->preprocessor(\&new_pp);
|
||
|
|
||
|
=head1 DESCRIPTION
|
||
|
|
||
|
C<Text::Template::Preprocess> provides a new C<PREPROCESSOR> option to
|
||
|
C<fill_in>. If the C<PREPROCESSOR> option is supplied, it must be a
|
||
|
reference to a preprocessor subroutine. When filling out a template,
|
||
|
C<Text::Template::Preprocessor> will use this subroutine to preprocess
|
||
|
the program fragment prior to evaluating the code.
|
||
|
|
||
|
The preprocessor subroutine will be called repeatedly, once for each
|
||
|
program fragment. The program fragment will be in C<$_>. The
|
||
|
subroutine should modify the contents of C<$_> and return.
|
||
|
C<Text::Template::Preprocess> will then execute contents of C<$_> and
|
||
|
insert the result into the appropriate part of the template.
|
||
|
|
||
|
C<Text::Template::Preprocess> objects also support a utility method,
|
||
|
C<preprocessor()>, which sets a new preprocessor for the object. This
|
||
|
preprocessor is used for all subsequent calls to C<fill_in> except
|
||
|
where overridden by an explicit C<PREPROCESSOR> option.
|
||
|
C<preprocessor()> returns the previous default preprocessor function,
|
||
|
or undefined if there wasn't one. When invoked with no arguments,
|
||
|
C<preprocessor()> returns the object's current default preprocessor
|
||
|
function without changing it.
|
||
|
|
||
|
In all other respects, C<Text::Template::Preprocess> is identical to
|
||
|
C<Text::Template>.
|
||
|
|
||
|
=head1 WHY?
|
||
|
|
||
|
One possible purpose: If your files contain a lot of JavaScript, like
|
||
|
this:
|
||
|
|
||
|
Plain text here...
|
||
|
{ perl code }
|
||
|
<script language=JavaScript>
|
||
|
if (br== "n3") {
|
||
|
// etc.
|
||
|
}
|
||
|
</script>
|
||
|
{ more perl code }
|
||
|
More plain text...
|
||
|
|
||
|
You don't want C<Text::Template> to confuse the curly braces in the
|
||
|
JavaScript program with executable Perl code. One strategy:
|
||
|
|
||
|
sub quote_scripts {
|
||
|
s(<script(.*?)</script>)(q{$1})gsi;
|
||
|
}
|
||
|
|
||
|
Then use C<PREPROCESSOR =E<gt> \"e_scripts>. This will transform
|
||
|
|
||
|
=head1 SEE ALSO
|
||
|
|
||
|
L<Text::Template>
|
||
|
|
||
|
=head1 SOURCE
|
||
|
|
||
|
The development version is on github at L<https://https://github.com/mschout/perl-text-template>
|
||
|
and may be cloned from L<git://https://github.com/mschout/perl-text-template.git>
|
||
|
|
||
|
=head1 BUGS
|
||
|
|
||
|
Please report any bugs or feature requests on the bugtracker website
|
||
|
L<https://github.com/mschout/perl-text-template/issues>
|
||
|
|
||
|
When submitting a bug or request, please include a test-file or a
|
||
|
patch to an existing test-file that illustrates the bug or desired
|
||
|
feature.
|
||
|
|
||
|
=head1 AUTHOR
|
||
|
|
||
|
Mark Jason Dominus, Plover Systems
|
||
|
|
||
|
Please send questions and other remarks about this software to
|
||
|
C<mjd-perl-template+@plover.com>
|
||
|
|
||
|
You can join a very low-volume (E<lt>10 messages per year) mailing
|
||
|
list for announcements about this package. Send an empty note to
|
||
|
C<mjd-perl-template-request@plover.com> to join.
|
||
|
|
||
|
For updates, visit C<http://www.plover.com/~mjd/perl/Template/>.
|
||
|
|
||
|
=head1 COPYRIGHT AND LICENSE
|
||
|
|
||
|
This software is copyright (c) 2013 by Mark Jason Dominus <mjd@cpan.org>.
|
||
|
|
||
|
This is free software; you can redistribute it and/or modify it under
|
||
|
the same terms as the Perl 5 programming language system itself.
|
||
|
|
||
|
=cut
|