| 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__ |