File Coverage

blib/lib/DateTime/Format/Baby.pm
Criterion Covered Total %
statement 75 84 89.2
branch 16 24 66.6
condition 11 24 45.8
subroutine 9 12 75.0
pod 4 7 57.1
total 115 151 76.1


line stmt bran cond sub pod time code
1             package DateTime::Format::Baby;
2              
3 2     2   43988 use strict;
  2         4  
  2         80  
4 2     2   8 use vars qw($VERSION);
  2         4  
  2         96  
5 2     2   2880 use DateTime;
  2         497176  
  2         70  
6 2     2   24 use Carp;
  2         5  
  2         9518  
7              
8             $VERSION = '0.15.3';
9              
10             my %languages = (
11             'en' => {numbers => [qw /one two three four five six seven
12             eight nine ten eleven twelve/],
13             format => "The big hand is on the %s " .
14             "and the little hand is on the %s",
15             big => [qw/big long large minute/],
16             little => [qw/little small short hour/]},
17              
18             'br' => {numbers => [qw /um dois trÍs quatro cinco seis
19             sete oito nove dez onze doze/],
20             format => "O ponteiro grande est· no %s " .
21             "e o ponteiro pequeno est· no %s"},
22              
23             'de' => {numbers => [qw /Eins Zwei Drei Vier F¸nf Sechs Sieben
24             Acht Neun Zehn Elf Zw–lf/],
25             format => "Der gro\xDFe Zeiger ist auf der %s " .
26             "und der kleine Zeiger ist auf der %s",
27             big => [qw/groß lang groß Minute/],
28             little => [qw/wenig klein Kurzschluß Stunde/]},
29              
30             'du' => {numbers => [qw /een twee drie vier vijf zes zeven
31             acht negen tien elf twaalf/],
32             format => "De grote wijzer is op de %s " .
33             "en de kleine wijzer is op de %s"},
34              
35             'es' => {numbers => [qw /uno dos tres cuatro cinco seis siete
36             ocho nueve diez once doce/],
37             format => "La manecilla grande est· sobre el %s " .
38             "y la manecilla pequeÒa est· sobre el %s",
39             big => [qw/grande grande minuto/, 'de largo'],
40             little => [qw/poco pequeño cortocircuito hora/]},
41            
42              
43             'fr' => {numbers => [qw /un deux trois quatre cinq six sept
44             huit neuf dix onze douze/],
45             format => "La grande aiguille est sur le %s " .
46             "et la petite aiguille est sur le %s",
47             big => [qw/grand longtemps grand minute/],
48             little => [qw/peu petit short heure/]},
49              
50             'it' => {numbers => ['a una', 'e due', 'e tre', 'e quattro',
51             'e cinque', 'e sei', 'e sette',
52             'e otto', 'e nove', 'e dieci',
53             'e undici', 'e dodici'],
54             format => "La lancetta lunga e' sull%s " .
55             "e quella corta e' sull%s",
56             big => [qw/grande lungamente grande minuto/],
57             little => [qw/piccolo piccolo short ora/]},
58              
59             'no' => {numbers => [qw /en to tre fire fem seks syv
60             Âtte ni ti elleve tolv/],
61             format => "Den store viseren er p %s " .
62             "og den lille viseren er p %s"},
63              
64             'se' => {numbers => [qw /ett tv tre fyra fem sex sju
65             Âtta nio tio elva tolv/],
66             format => "Den stora visaren ”r p %s " .
67             "och den lilla visaren ”r p %s"},
68              
69             'swedish chef'
70             => {numbers => [qw /one tvu three ffuoor ffeefe six
71             sefen eight nine ten elefen tvelfe/],
72             format => "Zee beeg hund is un zee %s und zee little " .
73             "hund is un zee %s. Bork, bork, bork!"},
74              
75             'warez' => {numbers => [qw {()nE TW0 7HR3e f0uR f|ve 5ix
76             ZE\/3n E|6hT n1nE TeN 3L3v3gn 7wELv3}],
77             format => 'T|-|3 bIG h4|\||) Yz 0n thE %s ' .
78             'and 7|-|3 lIttlE |-|aND |S 0|\| Th3 %s'},
79             'custom' => 1,
80             );
81              
82              
83             sub new {
84 2     2 0 395 my $class = shift;
85 2         5 my %args;
86 2 100       14 if (scalar @_ == 1) {
    50          
87 1         3 $args{language} = shift;
88             } elsif (scalar @_ %2) {
89 0         0 croak ("DateTime::Format::Baby must be given either one parameter (a language) or a hash");
90             } else {
91 1         3 %args = @_;
92             }
93 2   100     16 $args{language} ||= 'en';
94            
95 2   33     18 $args{numbers} ||= $languages{$args{language}}{numbers};
96 2   33     18 $args{format} ||= $languages{$args{language}}{format};
97 2   33     20 $args{big} ||= $languages{$args{language}}{big};
98 2   33     15 $args{little} ||= $languages{$args{language}}{little};
99            
100 2 50       8 unless (exists $languages{$args{language}}) {
101 0         0 croak "I do not know the language '$args{language}'. The languages I do know are: " . join(', ', sort keys %languages);
102             }
103 2 50       21 unless ($args{numbers}) {
104 0         0 croak "I have no numbers for that language.";
105             }
106 2 50       9 unless ($args{format}) {
107 0         0 croak "I have no format for that language.";
108             }
109            
110 2         11 return bless \%args, $class;
111             }
112              
113             sub languages {
114 0     0 1 0 return sort keys %languages;
115             }
116              
117             sub language {
118 4     4 1 732 my $self = shift;
119 4         4 my $language = shift;
120            
121 4 100       11 if ($language) {
122 3         7 $self->{language} = $language;
123 3         9 $self->{numbers} = $languages{$language}{numbers};
124 3         6 $self->{format} = $languages{$language}{format};
125 3         6 $self->{big} = $languages{$language}{big};
126 3         4 $self->{little} = $languages{$language}{little};
127            
128 3 50       7 unless (exists $languages{$language}) {
129 0         0 croak "I do not know the language '$language'. The languages I do know are: " . join(', ', sort keys %languages);
130             }
131             }
132 4         16 return $self->{language};
133             }
134              
135             sub parse_datetime {
136 2     2 1 5 my ( $self, $date ) = @_;
137              
138 2         2 my ($littlenum,$bignum);
139              
140 2 100 66     26 if ($self->{big} && $self->{little}) {
141 1         3 my $numbers = '(' . join('|',@{$self->{numbers}}) . ')';
  1         18  
142 1         11 my $format = $self->{format};
143 1         2 my $big = '(' . join('|',@{$self->{big}}) . ')';
  1         4  
144 1         2 my $little = '(' . join('|',@{$self->{little}}) . ')';
  1         4  
145              
146 1         120 (undef,$littlenum) = $date =~/$little.*?$numbers/i;
147 1         89 (undef,$bignum) = $date =~/$big.*?$numbers/i;
148              
149             } else {
150 1         9 my $regex = $self->{format};
151 1         5 $regex =~s/\%s/(\\w+)/g;
152            
153 1         20 ($bignum,$littlenum) = $date =~ /$regex/;
154             }
155            
156 2 50 33     13 unless ($bignum && $littlenum) {
157 0         0 croak "Sorry, I didn't understand '$date' in '".$self->language ."'";
158             }
159              
160 2         3 my %reverse;
161 2         4 @reverse{@{$self->{numbers}}} = (1..12);
  2         21  
162            
163 2         6 my $hours = $reverse{lc($littlenum)} * 1;
164 2         3 my $minutes = $reverse{lc($bignum)} * 5;
165            
166 2 50       6 $hours-- if $minutes > 30;
167 2 100       6 if ($minutes == 60) {
168 1         2 $minutes = 0; $hours++;
  1         2  
169             }
170 2         10 return DateTime->new(year=>0, hour=>$hours, minute=>$minutes);
171             }
172              
173             sub parse_duration {
174 0     0 0 0 croak "DateTime::Format::Baby doesn't do durations.";
175             }
176              
177             sub format_datetime {
178 2     2 1 782 my ( $self, $dt ) = @_;
179              
180 2         9 my ($hours, $minutes) = ($dt->hour, $dt->minute);
181              
182 2 50       22 $hours ++ if $minutes > 30;
183              
184             # Turn $hours into 1 .. 12 format.
185 2         4 $hours %= 12;
186 2   50     5 $hours ||= 12;
187              
188             # Round minutes to nearest 5 minute.
189 2         7 $minutes = sprintf "%.0f" => $minutes / 5;
190 2   50     5 $minutes ||= 12;
191              
192 2     2   2113 local $[ = 1;
  2         953  
  2         385  
  2         5  
193 2         5 return sprintf $self->{format} => @{$self->{numbers}} [$minutes, $hours];
  2         22  
194             }
195              
196             sub format_duration {
197 0     0 0   croak "DateTime::Format::Baby doesn't do durations.";
198             }
199              
200              
201             1;
202             __END__