This patch allows HTML::Template to be used with UTF-8 encoded templates.
It works for basic tasks (opening template files and includes), but it
is untested (and probably does not work) with caching.
The patch is (c) Jan "Yenya" Kasprzak <kas@fi.muni.cz>,
http://www.fi.muni.cz/~kas/ and can be distributed
under the same terms as HTML::Template itself.
--- HTML/Template.pm.orig Mon Dec 17 13:21:08 2007
+++ HTML/Template.pm Mon Dec 17 13:35:19 2007
@@ -648,6 +648,20 @@
normal behavior is to look only in the current directory for a
template to include. Defaults to 0.
+=item *
+
+binmode - set the given binmode() when opening the template file and all its
+includes.
+
+Example:
+
+ my $template = HTML::Template->new(
+ filename => 'file.tmpl',
+ binmode => ':utf8'
+ );
+
+NOTE: When the template is given as scalar or filehandle instead of
+file name, this sets the binmode only on included templates).
=back
=item Debugging Options
@@ -1662,13 +1676,16 @@
}
confess("HTML::Template->new() : Cannot open included file $options->{filename} : $!")
- unless defined(open(TEMPLATE, $filepath));
+ unless defined(open(my $fh, $filepath));
$self->{mtime} = $self->_mtime($filepath);
+ if (defined $options->{binmode}) {
+ binmode $fh, $options->{binmode};
+ }
+
# read into scalar, note the mtime for the record
- $self->{template} = "";
- while (read(TEMPLATE, $self->{template}, 10240, length($self->{template}))) {}
- close(TEMPLATE);
+ { local $/; $self->{template} = <$fh>; }
+ close($fh);
} elsif (exists($options->{scalarref})) {
# copy in the template text
@@ -2264,12 +2281,14 @@
die "HTML::Template->new() : Cannot open included file $filename : file not found."
unless defined($filepath);
die "HTML::Template->new() : Cannot open included file $filename : $!"
- unless defined(open(TEMPLATE, $filepath));
+ unless defined(open(my $fh, $filepath));
- # read into the array
- my $included_template = "";
- while(read(TEMPLATE, $included_template, 10240, length($included_template))) {}
- close(TEMPLATE);
+ if ($self->{options}->{binmode}) {
+ binmode $fh, $self->{options}->{binmode};
+ }
+ my $included_template;
+ { local $/; $included_template = <$fh>; }
+ close $fh;
# call filters if necessary
$self->_call_filters(\$included_template) if @{$options->{filter}};