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   89489 use strict;
  102         837  
  102         3090  
4 102     102   546 use warnings;
  102         191  
  102         2606  
5 102     102   537 use Carp;
  102         196  
  102         12356  
6 102     102   733 use base qw(Unicode::Collate);
  102         238  
  102         79687  
7              
8             our $VERSION = '1.30';
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   1299 my $locale = shift;
50 135 100       529 if ($locale) {
51 133         530 $locale = lc $locale;
52 133         500 $locale =~ tr/\-\ \./_/;
53 133 100       853 $locale =~ s/_([0-9a-z]+)\z/$TypeAlias{$1} ?
  42         335  
54             "_$TypeAlias{$1}" : "_$1"/e;
55 133 100       829 $LocaleFile{$locale} and return $locale;
56              
57 34         137 my @code = split /_/, $locale;
58 34         89 my $lan = shift @code;
59 34 100 100     210 my $scr = @code && length $code[0] == 4 ? ucfirst shift @code : '';
60 34 100 100     168 my $reg = @code && length $code[0] < 4 ? uc shift @code : '';
61 34 100       98 my $var = @code ? shift @code : '';
62              
63 34         65 my @list;
64 34 100       180 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         177 push @list, (
71             "${lan}_${scr}_${reg}",
72             "${lan}_${scr}",
73             "${lan}_${reg}",
74             ${lan},
75             );
76 34         92 for my $loc (@list) {
77 113 100       401 $LocaleFile{$loc} and return $loc;
78             }
79             }
80 14         49 return 'default';
81             }
82              
83             sub getlocale {
84 122     122 1 1754 return shift->{accepted_locale};
85             }
86              
87             sub locale_version {
88 3     3 1 17 return shift->{locale_version};
89             }
90              
91             sub _fetchpl {
92 123     123   308 my $accepted = shift;
93 123         350 my $f = $LocaleFile{$accepted};
94 123 100       403 return if !$f;
95 111         338 $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         369 my $path = "Unicode/Collate/Locale/$f";
101 111         93690 my $h = do $path;
102 111 50       728 croak "Unicode/Collate/Locale/$f can't be found" if !$h;
103 111         395 return $h;
104             }
105              
106             sub new {
107 123     123 0 15773 my $class = shift;
108 123         723 my %hash = @_;
109 123         622 $hash{accepted_locale} = _locale($hash{locale});
110              
111 123 50       594 if (exists $hash{table}) {
112 0         0 croak "your table can't be used with Unicode::Collate::Locale";
113             }
114              
115 123         481 my $href = _fetchpl($hash{accepted_locale});
116 123         1065 while (my($k,$v) = each %$href) {
117 251 100       842 if (!exists $hash{$k}) {
    50          
118 250         1066 $hash{$k} = $v;
119             } elsif ($k eq 'entry') {
120 1         6 $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         1779 return $class->SUPER::new(%hash);
126             }
127              
128             1;
129             __END__