File Coverage

blib/lib/HTML/EP/Locale.pm
Criterion Covered Total %
statement 62 68 91.1
branch 31 42 73.8
condition 0 2 0.0
subroutine 7 7 100.0
pod 0 1 0.0
total 100 120 83.3


line stmt bran cond sub pod time code
1             # -*- perl -*-
2             #
3             # HTML::EP - A Perl based HTML extension.
4             #
5             #
6             # Copyright (C) 1998 Jochen Wiedmann
7             # Am Eisteich 9
8             # 72555 Metzingen
9             # Germany
10             #
11             # Phone: +49 7123 14887
12             # Email: joe@ispsoft.de
13             #
14             # All rights reserved.
15             #
16             # You may distribute this module under the terms of either
17             # the GNU General Public License or the Artistic License, as
18             # specified in the Perl README file.
19             #
20             ############################################################################
21              
22             require 5.004;
23 5     5   2885 use strict;
  5         9  
  5         214  
24              
25 5     5   783 use HTML::EP ();
  5         42  
  5         10433  
26              
27              
28             package HTML::EP::Locale;
29              
30             @HTML::EP::Locale::ISA = qw(HTML::EP);
31              
32              
33             sub init ($$) {
34 15     15 0 39 my $self = shift; my $attr = shift;
  15         22  
35 15 50       40 return $self->{'_ep_language'} if $self->{'_ep_language'};
36 15         62 $self->SUPER::init();
37              
38             # Try to guess a language. First try to guess what languages are
39             # offered.
40 15         17 my @offered;
41 15 100       41 if ($attr->{'accept-language'}) {
42 11         49 @offered = split(/,/, $attr->{'accept-language'});
43             }
44 15 100       53 @offered = ($self->{'_ep_config'}->{'default_language'}, "en")
45             unless @offered;
46              
47             # Next, try to guess what the user wants. First let's see, if there
48             # is a CGI variable 'language'.
49 15         24 my $get;
50 15 50       58 if (my $lang = $self->{'cgi'}->param('language')) {
51 0         0 foreach my $l (@offered) {
52 0 0       0 return ($self->{'_ep_language'} = $l) if $l eq $lang;
53             }
54             }
55             # If there's no such CGI variable, look at the value of
56             # $ENV{'HTTP_ACCEPT_LANGUAGE'}.
57 15 50       290 if (exists($ENV{'HTTP_ACCEPT_LANGUAGE'})) {
58 0   0     0 foreach my $lang (split(/\s*,\s*/,
59             ($ENV{'HTTP_ACCEPT_LANGUAGE'} || ''))) {
60 0         0 foreach my $l (@offered) {
61 0 0       0 return ($self->{'_ep_language'} = $l) if $l eq $lang;
62             }
63             }
64             }
65             # If anything else fails, choose a default language
66 15         66 return $self->{'_ep_language'} = $offered[0];
67             }
68              
69              
70             sub _ep_language {
71 12     12   19 my($self, $attr, $tokens) = @_;
72 12         22 my $language = $self->{'_ep_language'};
73 12         16 my $debug = $self->{'debug'};
74 12 100       40 return exists $attr->{$language} ? $attr->{$language} : ''
    100          
75             unless exists $attr->{'language'};
76              
77 9         13 my $level = 0;
78 9         15 my $state = $attr->{'language'} eq $language;
79 9         13 my $state_done = $state;
80 9 100       36 my $start = $tokens->First() if $state;
81 9         10 my $last;
82 9         23 while (defined(my $token = $tokens->Token())) {
83 24 100       95 if ($token->{'type'} eq 'S') {
    100          
84 3 50       9 if ($token->{'tag'} eq 'ep-language') {
85 3 100       10 if ($state) {
    50          
86 1         4 $last = $tokens->First()-1;
87 1         5 $state = 0;
88             } elsif (!$state_done) {
89 2         10 my $at = $self->ParseAttr($token->{'attr'});
90 2 100       11 if ($state = ($at->{'language'} eq $language)) {
91 1         33 $start = $tokens->First();
92 1         5 $state_done = 1;
93             }
94             }
95             }
96             } elsif ($token->{'type'} eq 'E') {
97 9 50       21 if ($token->{'tag'} eq 'ep-language') {
98 9 100       29 return '' unless $state_done;
99 4 100       13 $last = $tokens->First()-1 if $state;
100 4         15 return $self->TokenMarch($tokens->Clone($start, $last));
101             }
102             }
103             }
104 0         0 die "ep-language without /ep-language";
105             }
106              
107              
108             sub _format_DM {
109 4     4   7 my $self = shift; my $str = shift;
  4         5  
110 4         54 $str = sprintf("%.2f DM", $str);
111 4         57 while ($str =~ s/(\d)(\d\d\d[\.\s])/$1 $2/) {
112             }
113 4         15 $str =~ s/\./,/;
114 4         13 $str;
115             }
116              
117             sub _format_Dollar {
118 1     1   2 my $self = shift; my $str = shift;
  1         2  
119 1         6 $str = sprintf("%.2f \$", $str);
120 1         11 while ($str =~ s/(\d)(\d\d\d[,\s])/$1 $2/) {
121             }
122 1         4 $str;
123             }
124              
125              
126             sub _format_TIME {
127 2     2   3 my $self = shift; my $date = shift;
  2         5  
128 2 100       8 if ($self->{'_ep_language'} eq 'de') {
129             # Sun, 7 Feb 1999 18:17:57 +0100
130 1 50       10 if ($date =~ m{(\S+),\s+
131             (\d+)\s+
132             (\S+)\s+
133             (\d+)\s+
134             (\d+\:\d+\:\d+)\s+
135             (\+\d+)}x) {
136 1         10 my %wdays = ('sun' => 0, 'mon' => 1, 'tue' => 2,
137             'wed' => 3, 'thu' => 4, 'fri' => 5,
138             'sat' => 6);
139 1         8 my $wday = (('Sonntag', 'Montag', 'Dienstag', 'Mittwoch',
140             'Donnerstag', 'Freitag', 'Samstag')[$wdays{lc $1}]);
141 1         14 my %months = ('jan' => 0, 'feb' => 1, 'mar' => 2,
142             'apr' => 3, 'may' => 4, 'jun' => 5,
143             'jul' => 6, 'aug' => 7, 'sep' => 8,
144             'oct' => 9, 'nov' => 10, 'dec' => 12
145             );
146 1         5 my $mon = (('Januar', 'Februar', 'März', 'April', 'Mai', 'Juni',
147             'Juli', 'August', 'September', 'Oktober', 'November',
148             'Dezember')[$months{lc $3}]);
149 1         11 $date = "$wday, den $2. $mon $4, $5 Uhr ($6)";
150             }
151             }
152 2         7 $date;
153             }
154              
155             1;