File Coverage

lib/Locale/Country/Extra.pm
Criterion Covered Total %
statement 69 69 100.0
branch 14 14 100.0
condition n/a
subroutine 18 18 100.0
pod 10 10 100.0
total 111 111 100.0


line stmt bran cond sub pod time code
1             package Locale::Country::Extra;
2 2     2   61302 use strict;
  2         14  
  2         49  
3 2     2   11 use warnings;
  2         3  
  2         66  
4              
5             our $VERSION = '1.0.3';
6              
7 2     2   767 use Locale::Country qw();
  2         67455  
  2         67  
8 2     2   898 use Locale::Country::Multilingual {use_io_layer => 1};
  2         6812  
  2         9  
9              
10             our %COUNTRY_MAP = (
11             "brunei darussalam" => "bn",
12             "cocos islands" => "cc",
13             "congo" => "cg",
14             "heard island and mcdonald islands" => "hm",
15             "hong kong s.a.r." => "hk",
16             "korea" => "kr",
17             "macao s.a.r." => "mo",
18             "myanmar" => "mm",
19             "islamic republic of pakistan" => "pk",
20             "palestinian authority" => "ps",
21             "pitcairn" => "pn",
22             "saint vincent and the grenadines" => "vc",
23             "south georgia" => "gs",
24             "south georgia & south sandwich" => "gs",
25             "syrian arab republic" => "sy",
26             "u.a.e." => "ae",
27             "vatican city state" => "va",
28             "virgin islands" => "vg"
29             );
30              
31             sub new {
32 1     1 1 83 my $class = shift;
33              
34 1         2 my $self = {};
35 1         3 bless $self, $class;
36              
37 1         6 $self->{_country_codes} = $self->_build_country_codes;
38 1         8 $self->{_idd_codes} = $self->_build_idd_codes;
39              
40 1         6 return $self;
41             }
42              
43             sub country_from_code {
44 7     7 1 1112 my ($self, $code) = @_;
45 7         9 $code = lc $code;
46              
47             # we need gb
48 7 100       16 $code = 'gb' if $code eq 'uk';
49              
50 7         16 return $self->_country_codes->{$code};
51             }
52              
53             sub code_from_country {
54 24     24 1 4628 my ($self, $country) = @_;
55              
56 24         105 $country =~ s/^\s+|\s+$//g;
57 24         35 $country = lc $country;
58              
59 24 100       112 return $COUNTRY_MAP{$country} if $COUNTRY_MAP{$country};
60              
61 7         26 my $code = Locale::Country::Multilingual->new()->country2code($country);
62              
63 7 100       257 return $code ? lc $code : undef;
64              
65             }
66              
67             sub idd_from_code {
68 10     10 1 7696 my ($self, $code) = @_;
69 10         15 $code = lc $code;
70              
71             # we need gb
72 10 100       24 $code = 'gb' if $code eq 'uk';
73              
74 10         22 return $self->_idd_codes->{$code};
75             }
76              
77             sub get_valid_phone {
78 7     7 1 11 my ($self, $number) = @_;
79              
80 7 100       32 return '' if $number =~ /^([0-9])\1{5}/;
81              
82 6         21 $number =~ s/\D//g; # Remove non-digits
83 6         15 $number =~ s/^00//; # Remove the leading '00'.
84 6         14 return $number;
85             }
86              
87             sub code_from_phone {
88 4     4 1 2340 my ($self, $number) = @_;
89              
90 4 100       11 if (my $first = $self->codes_from_phone($number)) {
91 3         5 return lc ${$first}[0];
  3         19  
92             }
93              
94 1         4 return '';
95             }
96              
97             sub codes_from_phone {
98 7     7 1 2665 my ($self, $number) = @_;
99              
100 7 100       16 if (my $phone = $self->get_valid_phone($number)) {
101 6         6 my %codes = %{$self->_idd_codes};
  6         14  
102 6         150 return [sort grep { $phone =~ /^$codes{$_}/ } keys %codes];
  1386         7010  
103             }
104              
105 1         4 return '';
106             }
107              
108             sub all_country_names {
109 1     1 1 2088 my $self = shift;
110 1         2 return values %{$self->_country_codes};
  1         4  
111             }
112              
113             sub all_country_codes {
114 1     1 1 2047 my $self = shift;
115 1         1 return keys %{$self->_country_codes};
  1         4  
116             }
117              
118             sub localized_code2country {
119 1     1 1 6432 my ($self, $country_code, $lang) = @_;
120              
121 1         7 my $lcm = Locale::Country::Multilingual->new();
122 1         16 return $lcm->code2country($country_code, $lang);
123             }
124              
125             sub _country_codes {
126 9     9   14 my ($self) = @_;
127 9         201 return $self->{_country_codes};
128             }
129              
130             sub _build_country_codes {
131 1     1   9 my $lcm = Locale::Country::Multilingual->new();
132 1         16 my @codes = $lcm->all_country_codes();
133              
134 1         27213 my $country_hash = {};
135 1         4 foreach my $code (@codes) {
136 249         5469 $country_hash->{lc($code)} = $lcm->code2country($code);
137             }
138              
139 1         59 return $country_hash;
140             }
141              
142             sub _idd_codes {
143 16     16   17 my ($self) = @_;
144 16         552 return $self->{_idd_codes};
145             }
146              
147             sub _build_idd_codes {
148             return {
149 1     1   122 "us" => 1,
150             "bs" => 1242,
151             "bb" => 1246,
152             "ai" => 1264,
153             "ag" => 1268,
154             "vg" => 1284,
155             "vi" => 1340,
156             "ky" => 1345,
157             "bm" => 1441,
158             "gd" => 1473,
159             "tc" => 1649,
160             "ms" => 1664,
161             "mp" => 1670,
162             "lc" => 1758,
163             "vc" => 1784,
164             "pr" => 1787,
165             "dm" => 1767,
166             "do" => 1809,
167             "tt" => 1868,
168             "kn" => 1869,
169             "jm" => 1876,
170             "eg" => 20,
171             "eh" => 21,
172             "ma" => 212,
173             "dz" => 213,
174             "tn" => 216,
175             "ly" => 218,
176             "gm" => 220,
177             "sn" => 221,
178             "mr" => 222,
179             "ml" => 223,
180             "gn" => 224,
181             "ci" => 225,
182             "bf" => 226,
183             "ne" => 227,
184             "tg" => 228,
185             "bj" => 229,
186             "mu" => 230,
187             "lr" => 231,
188             "sl" => 232,
189             "gh" => 233,
190             "ng" => 234,
191             "td" => 235,
192             "cf" => 236,
193             "cm" => 237,
194             "cv" => 238,
195             "st" => 239,
196             "gq" => 240,
197             "ga" => 241,
198             "cg" => 242,
199             "cd" => 243,
200             "ao" => 244,
201             "gw" => 245,
202             "io" => 246,
203             "sc" => 248,
204             "sd" => 249,
205             "rw" => 250,
206             "et" => 251,
207             "so" => 252,
208             "dj" => 253,
209             "ke" => 254,
210             "tz" => 255,
211             "ug" => 256,
212             "bi" => 257,
213             "mz" => 258,
214             "zm" => 260,
215             "mg" => 261,
216             "RE" => 262,
217             "zw" => 263,
218             "na" => 264,
219             "mw" => 265,
220             "ls" => 266,
221             "bw" => 267,
222             "sz" => 268,
223             "yt" => 269,
224             "za" => 27,
225             "sh" => 290,
226             "er" => 291,
227             "aw" => 297,
228             "fo" => 298,
229             "gl" => 299,
230             "gr" => 30,
231             "nl" => 31,
232             "be" => 32,
233             "fr" => 33,
234             "es" => 34,
235             "gi" => 350,
236             "pt" => 351,
237             "lu" => 352,
238             "ie" => 353,
239             "is" => 354,
240             "al" => 355,
241             "mt" => 356,
242             "cy" => 357,
243             "fi" => 358,
244             "bg" => 359,
245             "hu" => 36,
246             "lt" => 370,
247             "lv" => 371,
248             "ee" => 372,
249             "md" => 373,
250             "am" => 374,
251             "by" => 375,
252             "ad" => 376,
253             "mc" => 377,
254             "sm" => 378,
255             "va" => 379,
256             "ua" => 380,
257             "rs" => 381,
258             "hr" => 385,
259             "si" => 386,
260             "ba" => 387,
261             "mk" => 389,
262             "it" => 39,
263             "ro" => 40,
264             "li" => 417,
265             "ch" => 41,
266             "cz" => 420,
267             "sk" => 421,
268             "at" => 43,
269             "je" => 441534,
270             "im" => 44,
271             "gb" => 44,
272             "dk" => 45,
273             "se" => 46,
274             "no" => 47,
275             "pl" => 48,
276             "de" => 49,
277             "fk" => 500,
278             "bz" => 501,
279             "gt" => 502,
280             "sv" => 503,
281             "hn" => 504,
282             "ni" => 505,
283             "cr" => 506,
284             "pa" => 507,
285             "pm" => 508,
286             "ht" => 509,
287             "pe" => 51,
288             "mx" => 52,
289             "cu" => 53,
290             "ar" => 54,
291             "br" => 55,
292             "cl" => 56,
293             "co" => 57,
294             "ve" => 58,
295             "gp" => 590,
296             "bo" => 591,
297             "gy" => 592,
298             "ec" => 593,
299             "gf" => 594,
300             "py" => 595,
301             "mq" => 596,
302             "sr" => 597,
303             "uy" => 598,
304             "an" => 599,
305             "my" => 60,
306             "au" => 61,
307             "cx" => 618,
308             "id" => 62,
309             "ph" => 63,
310             "nz" => 64,
311             "pn" => 649,
312             "sg" => 65,
313             "th" => 66,
314             "tl" => 670,
315             "gu" => 671,
316             "aq" => 672,
317             "bn" => 673,
318             "nr" => 674,
319             "pg" => 675,
320             "to" => 676,
321             "sb" => 677,
322             "vu" => 678,
323             "fj" => 679,
324             "pw" => 680,
325             "wf" => 681,
326             "ck" => 682,
327             "nu" => 683,
328             "as" => 684,
329             "ws" => 685,
330             "ki" => 686,
331             "nc" => 687,
332             "tv" => 688,
333             "pf" => 689,
334             "tk" => 690,
335             "fm" => 691,
336             "mh" => 692,
337             "ru" => 7,
338             "kz" => 7,
339             "jp" => 81,
340             "kr" => 82,
341             "vn" => 84,
342             "kp" => 850,
343             "hk" => 852,
344             "mo" => 853,
345             "kh" => 855,
346             "la" => 856,
347             "cn" => 86,
348             "bd" => 880,
349             "tw" => 886,
350             "tr" => 90,
351             "in" => 91,
352             "pk" => 92,
353             "af" => 93,
354             "lk" => 94,
355             "mm" => 95,
356             "mv" => 960,
357             "lb" => 961,
358             "jo" => 962,
359             "sy" => 963,
360             "iq" => 964,
361             "kw" => 965,
362             "sa" => 966,
363             "ye" => 967,
364             "om" => 968,
365             "ps" => 970,
366             "ae" => 971,
367             "il" => 972,
368             "bh" => 973,
369             "qa" => 974,
370             "bt" => 975,
371             "mn" => 976,
372             "np" => 977,
373             "ir" => 98,
374             "tj" => 992,
375             "tm" => 993,
376             "az" => 994,
377             "ge" => 995,
378             "kg" => 996,
379             "uz" => 998,
380             };
381             }
382              
383             1;
384              
385             __END__