Acme-Ikamusume
view release on metacpan or search on metacpan
lib/Acme/Ikamusume.pm view on Meta::CPAN
package Acme::Ikamusume;
use 5.010001;
use strict;
use warnings;
use utf8;
our $VERSION = '0.08';
use File::ShareDir qw/dist_file/;
use Lingua::JA::Kana;
use Text::Mecabist;
sub geso {
my $self = bless { }, shift;
my $text = shift // "";
my $parser = Text::Mecabist->new({
userdic => dist_file('Acme-Ikamusume', Text::Mecabist->encoding->name .'.dic'),
});
my $doc = $parser->parse($text, sub {
my $node = shift;
return if not $node->readable;
return if not $node->reading;
$self->apply_rules($node);
});
return $doc->join('text');
}
sub godan {
my ($verb, $from, $to) = @_;
if (my ($kana) = $verb =~ /(\p{InHiragana})$/) {
$kana = kana2romaji($kana);
$kana =~ s/^sh/s/;
$kana =~ s/^ch/t/;
$kana =~ s/^ts/t/;
$kana =~ s/$from$/$to/;
$kana =~ s/^a$/wa/;
$kana =~ s/ti/chi/;
$kana =~ s/tu/tsu/;
$kana = romaji2hiragana($kana);
$verb =~ s/.$/$kana/;
}
$verb;
}
our @rules = (
# userdic extra field
sub {
my $node = shift;
my $word = $node->extra1 or return;
$node->text($word);
},
# IKA: inflection
sub {
my $node = shift;
return if not $node->extra2;
return if not $node->extra2 =~ /inflection/;
my $prev = $node->prev or return;
lib/Acme/Ikamusume.pm view on Meta::CPAN
$node->prev and $node->prev->text eq 'ãã' and
$node->surface eq 'ãªã') {
$node->text('ãªã¤ã«');
return;
}
if ($node->pos =~ /^å©åè©/ and
$node->prev and $node->prev->text =~ /(?:ã²ã½|ã¤ã¼?ã«)/) {
return;
}
my $latest = join "",
$node->prev && $node->prev->text,
$node->text;
if ($latest =~ /(?:ã²ã½|ã¤ã¼?ã«)$/) {
return;
}
$node->text($node->text . 'ã§ã²ã½');
}
if ($node->is('åè©') and
$node->inflection_form =~ 'åºæ¬å½¢' and
$next->pos =~ /^å©è©/) {
$node->text($node->text . 'ã§ã²ã½');
}
},
# EBI: accent
sub {
my $node = shift;
my $text = $node->text;
my @ebi_accent = qw(ï¼ âª âª â« â¬ â¡);
$text =~ s{(ã¨ã|ãã³|æµ·è)}{
$1 . $ebi_accent[ int rand scalar @ebi_accent ];
}e;
$node->text($text);
},
);
sub apply_rules {
my ($self, $node) = @_;
for my $rule (@rules) {
$rule->($node);
}
}
1;
__END__
=encoding utf-8
=head1 NAME
Acme::Ikamusume - The invader comes from the bottom of the sea!
=head1 SYNOPSIS
use utf8;
use Acme::Ikamusume;
print Acme::Ikamusume->geso('ã¤ã«å¨ã§ããããªããperlã§ä¾µç¥ãã¾ãããï¼');
# => ã¤ã«å¨ã§ã²ã½ãã主ãperlã§ä¾µç¥ããªã¤ã«ï¼
=head1 DESCRIPTION
Acme::Ikamusume converts Japanese text into like Ikamusume speak.
Ikamusume, meaning "Squid-Girl", she is a cute Japanese comic/manga
character (L<http://www.ika-musume.com/>).
Try this module here: L<http://ika.koneta.org/>. enjoy!
=head1 METHODS
=over 4
=item $output = Acme::Ikamusume->geso( $input )
=back
=head1 AUTHOR
Naoki Tomita E<lt>tomita@cpan.orgE<gt>
=head1 LICENSE
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=cut
( run in 2.295 seconds using v1.01-cache-2.11-cpan-54e63673c56 )