File Coverage

blib/lib/Unicode/Collate/Locale.pm
Criterion Covered Total %
statement 50 52 96.1
branch 23 26 88.4
condition 6 6 100.0
subroutine 9 9 100.0
pod 2 3 66.6
total 90 96 93.7


line stmt bran cond sub pod time code
1             package Unicode::Collate::Locale;
2              
3 102     102   79869 use strict;
  102         735  
  102         2930  
4 102     102   517 use warnings;
  102         329  
  102         2525  
5 102     102   564 use Carp;
  102         203  
  102         10434  
6 102     102   716 use base qw(Unicode::Collate);
  102         486  
  102         73420  
7              
8             our $VERSION = '1.29';
9              
10             my $PL_EXT = '.pl';
11              
12             my %LocaleFile = map { ($_, $_) } qw(
13             af ar as az be bn ca cs cu cy da dsb ee eo es et fa fi fil fo gu
14             ha haw he hi hr hu hy ig is ja kk kl kn ko kok lkt ln lt lv
15             mk ml mr mt nb nn nso om or pa pl ro sa se si sk sl sq sr sv
16             ta te th tn to tr uk ur vi vo wae wo yo zh
17             );
18             $LocaleFile{'default'} = '';
19             # aliases
20             $LocaleFile{'bs'} = 'hr';
21             $LocaleFile{'bs_Cyrl'} = 'sr';
22             $LocaleFile{'sr_Latn'} = 'hr';
23             # short file names
24             $LocaleFile{'de__phonebook'} = 'de_phone';
25             $LocaleFile{'de_AT_phonebook'} = 'de_at_ph';
26             $LocaleFile{'es__traditional'} = 'es_trad';
27             $LocaleFile{'fr_CA'} = 'fr_ca';
28             $LocaleFile{'fi__phonebook'} = 'fi_phone';
29             $LocaleFile{'si__dictionary'} = 'si_dict';
30             $LocaleFile{'sv__reformed'} = 'sv_refo';
31             $LocaleFile{'ug_Cyrl'} = 'ug_cyrl';
32             $LocaleFile{'zh__big5han'} = 'zh_big5';
33             $LocaleFile{'zh__gb2312han'} = 'zh_gb';
34             $LocaleFile{'zh__pinyin'} = 'zh_pin';
35             $LocaleFile{'zh__stroke'} = 'zh_strk';
36             $LocaleFile{'zh__zhuyin'} = 'zh_zhu';
37              
38             my %TypeAlias = qw(
39             phone phonebook
40             phonebk phonebook
41             dict dictionary
42             reform reformed
43             trad traditional
44             big5 big5han
45             gb2312 gb2312han
46             );
47              
48             sub _locale {
49 135     135   1074 my $locale = shift;
50 135 100       543 if ($locale) {
51 133         483 $locale = lc $locale;
52 133         494 $locale =~ tr/\-\ \./_/;
53 133 100       746 $locale =~ s/_([0-9a-z]+)\z/$TypeAlias{$1} ?
  42         314  
54             "_$TypeAlias{$1}" : "_$1"/e;
55 133 100       1122 $LocaleFile{$locale} and return $locale;
56              
57 34         142 my @code = split /_/, $locale;
58 34         86 my $lan = shift @code;
59 34 100 100     224 my $scr = @code && length $code[0] == 4 ? ucfirst shift @code : '';
60 34 100 100     167 my $reg = @code && length $code[0] < 4 ? uc shift @code : '';
61 34 100       95 my $var = @code ? shift @code : '';
62              
63 34         59 my @list;
64 34 100       172 push @list, (
65             "${lan}_${scr}_${reg}_$var",
66             "${lan}_${scr}__$var", # empty $scr should not be ${lan}__$var.
67             "${lan}_${reg}_$var", # empty $reg may be ${lan}__$var.
68             "${lan}__$var",
69             ) if $var ne '';
70 34         185 push @list, (
71             "${lan}_${scr}_${reg}",
72             "${lan}_${scr}",
73             "${lan}_${reg}",
74             ${lan},
75             );
76 34         85 for my $loc (@list) {
77 113 100       469 $LocaleFile{$loc} and return $loc;
78             }
79             }
80 14         51 return 'default';
81             }
82              
83             sub getlocale {
84 122     122 1 1637 return shift->{accepted_locale};
85             }
86              
87             sub locale_version {
88 3     3 1 15 return shift->{locale_version};
89             }
90              
91             sub _fetchpl {
92 123     123   295 my $accepted = shift;
93 123         362 my $f = $LocaleFile{$accepted};
94 123 100       423 return if !$f;
95 111         316 $f .= $PL_EXT;
96              
97             # allow to search @INC
98             # use File::Spec;
99             # my $path = File::Spec->catfile('Unicode', 'Collate', 'Locale', $f);
100 111         359 my $path = "Unicode/Collate/Locale/$f";
101 111         82610 my $h = do $path;
102 111 50       679 croak "Unicode/Collate/Locale/$f can't be found" if !$h;
103 111         390 return $h;
104             }
105              
106             sub new {
107 123     123 0 10547 my $class = shift;
108 123         682 my %hash = @_;
109 123         581 $hash{accepted_locale} = _locale($hash{locale});
110              
111 123 50       504 if (exists $hash{table}) {
112 0         0 croak "your table can't be used with Unicode::Collate::Locale";
113             }
114              
115 123         436 my $href = _fetchpl($hash{accepted_locale});
116 123         1078 while (my($k,$v) = each %$href) {
117 251 100       810 if (!exists $hash{$k}) {
    50          
118 250         1027 $hash{$k} = $v;
119             } elsif ($k eq 'entry') {
120 1         8 $hash{$k} = $v.$hash{$k};
121             } else {
122 0         0 croak "$k is reserved by $hash{locale}, can't be overwritten";
123             }
124             }
125 123         1598 return $class->SUPER::new(%hash);
126             }
127              
128             1;
129             __END__