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