diff options
-rw-r--r-- | Bugzilla/Template.pm | 23 | ||||
-rwxr-xr-x | Bugzilla/Template/Parser.pm | 66 |
2 files changed, 89 insertions, 0 deletions
diff --git a/Bugzilla/Template.pm b/Bugzilla/Template.pm index 9df831c7a..e9b6c3b9c 100644 --- a/Bugzilla/Template.pm +++ b/Bugzilla/Template.pm @@ -41,6 +41,7 @@ use Bugzilla::Util; use Bugzilla::User; use Bugzilla::Error; use Bugzilla::Status; +use Bugzilla::Template::Parser; use Cwd qw(abs_path); use MIME::Base64; @@ -54,6 +55,28 @@ use IO::Dir; use base qw(Template); +# As per the Template::Base documentation, the _init() method is being called +# by the new() constructor. We take advantage of this in order to plug our +# UTF-8-aware Parser object in neatly after the original _init() method has +# happened, in particular, after having set up the constants namespace. +# See bug 413121 for details. +sub _init { + my $self = shift; + my $config = $_[0]; + + $self->SUPER::_init(@_) || return undef; + + $self->{PARSER} = $config->{PARSER} + = new Bugzilla::Template::Parser($config); + + # Now we need to re-create the default Service object, making it aware + # of our Parser object. + $self->{SERVICE} = $config->{SERVICE} + = Template::Config->service($config); + + return $self; +} + # Convert the constants in the Bugzilla::Constants module into a hash we can # pass to the template object for reflection into its "constants" namespace # (which is like its "variables" namespace, but for constants). To do so, we diff --git a/Bugzilla/Template/Parser.pm b/Bugzilla/Template/Parser.pm new file mode 100755 index 000000000..0965e078e --- /dev/null +++ b/Bugzilla/Template/Parser.pm @@ -0,0 +1,66 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# The Initial Developer of the Original Code is Marc Schumann. +# Portions created by Marc Schumann are Copyright (C) 2008 Marc Schumann. +# All Rights Reserved. +# +# Contributor(s): Marc Schumann <wurblzap@gmail.com> + + +package Bugzilla::Template::Parser; + +use strict; + +use base qw(Template::Parser); + +sub parse { + my ($self, $text, @params) = @_; + if (Bugzilla->params->{'utf8'}) { + utf8::is_utf8($text) || utf8::decode($text); + } + return $self->SUPER::parse($text, @params); +} + +1; + +__END__ + +=head1 NAME + +Bugzilla::Template::Parser - Wrapper around the Template Toolkit +C<Template::Parser> object + +=head1 DESCRIPTION + +This wrapper makes the Template Toolkit aware of UTF-8 templates. + +=head1 SUBROUTINES + +=over + +=item C<parse($options)> + +Description: Parses template text using Template::Parser::parse(), +converting the text to UTF-8 encoding before, if necessary. + +Params: C<$text> - Text to pass to Template::Parser::parse(). + +Returns: Parsed text as returned by Template::Parser::parse(). + +=back + +=head1 SEE ALSO + +L<Template> |