Move common functions for template use to Packages::Template
[deb/packages.git] / lib / Packages / Template.pm
1 package Packages::Template;
2
3 use strict;
4 use warnings;
5
6 use Template;
7 use Locale::gettext;
8 use URI ();
9 use HTML::Entities ();
10 use URI::Escape ();
11 use Benchmark ':hireswallclock';
12
13 use Packages::CGI;
14 use Packages::I18N::Locale;
15 use Packages::I18N::Languages;
16 use Packages::I18N::LanguageNames;
17
18 our @ISA = qw( Exporter );
19 #our @EXPORT = qw( head );
20
21 use constant COMPILE => 1;
22
23 sub new {
24     my ($classname, $include, $format, $vars, $options) = @_;
25     $vars ||= {};
26     $options ||= {};
27
28     my $self = {};
29     bless( $self, $classname );
30
31     my @timestamp = gmtime;
32     $vars->{timestamp} = {
33         year => $timestamp[5]+1900,
34         string => scalar gmtime() .' UTC',
35     };
36     $vars->{make_search_url} = sub { return &Packages::CGI::make_search_url(@_) };
37     $vars->{make_url} = sub { return &Packages::CGI::make_url(@_) };
38     $vars->{g} = sub { return &Packages::I18N::Locale::tt_gettext(@_) };
39     $vars->{extract_host} = sub { my $uri = URI->new($_[0]);
40                                   my $host = $uri->host;
41                                   $host .= ':'.$uri->port if $uri->port != $uri->default_port;
42                                   return $host;
43                               };
44     # needed to work around the limitations of the the FILTER syntax
45     $vars->{html_encode} = sub { return HTML::Entities::encode_entities(@_,'<>&"') };
46     $vars->{uri_escape} = sub { return URI::Escape::uri_escape(@_) };
47     $vars->{quotemeta} = sub { return quotemeta($_[0]) };
48     $vars->{string2id} = sub { return &Packages::CGI::string2id(@_) };
49
50     $self->{template} = Template->new( {
51         PRE_PROCESS => [ 'config.tmpl' ],
52         INCLUDE_PATH => $include,
53         VARIABLES => $vars,
54         COMPILE_EXT => '.ttc',
55         %$options,
56     } ) or fatal_error( sprintf( _g( "Initialization of Template Engine failed: %s" ), $Template::ERROR ) );
57     $self->{format} = $format;
58     $self->{vars} = $vars;
59
60     return $self;
61 }
62
63 sub process {
64     my $self = shift;
65     return $self->{template}->process(@_);
66 }
67 sub error {
68     my $self = shift;
69     return $self->{template}->error(@_);
70 }
71
72 sub page {
73     my ($self, $action, $page_content, $target) = @_;
74
75     #use Data::Dumper;
76     #die Dumper($self, $action, $page_content);
77     $page_content->{used_langs} ||= [ 'en' ];
78     $page_content->{langs} = languages( $page_content->{lang}
79                                         || $self->{vars}{lang} || 'en',
80                                         @{$page_content->{used_langs}} );
81
82     my $txt;
83     if ($target) {
84         $self->process("$self->{format}/$action.tmpl", $page_content, $target)
85             or die sprintf( "template error: %s", $self->error ); # too late for reporting on-line
86     } else {
87         $self->process("$self->{format}/$action.tmpl", $page_content, \$txt)
88             or die sprintf( "template error: %s", $self->error );
89     }
90     return $txt;
91 }
92
93 sub error_page {
94     my ($self, $page_content) = @_;
95
96 #    use Data::Dumper;
97 #    warn Dumper($page_content);
98
99     my $txt;
100     $self->process("html/error.tmpl", $page_content, \$txt)
101         or die sprintf( "template error: %s", $self->error ); # too late for reporting on-line
102
103     return $txt;
104 }
105
106 sub languages {
107     my ( $lang, @used_langs ) = @_;
108     
109     my @langs;
110
111     if (@used_langs) {
112         
113         my @printed_langs = ();
114         foreach (@used_langs) {
115             next if $_ eq $lang; # Never print the current language
116             unless (get_selfname($_)) { warn "missing language $_"; next } #DEBUG
117             push @printed_langs, $_;
118         }
119         return [] unless scalar @printed_langs;
120         # Sort on uppercase to work with languages which use lowercase initial
121         # letters.
122         foreach my $cur_lang (sort langcmp @printed_langs) {
123             my %lang;
124             $lang{lang} = $cur_lang;
125             $lang{tooltip} = dgettext( "langs", get_language_name($cur_lang) );
126             $lang{selfname} = get_selfname($cur_lang);
127             $lang{transliteration} = get_transliteration($cur_lang) if defined get_transliteration($cur_lang);
128             push @langs, \%lang;
129         }
130     }
131     
132     return \@langs;
133 }
134
135 1;