File Coverage

blib/lib/Encode/JP/Mobile/Character.pm
Criterion Covered Total %
statement 89 93 95.7
branch 37 40 92.5
condition 2 2 100.0
subroutine 18 18 100.0
pod 8 8 100.0
total 154 161 95.6


line stmt bran cond sub pod time code
1             package Encode::JP::Mobile::Character;
2 24     24   2180 use strict;
  24         50  
  24         1137  
3 24     24   203 use warnings;
  24         54  
  24         857  
4 24     24   1399 use Encode;
  24         16204  
  24         2784  
5 24     24   22739 use Encode::JP::Mobile::Charnames;
  24         166  
  24         237  
6 24     24   252 use Encode::JP::Mobile ':props';
  24         53  
  24         4123  
7 24     24   158 use File::ShareDir 'dist_file';
  24         48  
  24         1144  
8 24     24   131 use Carp;
  24         49  
  24         26650  
9              
10             sub from_unicode {
11 783     783 1 4870 my ($class, $unicode) = @_;
12 783         4725 bless {unicode => $unicode}, $class;
13             }
14              
15             sub from_number {
16 6     6 1 3267 my $class = shift;
17 6         25 my %args = @_;
18 6 100       162 my $carrier = $args{carrier} or croak "missing carrier";
19 5 100       143 my $number = $args{number} or croak "missing number";
20              
21 4         15 my $dat = $class->_load_map;
22              
23 4         31 $carrier = +{I => 'docomo', E => 'kddi', V => 'softbank', 'H' => 'docomo'}->{$carrier};
24 4         21 $number = encode_utf8($number);
25              
26 4 100       119 my $key = $carrier eq 'kddi' ? 'unicode_auto' : 'unicode';
27 4         7 for my $row (@{$dat->{$carrier}}) {
  4         12  
28 1349 100       2692 if ($row->{number} eq $number) {
29 3         23 return $class->from_unicode(hex $row->{$key});
30             }
31             }
32 1         249 croak "unknown number: $number for $carrier";
33             }
34              
35             sub unicode_hex {
36 4     4 1 642 my ($class, ) = @_;
37 4         43 sprintf '%X', $class->{unicode};
38             }
39              
40             my $map;
41             sub _load_map {
42 6         45 $map ||= +{
43 23   100 23   78 map { $_, do( _dist_file( 'Encode-JP-Mobile', "${_}-table.pl" ) ) }
44             qw/docomo kddi softbank/
45             };
46              
47 23         47 return $map;
48             }
49              
50             sub name {
51 10     10 1 2486 my $self = shift;
52              
53 10         31 my $dat = $self->_load_map;
54              
55 10         40 for my $carrier (keys %$dat) {
56 22 100       63 my $key = $carrier eq 'kddi' ? 'unicode_auto' : 'unicode';
57 22         32 for my $row (@{ $dat->{$carrier} }) {
  22         53  
58 7801 50       14556 next unless exists $row->{'name'};
59 7801 100       18532 if (hex($row->{$key}) == $self->{unicode}) {
60 10         64 return decode_utf8($row->{name});
61             }
62             }
63             }
64              
65 0         0 return;
66             }
67              
68             sub name_en {
69 5     5 1 518 my $self = shift;
70              
71 5         16 my $dat = $self->_load_map;
72              
73 5         18 for my $carrier (keys %$dat) {
74 12 100       36 my $key = $carrier eq 'kddi' ? 'unicode_auto' : 'unicode';
75 12         16 for my $row (@{ $dat->{$carrier} }) {
  12         28  
76 3296 100       6360 next unless exists $row->{'name_en'};
77 2070 100       4883 if (hex($row->{$key}) == $self->{unicode}) {
78 5         27 return decode_utf8($row->{name_en});
79             }
80             }
81             }
82              
83 0         0 return;
84             }
85              
86             sub number {
87 4     4 1 1639 my $self = shift;
88              
89 4         13 my $dat = $self->_load_map;
90              
91 4         17 for my $carrier (keys %$dat) {
92 11 100       47 my $key = $carrier eq 'kddi' ? 'unicode_auto' : 'unicode';
93 11         18 for my $row (@{ $dat->{$carrier} }) {
  11         27  
94 4779 50       10704 next unless exists $row->{'number'};
95 4779 100       20169 if (hex($row->{$key}) == $self->{unicode}) {
96 4         34 return decode_utf8($row->{number});
97             }
98             }
99             }
100              
101 0         0 return;
102             }
103              
104             my $fallback_name_cache = do {
105             my $src = _dist_file('Encode-JP-Mobile', 'convert-map-utf8.pl');
106             do $src;
107             };
108             sub fallback_name {
109 2292     2292 1 5278 my ($self, $carrier) = @_;
110 2292 100       5129 croak "missing carrier" unless $carrier;
111 2291 100       6967 croak "invalid carrier name(I or E or V)" unless $carrier =~ /^[IEVH]$/;
112              
113 2290         9210 $carrier = +{I => 'docomo', E => 'kddi', V => 'softbank', 'H' => 'docomo'}->{$carrier};
114              
115 2290         7839 for my $from (keys %$fallback_name_cache) {
116 5776 100       27169 if (my $row = $fallback_name_cache->{$from}->{sprintf '%X', $self->{unicode}}->{$carrier}) {
117 1527 100       4110 if ($row->{type} eq 'name') {
118 1059         3321 return decode 'utf8', $row->{unicode};
119             } else {
120 468         1418 return;
121             }
122             }
123             }
124 763         6817 return;
125             }
126              
127             sub carrier {
128 3     3 1 7 my $self = shift;
129 3         16 my $uni = chr $self->{unicode};
130 3 100       33 if ($uni =~ /\p{InDoCoMoPictograms}/) {
    100          
    50          
131 1         5 return 'I';
132             } elsif ($uni =~ /\p{InSoftBankPictograms}/) {
133 1         152 return 'V';
134             } elsif ($uni =~ /\p{InKDDIAutoPictograms}/) {
135 1         150 return 'E';
136             } else {
137 0         0 return;
138             }
139             }
140              
141              
142             sub _dist_file {
143 24     24   7569 local $^W = 0; no warnings 'uninitialized'; # shuts up File-ShareDir warnings
  24     30   55  
  24         1832  
  30         142  
144 30         185 dist_file(@_);
145             }
146              
147             1;
148             __END__