zeroclickinfo-goodies/lib/DDG/Goodie/Kana.pm

101 lines
2.3 KiB
Perl
Raw Normal View History

2014-12-02 15:53:34 -08:00
package DDG::Goodie::Kana;
2015-02-12 07:38:00 -08:00
# ABSTRACT: Convert katakana, hiragana or romaji texts between each other
2014-12-02 15:53:34 -08:00
2015-02-14 07:08:57 -08:00
use utf8;
use DDG::Goodie;
2014-12-02 15:53:34 -08:00
use Lingua::JA::Moji qw/
is_kana
is_romaji
is_hiragana
hira2kata
kata2hira
kana2romaji
romaji2kana
2014-12-02 15:53:34 -08:00
romaji2hiragana/;
zci is_cached => 1;
zci answer_type => 'kana';
triggers end => qw/hiragana katakana romaji/;
2014-12-02 15:53:34 -08:00
my %dispatch = (
'hiragana' => \&to_hiragana,
'katakana' => \&to_katakana,
'romaji' => \&to_romaji
);
2015-02-12 19:40:06 -08:00
my $jp_punc = '【】、…。・「」『』〜0123456789 ー';
my $punc = '{}()[][],,….•\'\'""~:!?0123456789 -';
2015-02-14 07:08:57 -08:00
# Removes all puncuations symbols
# Methods from Lingua::JA::Moji don't work with it
2015-02-12 07:38:00 -08:00
sub trim_punc {
local $_ = shift @_;
2015-02-12 07:38:00 -08:00
my $punc = shift @_;
s/[\Q$punc\E]//g;
return $_;
};
2015-02-14 07:08:57 -08:00
# Translates punctuation between each other
2015-02-12 07:38:00 -08:00
sub punc_from_jp {
local $_ = shift @_;
eval "tr/$jp_punc/$punc/";
return $_;
}
sub punc_to_jp {
local $_ = shift @_;
eval "tr/$punc/$jp_punc/";
return $_;
}
2015-02-14 07:08:57 -08:00
# From romaji or kana to hiragana
sub to_hiragana {
my $text = shift @_;
2015-02-12 07:38:00 -08:00
return kata2hira($text) if is_kana(trim_punc($text, $jp_punc));
return romaji2hiragana(punc_to_jp($text), { ime => 1 }) if is_romaji(trim_punc($text, $punc));
};
2015-02-14 07:08:57 -08:00
# From romaji or kana to katakana
sub to_katakana {
my $text = shift @_;
2015-02-12 07:38:00 -08:00
return hira2kata($text) if is_kana(trim_punc($text, $jp_punc));
return romaji2kana(punc_to_jp($text), { ime => 1 }) if is_romaji(trim_punc($text, $punc));
};
2015-02-14 07:08:57 -08:00
# From kana to romaji
sub to_romaji {
my $text = shift @_;
2015-02-12 07:38:00 -08:00
my $romaji = kana2romaji($text, {style => 'hepburn', wo => 1}) if is_kana(trim_punc($text, $jp_punc));
2016-02-26 12:51:41 -08:00
return unless $romaji;
2015-02-12 07:38:00 -08:00
punc_from_jp($romaji);
};
handle query_lc => sub {
return unless /^
(?<text>.*?)
(?: to| in)?\s+
(?<syll>hiragana|katakana|romaji)
$/x;
my $text = $+{text};
2015-02-14 07:08:57 -08:00
my $syll = $+{syll}; # Output syllable
$text =~ s/^\s+|\s+$//g;
my $answer = $dispatch{$syll}($text);
return unless $answer;
2015-02-14 07:08:57 -08:00
2016-05-16 05:10:29 -07:00
return "$text converted to $syll is $answer", structured_answer => {
data => {
title => $answer,
subtitle => "Convert to ". ucfirst $syll. ": $text"
},
templates => {
group => 'text'
}
};
2014-12-02 15:53:34 -08:00
};
1;