From 20bee9210430e91d6e700a5b99be0213dd8c5443 Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Tue, 7 Feb 2017 16:37:55 +0100 Subject: [PATCH] Bug 13618: Use a simplified version of Template::Stash::AutoEscaping Koha::Template::Escape is a simple version of Template::Stash::AutoEscaping It seems that removing and cleanly some pieces of Template::Stash::AutoEscaping will bring us a lot of performance boost. --- C4/Installer/PerlDependencies.pm | 5 --- C4/Templates.pm | 4 +- Koha/Template/Escape.pm | 97 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 7 deletions(-) create mode 100644 Koha/Template/Escape.pm diff --git a/C4/Installer/PerlDependencies.pm b/C4/Installer/PerlDependencies.pm index 8942f23..4e1f75f 100644 --- a/C4/Installer/PerlDependencies.pm +++ b/C4/Installer/PerlDependencies.pm @@ -852,11 +852,6 @@ our $PERL_DEPS = { required => 1, min_ver => '0.28', }, - 'Template::Stash::AutoEscaping' => { - 'usage' => 'Code', - 'required' => '1', - 'min_ver' => '0.0303', - }, }; 1; diff --git a/C4/Templates.pm b/C4/Templates.pm index 4db5c64..c2f6afc 100644 --- a/C4/Templates.pm +++ b/C4/Templates.pm @@ -5,7 +5,7 @@ use warnings; use Carp; use CGI qw ( -utf8 ); use List::MoreUtils qw/ any uniq /; -use Template::Stash::AutoEscaping; +use Koha::Template::Escape; # Copyright 2009 Chris Cormack and The Koha Dev Team # @@ -72,7 +72,7 @@ sub new { COMPILE_DIR => $use_template_cache ? C4::Context->config('template_cache_dir') : '', INCLUDE_PATH => \@includes, FILTERS => {}, - STASH => Template::Stash::AutoEscaping->new, + STASH => Koha::Template::Escape->new, ENCODING => 'UTF-8', } ) or die Template->error(); diff --git a/Koha/Template/Escape.pm b/Koha/Template/Escape.pm new file mode 100644 index 0000000..86c2e18 --- /dev/null +++ b/Koha/Template/Escape.pm @@ -0,0 +1,97 @@ +package Koha::Template::Escape; + +# This is largely inspired from Template::Stash::AutoEscaping + +use Modern::Perl; + +use Template::Config; +use parent ($Template::Config::STASH, 'Class::Data::Inheritable'); + +sub new { + my $class = shift; + my $self = $class->SUPER::new(@_); + return $self; +} + +sub get_raw_args { + my ( $args, $escaped_class ) = @_; + my $changed = 0; + my @raw_args; + for my $v (@{ $args }) { + my $new_v; + if ( ref $v eq $escaped_class ) { + $changed = 1; + $new_v = $v->[0]; + } elsif (ref $v eq 'ARRAY') { + $new_v = get_raw_args($v, $escaped_class); + if ($new_v) { + $changed = 1; + } else { + $new_v = $v; + } + } else { + $new_v = $v; + } + push @raw_args, $new_v; + } + + return unless $changed; + return \@raw_args; +} + +sub get { + my ( $self, @args ) = @_; + + # note: hack for [% hash.${key} %] [% hash.item(key) %] + # key expected raw string. + if (ref $args[0] eq "ARRAY" && (scalar @{$args[0]} > 2)){ + my $changed = get_raw_args($args[0], 'Koha::Template::Escape'); + # retry by non-escaped args + if ($changed) { + $args[0] = $changed; + return $self->get(@args); + } + } + + my ($var) = $self->SUPER::get(@args); + if (ref $args[0] eq "ARRAY") { + my $key = $args[0]->[0]; + if (grep { $key eq $_ } @{ $self->{ignore_escape} }) { + return $var; + } + } + + my $ref = ref $var; + # string + if ((!$ref) and (length($var) > 0)) { + return $self->escape($var); + } + return $var; +} + +# With %XML => xml_escape subroutine from Mojo +#our %XML = ( +# '&' => '&', +# '<' => '<', +# '>' => '>', +# '"' => '"', +# '\'' => ''' +#); + +# Without XML => TT html filter and AutoEscaping +sub escape { + my $class = shift; + my $text = shift; +# $text =~ s/([&<>"'])/$XML{$1}/ge; + for ($text) { + s/&/&/g; + s//>/g; + s/"/"/g; + s/'/'/g; + } + + return $text; +} + +1; -- 2.9.3