File Coverage

blib/lib/Lingua/TR/ASCII.pm
Criterion Covered Total %
statement 85 85 100.0
branch 20 22 90.9
condition 13 17 76.4
subroutine 16 16 100.0
pod 2 2 100.0
total 136 142 95.7


line stmt bran cond sub pod time code
1             package Lingua::TR::ASCII;
2 1     1   24052 use strict;
  1         2  
  1         42  
3 1     1   6 use warnings;
  1         1  
  1         30  
4 1     1   5 use utf8;
  1         6  
  1         7  
5 1     1   22 use base qw( Exporter );
  1         2  
  1         118  
6 1     1   1976 use Lingua::TR::ASCII::Data;
  1         880  
  1         400  
7              
8             our $VERSION = '0.13';
9             our @EXPORT = qw( ascii_to_turkish turkish_to_ascii );
10              
11             sub ascii_to_turkish {
12 12     12 1 24876 my($str) = @_;
13 12 100       50 return $str if ! $str;
14 9         42 return __PACKAGE__->_new( $str )->_deasciify;
15             }
16              
17             sub turkish_to_ascii {
18 9     9 1 119 my($str, $encoding) = @_;
19 9         1444 require Text::Unidecode;
20 1     1   13 use utf8;
  1         1  
  1         8  
21 9         2726 return Text::Unidecode::unidecode( $str );
22             }
23              
24             sub _new {
25 9     9   18 my($class, $input) = @_;
26 9         72 my $self = {
27             input => $input,
28             length => length $input,
29             turkish => $input,
30             };
31 9         27 bless $self, $class;
32 9         30 return $self;
33             }
34              
35             # Convert a string with ASCII-only letters into one with Turkish letters.
36             sub _deasciify {
37 9     9   11 my($self) = @_;
38 9         28 my $s = \$self->{turkish};
39 9         15 my @chars = split m{}xms, ${$s};
  9         406  
40              
41 9         76 for my $i ( 0 .. $#chars ) {
42 1598         2164 my $c = $chars[$i];
43 1598 100       3077 next if ! $self->_needs_correction( $c, $i );
44 163   33     230 substr ${$s}, $i, 1, $TOGGLE_ACCENT->{ $c } || $c;
  163         778  
45             }
46              
47 9         15 return ${$s};
  9         204  
48             }
49              
50             # Determine if char at cursor needs correction.
51             sub _needs_correction {
52 1598     1598   2370 my($self, $ch, $point) = @_;
53 1598   66     5402 my $tr = $ASCIIFY->{ $ch } || $ch;
54 1598         2314 my $pl = $PATTERN->{ lc $tr };
55 1598 100 100     3443 my $m = $pl ? $self->_matches( $pl, $point || 0 ) : 0;
56              
57 1598 50       6878 return $tr eq 'I' ? ( $ch eq $tr ? ! $m : $m )
    50          
    100          
58             : ( $ch eq $tr ? $m : ! $m );
59             }
60              
61             # Check if the pattern is in the pattern table.
62             sub _matches {
63 422     422   522 my($self, $dlist, $point) = @_;
64 422   100     5667 my $str = $self->_get_context( $point || 0 );
65 422         723 my $rank = 2 * keys %{ $dlist };
  422         770  
66 422         550 my $len = length $str;
67 422         441 my($start, $end);
68              
69 422         976 while ( $start++ <= CONTEXT_SIZE ) {
70 4642         4772 $end = CONTEXT_SIZE;
71 4642         9007 while ( ++$end <= $len ) {
72 25399         39107 my $s = substr $str, $start, $end - $start;
73 25399   100     88554 my $r = $dlist->{ $s } || next;
74 815 100       2616 $rank = $r if abs $r < abs $rank;
75             }
76             }
77              
78 422         1093 return $rank > 0;
79             }
80              
81             sub _get_context {
82 422     422   512 my($self, $point, $size) = @_;
83 422   50     1299 $size ||= CONTEXT_SIZE;
84 422         475 my($s, $i, $space, $index);
85              
86             my $morph = sub {
87 844     844   1286 my($next, $lookup) = @_;
88 844         934 $index = $point;
89 844         848 $space = 0;
90 844         1247 while ( $next->() ) {
91 6035         12246 my $char = substr $self->{turkish}, $index, 1;
92 6035         9438 my $x = $lookup->{ $char };
93 6035 100       11400 if ( $x ) {
94 4926         7122 substr $s, abs $i, 1, $x;
95 4926         5004 $space = 0;
96 4926         5006 $i++;
97 4926         12931 next;
98             }
99 1109 100       1991 next if $space;
100 974         1085 $space = 1;
101 974         1711 $i++;
102             }
103 422         1475 };
104              
105 422         909 $s = q{ } x ( 1 + ( 2 * $size ) );
106 422         463 $i = 1 + $size;
107 422         625 substr $s, $size, 1, 'X';
108              
109             $morph->(
110 2309 100 100 2309   19716 sub { $i < length $s && ! $space && ++$index < $self->{length} },
111 422         1463 $DOWNCASE_ASCIIFY
112             );
113              
114 422         1376 $s = substr $s, 0, $i;
115 422         525 $i = 0 - --$size;
116              
117             $morph->(
118 4570 100   4570   23544 sub { $i <= 0 && --$index >= 0 },
119 422         1362 $UPCASE_ACCENTS
120             );
121              
122 422         3129 return $s;
123             }
124              
125             1;
126              
127             __END__