OpenGuides
view release on metacpan or search on metacpan
lib/OpenGuides/Template.pm view on Meta::CPAN
template => "node.tt",
vars => { foo => "bar" }
);
=head1 METHODS
=over 4
=item B<output>
print OpenGuides::Template->output( wiki => $wiki,
config => $config,
template => "node.tt",
content_type => "text/html",
cookies => $cookie,
vars => {foo => "bar"},
noheaders => 1
);
Returns everything you need to send to STDOUT, including the
Content-Type: header. Croaks unless C<template> is supplied.
The config object and variables supplied in C<vars> are passed through
to the template specified. Additional Template Toolkit variables are
automatically set and passed through as well, as described below.
B<Note:> variables set in C<vars> will over-ride any variables of the
same name in the config object or the user cookies.
=over
=item * C<openguides_version>
=item * C<site_name>
=item * C<cgi_url>
=item * C<full_cgi_url>
=item * C<enable_page_deletion> (gets set to true or false - defaults to false)
=item * C<contact_email>
=item * C<stylesheet>
=item * C<home_link>
=item * C<formatting_rules_link> (unless C<omit_formatting_link> is set in user cookie)
=item * C<navbar_on_home_page>
=item * C<home_name>
=item * C<gmaps_api_key>
=item * C<licence_name>
=item * C<licence_url>
=item * C<licence_info_url>
=item * C<prefs> (the preferences from the user cookie)
=back
If C<node> is supplied:
=over
=item * C<node_name>
=item * C<node_param> (the node name escaped for use in URLs)
=back
Content-Type: defaults to C<text/html> and is omitted if the
C<content_type> arg is explicitly set to the blank string.
However, what you more often need is the C<noheaders> option,
which suppresses all HTTP headers, not just the Content-Type.
The HTTP response code may be explictly set with the C<http_status> arg.
=cut
sub output {
my ($class, %args) = @_;
croak "No template supplied" unless $args{template};
my $config = $args{config} or croak "No config supplied";
my $template_path = $config->template_path;
my $custom_template_path = $config->custom_template_path || "";
my $tt = Template->new(
{ INCLUDE_PATH => "$custom_template_path:$template_path" } );
my $script_name = $config->script_name;
my $script_url = $config->script_url;
my $default_city = $config->default_city;
# Check cookie to see if we need to set the formatting_rules_link.
my ($formatting_rules_link, $omit_help_links);
my $formatting_rules_node = $config->formatting_rules_node;
$formatting_rules_link = $config->formatting_rules_link;
my %cookie_data = OpenGuides::CGI->get_prefs_from_cookie(
config => $config,
cookies => $args{cookies},
);
if ( $cookie_data{omit_help_links} ) {
$omit_help_links = 1;
} else {
if (( $formatting_rules_node ) and !( $formatting_rules_link )){
$formatting_rules_link = $script_url . $script_name . "?"
. uri_escape($args{wiki}->formatter->node_name_to_node_param($formatting_rules_node));
}
}
my $enable_page_deletion = 0;
if ( $config->enable_page_deletion
and ( lc($config->enable_page_deletion) eq "y"
or $config->enable_page_deletion eq "1" )
) {
$enable_page_deletion = 1;
}
my $is_admin = 0;
if ( $cookie_data{is_admin} ) {
$is_admin = 1;
}
my $tt_vars = {
config => $config,
prefs => \%cookie_data,
site_name => $config->site_name,
cgi_url => $script_name,
script_url => $script_url,
full_cgi_url => $script_url . $script_name,
contact_email => $config->contact_email,
stylesheet => $config->stylesheet_url,
home_link => $script_url . $script_name,
home_name => $config->home_name,
navbar_on_home_page => $config->navbar_on_home_page,
omit_help_links => $omit_help_links,
is_admin => $is_admin,
formatting_rules_link => $formatting_rules_link,
formatting_rules_node => $formatting_rules_node,
openguides_version => $OpenGuides::VERSION,
enable_page_deletion => $enable_page_deletion,
language => $config->default_language,
http_charset => $config->http_charset,
default_city => $default_city,
gmaps_api_key => $config->gmaps_api_key,
licence_name => $config->licence_name,
licence_url => $config->licence_url,
licence_info_url => $config->licence_info_url,
responsive => $config->responsive,
};
if ($args{node}) {
$tt_vars->{node_name} = CGI->escapeHTML($args{node});
$tt_vars->{node_param} = OpenGuides::CGI->escape(
$args{wiki}->formatter->node_name_to_node_param( $args{node} ) );
}
# Now set further TT variables if explicitly supplied - do this after the
# above auto-setting as these override auto-set ones.
$tt_vars = { %$tt_vars, %{ $args{vars} || {} } };
# Finally, dig out the username from the cookie if we haven't already
# been sent it in vars.
if ( !$tt_vars->{username} ) {
my %prefs = OpenGuides::CGI->get_prefs_from_cookie(config => $config);
# If there's nothing in there, it defaults to "Anonymous".
if ( $prefs{username} ne "Anonymous" ) {
$tt_vars->{username} = $prefs{username};
}
}
my $header = "";
unless ( $args{noheaders} ) {
my %cgi_header_args;
if ( defined $args{content_type} and $args{content_type} eq "" ) {
$cgi_header_args{'-type'} = '';
} else {
if ( $args{content_type} ) {
$cgi_header_args{'-type'} = $args{content_type};
} else {
$cgi_header_args{'-type'} = "text/html";
}
}
if ( $tt_vars->{http_charset} ) {
$cgi_header_args{'-type'} .= "; charset=".$tt_vars->{http_charset};
}
$cgi_header_args{'-cookie'} = $args{cookies};
if ( $args{http_status} ) {
$cgi_header_args{'-status'} = $args{http_status};
}
$header = CGI::header( %cgi_header_args );
}
# vile hack
my %field_vars = OpenGuides::Template->extract_metadata_vars(
wiki => $args{wiki},
config => $config,
set_coord_field_vars => 1,
metadata => {},
);
$tt_vars = { %field_vars, %$tt_vars };
my $output;
$tt->process( $args{template}, $tt_vars, \$output );
my $contact_email = $config->contact_email;
$output ||= qq(<html><head><title>ERROR</title></head><body><p>
Sorry! Something went wrong. Please contact the site administrator
at <a href="mailto:$contact_email">$contact_email</a> and quote the
following error message:</p><blockquote>Failed to process template: )
. $tt->error
. qq(</blockquote></body></html>);
return $header . $output;
}
=item B<extract_metadata_vars>
my %node_data = $wiki->retrieve_node( "Home Page" );
my %metadata_vars = OpenGuides::Template->extract_metadata_vars(
lib/OpenGuides/Template.pm view on Meta::CPAN
latitude => $lat,
longitude => $long,
osie_x => $osie_x,
osie_y => $osie_y,
);
}
if ( $args{set_coord_field_vars} ) {
%vars = (
%vars,
coord_field_1 => "osie_x",
coord_field_2 => "osie_y",
dist_field => "osie_dist",
coord_field_1_name
=> "Irish National Grid X coordinate",
coord_field_2_name
=> "Irish National Grid Y coordinate",
coord_field_1_value => $osie_x,
coord_field_2_value => $osie_y,
);
}
} elsif ( $geo_handler == 3 ) {
require Geo::Coordinates::UTM;
my $lat = $q->param("latitude");
my $long = $q->param("longitude");
if ( defined $lat && length $lat
&& defined $long && length $long ) {
# Trim whitespace.
$lat =~ s/\s+//g;
$long =~ s/\s+//g;
my ($zone, $easting, $northing) =
Geo::Coordinates::UTM::latlon_to_utm( $config->ellipsoid,
$lat, $long );
$easting =~ s/\..*//; # chop off decimal places
$northing =~ s/\..*//; # - metre accuracy enough
%vars = (
%vars,
latitude => $lat,
longitude => $long,
easting => $easting,
northing => $northing,
);
}
if ( $args{set_coord_field_vars} ) {
%vars = (
%vars,
coord_field_1 => "latitude",
coord_field_2 => "longitude",
dist_field => "latlong_dist",
coord_field_1_name => "Latitude (decimal)",
coord_field_2_name => "Longitude (decimal)",
coord_field_1_value => $lat,
coord_field_2_value => $long,
);
}
}
}
# Check whether we need to munge lat and long.
# Store them unmunged as well so commit_node can get hold of them.
my %prefs = OpenGuides::CGI->get_prefs_from_cookie( config => $config );
if ( $prefs{latlong_traditional} ) {
foreach my $var ( qw( latitude longitude ) ) {
next unless defined $vars{$var} && length $vars{$var};
$vars{$var."_unmunged"} = $vars{$var};
$vars{$var} = _deg2string($vars{$var});
}
}
return %vars;
}
# Slightly modified from the no-longer-available Geography::NationalGrid
# module, which was written by P Kent and distributed under the Artistic
# Licence.
sub _deg2string {
my $degrees = shift;
# make positive
my $isneg = 0;
if ($degrees < 0) {
$isneg = 1;
$degrees = abs( $degrees );
} elsif ($degrees == 0) {
return '0d 0m 0s';
}
my $d = int( $degrees );
$degrees -= $d;
$degrees *= 60;
my $m = int( $degrees );
$degrees -= $m;
my $s = $degrees * 60;
return sprintf("%s%dd %um %.2fs", ($isneg?'-':''), $d, $m, $s);
}
=back
=head1 AUTHOR
The OpenGuides Project (openguides-dev@lists.openguides.org)
=head1 COPYRIGHT
Copyright (C) 2003-2013 The OpenGuides Project. All Rights Reserved.
This module is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=cut
1;
( run in 2.220 seconds using v1.01-cache-2.11-cpan-8f98c5d2c55 )