File Coverage

blib/lib/Lingua/Num2Word.pm
Criterion Covered Total %
statement 29 49 59.1
branch 4 22 18.1
condition 5 8 62.5
subroutine 11 12 91.6
pod 5 5 100.0
total 54 96 56.2


line stmt bran cond sub pod time code
1             # For Emacs: -*- mode:cperl; eval: (folding-mode 1) -*-
2             #
3             # Copyright (c) PetaMem, s.r.o. 2002-present
4             #
5             package Lingua::Num2Word;
6             # ABSTRACT: A wrapper for Lingua::XXX::num2word modules.
7              
8             # {{{ use block
9              
10 1     1   153490 use 5.16.0;
  1         4  
11 1     1   10 use utf8;
  1         3  
  1         12  
12              
13 1     1   44 use Carp;
  1         2  
  1         112  
14 1     1   763 use Encode;
  1         18230  
  1         145  
15              
16             # }}}
17             # {{{ BEGIN
18             our $VERSION = '0.2603230';
19              
20             BEGIN {
21 1     1   9 use Exporter ();
  1         2  
  1         29  
22 1     1   5 use vars qw(@ISA @EXPORT_OK %known);
  1         1  
  1         2322  
23 1     1   21 @ISA = qw(Exporter);
24 1         1135 @EXPORT_OK = qw(cardinal get_interval known_langs langs preprocess_code);
25             }
26              
27             # }}}
28              
29             # {{{ templates for functional and object interface
30              
31             my $template_func = q{ use __PACKAGE_WITH_VERSION__ ();
32             $result = __PACKAGE__::__FUNCTION__($number);
33             };
34              
35             my $template_obj = q{ use __PACKAGE_WITH_VERSION__ ();
36             my $tmp_obj = new __PACKAGE__;
37             $result = $tmp_obj->__FUNCTION__($number);
38             };
39              
40             # }}}
41             # {{{ %known language codes from iso639 mapped to respective interface
42              
43             %known = (
44             afr => {
45             package => 'Numbers',
46             version => '',
47             limit_lo => 0,
48             limit_hi => 99_999_999_999,
49             function => 'parse',
50             code => $template_obj,
51             },
52             ces => {
53             package => 'Num2Word',
54             version => '',
55             limit_lo => 0,
56             limit_hi => 999_999_999,
57             function => 'num2ces_cardinal',
58             code => $template_func,
59             },
60             deu => {
61             package => 'Num2Word',
62             version => '',
63             limit_lo => 0,
64             limit_hi => 999_999_999,
65             function => 'num2deu_cardinal',
66             code => $template_func,
67             },
68             eng => {
69             package => 'Numbers',
70             version => '',
71             limit_lo => 1,
72             limit_hi => 999_999_999_999_999, # 1e63
73             function => '',
74             code => q{ use __PACKAGE_WITH_VERSION__ qw(American);
75             my $tmp_obj = new __PACKAGE__;
76             $tmp_obj->parse($number);
77             $result = $tmp_obj->get_string;
78             },
79             },
80             eus => {
81             package => 'Numbers',
82             version => '',
83             limit_lo => 0,
84             limit_hi => 999_999_999_999,
85             function => 'cardinal2alpha',
86             code => $template_func,
87             },
88             fra => {
89             package => 'Numbers',
90             version => '',
91             limit_lo => 0,
92             limit_hi => 999_999_999_999_999, # < 1e52
93             function => 'get_string',
94             code => q{
95             use Lingua::FRA::Numbers;
96             my $tmp_obj = Lingua::FRA::Numbers->new($number);
97             $result = $tmp_obj->get_string;
98             },
99             },
100             ind => {
101             package => 'Nums2Words',
102             version => '',
103             limit_lo => 0,
104             limit_hi => 999_999_999_999_999,
105             function => 'nums2words',
106             code => $template_func,
107             },
108             ita => {
109             package => 'Numbers',
110             version => '',
111             limit_lo => 0,
112             limit_hi => 999_999_999_999,
113             function => 'number_to_it',
114             code => $template_func,
115             },
116             jpn => {
117             package => 'Number',
118             version => '',
119             limit_lo => 1,
120             limit_hi => 999_999_999_999_999,
121             function => 'to_string',
122             code => q{ use __PACKAGE_WITH_VERSION__ ();
123             my @words = __PACKAGE__::__FUNCTION__($number);
124             $result = join ' ', @words;
125             },
126             },
127             nld => {
128             package => 'Num2Word',
129             version => '',
130             limit_lo => 0,
131             limit_hi => 999_999_999,
132             function => 'num2nld_cardinal',
133             code => $template_func,
134             },
135             nor => {
136             package => 'Num2Word',
137             version => '',
138             limit_lo => 0,
139             limit_hi => 999_999_999,
140             function => 'num2no_cardinal',
141             code => $template_obj,
142             },
143             pol => {
144             package => 'Numbers',
145             version => '',
146             limit_lo => 0,
147             limit_hi => 9_999_999_999_999,
148             function => 'parse',
149             code => $template_obj,
150             },
151             por => {
152             package => 'Nums2Words',
153             version => '',
154             limit_lo => 0,
155             limit_hi => 999_999_999_999_999,
156             function => 'num2word',
157             code => $template_func,
158             },
159             rus => {
160             package => 'Number',
161             version => '',
162             limit_lo => 0,
163             limit_hi => 999_999_999_999_999,
164             function => 'rur_in_words',
165             code => q{ use __PACKAGE_WITH_VERSION__ ();
166             $result = __PACKAGE__::__FUNCTION__($number);
167             if ($result) {
168             if ($number) {
169             $result =~ s/\s+\S+\s+\S+\s+\S+$//;
170             }
171             else {
172             $result =~ s/\s+\S+$//;
173             }
174             $result =~ s/^\s+//;
175             }
176             },
177             },
178             spa => {
179             package => 'Numeros',
180             version => '',
181             limit_lo => 0,
182             limit_hi => 999_999_999_999_999,
183             function => 'cardinal',
184             code => $template_obj,
185             },
186             swe => {
187             package => 'Num2Word',
188             version => '',
189             limit_lo => 0,
190             limit_hi => 999_999_999,
191             function => 'num2sv_cardinal',
192             code => $template_func,
193             },
194             zho => {
195             package => 'Numbers',
196             version => '',
197             limit_lo => 1,
198             limit_hi => 999_999_999_999_999,
199             function => '',
200             code => q{ use __PACKAGE_WITH_VERSION__ qw(traditional);
201             my $tmp_obj = new __PACKAGE__;
202             $tmp_obj->parse($number);
203             $result = $tmp_obj->get_string;
204             },
205             },
206             );
207              
208             # }}}
209             # {{{ new constructor
210              
211             sub new {
212 5     5 1 141377 return bless {}, shift;
213             }
214              
215             # }}}
216             # {{{ known_langs list of currently supported languages
217              
218             sub known_langs {
219 0 0   0 1 0 return wantarray ? sort keys %known : [ sort keys %known ];
220             }
221              
222             # }}}
223             # {{{ get_interval get minimal and maximal supported number
224              
225             # Return:
226             # undef for unsupported language
227             # list or list reference (depending to calling context) with
228             # minimal and maximal supported number
229             #
230             sub get_interval {
231 2 50   2 1 965 my $self = ref($_[0]) ? shift : Lingua::Num2Word->new();
232 2   100     8 my $lang = shift // return;
233              
234 1 50       10 return if (!defined $known{$lang});
235              
236 0         0 my @limits = ($known{$lang}{limit_lo}, $known{$lang}{limit_hi});
237              
238 0 0       0 return wantarray ? @limits : \@limits;
239             }
240              
241             # }}}
242             # {{{ cardinal convert number to text
243              
244             sub cardinal {
245 2 50   2 1 995 my $self = ref($_[0]) ? shift : Lingua::Num2Word->new();
246 2         4 my $result = '';
247 2   50     9 my $lang = shift // return $result;
248 0   0     0 my $number = shift // return $result;
249              
250 0         0 $lang = lc $lang;
251              
252 0 0       0 return $result if (!defined $known{$lang});
253              
254 0 0       0 if (defined $known{$lang}{lang}) {
255 0         0 eval $self->preprocess_code($known{$lang}{lang}); ## no critic
256 0 0       0 carp $@ if ($@);
257             }
258             else {
259 0         0 eval $self->preprocess_code($lang); ## no critic
260 0 0       0 carp $@ if ($@);
261             }
262              
263 0         0 return $result;
264             }
265              
266             # }}}
267             # {{{ preprocess_code prepare code for evaluation
268              
269             sub preprocess_code {
270 2     2 1 1123 my $self = shift;
271 2   100     12 my $lang = shift // return;
272              
273 1 50       5 return if !exists $known{$lang};
274              
275 0           my $result = $known{$lang}{code};
276 0           my $pkg_name = 'Lingua::' . uc($lang) . '::' . $known{$lang}{package};
277 0 0         my $pkg_name_with_version = $known{$lang}{version} ne ''
278             ? "$pkg_name $known{$lang}{version}"
279             : $pkg_name
280             ;
281              
282 0           my $function = $known{$lang}{function};
283              
284 0           $result =~ s/__PACKAGE_WITH_VERSION__/$pkg_name_with_version/g;
285 0           $result =~ s/__PACKAGE__/$pkg_name/g;
286 0           $result =~ s/__FUNCTION__/$function/g;
287              
288 0           return $result;
289             }
290             # }}}
291              
292             1;
293             __END__