File Coverage

blib/lib/Encode/Arabic/Buckwalter.pm
Criterion Covered Total %
statement 74 76 97.3
branch 36 64 56.2
condition 2 3 66.6
subroutine 15 16 93.7
pod 4 6 66.6
total 131 165 79.3


line stmt bran cond sub pod time code
1             # ###################################################################### Otakar Smrz, 2003/01/23
2             #
3             # Encoding of Arabic: Tim Buckwalter's Notation ##################################### 2003/06/19
4              
5             package Encode::Arabic::Buckwalter;
6              
7             our $VERSION = '14.1';
8              
9 2     2   20520 use 5.008;
  2         6  
  2         79  
10              
11 2     2   11 use strict;
  2         3  
  2         69  
12 2     2   9 use warnings;
  2         3  
  2         60  
13              
14 2     2   9 use Scalar::Util 'blessed';
  2         3  
  2         190  
15              
16 2     2   705 use Encode::Encoding;
  2         7922  
  2         47  
17 2     2   9 use base 'Encode::Encoding';
  2         3  
  2         749  
18              
19             __PACKAGE__->Define('Buckwalter', 'Tim');
20              
21              
22             our $enmode;
23             our $demode;
24              
25             our $optxml;
26              
27             our %modemap = (
28              
29             'default' => 0,
30             'undef' => 0,
31              
32             'fullvocalize' => 0,
33             'full' => 0,
34              
35             'nowasla' => 4,
36              
37             'vocalize' => 3,
38             'nosukuun' => 3,
39              
40             'novocalize' => 2,
41             'novowels' => 2,
42             'none' => 2,
43              
44             'noshadda' => 1,
45             'noneplus' => 1,
46             );
47              
48              
49             # use subs 'encoder', 'decoder'; # ignores later prototypes
50              
51             sub encoder ($); # respect prototypes
52             sub decoder ($); # respect prototypes
53              
54              
55             sub import { # perform import as if Encode were used one level before this module
56              
57 4 100 66 4   749 $optxml = defined $_[1] && $_[1] eq ':xml' ? 1 : 0;
58              
59 4         12 __PACKAGE__->enmode('full');
60 4         20 __PACKAGE__->demode('full');
61              
62 4         11 splice @_, 1, 1;
63              
64 4         27 require Encode;
65              
66 4 100       58 push @Encode::ISA, 'Exporter' unless Encode->can('export_to_level');
67              
68 4         558 Encode->export_to_level(1, @_);
69             }
70              
71              
72             sub encode ($$;$) {
73 2     2 1 1678 my (undef, $text, $check) = @_;
74              
75 2 50       9 $_[1] = '' if $check; # needed by in-place edit
76              
77 2         92 $text = encoder $text;
78              
79 2 50       26 $text = Encode::encode "utf8", $text if Encode::is_utf8($text);
80              
81 2         58 return $text;
82             }
83              
84              
85             sub decode ($$;$) {
86 4     4 1 738 my (undef, $text, $check) = @_;
87              
88 4 50       13 $_[1] = '' if $check; # needed by in-place edit
89              
90 4 50       24 $text = Encode::decode "utf8", $text unless Encode::is_utf8($text);
91              
92 4         265 $text = decoder $text;
93              
94 4         12 return $text;
95             }
96              
97              
98             sub enmode ($$;$$) {
99 4     4 1 9 my ($cls, $mode, $xml, $kshd) = @_;
100              
101 4 50       10 $cls = blessed $cls if ref $cls;
102 4 50       12 $xml = $optxml unless defined $xml;
103              
104 4 50       9 $mode = 'undef' unless defined $mode;
105 4 50       14 $mode = $modemap{$mode} if exists $modemap{$mode};
106              
107 2     2   9 no strict 'refs';
  2         9  
  2         392  
108              
109 4         5 my $return = ${ $cls . '::enmode' };
  4         14  
110              
111 4 50       11 if (defined $mode) {
112              
113 4         4 ${ $cls . '::enmode' } = $mode;
  4         11  
114              
115 4 50       64 my @set = (
    50          
    50          
    100          
    50          
    50          
    50          
    50          
116              
117             ( $kshd
118             ? ''
119             : q [\x{0640}] ) .
120             q [\x{0623}\x{0624}\x{0625}] .
121             q [\x{060C}\x{061B}\x{061F}] .
122             q [\x{0621}\x{0622}\x{0626}-\x{063A}\x{0641}-\x{064A}] .
123             q [\x{067E}\x{0686}\x{0698}\x{06A4}\x{06AF}] .
124             q [\x{0660}-\x{0669}] .
125             q [\x{0671}] .
126             q [\x{0651}] .
127             q [\x{064B}-\x{0650}\x{0670}] .
128             q [\x{0652}] .
129             ( $kshd
130             ? q [\x{0640}]
131             : '' )
132              
133             ,
134              
135             ( $kshd
136             ? ''
137             : q [_] ) .
138             ( $xml
139             ? q [OWI]
140             : q [>&<] ) .
141             q [,;?] .
142             q ['|}AbptvjHxd*rzs$SDTZEgfqklmnhwYy] .
143             q [PJRVG] .
144             q [0-9] .
145             ( $mode == 0
146             ? q [{]
147             : q [A] ) .
148             ( $mode == 1
149             ? ''
150             : q [~] . ( $mode == 2
151             ? ''
152             : q [FNKaui`] . ( $mode == 3
153             ? ''
154             : q [o] ) ) )
155              
156             );
157              
158              
159 4         19 undef &encoder;
160              
161 2     2 0 1043 eval q /
  2     0   58  
  2         701  
  4         449  
  0         0  
  0         0  
162              
163             sub encoder ($) {
164              
165             $_[0] =~ tr[/ . $set[0] . q /]
166             [/ . $set[1] . q /]d;
167              
168             return $_[0];
169             }
170             /;
171             }
172              
173 4         11499 return $return;
174             }
175              
176              
177             sub demode ($$;$$) {
178 4     4 1 8 my ($cls, $mode, $xml, $kshd) = @_;
179              
180 4 50       12 $cls = blessed $cls if ref $cls;
181 4 50       13 $xml = $optxml unless defined $xml;
182              
183 4 50       9 $mode = 'undef' unless defined $mode;
184 4 50       15 $mode = $modemap{$mode} if exists $modemap{$mode};
185              
186 2     2   9 no strict 'refs';
  2         3  
  2         323  
187              
188 4         6 my $return = ${ $cls . '::demode' };
  4         16  
189              
190 4 50       13 if (defined $mode) {
191              
192 4         4 ${ $cls . '::demode' } = $mode;
  4         9  
193              
194 4 50       62 my @set = (
    100          
    50          
    50          
    50          
    50          
    50          
    50          
195              
196             ( $kshd
197             ? ''
198             : q [_] ) .
199             ( $xml
200             ? q [OWI]
201             : q [>&<] ) .
202             q [,;?] .
203             q ['|}AbptvjHxd*rzs$SDTZEgfqklmnhwYy] .
204             q [PJRVG] .
205             q [0-9] .
206             q [{] .
207             q [~] .
208             q [FNKaui`] .
209             q [o] .
210             ( $kshd
211             ? q [_]
212             : '' )
213              
214             ,
215              
216             ( $kshd
217             ? ''
218             : q [\x{0640}] ) .
219             q [\x{0623}\x{0624}\x{0625}] .
220             q [\x{060C}\x{061B}\x{061F}] .
221             q [\x{0621}\x{0622}\x{0626}-\x{063A}\x{0641}-\x{064A}] .
222             q [\x{067E}\x{0686}\x{0698}\x{06A4}\x{06AF}] .
223             q [\x{0660}-\x{0669}] .
224             ( $mode == 0
225             ? q [\x{0671}]
226             : q [\x{0627}] ) .
227             ( $mode == 1
228             ? ''
229             : q [\x{0651}] . ( $mode == 2
230             ? ''
231             : q [\x{064B}-\x{0650}\x{0670}] . ( $mode == 3
232             ? ''
233             : q [\x{0652}] ) ) )
234              
235             );
236              
237              
238 4         21 undef &decoder;
239              
240 4     1 0 319 eval q /
  1         18  
  1         4  
241              
242             sub decoder ($) {
243              
244             $_[0] =~ tr[/ . $set[0] . q /]
245             [/ . $set[1] . q /]d;
246              
247             return $_[0];
248             }
249             /;
250             }
251              
252 4         4238 return $return;
253             }
254              
255              
256             1;
257              
258             __END__