File Coverage

blib/lib/Text/UnAbbrev.pm
Criterion Covered Total %
statement 92 97 94.8
branch 6 12 50.0
condition 7 12 58.3
subroutine 16 16 100.0
pod 1 2 50.0
total 122 139 87.7


line stmt bran cond sub pod time code
1             package Text::UnAbbrev;
2              
3 1     1   40597 use common::sense;
  1         3  
  1         10  
4 1     1   803 use charnames q(:full);
  1         41925  
  1         9  
5 1     1   290 use Carp;
  1         3  
  1         113  
6 1     1   941 use English qw[-no_match_vars];
  1         5036  
  1         10  
7 1     1   568 use File::Find;
  1         3  
  1         82  
8 1     1   886 use File::Spec::Functions ();
  1         1121  
  1         37  
9 1     1   730 use IO::File;
  1         12428  
  1         182  
10 1     1   2163 use Moo;
  1         18589  
  1         9  
11 1     1   2952 use File::ShareDir::ProjectDistDir;
  1         23770  
  1         9  
12 1     1   936 use Unicode::CaseFold;
  1         1084  
  1         543  
13              
14             our $VERSION = '0.03'; # VERSION
15              
16             has dict => ( is => q(rw), default => sub { {}; }, );
17             has language => ( is => q(rw) );
18             has domain => ( is => q(rw) );
19             has subdomain => ( is => q(rw) );
20              
21             sub BUILD {
22 1     1 0 9 my $self = shift;
23 1         2 my $args = shift;
24              
25 1         2 my $pkg = __PACKAGE__;
26 1         5 $pkg =~ s{::}{-}g;
27 1         6 my $share_dir = dist_dir($pkg);
28 1         194895 my @dict_file;
29 1 50   13   142 find( sub { push @dict_file, $File::Find::name if -e }, $share_dir, );
  13         668  
30              
31 1         12 while ( my $dict_file = shift @dict_file ) {
32 13         47 $self->_load_dict($dict_file);
33             }
34              
35 1 50       7 if ( ref $args eq q(HASH) ) {
36 1         2 foreach my $method ( keys %{$args} ) {
  1         6  
37 0 0       0 if ( __PACKAGE__->can($method) ) {
38 0         0 my $value = delete $args->{$method};
39 0         0 $self->$method($value);
40             }
41 0         0 else { croak( sprintf q(method unknown: '%s'), $method ); }
42             }
43             }
44              
45 1         33 return 1;
46             } ## end sub BUILD
47              
48             sub _load_dict {
49 13     13   22 my $self = shift;
50 13         21 my $dict_file = shift;
51              
52 13         58 my ( $language, $domain, $subdomain )
53             = ( File::Spec::Functions::splitdir($dict_file) )[ -3, -2, -1 ];
54              
55 13         184 my $fh = IO::File->new( $dict_file, q(<:utf8) );
56 13         1647 while ( my $line = $fh->getline() ) {
57 1907         42871 chomp $line;
58 1907         13292 my ( $abbrev, $expansion ) = split m{\t+|\N{SPACE}{2,}}msx, $line;
59 1907         3478 $abbrev = $self->_norm_abbrev($abbrev);
60 1907         1604 push @{ $self->dict->{$language}{$domain}{$subdomain}{$abbrev} },
  1907         42853  
61             $expansion;
62             }
63 13         476 $fh->close();
64              
65 13         370 return 1;
66             } ## end sub _load_dict
67              
68             sub lookup {
69 7037     7037 1 5072973 my $self = shift;
70 7037         10566 my $abbrev = shift;
71 7037         10111 my $mode = shift;
72              
73 7037 50       17950 return unless defined $abbrev;
74              
75 7037         14861 my $query = $self->_norm_abbrev($abbrev);
76 7037         7943 my @result;
77 7037   66     27843 my @language = $self->language() || keys %{ $self->dict() };
78 7037         11479 foreach my $language (@language) {
79 8759         19876 my $language_node = $self->dict->{$language};
80 8759   66     24171 my @domain = $self->domain() || keys %{$language_node};
81 8759         11307 foreach my $domain (@domain) {
82 13087         19647 my $domain_node = $language_node->{$domain};
83 13087   66     32800 my @subdomain = $self->subdomain() || keys %{$domain_node};
84 13087         15110 foreach my $subdomain (@subdomain) {
85 17598         18839 my $subdomain_node = $domain_node->{$subdomain};
86 17598 100       59086 if ( exists $subdomain_node->{$query} ) {
87 7116         25337 my $origin = {
88             language => $language,
89             domain => $domain,
90             subdomain => $subdomain,
91             };
92 7116         24205 push @result,
93             $self->_proc_results( $subdomain_node->{$query},
94             $mode, $origin, );
95             }
96             }
97             } ## end foreach my $domain (@domain)
98             } ## end foreach my $language (@language)
99              
100 7037         26894 return @result;
101             } ## end sub lookup
102              
103             sub _proc_results {
104 7116     7116   8795 my $self = shift;
105 7116         8384 my $results = shift;
106 7116         7167 my $mode = shift;
107 7116         7256 my $origin = shift;
108              
109 7116         7329 my @result;
110 7116         6541 foreach my $result ( @{$results} ) {
  7116         12472  
111 7628 50 33     19204 if ( defined $mode && $mode eq q(with_origin) ) {
112 0         0 push @result, { $result => $origin };
113             }
114             else {
115 7628         17843 push @result, $result;
116             }
117             }
118              
119 7116         38093 return @result;
120             } ## end sub _proc_results
121              
122             sub _norm_abbrev {
123 8944     8944   11474 my $self = shift;
124 8944         10205 my $abbrev = shift;
125              
126 8944         16910 foreach ($abbrev) {
127 8944         27836 tr{\N{FULL STOP}}{}d;
128 8944         14820 tr{\N{SPACE}} {}d;
129 8944         27138 $_ = fc;
130             }
131              
132 8944         71847 return $abbrev;
133             }
134              
135             __PACKAGE__->meta->make_immutable;
136             1;
137              
138             __END__