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
|
2014-12-03 08:30:16 -08:00
|
|
|
|
romaji2kana
|
2014-12-02 15:53:34 -08:00
|
|
|
|
romaji2hiragana/;
|
|
|
|
|
|
|
|
|
|
zci is_cached => 1;
|
|
|
|
|
zci answer_type => 'kana';
|
|
|
|
|
|
2015-02-12 17:33:44 -08:00
|
|
|
|
triggers end => qw/hiragana katakana romaji/;
|
2014-12-02 15:53:34 -08:00
|
|
|
|
|
2014-12-03 08:30:16 -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 -';
|
2014-12-03 08:30:16 -08:00
|
|
|
|
|
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 {
|
2014-12-03 08:30:16 -08:00
|
|
|
|
local $_ = shift @_;
|
2015-02-12 07:38:00 -08:00
|
|
|
|
my $punc = shift @_;
|
|
|
|
|
s/[\Q$punc\E]//g;
|
2014-12-03 08:30:16 -08:00
|
|
|
|
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
|
2014-12-03 08:30:16 -08:00
|
|
|
|
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));
|
2014-12-03 08:30:16 -08:00
|
|
|
|
};
|
|
|
|
|
|
2015-02-14 07:08:57 -08:00
|
|
|
|
# From romaji or kana to katakana
|
2014-12-03 08:30:16 -08:00
|
|
|
|
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));
|
2014-12-03 08:30:16 -08:00
|
|
|
|
};
|
|
|
|
|
|
2015-02-14 07:08:57 -08:00
|
|
|
|
# From kana to romaji
|
2014-12-03 08:30:16 -08:00
|
|
|
|
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);
|
2014-12-03 08:30:16 -08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
handle query_lc => sub {
|
2015-02-12 17:33:44 -08:00
|
|
|
|
return unless /^
|
|
|
|
|
(?<text>.*?)
|
|
|
|
|
(?: to| in)?\s+
|
|
|
|
|
(?<syll>hiragana|katakana|romaji)
|
|
|
|
|
$/x;
|
2015-02-13 05:34:29 -08:00
|
|
|
|
|
2014-12-03 08:30:16 -08:00
|
|
|
|
my $text = $+{text};
|
2015-02-14 07:08:57 -08:00
|
|
|
|
my $syll = $+{syll}; # Output syllable
|
2015-02-13 05:34:29 -08:00
|
|
|
|
$text =~ s/^\s+|\s+$//g;
|
2014-12-03 08:30:16 -08:00
|
|
|
|
my $answer = $dispatch{$syll}($text);
|
2015-02-13 05:34:29 -08:00
|
|
|
|
|
2014-12-03 08:30:16 -08:00
|
|
|
|
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;
|
|
|
|
|
|