]> git.deb.at Git - deb/packages.git/blob - lib/Packages/Template.pm
The Big, the Fat and the Ugly commit ;)
[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 Benchmark ':hireswallclock';
9
10 use Packages::CGI;
11 use Packages::I18N::Locale;
12 use Packages::I18N::Languages;
13 use Packages::I18N::LanguageNames;
14
15 our @ISA = qw( Exporter );
16 #our @EXPORT = qw( head );
17
18 use constant COMPILE => 1;
19
20 sub new {
21     my ($classname, $include, $format, $vars, $options) = @_;
22     $options ||= {};
23
24     my $self = {};
25     bless( $self, $classname );
26
27     my @timestamp = gmtime;
28     $vars->{timestamp} = {
29         year => $timestamp[5]+1900,
30         string => scalar gmtime() .' UTC',
31     };
32
33     $self->{template} = Template->new( {
34         PRE_PROCESS => [ 'config.tmpl' ],
35         INCLUDE_PATH => $include,
36         VARIABLES => $vars,
37         COMPILE_EXT => '.ttc',
38         %$options,
39     } ) or fatal_error( sprintf( _g( "Initialization of Template Engine failed: %s" ), $Template::ERROR ) );
40     $self->{format} = $format;
41
42     return $self;
43 }
44
45 sub process {
46     my $self = shift;
47     return $self->{template}->process(@_);
48 }
49 sub error {
50     my $self = shift;
51     return $self->{template}->error(@_);
52 }
53
54 sub page {
55     my ($self, $action, $page_content) = @_;
56
57     #use Data::Dumper;
58     #die Dumper($self, $action, $page_content);
59
60     my $txt;
61     $self->process("$self->{format}/$action.tmpl", $page_content, \$txt)
62         or die sprintf( "template error: %s", $self->error ); # too late for reporting on-line
63
64     return $txt;
65 }
66
67 sub error_page {
68     my ($self, $page_content) = @_;
69
70 #    use Data::Dumper;
71 #    warn Dumper($page_content);
72
73     my $txt;
74     $self->process("$self->{format}/error.tmpl", $page_content, \$txt)
75         or die sprintf( "template error: %s", $self->error ); # too late for reporting on-line
76
77     return $txt;
78 }
79
80 sub trailer {
81     my ($self, $NAME, $LANG, $USED_LANGS, $timediff) = @_;
82
83     my $langs = languages( $LANG, @$USED_LANGS );
84
85     my $txt;
86     $self->process("$self->{format}/foot.tmpl", { langs => $langs, name => $NAME, benchmark => $timediff ? timestr($timediff) : '' }, \$txt)
87         or die sprintf( "template error: %s", $self->error ); # too late for reporting on-line
88
89     return $txt;
90 }
91
92 sub languages {
93     my ( $lang, @used_langs ) = @_;
94     
95     my @langs;
96
97     if (@used_langs) {
98         
99         my @printed_langs = ();
100         foreach (@used_langs) {
101             next if $_ eq $lang; # Never print the current language
102             unless (get_selfname($_)) { warn "missing language $_"; next } #DEBUG
103             push @printed_langs, $_;
104         }
105         return [] unless scalar @printed_langs;
106         # Sort on uppercase to work with languages which use lowercase initial
107         # letters.
108         foreach my $cur_lang (sort langcmp @printed_langs) {
109             my %lang;
110             $lang{lang} = $cur_lang;
111             $lang{tooltip} = dgettext( "langs", get_language_name($cur_lang) );
112             $lang{selfname} = get_selfname($cur_lang);
113             $lang{transliteration} = get_transliteration($cur_lang) if defined get_transliteration($cur_lang);
114             push @langs, \%lang;
115         }
116     }
117     
118     return \@langs;
119 }
120
121 1;