File Coverage

lib/Lingua/JA/Romaji/Valid.pm
Criterion Covered Total %
statement 51 53 96.2
branch 21 30 70.0
condition 2 2 100.0
subroutine 8 8 100.0
pod 6 6 100.0
total 88 99 88.8


line stmt bran cond sub pod time code
1             package Lingua::JA::Romaji::Valid;
2              
3 4     4   113477 use strict;
  4         9  
  4         159  
4 4     4   23 use warnings;
  4         10  
  4         3490  
5              
6             our $VERSION = '0.03';
7              
8             my %aliases = (
9             loose => 'ISO3602Loose',
10             liberal => 'Liberal',
11             kunrei => 'ISO3602',
12             japanese => 'ISO3602Strict',
13             passport => 'HepburnPassport',
14             railway => 'HepburnRailway',
15             traditional => 'Hepburn',
16             hepburn => 'HepburnRevised',
17             international => 'HepburnRevisedInternational',
18             );
19              
20             sub new {
21 308     308 1 131590 my ($class, $rule) = @_;
22 308         1300 my $self = bless {}, $class;
23              
24 308   100     806 $rule ||= 'ISO3602Loose';
25 308 100       1294 $rule = $aliases{$rule} if exists $aliases{$rule};
26              
27 308         596 my $package = 'Lingua::JA::Romaji::Valid::Rule::'.$rule;
28 308 50       27453 eval "require $package"; die $@ if $@;
  308         1394  
29 308         1425 $self->{rule} = $package->new;
30              
31 308         973 $self;
32             }
33              
34 1     1 1 29 sub aliases { sort keys %aliases }
35 322     322 1 2032 sub verbose { shift->{rule}->verbose(@_) }
36              
37             sub as_romaji {
38 313     313 1 1711 my ($self, $word, @extra_filters) = @_;
39              
40 313 50       790 return unless defined $word;
41              
42 313         966 $word = quotemeta lc $word;
43              
44 313 50       1251 return unless $self->{rule}->_prepare( \$word, @extra_filters );
45              
46 313         2269 my @kanas = $word =~ /((?:[^aeiou]*)(?:[aeioun]))/g;
47 313         925 my $got = join '', @kanas;
48 313         2107 my ($rest) = $word =~ /^$got(.+)/;
49              
50 313 100       712 if ( $rest ) {
51             # always prohibit consonant ending but 'n'
52 16 50       36 warn "consonant ending: $rest" if $self->verbose;
53 16         240 return;
54             }
55              
56 297         478 foreach my $kana ( @kanas ) {
57 764 100       2576 return unless $self->{rule}->is_valid( $kana, @extra_filters );
58             }
59 179         1026 return 1;
60             }
61              
62             sub as_name {
63 29     29 1 8627 my ($self, $word, @extra_filters) = @_;
64              
65 29 100       163 return unless defined $word;
66              
67 26         61 $word = quotemeta lc $word;
68              
69 26         60 push @extra_filters, qw(
70             prohibit_initial_n
71             prohibit_initial_wo
72             prohibit_foreign_kanas
73             );
74 26 100       117 return unless $self->{rule}->_prepare( \$word, @extra_filters );
75              
76 24         168 my @kanas = $word =~ /((?:[^aeiou]*)(?:[aeioun]))/g;
77 24         58 my $got = join '', @kanas;
78 24         403 my ($rest) = $word =~ /^$got(.+)/;
79              
80 24 50       55 if ( $rest ) {
81             # always prohibit consonant ending but 'n'
82 0 0       0 warn "consonant ending: $rest" if $self->verbose;
83 0         0 return;
84             }
85              
86 24         43 foreach my $kana ( @kanas ) {
87 38 100       144 return unless $self->{rule}->is_valid( $kana, @extra_filters );
88             }
89 8         29 return 1;
90             }
91              
92             sub as_fullname {
93 3     3 1 9 my ($self, $word, @extra_filters) = @_;
94              
95 3 50       7 return unless defined $word;
96              
97 3         7 $word = quotemeta lc $word;
98              
99             # XXX: allow comma separated name: should this be optional?
100 3         15 my $rule = qr/(?:\\?\s)+|(?:\\?\s)*(?:\\?,)(?:\\?\s)*/;
101 3         57 my @parts = split $rule, $word;
102              
103             # Japanese full name should have both first and last names
104             # but not a middle name
105 3 100       20 return unless @parts == 2;
106              
107 1         3 foreach my $part ( @parts ) {
108 2 50       6 return unless $self->as_name( $part, @extra_filters );
109             }
110 1         7 return 1;
111             }
112              
113             1;
114              
115             __END__