Acme-Nyaa
view release on metacpan or search on metacpan
lib/Acme/Nyaa/Ja.pm view on Meta::CPAN
'ããã¼ã¼ãªã',
'ããã¼ã¼ãª!ã',
'ããã¼ã¼ã¼ãª!!ã',
'ããã¼ã¼ã¼ã¼ãª!!!ã',
];
my $Copulae = [ 'ã ', 'ã§ã', 'ã§ãã', 'ã©ã', 'ãããããªã', 'ããã', 'ããã§ã' ];
my $HiraganaTails = [
'ã«ã', 'ã«ãã¼', 'ã«ãã', 'ã«ãã¼ã¼ã¼ã¼!', 'ã«ãã', 'ã«ãã¼ã', 'ã«ããã',
'ã«ãã¼!', 'ã«ãã¼ã¼ã¼!!', 'ã«ãã¼ã¼!',
];
my $KatakanaTails = [
'ãã£', 'ãã£ã¼', 'ãã£ã', 'ãã£ã¼ã¼ã¼ã¼!', 'ãã£ã', 'ãã£ã¼ã', 'ãã£ãã',
'ãã£ã¼!', 'ãã£ã¼ã¼ã¼!!', 'ãã£ã¼ã¼!',
];
my $DoNotBecomeCat = [
# See http://ja.wikipedia.org/wiki/ã¢ã¼ãã³ã°å¨ã
'ã¢ã¼ãã³ã°å¨ã',
'ã«ã³ããªã¼å¨ã',
'ã³ã³ãããå¨ã',
'ããã¢ãã',
'ã¨ã³ã¢ãã',
'ããã¼!ã¢ã¼ãã³ã°ã',
'ã¨ã¢ã¢ãã',
'ã¢ã¼ãã³ã°åäºã',
'ã¢ã¼å¨ã',
];
sub new {
# Constructor
my $class = shift;
my $argvs = { @_ };
return $class if ref $class eq __PACKAGE__;
$argvs->{'language'} = 'ja';
return bless $argvs, __PACKAGE__;
}
sub language {
# Set language to use
my $self = shift;
$self->{'language'} ||= 'ja';
return $self->{'language'};
}
sub object {
# Wrapper method for new()
my $self = shift;
return __PACKAGE__->new unless ref $self;
return $self;
}
*objects = *object;
*findobject = *object;
sub cat {
my $self = shift;
my $argv = shift;
my $flag = shift // 0;
my $ref1 = ref $argv;
my $text = undef;
my $neko = undef;
my $nyaa = undef;
return q() if( $ref1 ne '' && $ref1 ne 'SCALAR' );
$text = $ref1 eq 'SCALAR' ? $$argv: $argv;
return q() unless length $text;
eval {
$self->reckon( \$text );
$neko = $self->toutf8( $text );
};
return $text if $@;
$neko =~ s{($RxPeriod)}{$1$Separator}g;
$neko .= $Separator unless $neko =~ m{$Separator};
my $hiralength = scalar @$HiraganaTails;
my $katalength = scalar @$KatakanaTails;
my $writingset = [ split( $Separator, $neko ) ];
my $haschomped = 0;
my ( $r1,$r2 ) = 0;
for my $e ( @$writingset ) {
next if $e =~ m/\A$RxPeriod\s*\z/;
next if $e =~ m/$RxEndOfList\s*\z/;
next if grep { $e =~ m/\A$_\s*/ } @$DoNotBecomeCat;
next if grep { $e =~ m/$_$RxPeriod?\z/ } @$HiraganaTails;
next if grep { $e =~ m/$_$RxPeriod?\z/ } @$KatakanaTails;
next if grep { $e =~ m/$_$RxEndOfSentence?\s*\z/ } @$HiraganaTails;
next if grep { $e =~ m/$_$RxEndOfSentence?\s*\z/ } @$KatakanaTails;
next if grep { $e =~ m/$_\s*\z/ } @$FightingCats;
# Do not convert if the string contain only ASCII characters.
# ASCIIæåããå
¥ã£ã¦ãªãæã¯ä½ãããªã
next if $e =~ m{\A[\x20-\x7E]+\z};
# ã²ãããªãã¾ãã¯ã«ã¿ã«ããå
¥ã£ã¦ãªããªã次ã¸
next unless $e =~ m{[\p{InHiragana}\p{InKatakana}]+};
# Cats may be hard to speak a word which ends with a character 'ã'.
# ãããã®å¾ãã«ãã£ã¼ãããã¨ç«ãåãã«ããã
next if $e =~ m{[ãã]$RxPeriod?\s*\z};
$haschomped = chomp $e;
if( $e =~ m/ãª$RxPeriod?\s*\z/ ) {
# 㪠=> ã«ãã¼
$e =~ s/ãª($RxPeriod?)(\s*)\z/$HiraganaNya$1$2/;
} elsif( $e =~ m/ã$RxPeriod?\s*\z/ ) {
# ã => ãã£ã¼
$e =~ s/ã($RxPeriod?)(\s*)\z/$HiraganaNya$1$2/;
} elsif( $e =~ m/\p{InHiragana}$RxPeriod\s*\z/ ) {
$r1 = int rand $katalength;
$e =~ s/($RxPeriod)(\s*)\z/$KatakanaTails->[ $r1 ]$1$2/;
} elsif( $e =~ m/\p{InKatakana}$RxPeriod\s*\z/ ) {
$r1 = int rand $hiralength;
lib/Acme/Nyaa/Ja.pm view on Meta::CPAN
$r1 = int rand( $hiralength / 2 );
$e =~ s/$RxEndOfSentence/$HiraganaTails->[ $r1 ]$eos/g;
} elsif( $e =~ m/\p{InHiragana}$RxEndOfSentence\s*\z/ ) {
$r1 = int rand( $katalength / 2 );
$e =~ s/$RxEndOfSentence/$KatakanaTails->[ $r1 ]$eos/g;
} else {
$r1 = int rand( $katalength / 2 );
$r2 = int rand( scalar @$Copulae );
$e =~ s/$RxEndOfSentence/$Copulae->[ $r2 ]$KatakanaTails->[ $r1 ]$eos/g;
}
} elsif( $e =~ m/$RxConversation\s*\z/ ) {
# 0.5ã®ç¢ºçã§ä¼è©±ã®å¾ãã§ç«ãå§å©ããã
if( $e =~ m/\A(.*$RxConversation[ ]*)($RxConversation.*)\s*\z/ ) {
$r1 = int rand scalar @$FightingCats;
$e = $1.$FightingCats->[ $r1 ].$2 if int(rand(10)) % 2;
}
$r1 = int rand scalar @$FightingCats;
$e .= $FightingCats->[ $r1 ] if int(rand(10)) % 2;
} else {
$r1 = int rand $katalength;
if( $e =~ m/[0-9\p{Latin}]\s*\z/ ) {
$r2 = int rand scalar @$Copulae;
$e =~ s/(\s*?)\z/ $Copulae->[ $r2 ]$KatakanaTails->[ $r1 ]$1/;
} elsif( $e =~ m/\p{InKatakana}\s*\z/ ) {
$e =~ s/(\s*?)\z/$HiraganaTails->[ $r1 ]$1/;
} else {
$e =~ s/(\s*?)\z/$KatakanaTails->[ $r1 ]$1/;
}
}
}
$e =~ s/[!]$RxPeriod/! /g;
$e .= qq(\n) if $haschomped;
} # End of for(@$writingset)
return $self->utf8to( join( '', @$writingset ) ) unless $flag;
return join( '', @$writingset );
}
sub neko {
my $self = shift;
my $argv = shift;
my $flag = shift // 0;
my $ref1 = ref $argv;
my $text = undef;
my $neko = undef;
return q() if( $ref1 ne '' && $ref1 ne 'SCALAR' );
$text = $ref1 eq 'SCALAR' ? $$argv : $argv;
return q() unless length $text;
eval {
$self->reckon( \$text );
$neko = $self->toutf8( $text );
};
return $text if $@;
my $nounstable = {
'ç¥' => 'ãã³',
'ï¨' => 'ãã³',
};
for my $e ( keys %$nounstable ) {
next unless $neko =~ m{$e};
my $f = $nounstable->{ $e };
$neko =~ s{\A[$e]\z}{$f};
$neko =~ s{\A[$e](\p{InHiragana})}{$f$1};
$neko =~ s{\A[$e](\p{InKatakana})}{$f$1};
$neko =~ s{(\p{InHiragana})[$e](\p{InHiragana})}{$1$f$2}g;
$neko =~ s{(\p{InHiragana})[$e](\p{InKatakana})}{$1$f$2}g;
$neko =~ s{(\p{InKatakana})[$e](\p{InKatakana})}{$1$f$2}g;
$neko =~ s{(\p{InKatakana})[$e](\p{InHiragana})}{$1$f$2}g;
$neko =~ s{(\p{InHiragana})[$e]($RxPeriod|$RxComma)?\z}{$1$f$2}g;
$neko =~ s{(\p{InKatakana})[$e]($RxPeriod|$RxComma)?\z}{$1$f$2}g;
}
return $self->utf8to( $neko ) unless $flag;
return $neko;
}
sub nyaa {
my $self = shift;
my $argv = shift || q();
my $text = ref $argv ? $$argv : $argv;
my $nyaa = [];
push @$nyaa, @$KatakanaTails, @$HiraganaTails;
return $text.$nyaa->[ int rand( scalar @$nyaa ) ];
}
sub straycat {
my $self = shift;
my $argv = shift // return q();
my $noun = shift // 0;
my $ref1 = ref $argv;
my $data = [];
my $text = q();
my $nekobuffer = q();
my $leftbuffer = q();
my $buffersize = 144;
my $entityrmap = {
( run in 1.023 second using v1.01-cache-2.11-cpan-d80b1682f3f )