File Coverage

blib/lib/AltaVista/BabelFish.pm
Criterion Covered Total %
statement 40 139 28.7
branch 7 88 7.9
condition 9 29 31.0
subroutine 10 17 58.8
pod 10 11 90.9
total 76 284 26.7


line stmt bran cond sub pod time code
1             package AltaVista::BabelFish;
2            
3 1     1   30073 use strict;
  1         3  
  1         104  
4 1     1   6 use warnings;
  1         2  
  1         35  
5 1     1   893 use version; our $VERSION = qv('42.0.2');
  1         2646  
  1         7  
6              
7 1     1   1731 use Class::Std;
  1         16270  
  1         8  
8 1     1   1195 use Class::Std::Utils;
  1         857  
  1         6  
9            
10             my %lang = (
11             'zh' => {
12             'name' => 'Chinese Simplified',
13             'targets' => [qw(en)],
14             },
15             'zt' => {
16             'name' => 'Chinese Traditional',
17             'targets' => [qw(en)],
18             },
19             'en' => {
20             'name' => 'English',
21             'targets' => [qw(es zh zt nl fr de el it ja ko pt ru)],
22             },
23             'nl' => {
24             'name' => 'Dutch',
25             'targets' => [qw(en fr)],
26             'native' => 'Nederlands',
27             },
28             'fr' => {
29             'name' => 'French',
30             'targets' => [qw(en nl de el it pt es)],
31             },
32             'de' => {
33             'name' => 'German',
34             'targets' => [qw(en fr)],
35             },
36             'el' => {
37             'name' => 'Greek',
38             'targets' => [qw(en fr)],
39             },
40             'it' => {
41             'name' => 'Italian',
42             'targets' => [qw(en fr)],
43             'native' => 'Italiano',
44             },
45             'ja' => {
46             'name' => 'Japanese',
47             'targets' => [qw(en)],
48             },
49             'ko' => {
50             'name' => 'Korean',
51             'targets' => [qw(en)],
52             },
53             'pt' => {
54             'name' => 'Portuguese',
55             'targets' => [qw(en fr)],
56             },
57             'ru' => {
58             'name' => 'Russian',
59             'targets' => [qw(en)],
60             },
61             'es' => {
62             'name' => 'Spanish',
63             'targets' => [qw(en fr)],
64             },
65             );
66            
67             # make seperator $SimpleMood::DEATHSTAR: :=-=: ??
68             my %alta = (
69             'seperator' => 'Perl_AltaVista_BabelFish_DanMuey',
70             'url' => 'http://babelfish.altavista.com/tr',
71             'form' => {
72             'doit' => 'done',
73             'intl' => '1',
74             'tt' => 'urltext',
75             },
76             'urltext_param' => 'urltext',
77             'lp_param' => 'lp',
78             'pre' => '',
79             'pst' => '',
80             'q_pre' => '
',
81             'q_pst' => '',
82             # 'q_pre' => 'input type=hidden name="q" value="',
83             # 'q_pst' => '"',
84             'kls_pre' => 'input type="hidden" name="kls" value="',
85             'kls_pst' => '"',
86             'ienc_pre' => 'input type="hidden" name="ienc" value="',
87             'ienc_pst' => '"',
88             );
89              
90             { # start encapsulation of inside out object
91              
92             my %source :ATTR(init_arg => 'source', get => 'source');
93             my %target :ATTR(init_arg => 'target', get => 'target');
94             my %errstr :ATTR(get => 'errstr');
95              
96             sub BUILD {
97 8     8 0 269 my ($self, $ident, $args_ref) = @_;
98 8 100 100     46 $source{ $ident } = defined $args_ref->{'source'}
99             && exists $lang{ $args_ref->{'source'} }
100             ? $args_ref->{'source'} : 'en';
101 8   100     26 $target{ $ident } = $args_ref->{'target'} || '';
102            
103 8         19 $self->set_source( $source{ $ident } );
104 8         15 $self->set_target( $target{ $ident } );
105              
106 8         11 $errstr{ $ident } = undef;
107            
108 8         18 return;
109             }
110            
111             sub set_source {
112 8     8 1 10 my ($self, $_source) = @_;
113 8         15 my $ident = ident $self;
114 8 50 33     35 $source{ $ident } = $_source if defined $_source
115             && exists $lang{ $_source };
116 8 100 33     20 if(!defined $target{ $ident }
  8         188  
117             || !grep /^\Q$target{ $ident }\E$/,
118             @{ $lang{ $source{ $ident } }->{'targets'} }) {
119              
120 5         12 $target{ $ident } = $lang{ $source{ $ident } }->{'targets'}->[0];
121             }
122 8         15 return $source{ $ident };
123             }
124            
125             sub set_target {
126 8     8 1 10 my($self, $_target) = @_;
127 8         14 my $ident = ident $self;
128 8         164 $target{ $ident } = $_target
129             if defined $_target && exists $lang{ $_target }
130             && grep /^\Q$target{ $ident }\E$/,
131 8 50 33     36 @{ $lang{ $source{ $ident } }->{'targets'} };
      33        
132 8         14 return $target{ $ident };
133             }
134            
135             sub get_english {
136 16     16 1 297 my ($self, $_lang) = @_;
137 16 50       30 my $lnx = exists $lang{ $_lang } ? $_lang : $source{ ident $self };
138 16         84 return $lang{ $lnx }->{'name'};
139             }
140              
141             sub get_native {
142 0     0 1   my ($self, $_lang) = @_;
143 0           my $name = undef;
144 0 0         return $lang{ $_lang}->{'native'} if exists $lang{ $_lang}->{'native'};
145 0           require Locales::Language; # only need it here :)
146 0           eval {
147 0           $name = Locales::Language->new( $_lang )->code2language( $_lang );
148             }; # eval since this dies a lot...
149 0           return $name;
150             # return scalar $self->translate( $self->get_english($_lang), 'en', $_lang ); # or cache in hash native => '',
151             }
152            
153             sub get_source_languages_arrayref {
154 0     0 1   my ($self, $_lang) = @_;
155 0 0 0       $_lang = defined $_lang && exists $lang{ $_lang } ? $_lang : '';
156 0           my @target;
157 0 0         if($_lang) {
158 0           for(keys %lang) {
159 0           push @target, $_ if grep /^\Q$_lang\E$/,
160 0 0         @{ $lang{$_}->{'targets'} };
161             }
162             # list all languages that can be translated into this lang
163 0           return \@target;
164             }
165 0           return [keys %lang]; # list all source languages
166             }
167            
168             sub get_target_languages_arrayref {
169 0     0 1   my ($self, $_lang) = @_;
170 0 0 0       $_lang = defined $_lang && exists $lang{ $_lang }
171             ? $_lang : $source{ ident $self };
172 0           return $lang{ $_lang }->{'targets'};
173             }
174            
175             sub translate {
176 0     0 1   my ($self, $text, $_source, $_target) = @_;
177              
178 0           my $current_source = $self->get_source();
179 0           my $current_target = $self->get_target();
180 0 0         $self->set_source( $_source ) if $_source;
181 0 0         $self->set_target( $_target ) if $_target;
182              
183 0 0         if(ref $text eq 'ARRAY') {
184 0           $alta{'seperator'} =~ s/\W//g;
185 0           my $str = join " \n\n$alta{'seperator'}\n\n ", @{ $text };
  0            
186 0 0         my ($pre,$x,$y) = $self->translate($str) or return undef;
187              
188 0 0         $self->set_source( $current_source ) if $_source;
189 0 0         $self->set_target( $current_target ) if $_target;
190              
191 0 0         return ([split / \n\n$alta{'seperator'}\n\n /, $pre], $x, $y)
192             if wantarray;
193 0           return [split / \n\n$alta{'seperator'}\n\n /, $pre]
194             }
195             else {
196 1     1   30450 use LWP::UserAgent;
  1         128055  
  1         928  
197 0           $alta{'form'}->{ $alta{'urltext_param'} } = $text; # url encode?
198 0           $alta{'form'}->{ $alta{'lp_param'} }
199             = "$source{ ident $self }\_$target{ ident $self }";
200            
201 0           my $agt = new LWP::UserAgent;
202 0           $agt->agent("Perl Module: AltaVista::BabelFish/$VERSION "
203             . '(c) Dan Muey/2005');
204 0           my $res = $agt->post($alta{url}, $alta{form});
205            
206 0 0         $errstr{ ident $self } = $res->status_line()
207             if !$res->is_success();
208 0 0         return undef if !$res->is_success();
209 0           my $cnt = $res->content();
210            
211 0           my ($parse_me) = $cnt
212             =~ m/\Q$alta{'pre'}\E(.*)\Q$alta{'pst'}\E/si;
213 0           my ($tr) = $parse_me
214             =~ m/\Q$alta{'q_pre'}\E([^\"]*)\Q$alta{'q_pst'}\E/si;
215 0           my ($k) = $parse_me
216             =~ m/\Q$alta{'kls_pre'}\E([^\"]*)\Q$alta{'kls_pst'}\E/si;
217 0           my ($i) = $parse_me
218             =~ m/\Q$alta{'ienc_pre'}\E([^\"]*)\Q$alta{'ienc_pst'}\E/si;
219             # set to empty instead of undef to avoid warnings
220 0 0         $tr = '' if !defined $tr;
221 0 0         $k = '' if !defined $k;
222 0 0         $i = '' if !defined $i;
223              
224 0 0         $self->set_source( $current_source ) if $_source;
225 0 0         $self->set_target( $current_target ) if $_target;
226              
227 0 0         return ($tr, $k, $i) if wantarray;
228 0           return $tr;
229             }
230             }
231            
232             sub get_languages_hashref {
233 0     0 1   return \%lang;
234             }
235            
236             sub is_latest_version {
237 0     0 1   my($self) = @_;
238 0           my $ident = ident $self;
239 0           my ($cpan, $ior) = ('', '');
240            
241 0           eval 'use CPAN;';
242            
243 0 0         if($@) {
244 0           $errstr{ $ident } = $@;
245 0           return 0;
246             }
247            
248 0           eval <<'REDIRECT_END';
249             use IO::Redirect;
250             $ior = IO::Redirect->new();
251             $ior->redirect_stdout_stderr(\$cpan);
252             REDIRECT_END
253            
254 0           my $mod = CPAN::Shell->expand('Module', 'AltaVista::BabelFish');
255            
256 0 0         if(defined $mod) {
257 0 0         if($VERSION eq $mod->cpan_version) {
258 0 0         if(ref $ior) {
259 0           $ior->un_redirect_stdout_stderr();
260             }
261 0           return 1;
262             }
263             else {
264 0           $errstr{ $ident } = "Installed Version: $VERSION\nLatest "
265             . 'version: ' . $mod->cpan_version();
266             }
267             }
268             else {
269 0 0         $errstr{ $ident }
270             = "Undefined CPAN Object. Here is what CPAN said:\n$cpan"
271             if ref $ior;
272 0 0         $errstr{ $ident } = "Undefined CPAN Object." if !ref $ior;
273             }
274            
275 0 0         if(ref $ior) {
276 0           $ior->un_redirect_stdout_stderr();
277             }
278            
279 0           return;
280             }
281            
282             sub fishinfo {
283 0     0 1   my($self, $use_native) = @_;
284 0           my $title
285             = "AltaVista::BabelFish Perl module $VERSION by Daniel Muey";
286 0           my $url = 'http://search.cpan.org/~dmuey/AltaVista-BabelFish-'
287             . "$VERSION/BabelFish.pm";
288 0 0         my $html = -t STDIN ? 0 : 1;
289 0           my $fish = AltaVista::BabelFish->new;
290 0 0         my $out = $html
291             ? qq(

$title

\n)
292             . qq(

Click here)

293             . " for documentation.

\n
    \n"
294             : "$title\nSee `perldoc AltaVista::BabelFish` or $url"
295             . " for documentation\n\n";
296              
297 0           for my $src (sort @{ $fish->get_source_languages_arrayref() }) {
  0            
298 0 0 0       my $native = $use_native && $src ne 'en'
299             ? $fish->get_native($src) : '';
300 0           my $english = $fish->get_english($src);
301 0 0 0       $native = $native && $native ne $english ? "[$native] " : '';
302 0 0         $out .= "
  • " if $html;
  • 303 0           $out .= "$native$english ($src) translates into:\n";
    304 0 0         $out .= "
      \n" if $html;
    305 0           for(sort @{ $fish->get_target_languages_arrayref($src) }) {
      0            
    306 0 0         $out .= "
  • \n" if $html;
  • 307 0           $out .= " " . $fish->get_english($_) . " ($_)\n";
    308 0 0         $out .= " \n" if $html;
    309             }
    310 0 0         $out .= " \n" if $html;
    311 0 0         $out .= " \n" if $html;
    312 0           $out .= "\n";
    313             }
    314              
    315 0 0         $out .= "\n" if $html;
    316              
    317 0 0         if(!defined wantarray) {
    318 0           print $out;
    319             }
    320             else {
    321 0           return $out;
    322             }
    323             }
    324              
    325             } # end encapsulation of inside out object
    326            
    327             1; # yes I'd like to do "42;" but warnings doesn't like it :)
    328            
    329             __END__