From a40d927bfd9a9b3012be9e0f85da84aa4dd58344 Mon Sep 17 00:00:00 2001 From: "bbaetz%student.usyd.edu.au" <> Date: Fri, 20 Dec 2002 15:21:24 +0000 Subject: Bug 173622 - Move template handling into a module. r=justdave, joel, a=justdave --- Bugzilla/CGI.pm | 2 +- Bugzilla/Template.pm | 236 +++++++++++++++++++++++++++++++++++ Bugzilla/Template/Plugin/Bugzilla.pm | 53 ++++++++ 3 files changed, 290 insertions(+), 1 deletion(-) create mode 100644 Bugzilla/Template.pm create mode 100644 Bugzilla/Template/Plugin/Bugzilla.pm (limited to 'Bugzilla') diff --git a/Bugzilla/CGI.pm b/Bugzilla/CGI.pm index ae0546c2e..ad609c2ab 100644 --- a/Bugzilla/CGI.pm +++ b/Bugzilla/CGI.pm @@ -111,7 +111,7 @@ __END__ =head1 NAME - Bugzilla::CGI - CGI handling for Bugzilla +Bugzilla::CGI - CGI handling for Bugzilla =head1 SYNOPSIS diff --git a/Bugzilla/Template.pm b/Bugzilla/Template.pm new file mode 100644 index 000000000..abcfd3ff6 --- /dev/null +++ b/Bugzilla/Template.pm @@ -0,0 +1,236 @@ +# -*- 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 Netscape Communications +# Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): Terry Weissman +# Dan Mosedale +# Jacob Steenhagen +# Bradley Baetz +# Christopher Aillon + +package Bugzilla::Template; + +use strict; + +use Bugzilla::Config; +use Bugzilla::Util; + +# for time2str - replace by TT Date plugin?? +use Date::Format (); + +use base qw(Template); + +############################################################################### +# Templatization Code + +# Use the Toolkit Template's Stash module to add utility pseudo-methods +# to template variables. +use Template::Stash; + +# Add "contains***" methods to list variables that search for one or more +# items in a list and return boolean values representing whether or not +# one/all/any item(s) were found. +$Template::Stash::LIST_OPS->{ contains } = + sub { + my ($list, $item) = @_; + return grep($_ eq $item, @$list); + }; + +$Template::Stash::LIST_OPS->{ containsany } = + sub { + my ($list, $items) = @_; + foreach my $item (@$items) { + return 1 if grep($_ eq $item, @$list); + } + return 0; + }; + +# Add a "substr" method to the Template Toolkit's "scalar" object +# that returns a substring of a string. +$Template::Stash::SCALAR_OPS->{ substr } = + sub { + my ($scalar, $offset, $length) = @_; + return substr($scalar, $offset, $length); + }; + +# Add a "truncate" method to the Template Toolkit's "scalar" object +# that truncates a string to a certain length. +$Template::Stash::SCALAR_OPS->{ truncate } = + sub { + my ($string, $length, $ellipsis) = @_; + $ellipsis ||= ""; + + return $string if !$length || length($string) <= $length; + + my $strlen = $length - length($ellipsis); + my $newstr = substr($string, 0, $strlen) . $ellipsis; + return $newstr; + }; + +# Create the template object that processes templates and specify +# configuration parameters that apply to all templates. + +############################################################################### + +# Construct the Template object + +# Note that all of the failure cases here can't use templateable errors, +# since we won't have a template to use... + +sub create { + my $class = shift; + + # IMPORTANT - If you make any configuration changes here, make sure to + # make them in t/004.template.t and checksetup.pl. + + return $class->new({ + # Colon-separated list of directories containing templates. + INCLUDE_PATH => "template/en/custom:template/en/default", + + # Remove white-space before template directives (PRE_CHOMP) and at the + # beginning and end of templates and template blocks (TRIM) for better + # looking, more compact content. Use the plus sign at the beginning + # of directives to maintain white space (i.e. [%+ DIRECTIVE %]). + PRE_CHOMP => 1, + TRIM => 1, + + COMPILE_DIR => 'data/', + + # Functions for processing text within templates in various ways. + # IMPORTANT! When adding a filter here that does not override a + # built-in filter, please also add a stub filter to checksetup.pl + # and t/004template.t. + FILTERS => { + # Render text in strike-through style. + strike => sub { return "" . $_[0] . "" }, + + # Returns the text with backslashes, single/double quotes, + # and newlines/carriage returns escaped for use in JS strings. + js => sub { + my ($var) = @_; + $var =~ s/([\\\'\"])/\\$1/g; + $var =~ s/\n/\\n/g; + $var =~ s/\r/\\r/g; + return $var; + }, + + # HTML collapses newlines in element attributes to a single space, + # so form elements which may have whitespace (ie comments) need + # to be encoded using + # See bugs 4928, 22983 and 32000 for more details + html_linebreak => sub { + my ($var) = @_; + $var =~ s/\r\n/\ /g; + $var =~ s/\n\r/\ /g; + $var =~ s/\r/\ /g; + $var =~ s/\n/\ /g; + return $var; + }, + + xml => \&Bugzilla::Util::xml_quote , + + # This filter escapes characters in a variable or value string for + # use in a query string. It escapes all characters NOT in the + # regex set: [a-zA-Z0-9_\-.]. The 'uri' filter should be used for + # a full URL that may have characters that need encoding. + url_quote => \&Bugzilla::Util::url_quote , + + quoteUrls => \&::quoteUrls , + + bug_link => [ sub { + my ($context, $bug) = @_; + return sub { + my $text = shift; + return &::GetBugLink($text, $bug); + }; + }, + 1 + ], + + # In CSV, quotes are doubled, and any value containing a quote or a + # comma is enclosed in quotes. + csv => sub + { + my ($var) = @_; + $var =~ s/\"/\"\"/g; + if ($var !~ /^-?(\d+\.)?\d*$/) { + $var = "\"$var\""; + } + return $var; + } , + + # Format a time for display (more info in Bugzilla::Util) + time => \&Bugzilla::Util::format_time, + }, + + PLUGIN_BASE => 'Bugzilla::Template::Plugin', + + # Default variables for all templates + VARIABLES => { + # Function for retrieving global parameters. + 'Param' => \&Bugzilla::Config::Param, + + # Function to create date strings + 'time2str' => \&Date::Format::time2str, + + # Function for processing global parameters that contain references + # to other global parameters. + 'PerformSubsts' => \&::PerformSubsts , + + # Generic linear search function + 'lsearch' => \&Bugzilla::Util::lsearch, + + # UserInGroup - you probably want to cache this + 'UserInGroup' => \&::UserInGroup, + + # SyncAnyPendingShadowChanges + # - called in the footer to sync the shadowdb + 'SyncAnyPendingShadowChanges' => \&::SyncAnyPendingShadowChanges, + + # Bugzilla version + # This could be made a ref, or even a CONSTANT with TT2.08 + 'VERSION' => $Bugzilla::Config::VERSION , + }, + + }) || die("Template creation failed: " . $class->error()); +} + +1; + +__END__ + +=head1 NAME + +Bugzilla::Template - Wrapper arround the Template Toolkit C