File Coverage

blib/lib/Acme/Lou.pm
Criterion Covered Total %
statement 21 23 91.3
branch n/a
condition n/a
subroutine 8 8 100.0
pod n/a
total 29 31 93.5


line stmt bran cond sub pod time code
1             package Acme::Lou;
2 4     4   85870 use 5.010001;
  4         10  
3 4     4   14 use strict;
  4         3  
  4         66  
4 4     4   12 use warnings;
  4         8  
  4         88  
5 4     4   482 use utf8;
  4         11  
  4         696  
6             our $VERSION = '0.04';
7              
8 4     4   141 use Exporter 'import';
  4         4  
  4         97  
9 4     4   1897 use Encode;
  4         27654  
  4         279  
10 4     4   1858 use File::ShareDir qw/dist_file/;
  4         18421  
  4         225  
11 4     4   1495 use Text::Mecabist;
  0            
  0            
12              
13             our @EXPORT_OK = qw/lou/;
14              
15             sub lou {
16             my $text = shift || "";
17             return Acme::Lou->new->translate($text);
18             }
19              
20             sub new {
21             my $class = shift;
22             my $self = bless {
23             mecab_option => {
24             userdic => dist_file('Acme-Lou', Text::Mecabist->encoding->name .'.dic'),
25             },
26             lou_rate => 100,
27             @_,
28             }, $class;
29             }
30              
31             sub translate {
32             my ($self, $text, $opt) = @_;
33             my $rate = $opt->{lou_rate} // $self->{lou_rate};
34            
35             my $parser = Text::Mecabist->new($self->{mecab_option});
36            
37             return $parser->parse($text, sub {
38             my $node = shift;
39             return if not $node->readable;
40            
41             my $word = $node->extra1 or return; # ルー単語 found
42             my $okuri = $node->extra2 // "";
43            
44             return if int(rand 100) > $rate;
45            
46             if ($node->prev and
47             $node->prev->is('接頭詞') and
48             $node->prev->lemma =~ /^[ごお御]$/) {
49             $node->prev->skip(1);
50             }
51            
52             if ($node->is('形容詞') and
53             $node->is('基本形') and
54             $node->next and $node->next->pos =~ /助詞|記号/) {
55             $okuri = "";
56             }
57              
58             $node->text($word . $okuri);
59             })->stringify();
60             }
61              
62             1;
63             __END__