File Coverage

blib/lib/Text/TransMetaphone/am.pm
Criterion Covered Total %
statement 57 78 73.0
branch 7 12 58.3
condition 2 3 66.6
subroutine 8 8 100.0
pod 0 2 0.0
total 74 103 71.8


line stmt bran cond sub pod time code
1             package Text::TransMetaphone::am;
2              
3             # If either of these next two lines are inside
4             # the BEGIN block the package will break.
5             #
6 1     1   7 use utf8;
  1         3  
  1         12  
7 1     1   769 use Regexp::Ethiopic::Amharic qw(:forms setForm overload);
  1         7949  
  1         18  
8              
9             BEGIN
10             {
11 1     1   440 use strict;
  1         2  
  1         30  
12 1     1   5 use warnings;
  1         2  
  1         83  
13 1     1   8 use vars qw( $VERSION $LocaleRange %IMExpected %IMError %plosives );
  1         2  
  1         117  
14              
15 1     1   252 $VERSION = '0.10';
16              
17 1         7 $LocaleRange = qr/[ሀ-ቍበ-ኾዐ-ዷጀ-ጕጠ-፼]/;
18              
19 1         7 %plosives = (
20             k => 'ቀ',
21             t => 'ጠ',
22             ʧ => 'ጨ',
23             s => 'ጸ',
24             p => 'ጰ',
25             );
26 1         11 %IMExpected =(
27             ስ => "s",
28             ጽ => "s'",
29             ቅ => "k'",
30             ቕ => "q",
31             ት => "t",
32             ጥ => "t'",
33             ች => "ʧ",
34             ጭ => "ʧ",
35             ን => "n",
36             ክ => "k",
37             ዝ => "z",
38             ዥ => "ʒ",
39             ጵ => "p'",
40             ፕ => "p"
41             );
42 1         45 %IMError =(
43             ስ => "s'",
44             ጽ => "s",
45             ቅ => "q",
46             ቕ => "k'",
47             ት => "t'",
48             ጥ => "t",
49             ች => "ʧ'",
50             ጭ => "ʧ'",
51             ን => "ɲ",
52             ክ => "x",
53             ዝ => "ʒ",
54             ዥ => "z",
55             ጵ => "p",
56             ፕ => "p'"
57             );
58             }
59              
60              
61             sub trans_metaphone
62             {
63              
64 1     1 0 3 $_ = $_[0];
65              
66             #
67             # strip out all but first vowel:
68             #
69 1         5 s/^[=#አ#=]/a/;
70 1         4 s/[=#አ#=]//g;
71              
72 1         4 s/([#11#])/setForm($1,$ሳድስ)."ዋ"/eg;
  0         0  
73 1         3 s/[=#ሀ#=]/h/g;
74 1         3 s/[=#ሰ#=]/ሰ/g;
75 1         21 s/[=#ጸ#=]/ጸ/g;
76             # s/(.)[=#ጸ#=]/s'/g; # compare this to ts in english, it should be a 2nd key
77              
78             #
79             # now strip vowels, this simplies later code:
80             #
81 1 50       13 s/(\p{InEthiopic})/ ($1 eq 'ኘ') ? $1 : setForm($1,$ሳድስ)/eg;
  4         104  
82              
83 1         19 tr/ልምርሽብቭውይድጅግፍ/lmrʃbvwjdʤgf/;
84              
85              
86 1         4 my @keys = ( $_ );
87 1         2 my $re = $_;
88              
89              
90             #
91             # mixed glyphs: ዽ for ጵ or ዽ is shift stick for ድ
92             #
93 1 50       6 if ( $keys[0] =~ /ዽ/ ) {
94 0         0 $keys[2] = $keys[1] = $keys[0];
95 0         0 $keys[0] =~ s/ዽ/ɗ/; # caps problem
96 0         0 $keys[1] =~ s/ዽ/d/; # literal
97 0         0 $keys[2] =~ s/ዽ/p'/; # mistaken glyph
98 0         0 $re =~ s/ዽ/([dɗ]|p')/g;
99             }
100             #
101             # mixed glyphs: ኘ for ፕ or ኘ is shift stick for ነ
102             #
103 1 50       3 if ( $keys[0] =~ /ኘ/ ) {
104 0         0 my (@newKeysA, @newKeysB);
105 0         0 for (my $i=0; $i < @keys; $i++) {
106 0         0 $newKeysA[$i] = $newKeysB[$i] = $keys[$i]; # copy old keys
107 0         0 $keys[$i] =~ s/ኘ/ɲ/; # literal
108 0         0 $newKeysA[$i] =~ s/ኘ/n/; # caps problem
109 0         0 $newKeysB[$i] =~ s/ኘ/p/; # mistaken glyph
110             }
111 0         0 push (@keys,@newKeysA); # add new keys to old keys
112 0         0 push (@keys,@newKeysB); # add new keys to old keys
113 0         0 $re =~ s/ኘ/[nɲp]/g;
114             }
115             #
116             # handle phonological problems
117             #
118 1 50       5 if ( $keys[0] =~ /mb/ ) {
119 0         0 my @newKeys;
120 0         0 for (my $i=0; $i < @keys; $i++) {
121 0         0 $newKeys[$i] = $keys[$i]; # copy old keys
122 0         0 $newKeys[$i] =~ s/mb/nb/; # update old keys for primary mapping
123             }
124 0         0 push (@keys,@newKeys); # add new keys to old keys
125 0         0 $re =~ s/mb/[mn]b/g;
126             }
127              
128             #
129             # try to keep least probable keys last:
130             #
131             #
132             # Handle IM problems
133             #
134 1         6 while ( $keys[0] =~ /([ስቅቕትችንክዝዥጥጭጽጵፕ])/ ) {
135 2         5 my $a = $1;
136 2         16 my @newKeys;
137 2         8 for (my $i=0; $i < @keys; $i++) {
138 3         8 $newKeys[$i] = $keys[$i]; # copy old keys
139 3         44 $keys[$i] =~ s/$a/$IMExpected{$a}/; # update old keys for primary mapping
140             }
141 2         9 for (my $i=0; $i < @newKeys; $i++) {
142 3         31 $newKeys[$i] =~ s/$a/$IMError{$a}/; # update new keys for alternative
143             }
144 2         6 push (@keys,@newKeys); # add new keys to old keys
145              
146             # print "$a => $IMExpected{$a} / $IMError{$a}\n";
147 2 100 66     13 if ( $plosives{$IMExpected{$a}} || $plosives{$IMError{$a}} ) {
148 1         15 $re =~ s/$a/($IMExpected{$a}|$IMError{$a})/g;
149             }
150             else {
151 1         18 $re =~ s/$a/[$IMExpected{$a}$IMError{$a}]/g;
152             }
153             }
154              
155 1 50       4 if ( $#keys ) {
156 1         47 push ( @keys, qr/$re/ );
157             }
158              
159 1         9 @keys;
160             }
161              
162              
163             sub reverse_key
164             {
165 1     1 0 4 $_ = $_[0];
166            
167 1         3 s/([stʧkp])'/$plosives{$1}/g;
168 1         4 tr/hlmrsʃqbvtʧnɲakwjdɗʤzʒgɲfp/ሀለመረሰሸቐበቨተቸነኘአከወየደዸጀዘዠገጘፈፐ/;
169 1         22 s/(\p{InEthiopic})/[#$1#]/g;
170 1         5 s/ዸ/ደዸ/g;
171 1         2 s/ጘ/ገጘ/g;
172              
173 1         5 $_;
174             }
175              
176              
177              
178             #########################################################
179             # Do not change this, Do not put anything below this.
180             # File must return "true" value at termination
181             1;
182             ##########################################################
183              
184             __END__