├── spec ├── spec.opts ├── spec_helper.rb ├── string_spec.rb └── romankana_spec.rb ├── lib ├── romankana │ ├── version.rb │ ├── utils.rb │ ├── string.rb │ ├── romankana.rb │ ├── k2r.rb │ └── r2k.rb └── romankana.rb ├── .travis.yml ├── Gemfile ├── Rakefile ├── Manifest.txt ├── .gitignore ├── script ├── destroy ├── generate └── console ├── tasks └── rspec.rake ├── romankana.gemspec ├── README.rdoc └── test └── romankana_test.rb /spec/spec.opts: -------------------------------------------------------------------------------- 1 | --colour -------------------------------------------------------------------------------- /lib/romankana/version.rb: -------------------------------------------------------------------------------- 1 | module RomanKana 2 | VERSION = '0.2.1' 3 | end 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: ruby 2 | rvm: 3 | - 2.1.0 4 | - 2.0.0 5 | - 1.9.3 6 | - 1.9.2 7 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'coveralls', require: false 4 | 5 | # Specify your gem's dependencies in romankana.gemspec 6 | gemspec 7 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require "bundler/gem_tasks" 2 | require "rspec/core/rake_task" 3 | 4 | RSpec::Core::RakeTask.new do |spec| 5 | spec.pattern = 'spec/**/*_spec.rb' 6 | #spec.rspec_opts = ['--backtrace'] 7 | end 8 | 9 | task :default => [:spec] 10 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | require 'coveralls' 2 | Coveralls.wear! 3 | begin 4 | require 'rspec' 5 | rescue LoadError 6 | require 'rubygems' unless ENV['NO_RUBYGEMS'] 7 | gem 'rspec' 8 | require 'rspec' 9 | end 10 | 11 | $:.unshift(File.dirname(__FILE__) + '/../lib') 12 | require 'romankana' 13 | -------------------------------------------------------------------------------- /Manifest.txt: -------------------------------------------------------------------------------- 1 | History.txt 2 | Manifest.txt 3 | PostInstall.txt 4 | README.rdoc 5 | Rakefile 6 | lib/romankana.rb 7 | lib/romankana/romankana.rb 8 | lib/romankana/r2k.rb 9 | lib/romankana/k2r.rb 10 | script/console 11 | script/destroy 12 | script/generate 13 | spec/romankana_spec.rb 14 | spec/spec.opts 15 | spec/spec_helper.rb 16 | tasks/rspec.rake 17 | test/romankana_test.rb 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .*.swp 2 | .*.swo 3 | *~ 4 | pkg/* 5 | 6 | .DS_Store 7 | 8 | nbproject/private/rake-d.txt 9 | 10 | nbproject/project.properties 11 | 12 | nbproject/project.xml 13 | 14 | *.gem 15 | *.rbc 16 | .bundle 17 | .config 18 | .yardoc 19 | Gemfile.lock 20 | InstalledFiles 21 | _yardoc 22 | coverage 23 | doc/ 24 | lib/bundler/man 25 | pkg 26 | rdoc 27 | spec/reports 28 | test/tmp 29 | test/version_tmp 30 | tmp 31 | -------------------------------------------------------------------------------- /lib/romankana/utils.rb: -------------------------------------------------------------------------------- 1 | module RomanKana 2 | module Utils 3 | def self.set_encoding_of_before before, after 4 | e = before.encoding 5 | return (e == Encoding::US_ASCII or e == Encoding::ASCII_8BIT) ? after : after.encode(e) 6 | end 7 | 8 | def self.convert_utf8 str 9 | return (str.encoding != Encoding::UTF_8) ? str.encode(Encoding::UTF_8) : str 10 | end 11 | end 12 | end 13 | 14 | -------------------------------------------------------------------------------- /script/destroy: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..')) 3 | 4 | begin 5 | require 'rubigen' 6 | rescue LoadError 7 | require 'rubygems' 8 | require 'rubigen' 9 | end 10 | require 'rubigen/scripts/destroy' 11 | 12 | ARGV.shift if ['--help', '-h'].include?(ARGV[0]) 13 | RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit] 14 | RubiGen::Scripts::Destroy.new.run(ARGV) 15 | -------------------------------------------------------------------------------- /script/generate: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..')) 3 | 4 | begin 5 | require 'rubigen' 6 | rescue LoadError 7 | require 'rubygems' 8 | require 'rubigen' 9 | end 10 | require 'rubigen/scripts/generate' 11 | 12 | ARGV.shift if ['--help', '-h'].include?(ARGV[0]) 13 | RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit] 14 | RubiGen::Scripts::Generate.new.run(ARGV) 15 | -------------------------------------------------------------------------------- /script/console: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # File: script/console 3 | irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb' 4 | 5 | libs = " -r irb/completion" 6 | # Perhaps use a console_lib to store any extra methods I may want available in the cosole 7 | # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}" 8 | libs << " -r #{File.dirname(__FILE__) + '/../lib/romankana.rb'}" 9 | puts "Loading romankana gem" 10 | exec "#{irb} #{libs} --simple-prompt" -------------------------------------------------------------------------------- /lib/romankana.rb: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | $:.unshift(File.dirname(__FILE__)) unless 3 | $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__))) 4 | 5 | directory = File.expand_path(File.dirname(__FILE__)) 6 | require directory+'/romankana/r2k.rb' 7 | require directory+'/romankana/k2r.rb' 8 | require directory+'/romankana/utils.rb' 9 | require directory+'/romankana/romankana.rb' 10 | require directory+'/romankana/string.rb' 11 | require directory+'/romankana/version.rb' 12 | 13 | module RomanKana 14 | end 15 | -------------------------------------------------------------------------------- /tasks/rspec.rake: -------------------------------------------------------------------------------- 1 | begin 2 | require 'rspec' 3 | rescue LoadError 4 | require 'rubygems' unless ENV['NO_RUBYGEMS'] 5 | require 'rspec' 6 | end 7 | begin 8 | require 'rspec/core/rake_task' 9 | rescue LoadError 10 | puts <<-EOS 11 | To use rspec for testing you must install rspec gem: 12 | gem install rspec 13 | EOS 14 | exit(0) 15 | end 16 | 17 | desc "Run the specs under spec/models" 18 | RSpec::Core::RakeTask.new do |t| 19 | t.rspec_opts = ['--options', "spec/spec.opts"] 20 | t.pattern = 'spec/**/*_spec.rb' 21 | end 22 | -------------------------------------------------------------------------------- /romankana.gemspec: -------------------------------------------------------------------------------- 1 | lib = File.expand_path('../lib', __FILE__) 2 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 3 | require 'romankana/version' 4 | 5 | Gem::Specification.new do |spec| 6 | spec.name = "romankana" 7 | spec.version = RomanKana::VERSION 8 | spec.authors = ["ymrl"] 9 | spec.email = ["ymrl@ymrl.net"] 10 | spec.summary = %q{Roman Alphabet <-> Japanese Hiragana/Katkakana Convert Library for Ruby} 11 | spec.description = spec.summary 12 | spec.homepage = "https://github.com/ymrl/romankana" 13 | spec.license = "MIT" 14 | spec.required_ruby_version = ">= 1.9" 15 | 16 | spec.files = `git ls-files`.split($/) 17 | spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } 18 | spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) 19 | spec.require_paths = ["lib"] 20 | 21 | spec.add_development_dependency "bundler", "~> 1.5" 22 | spec.add_development_dependency "rake" 23 | spec.add_development_dependency "rspec" 24 | end 25 | -------------------------------------------------------------------------------- /lib/romankana/string.rb: -------------------------------------------------------------------------------- 1 | #coding:UTF-8 2 | $:.unshift(File.dirname(__FILE__)) unless 3 | $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__))) 4 | 5 | require 'romankana' 6 | 7 | class String 8 | def roman_to_hiragana 9 | r = self.split(/([a-zA-Z]+)/u).map{|e|e =~ /[a-zA-Z]+/u?NKF.nkf("-Wwh1",RomanKana.romankana(e)):e}.join('') 10 | return RomanKana::Utils.set_encoding_of_before(self,r) 11 | end 12 | def roman_to_katakana 13 | r = self.split(/([a-zA-Z]+)/u).map{|e|e =~ /[a-zA-Z]+/u?RomanKana.romankana(e):e}.join('') 14 | return RomanKana::Utils.set_encoding_of_before(self,r) 15 | end 16 | def katakana_to_roman 17 | r = self.split(/([ァ-ヴ]+)/u).map{|e|e =~ /[ァ-ヴ]+/u?RomanKana.kanaroman(e):e}.join('') 18 | return RomanKana::Utils.set_encoding_of_before(self,r) 19 | end 20 | def hiragana_to_roman 21 | r = self.split(/([ぁ-ゔ]+)/u).map{|e|e =~ /[ぁ-ゔ]+/u?NKF.nkf("-Wwh1",RomanKana.kanaroman(e)):e}.join('') 22 | return RomanKana::Utils.set_encoding_of_before(self,r) 23 | end 24 | def to_roman 25 | r = RomanKana.kanaroman(self) 26 | return RomanKana::Utils.set_encoding_of_before(self,r) 27 | end 28 | def to_hiragana 29 | r = NKF.nkf('-Wwh1',RomanKana.romankana(self)) 30 | return RomanKana::Utils.set_encoding_of_before(self,r) 31 | end 32 | def to_katakana 33 | r = NKF.nkf('-Wwh2',RomanKana.romankana(self)) 34 | return RomanKana::Utils.set_encoding_of_before(self,r) 35 | end 36 | def to_hankaku 37 | r = NKF.nkf('-Z4xwW',RomanKana::Utils.convert_utf8(self)) 38 | return RomanKana::Utils.set_encoding_of_before(self,r) 39 | end 40 | end 41 | -------------------------------------------------------------------------------- /spec/string_spec.rb: -------------------------------------------------------------------------------- 1 | #coding:UTF-8 2 | require 'spec_helper' 3 | describe String do 4 | 5 | describe '#roman_to_hiragana' do 6 | it 'converts roman-ji to hiragana' do 7 | expect('ほげほげhogehogeホゲホゲ'.roman_to_hiragana).to eq 'ほげほげほげほげホゲホゲ' 8 | end 9 | end 10 | 11 | describe '#roman_to_katakana' do 12 | it 'converts roman-ji to katakana' do 13 | expect('ほげほげhogehogeホゲホゲ'.roman_to_katakana).to eq 'ほげほげホゲホゲホゲホゲ' 14 | end 15 | end 16 | 17 | describe '#katakana_to_roman' do 18 | it 'converts katakana to roman' do 19 | expect('ほげほげhogehogeホゲホゲ'.katakana_to_roman).to eq 'ほげほげhogehogehogehoge' 20 | end 21 | end 22 | 23 | describe '#hiragana_to_roman' do 24 | it 'converts hiragana to roman' do 25 | expect('ほげほげhogehogeホゲホゲ'.hiragana_to_roman).to eq 'hogehogehogehogeホゲホゲ' 26 | end 27 | end 28 | 29 | describe '#to_roman' do 30 | it 'converts all kana to roman' do 31 | expect('ほげほげhogehogeホゲホゲ'.to_roman).to eq 'hogehogehogehogehogehoge' 32 | end 33 | end 34 | 35 | 36 | describe '#to_hiragana' do 37 | it 'converts all roman-ji and katakana to hiragana' do 38 | expect('ほげほげhogehogeホゲホゲ'.to_hiragana).to eq 'ほげほげほげほげほげほげ' 39 | end 40 | end 41 | 42 | describe '#to_katakana' do 43 | it 'converts all roman-ji and hiragana to katakana' do 44 | expect('ほげほげhogehogeホゲホゲ'.to_katakana).to eq 'ホゲホゲホゲホゲホゲホゲ' 45 | end 46 | end 47 | 48 | 49 | describe '#to_hankaku' do 50 | it 'converts katkana and zenkaku alphabet to hankaku' do 51 | expect('ほげほげhogehogeホゲホゲhogehoge'.to_hankaku).to eq 'ほげほげhogehogeホゲホゲhogehoge' 52 | end 53 | end 54 | 55 | end 56 | -------------------------------------------------------------------------------- /lib/romankana/romankana.rb: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | $:.unshift(File.dirname(__FILE__)) unless 3 | $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__))) 4 | 5 | require 'kconv' 6 | require 'utils' 7 | 8 | module RomanKana 9 | def self.find_kana_from_str str 10 | return '' if !str || str.length == 0 11 | found = R2K_TABLE[str] 12 | if found 13 | return found 14 | elsif str.length >= 2 && str[0] == 'n' && str[1] == 'n' 15 | return "ン#{find_kana_from_str(str[2..-1])}" 16 | elsif str.length > 2 && str[0] == 'n' && str[1] !~ /[aiueoy]/ 17 | return "ン#{find_kana_from_str(str[1..-1])}" 18 | elsif str.length > 2 && str[0] == 'm' && str[1] =~ /[bmp]/ 19 | return "ン#{find_kana_from_str(str[1..-1])}" 20 | elsif str.length >= 2 && str[0] == str[1] && str[0] =~ /[bcdfghjklmnpqrstvwxyz]/ 21 | return "ッ#{find_kana_from_str(str[1..-1])}" 22 | elsif str.length >= 2 23 | return "#{find_kana_from_str(str[0])}#{find_kana_from_str(str[1..-1])}" 24 | else 25 | return str 26 | end 27 | end 28 | 29 | def self.romankana str 30 | str = RomanKana::Utils.convert_utf8(str) 31 | ret = '' 32 | array = NKF.nkf('-WwZ0',str).downcase.split(/([^a-z])/).map do |e| 33 | e.split(/([^aiueo]*[aiueo])/).delete_if{|e|e.length == 0} 34 | end.flatten 35 | ret = array.map{|e| find_kana_from_str e } 36 | return ret.join('') 37 | end 38 | 39 | def self.kanaroman str 40 | str = RomanKana::Utils.convert_utf8(str) 41 | ret = nil 42 | 43 | temp = NKF.nkf('-Wwh2',str).split('') 44 | array = [] 45 | temp.each_with_index do |s,i| 46 | if i + 1 < temp.length 47 | next_str = temp[i+1] 48 | if next_str =~ /[ァィゥェォャュョ]/u 49 | s = "#{s}#{next_str}" 50 | temp[i+1] = nil 51 | end 52 | end 53 | array.push s if s 54 | end 55 | 56 | ret = array.map{|e| K2R_TABLE[e] || e } 57 | ret.each_with_index do |s,i| 58 | if s == 'ッ' 59 | if i + 1 < ret.length 60 | c = ret[i+1].split('').first 61 | ret[i] = c if c !~ /[aiueo]/ 62 | end 63 | elsif s == 'ー' 64 | if i - 1 >= 0 65 | c = ret[i-1].split('').last 66 | ret[i] = c if c =~ /[aiueo]/ 67 | end 68 | end 69 | end 70 | return ret.join('') 71 | end 72 | end 73 | -------------------------------------------------------------------------------- /README.rdoc: -------------------------------------------------------------------------------- 1 | = RomanKana: 2 | {Build Status}[https://travis-ci.org/ymrl/romankana] 3 | {Coverage Status}[https://coveralls.io/r/ymrl/romankana] 4 | 5 | 6 | * https://github.com/ymrl/romankana 7 | 8 | == DESCRIPTION: 9 | 10 | Roman Alphabet <-> Japanese Hiragana/Katkakana Convert Library for Ruby 11 | 12 | == SYNOPSIS: 13 | 14 | require 'romankana' 15 | RomanKana.kanaroman 'ほげほげ' #=> 'hogehoge' 16 | RomanKana.kanaroman 'ホゲホゲ' #=> 'hogehoge' 17 | RomanKana.romankana 'hogehoge' #=> 'ほげほげ' 18 | 'hogehoge'.to_hiragana #=> 'ほげほげ' 19 | 'hogehoge'.to_katakana #=> 'ホゲホゲ' 20 | 'ほげほげホゲホゲ'.to_roman #=> 'hogehogehogehoge' 21 | 'ほげほげhogehogeホゲホゲ'.to_roman #=> 'hogehogehogehoge' 22 | 'ほげほげhogehogeホゲホゲ'.hiragana_to_roman #=> 'hogehogehogehogeホゲホゲ' 23 | 'ほげほげhogehogeホゲホゲ'.katakana_to_roman #=> 'ほげほげhogehogehogehoge' 24 | 'ほげほげhogehogeホゲホゲ'.roman_to_katakana #=> 'ほげほげホゲホゲホゲホゲ' 25 | 'ほげほげhogehogeホゲホゲ'.roman_to_hiragana #=> 'ほげほげほげほげホゲホゲ' 26 | 27 | == REQUIREMENTS: 28 | 29 | * ruby (VERSION >= 1.9) 30 | 31 | == INSTALL: 32 | gem install romankana 33 | 34 | == LICENSE: 35 | 36 | (The MIT License) 37 | 38 | Copyright (c) 2011 Allu Yamane 39 | 40 | Permission is hereby granted, free of charge, to any person obtaining 41 | a copy of this software and associated documentation files (the 42 | 'Software'), to deal in the Software without restriction, including 43 | without limitation the rights to use, copy, modify, merge, publish, 44 | distribute, sublicense, and/or sell copies of the Software, and to 45 | permit persons to whom the Software is furnished to do so, subject to 46 | the following conditions: 47 | 48 | The above copyright notice and this permission notice shall be 49 | included in all copies or substantial portions of the Software. 50 | 51 | THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, 52 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 53 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 54 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 55 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 56 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 57 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 58 | -------------------------------------------------------------------------------- /lib/romankana/k2r.rb: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | module RomanKana 3 | K2R_TABLE = { 4 | 'ア' => 'a', 5 | 'イ' => 'i', 6 | 'ウ' => 'u', 7 | 'エ' => 'e', 8 | 'オ' => 'o', 9 | 'カ' => 'ka', 10 | 'キ' => 'ki', 11 | 'ク' => 'ku', 12 | 'ケ' => 'ke', 13 | 'コ' => 'ko', 14 | 'サ' => 'sa', 15 | 'シ' => 'shi', 16 | 'ス' => 'su', 17 | 'セ' => 'se', 18 | 'ソ' => 'so', 19 | 'タ' => 'ta', 20 | 'チ' => 'chi', 21 | 'ツ' => 'tsu', 22 | 'テ' => 'te', 23 | 'ト' => 'to', 24 | 'ナ' => 'na', 25 | 'ニ' => 'ni', 26 | 'ヌ' => 'nu', 27 | 'ネ' => 'ne', 28 | 'ノ' => 'no', 29 | 'ハ' => 'ha', 30 | 'ヒ' => 'hi', 31 | 'フ' => 'fu', 32 | 'ヘ' => 'he', 33 | 'ホ' => 'ho', 34 | 'マ' => 'ma', 35 | 'ミ' => 'mi', 36 | 'ム' => 'mu', 37 | 'メ' => 'me', 38 | 'モ' => 'mo', 39 | 'ヤ' => 'ya', 40 | 'ユ' => 'yu', 41 | 'ヨ' => 'yo', 42 | 'ラ' => 'ra', 43 | 'リ' => 'ri', 44 | 'ル' => 'ru', 45 | 'レ' => 're', 46 | 'ロ' => 'ro', 47 | 'ワ' => 'wa', 48 | 'ヰ' => 'i', 49 | 'ヱ' => 'e', 50 | 'ヲ' => 'o', 51 | 'ン' => 'n', 52 | 'ガ' => 'ga', 53 | 'ギ' => 'gi', 54 | 'グ' => 'gu', 55 | 'ゲ' => 'ge', 56 | 'ゴ' => 'go', 57 | 'ザ' => 'za', 58 | 'ジ' => 'ji', 59 | 'ズ' => 'zu', 60 | 'ゼ' => 'ze', 61 | 'ゾ' => 'zo', 62 | 'ダ' => 'da', 63 | 'ヂ' => 'ji', 64 | 'ヅ' => 'zu', 65 | 'デ' => 'de', 66 | 'ド' => 'do', 67 | 'バ' => 'ba', 68 | 'ビ' => 'bi', 69 | 'ブ' => 'bu', 70 | 'ベ' => 'be', 71 | 'ボ' => 'bo', 72 | 'パ' => 'pa', 73 | 'ピ' => 'pi', 74 | 'プ' => 'pu', 75 | 'ペ' => 'pe', 76 | 'ポ' => 'po', 77 | 'キャ' => 'kya', 78 | 'キュ' => 'kyu', 79 | 'キョ' => 'kyo', 80 | 'シャ' => 'sha', 81 | 'シュ' => 'shu', 82 | 'ショ' => 'sho', 83 | 'チャ' => 'cha', 84 | 'チュ' => 'chu', 85 | 'チョ' => 'cho', 86 | 'ヂャ' => 'ja', 87 | 'ヂュ' => 'ju', 88 | 'ヂョ' => 'jo', 89 | 'ニャ' => 'nya', 90 | 'ニュ' => 'nyu', 91 | 'ニョ' => 'nyo', 92 | 'ヒャ' => 'hya', 93 | 'ヒュ' => 'hyu', 94 | 'ヒョ' => 'hyo', 95 | 'ミャ' => 'mya', 96 | 'ミュ' => 'myu', 97 | 'ミョ' => 'myo', 98 | 'リャ' => 'rya', 99 | 'リュ' => 'ryu', 100 | 'リョ' => 'ryo', 101 | 'ギャ' => 'gya', 102 | 'ギュ' => 'gyu', 103 | 'ギョ' => 'gyo', 104 | 'ジャ' => 'ja', 105 | 'ジュ' => 'ju', 106 | 'ジョ' => 'jo', 107 | 'ビャ' => 'bya', 108 | 'ビュ' => 'byu', 109 | 'ビョ' => 'byo', 110 | 'ピャ' => 'pya', 111 | 'ピュ' => 'pyu', 112 | 'ピョ' => 'pyo', 113 | 'ヴァ' => 'va', 114 | 'ヴィ' => 'vi', 115 | 'ヴ' => 'vu', 116 | 'ヴェ' => 've', 117 | 'ヴォ' => 'vo', 118 | 'ファ' => 'fa', 119 | 'フィ' => 'fi', 120 | 'フェ' => 'fe', 121 | 'フォ' => 'fo', 122 | } 123 | end 124 | -------------------------------------------------------------------------------- /lib/romankana/r2k.rb: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | module RomanKana 3 | R2K_TABLE = { 4 | 'a' => 'ア', 5 | 'i' => 'イ', 6 | 'u' => 'ウ', 7 | 'e' => 'エ', 8 | 'o' => 'オ', 9 | 'ba' => 'バ', 'bya' => 'ビャ', 10 | 'bi' => 'ビ', 'byi' => 'ビィ', 11 | 'bu' => 'ブ', 'byu' => 'ビュ', 12 | 'be' => 'ベ', 'bye' => 'ビェ', 13 | 'bo' => 'ボ', 'byo' => 'ビョ', 14 | 'ca' => 'カ', 'cya' => 'チャ', 'cha' => 'チャ', 15 | 'ci' => 'シ', 'cyi' => 'チィ', 'chi' => 'チ', 16 | 'cu' => 'ス', 'cyu' => 'チュ', 'chu' => 'チュ', 17 | 'ce' => 'セ', 'cye' => 'チェ', 'che' => 'チェ', 18 | 'co' => 'コ', 'cyo' => 'チョ', 'cho' => 'チョ', 19 | 'da' => 'ダ', 'dya' => 'ヂャ', 'dha' => 'ドャ', 20 | 'di' => 'ヂ', 'dyi' => 'ヂィ', 'dhi' => 'ドィ', 21 | 'du' => 'ヅ', 'dyu' => 'ヂュ', 'dhu' => 'ドュ', 22 | 'de' => 'デ', 'dye' => 'ヂェ', 'dhe' => 'ドェ', 23 | 'do' => 'ド', 'dyo' => 'ヂョ', 'dho' => 'ドョ', 24 | 'fa' => 'ファ', 'fya' => 'フャ', 25 | 'fi' => 'フィ', 'fyi' => 'フィ', 26 | 'fu' => 'フ', 'fyu' => 'フュ', 27 | 'fe' => 'フェ', 'fye' => 'フェ', 28 | 'fo' => 'フォ', 'fyo' => 'フョ', 29 | 'ga' => 'ガ', 'gya' => 'ギャ', 30 | 'gi' => 'ギ', 'gyi' => 'ギィ', 31 | 'gu' => 'グ', 'gyu' => 'ギュ', 32 | 'ge' => 'ゲ', 'gye' => 'ギェ', 33 | 'go' => 'ゴ', 'gyo' => 'ギョ', 34 | 'ha' => 'ハ', 'hya' => 'ヒャ', 35 | 'hi' => 'ヒ', 'hyi' => 'ヒィ', 36 | 'hu' => 'フ', 'hyu' => 'ヒュ', 37 | 'he' => 'ヘ', 'hye' => 'ヒェ', 38 | 'ho' => 'ホ', 'hyo' => 'ヒョ', 39 | 'ja' => 'ジャ', 'jya' => 'ジャ', 40 | 'ji' => 'ジ', 'jyi' => 'ジィ', 41 | 'ju' => 'ジュ', 'jyu' => 'ジュ', 42 | 'je' => 'ジェ', 'jye' => 'ジェ', 43 | 'jo' => 'ジョ', 'jyo' => 'ジョ', 44 | 'ka' => 'カ', 'kya' => 'キャ', 45 | 'ki' => 'キ', 'kyi' => 'キィ', 46 | 'ku' => 'ク', 'kyu' => 'キュ', 47 | 'ke' => 'ケ', 'kye' => 'キェ', 48 | 'ko' => 'コ', 'kyo' => 'キョ', 49 | 'la' => 'ラ', 'lya' => 'リャ', 50 | 'li' => 'リ', 'lyi' => 'リィ', 51 | 'lu' => 'ル', 'lyu' => 'リュ', 52 | 'le' => 'レ', 'lye' => 'リェ', 53 | 'lo' => 'ロ', 'lyo' => 'リョ', 54 | 'ma' => 'マ', 'mya' => 'ミャ', 55 | 'mi' => 'ミ', 'myi' => 'ミィ', 56 | 'mu' => 'ム', 'myu' => 'ミュ', 57 | 'me' => 'メ', 'mye' => 'ミェ', 58 | 'mo' => 'モ', 'myo' => 'ミョ', 59 | 'na' => 'ナ', 'nya' => 'ニャ', 60 | 'ni' => 'ニ', 'nyi' => 'ニィ', 61 | 'nu' => 'ヌ', 'nyu' => 'ニュ', 62 | 'ne' => 'ネ', 'nye' => 'ニェ', 63 | 'no' => 'ノ', 'nyo' => 'ニョ', 64 | 'pa' => 'パ', 'pya' => 'ピャ', 65 | 'pi' => 'ピ', 'pyi' => 'ピィ', 66 | 'pu' => 'プ', 'pyu' => 'ピュ', 67 | 'pe' => 'ペ', 'pye' => 'ピェ', 68 | 'po' => 'ポ', 'pyo' => 'ピョ', 69 | 'qa' => 'クァ', 70 | 'qi' => 'クィ', 71 | 'qu' => 'ク', 72 | 'qe' => 'クェ', 73 | 'qo' => 'クォ', 74 | 'ra' => 'ラ', 'rya' => 'リャ', 'sha' => 'シャ', 75 | 'ri' => 'リ', 'ryi' => 'リィ', 'shi' => 'シ', 76 | 'ru' => 'ル', 'ryu' => 'リュ', 'shu' => 'シュ', 77 | 're' => 'レ', 'rye' => 'リェ', 'she' => 'シェ', 78 | 'ro' => 'ロ', 'ryo' => 'リョ', 'sho' => 'ショ', 79 | 'sa' => 'サ', 'sya' => 'シャ', 80 | 'si' => 'シ', 'syi' => 'シィ', 81 | 'su' => 'ス', 'syu' => 'シュ', 82 | 'se' => 'セ', 'sye' => 'シェ', 83 | 'so' => 'ソ', 'syo' => 'ショ', 84 | 'ta' => 'タ', 'tya' => 'チャ', 'tha' => 'テャ', 85 | 'ti' => 'チ', 'tyi' => 'チィ', 'thi' => 'ティ', 86 | 'tu' => 'ツ', 'tyu' => 'チュ', 'thu' => 'テュ', 87 | 'te' => 'テ', 'tye' => 'チェ', 'the' => 'テェ', 88 | 'to' => 'ト', 'tyo' => 'チョ', 'tho' => 'テョ', 89 | 'va' => 'ヴァ', 'vya' => 'ヴャ', 90 | 'vi' => 'ヴィ', 'vyi' => 'ヴィ', 91 | 'vu' => 'ヴ', 'vyu' => 'ヴュ', 92 | 've' => 'ヴェ', 'vye' => 'ヴェ', 93 | 'vo' => 'ヴォ', 'vyo' => 'ヴョ', 94 | 'wa' => 'ワ', 'wha' => 'ウァ', 95 | 'wi' => 'ウィ', 'wyi' => 'ヰ', 'whi' => 'ウィ', 96 | 'wu' => 'ウ', 'whu' => 'ウ', 97 | 'we' => 'ウェ', 'wye' => 'ヱ', 'whe' => 'ウェ', 98 | 'wo' => 'ヲ', 'who' => 'ウォ', 99 | 'xa' => 'ザ', 100 | 'xi' => 'ジ', 101 | 'xu' => 'ズ', 102 | 'xe' => 'ゼ', 103 | 'xo' => 'ゾ', 104 | 'ya' => 'ヤ', 105 | 'yi' => 'ヰ', 106 | 'yu' => 'ユ', 107 | 'ye' => 'ヱ', 108 | 'yo' => 'ヨ', 109 | 'za' => 'ザ', 'zya' => 'ジャ', 110 | 'zi' => 'ジ', 'zyi' => 'ジィ', 111 | 'zu' => 'ズ', 'zyu' => 'ジュ', 112 | 'ze' => 'ゼ', 'zye' => 'ジェ', 113 | 'zo' => 'ゾ', 'zyo' => 'ジョ', 114 | 'nn' => 'ン', 115 | 'tsu' => 'ツ', 116 | } 117 | end 118 | -------------------------------------------------------------------------------- /spec/romankana_spec.rb: -------------------------------------------------------------------------------- 1 | # coding:UTF-8 2 | require 'spec_helper.rb' 3 | 4 | describe RomanKana do 5 | 6 | describe "#find_kana_from_str" do 7 | let(:given){ '' } 8 | before do 9 | @got = RomanKana.find_kana_from_str given 10 | end 11 | 12 | context 'non-alphabet string given' do 13 | let(:given){ 'あ' } 14 | 15 | it 'returns given string' do 16 | expect(@got).to eq given 17 | end 18 | end 19 | 20 | context 'string starts with nn given' do 21 | let(:given){ 'nnya' } 22 | 23 | it 'returns ン...' do 24 | expect(@got).to eq 'ンヤ' 25 | end 26 | end 27 | 28 | context 'string stats with n given' do 29 | context 'next to consonant' do 30 | let(:given){ 'nga' } 31 | 32 | it 'returns ンガ' do 33 | expect(@got).to eq 'ンガ' 34 | end 35 | end 36 | context 'next to vowel' do 37 | let(:given){ 'nya' } 38 | 39 | it 'returns ニャ' do 40 | expect(@got).to eq 'ニャ' 41 | end 42 | end 43 | end 44 | 45 | context 'string stats with m given' do 46 | context 'means ン' do 47 | let(:given){ 'mba' } 48 | 49 | it 'returns ンバ' do 50 | expect(@got).to eq 'ンバ' 51 | end 52 | end 53 | 54 | context 'next to vowel' do 55 | let(:given){ 'ma' } 56 | 57 | it 'returns マ' do 58 | expect(@got).to eq 'マ' 59 | end 60 | end 61 | 62 | context 'nonsense' do 63 | let(:given){ 'mdo' } 64 | 65 | it 'returns mド' do 66 | expect(@got).to eq 'mド' 67 | end 68 | end 69 | end 70 | 71 | context 'string starts with same 2 alphabet given' do 72 | context 'that is consonant' do 73 | let(:given){'tto'} 74 | 75 | it 'returns ット' do 76 | expect(@got).to eq 'ット' 77 | end 78 | end 79 | 80 | context 'that is vowel' do 81 | let(:given){'aada'} 82 | 83 | it 'returns アアダ' do 84 | expect(@got).to eq 'アアダ' 85 | end 86 | end 87 | end 88 | 89 | context 'long string given' do 90 | let(:given){ 'aaaaaaaa' } 91 | 92 | it 'returns アアアアアアア' do 93 | expect(@got).to eq 'アアアアアアアア' 94 | end 95 | end 96 | end 97 | 98 | describe "#romankana" do 99 | let(:given){ '' } 100 | before do 101 | @got = RomanKana.romankana given 102 | end 103 | 104 | context 'hiragana given' do 105 | let(:given) { 'あのいーはとーゔぉのすきとおったかぜ' } 106 | 107 | it 'does nothing' do 108 | expect(@got).to eq given 109 | end 110 | end 111 | 112 | context 'katakana given' do 113 | let(:given) { 'アノイーハトーヴォノスキトオッタカゼ' } 114 | 115 | it 'does nothing' do 116 | expect(@got).to eq given 117 | end 118 | 119 | end 120 | 121 | 122 | context 'roman-ji given' do 123 | let(:given) { 'ano iihatoovo no sukitootta kaze' } 124 | it 'returns katakana' do 125 | expect(@got).to eq 'アノ イイハトオヴォ ノ スキトオッタ カゼ' 126 | end 127 | end 128 | 129 | context 'ン given' do 130 | context 'in nn' do 131 | let(:given){'kouennji himonnya'} 132 | 133 | it 'handles nn as ン' do 134 | expect(@got).to eq 'コウエンジ ヒモンヤ' 135 | end 136 | end 137 | 138 | context 'in n' do 139 | let(:given){'kouenji himonya'} 140 | 141 | it 'handles n as ン' do 142 | expect(@got).to eq 'コウエンジ ヒモニャ' 143 | end 144 | end 145 | end 146 | 147 | context 'the Hepburn system given' do 148 | let(:given){'nishinippori hambaagu'} 149 | 150 | it 'handles in the Hepburn system' do 151 | expect(@got).to eq 'ニシニッポリ ハンバアグ' 152 | end 153 | end 154 | 155 | context 'the kunrei system given' do 156 | let(:given){'nisinippori hanbaagu'} 157 | 158 | it 'handles in the kunrei system' do 159 | expect(@got).to eq 'ニシニッポリ ハンバアグ' 160 | end 161 | end 162 | end 163 | 164 | describe "#kanaroman" do 165 | let(:given){ '' } 166 | before do 167 | @got = RomanKana.kanaroman given 168 | end 169 | 170 | context 'roman-ji given' do 171 | let(:given) { 'ano iihatoovo no sukitootta kaze' } 172 | 173 | it 'does nothing' do 174 | expect(@got).to eq given 175 | end 176 | end 177 | 178 | context 'hiragana given' do 179 | let(:given) { 'あのいーはとーゔぉのすきとおったかぜ' } 180 | 181 | it 'converts to roman-ji' do 182 | expect(@got).to eq 'anoiihatoovonosukitoottakaze' 183 | end 184 | 185 | end 186 | 187 | context 'katakana given' do 188 | let(:given) { 'アノイーハトーヴォノスキトオッタカゼ' } 189 | 190 | it 'converts to roman-ji' do 191 | expect(@got).to eq 'anoiihatoovonosukitoottakaze' 192 | end 193 | end 194 | 195 | context 'ン given' do 196 | context 'in nn' do 197 | let(:given){'コウエンジ ヒモンヤ'} 198 | 199 | it 'handles ン' do 200 | expect(@got).to eq 'kouenji himonya' 201 | end 202 | end 203 | end 204 | 205 | context 'ー and ッ given' do 206 | let(:given){'マークザッカーバーグ アーノルドシュワルツネッガー'} 207 | 208 | it 'changes ー' do 209 | expect(@got).to eq 'maakuzakkaabaagu aanorudoshuwarutsuneggaa' 210 | end 211 | end 212 | end 213 | end 214 | -------------------------------------------------------------------------------- /test/romankana_test.rb: -------------------------------------------------------------------------------- 1 | #!/bin/env ruby 2 | # -*- coding: utf-8 -*- 3 | 4 | # romankanaを設置するファイル構成に合わせて調整してね! 5 | $:.unshift File.join(File.dirname(__FILE__), '..', 'lib') 6 | 7 | require 'test/unit' 8 | require 'romankana' 9 | 10 | class RomankanaTest < Test::Unit::TestCase 11 | @@roma_data = { 12 | 'A'=>['あ','ア'], 13 | 'I'=>['い','イ'], 14 | 'U'=>['う','ウ'], 15 | 'E'=>['え','エ'], 16 | 'O'=>['お','オ'], 17 | 'LA'=>['ら','ラ'], 18 | 'LI'=>['り','リ'], 19 | 'LU'=>['る','ル'], 20 | 'LE'=>['れ','レ'], 21 | 'LO'=>['ろ','ロ'], 22 | 'KA'=>['か','カ'], 23 | 'KI'=>['き','キ'], 24 | 'KU'=>['く','ク'], 25 | 'KE'=>['け','ケ'], 26 | 'KO'=>['こ','コ'], 27 | 'KYA'=>['きゃ','キャ'], 28 | 'KYU'=>['きゅ','キュ'], 29 | 'KYO'=>['きょ','キョ'], 30 | 'SA'=>['さ','サ'], 31 | 'SI'=>['し','シ'], 32 | 'SHI'=>['し','シ'], 33 | 'SU'=>['す','ス'], 34 | 'SE'=>['せ','セ'], 35 | 'SO'=>['そ','ソ'], 36 | 'SYA'=>['しゃ','シャ'], 37 | 'SHA'=>['しゃ','シャ'], 38 | 'SYU'=>['しゅ','シュ'], 39 | 'SHU'=>['しゅ','シュ'], 40 | 'SYO'=>['しょ','ショ'], 41 | 'SHO'=>['しょ','ショ'], 42 | 'TA'=>['た','タ'], 43 | 'TI'=>['ち','チ'], 44 | 'CHI'=>['ち','チ'], 45 | 'TU'=>['つ','ツ'], 46 | 'TSU'=>['つ','ツ'], 47 | 'TE'=>['て','テ'], 48 | 'TO'=>['と','ト'], 49 | 'TYA'=>['ちゃ','チャ'], 50 | 'CHA'=>['ちゃ','チャ'], 51 | 'TYU'=>['ちゅ','チュ'], 52 | 'CHU'=>['ちゅ','チュ'], 53 | 'TYO'=>['ちょ','チョ'], 54 | 'CHO'=>['ちょ','チョ'], 55 | 'NA'=>['な','ナ'], 56 | 'NI'=>['に','ニ'], 57 | 'NU'=>['ぬ','ヌ'], 58 | 'NE'=>['ね','ネ'], 59 | 'NO'=>['の','ノ'], 60 | 'NYA'=>['にゃ','ニャ'], 61 | 'NYU'=>['にゅ','ニュ'], 62 | 'NYO'=>['にょ','ニョ'], 63 | 'HA'=>['は','ハ'], 64 | 'HI'=>['ひ','ヒ'], 65 | 'HU'=>['ふ','フ'], 66 | 'FU'=>['ふ','フ'], 67 | 'HE'=>['へ','ヘ'], 68 | 'HO'=>['ほ','ホ'], 69 | 'HYA'=>['ひゃ','ヒャ'], 70 | 'HYU'=>['ひゅ','ヒュ'], 71 | 'HYO'=>['ひょ','ヒョ'], 72 | 'MA'=>['ま','マ'], 73 | 'MI'=>['み','ミ'], 74 | 'MU'=>['む','ム'], 75 | 'ME'=>['め','メ'], 76 | 'MO'=>['も','モ'], 77 | 'MYA'=>['みゃ','ミャ'], 78 | 'MYU'=>['みゅ','ミュ'], 79 | 'MYO'=>['みょ','ミョ'], 80 | 'YA'=>['や','ヤ'], 81 | 'YU'=>['ゆ','ユ'], 82 | 'YO'=>['よ','ヨ'], 83 | 'RA'=>['ら','ラ'], 84 | 'RI'=>['り','リ'], 85 | 'RU'=>['る','ル'], 86 | 'RE'=>['れ','レ'], 87 | 'RO'=>['ろ','ロ'], 88 | 'RYA'=>['りゃ','リャ'], 89 | 'RYU'=>['りゅ','リュ'], 90 | 'RYO'=>['りょ','リョ'], 91 | 'WA'=>['わ','ワ'], 92 | 'WO'=>['を','ヲ'], 93 | 'NN'=>['ん','ン'], 94 | 'GA'=>['が','ガ'], 95 | 'GI'=>['ぎ','ギ'], 96 | 'GU'=>['ぐ','グ'], 97 | 'GE'=>['げ','ゲ'], 98 | 'GO'=>['ご','ゴ'], 99 | 'GYA'=>['ぎゃ','ギャ'], 100 | 'GYU'=>['ぎゅ','ギュ'], 101 | 'GYO'=>['ぎょ','ギョ'], 102 | 'ZA'=>['ざ','ザ'], 103 | 'ZI'=>['じ','ジ'], 104 | 'JI'=>['じ','ジ'], 105 | 'ZU'=>['ず','ズ'], 106 | 'ZE'=>['ぜ','ゼ'], 107 | 'ZO'=>['ぞ','ゾ'], 108 | 'ZYA'=>['じゃ','ジャ'], 109 | 'JA'=>['じゃ','ジャ'], 110 | 'ZYU'=>['じゅ','ジュ'], 111 | 'JU'=>['じゅ','ジュ'], 112 | 'ZYO'=>['じょ','ジョ'], 113 | 'JO'=>['じょ','ジョ'], 114 | 'DA'=>['だ','ダ'], 115 | 'DI'=>['ぢ','ヂ'], 116 | 'DU'=>['づ','ヅ'], 117 | 'DE'=>['で','デ'], 118 | 'DO'=>['ど','ド'], 119 | 'DYA'=>['ぢゃ','ヂャ'], 120 | 'DYU'=>['ぢゅ','ヂュ'], 121 | 'DYO'=>['ぢょ','ヂョ'], 122 | 'BA'=>['ば','バ'], 123 | 'BI'=>['び','ビ'], 124 | 'BU'=>['ぶ','ブ'], 125 | 'BE'=>['べ','ベ'], 126 | 'BO'=>['ぼ','ボ'], 127 | 'BYA'=>['びゃ','ビャ'], 128 | 'BYU'=>['びゅ','ビュ'], 129 | 'BYO'=>['びょ','ビョ'], 130 | 'PA'=>['ぱ','パ'], 131 | 'PI'=>['ぴ','ピ'], 132 | 'PU'=>['ぷ','プ'], 133 | 'PE'=>['ぺ','ペ'], 134 | 'PO'=>['ぽ','ポ'], 135 | 'PYA'=>['ぴゃ','ピャ'], 136 | 'PYU'=>['ぴゅ','ピュ'], 137 | 'PYO'=>['ぴょ','ピョ'], 138 | 'FA'=>['ふぁ','ファ'], 139 | 'FI'=>['ふぃ','フィ'], 140 | 'FE'=>['ふぇ','フェ'], 141 | 'FO'=>['ふぉ','フォ'], 142 | 'FYA'=>['ふゃ','フャ'], 143 | 'FYU'=>['ふゅ','フュ'], 144 | 'FYO'=>['ふょ','フョ'], 145 | 'a'=>['あ','ア'], 146 | 'i'=>['い','イ'], 147 | 'u'=>['う','ウ'], 148 | 'e'=>['え','エ'], 149 | 'o'=>['お','オ'], 150 | 'ka'=>['か','カ'], 151 | 'ki'=>['き','キ'], 152 | 'ku'=>['く','ク'], 153 | 'ke'=>['け','ケ'], 154 | 'ko'=>['こ','コ'], 155 | 'kya'=>['きゃ','キャ'], 156 | 'kyu'=>['きゅ','キュ'], 157 | 'kyo'=>['きょ','キョ'], 158 | 'sa'=>['さ','サ'], 159 | 'si'=>['し','シ'], 160 | 'shi'=>['し','シ'], 161 | 'su'=>['す','ス'], 162 | 'se'=>['せ','セ'], 163 | 'so'=>['そ','ソ'], 164 | 'sya'=>['しゃ','シャ'], 165 | 'sha'=>['しゃ','シャ'], 166 | 'syu'=>['しゅ','シュ'], 167 | 'shu'=>['しゅ','シュ'], 168 | 'syo'=>['しょ','ショ'], 169 | 'sho'=>['しょ','ショ'], 170 | 'ta'=>['た','タ'], 171 | 'ti'=>['ち','チ'], 172 | 'chi'=>['ち','チ'], 173 | 'tu'=>['つ','ツ'], 174 | 'tsu'=>['つ','ツ'], 175 | 'te'=>['て','テ'], 176 | 'to'=>['と','ト'], 177 | 'tya'=>['ちゃ','チャ'], 178 | 'cha'=>['ちゃ','チャ'], 179 | 'tyu'=>['ちゅ','チュ'], 180 | 'chu'=>['ちゅ','チュ'], 181 | 'tyo'=>['ちょ','チョ'], 182 | 'cho'=>['ちょ','チョ'], 183 | 'na'=>['な','ナ'], 184 | 'ni'=>['に','ニ'], 185 | 'nu'=>['ぬ','ヌ'], 186 | 'ne'=>['ね','ネ'], 187 | 'no'=>['の','ノ'], 188 | 'nya'=>['にゃ','ニャ'], 189 | 'nyu'=>['にゅ','ニュ'], 190 | 'nyo'=>['にょ','ニョ'], 191 | 'ha'=>['は','ハ'], 192 | 'hi'=>['ひ','ヒ'], 193 | 'hu'=>['ふ','フ'], 194 | 'fu'=>['ふ','フ'], 195 | 'he'=>['へ','ヘ'], 196 | 'ho'=>['ほ','ホ'], 197 | 'hya'=>['ひゃ','ヒャ'], 198 | 'hyu'=>['ひゅ','ヒュ'], 199 | 'hyo'=>['ひょ','ヒョ'], 200 | 'ma'=>['ま','マ'], 201 | 'mi'=>['み','ミ'], 202 | 'mu'=>['む','ム'], 203 | 'me'=>['め','メ'], 204 | 'mo'=>['も','モ'], 205 | 'mya'=>['みゃ','ミャ'], 206 | 'myu'=>['みゅ','ミュ'], 207 | 'myo'=>['みょ','ミョ'], 208 | 'ya'=>['や','ヤ'], 209 | 'yu'=>['ゆ','ユ'], 210 | 'yo'=>['よ','ヨ'], 211 | 'ra'=>['ら','ラ'], 212 | 'ri'=>['り','リ'], 213 | 'ru'=>['る','ル'], 214 | 're'=>['れ','レ'], 215 | 'ro'=>['ろ','ロ'], 216 | 'rya'=>['りゃ','リャ'], 217 | 'ryu'=>['りゅ','リュ'], 218 | 'ryo'=>['りょ','リョ'], 219 | 'wa'=>['わ','ワ'], 220 | 'wo'=>['を','ヲ'], 221 | 'nn'=>['ん','ン'], 222 | 'ga'=>['が','ガ'], 223 | 'gi'=>['ぎ','ギ'], 224 | 'gu'=>['ぐ','グ'], 225 | 'ge'=>['げ','ゲ'], 226 | 'go'=>['ご','ゴ'], 227 | 'gya'=>['ぎゃ','ギャ'], 228 | 'gyu'=>['ぎゅ','ギュ'], 229 | 'gyo'=>['ぎょ','ギョ'], 230 | 'za'=>['ざ','ザ'], 231 | 'zi'=>['じ','ジ'], 232 | 'ji'=>['じ','ジ'], 233 | 'zu'=>['ず','ズ'], 234 | 'ze'=>['ぜ','ゼ'], 235 | 'zo'=>['ぞ','ゾ'], 236 | 'zya'=>['じゃ','ジャ'], 237 | 'ja'=>['じゃ','ジャ'], 238 | 'zyu'=>['じゅ','ジュ'], 239 | 'ju'=>['じゅ','ジュ'], 240 | 'zyo'=>['じょ','ジョ'], 241 | 'jo'=>['じょ','ジョ'], 242 | 'da'=>['だ','ダ'], 243 | 'di'=>['ぢ','ヂ'], 244 | 'du'=>['づ','ヅ'], 245 | 'de'=>['で','デ'], 246 | 'do'=>['ど','ド'], 247 | 'dya'=>['ぢゃ','ヂャ'], 248 | 'dyu'=>['ぢゅ','ヂュ'], 249 | 'dyo'=>['ぢょ','ヂョ'], 250 | 'ba'=>['ば','バ'], 251 | 'bi'=>['び','ビ'], 252 | 'bu'=>['ぶ','ブ'], 253 | 'be'=>['べ','ベ'], 254 | 'bo'=>['ぼ','ボ'], 255 | 'bya'=>['びゃ','ビャ'], 256 | 'byu'=>['びゅ','ビュ'], 257 | 'byo'=>['びょ','ビョ'], 258 | 'pa'=>['ぱ','パ'], 259 | 'pi'=>['ぴ','ピ'], 260 | 'pu'=>['ぷ','プ'], 261 | 'pe'=>['ぺ','ペ'], 262 | 'po'=>['ぽ','ポ'], 263 | 'pya'=>['ぴゃ','ピャ'], 264 | 'pyu'=>['ぴゅ','ピュ'], 265 | 'pyo'=>['ぴょ','ピョ'], 266 | 'fa'=>['ふぁ','ファ'], 267 | 'fi'=>['ふぃ','フィ'], 268 | 'fe'=>['ふぇ','フェ'], 269 | 'fo'=>['ふぉ','フォ'], 270 | 'fya'=>['ふゃ','フャ'], 271 | 'fyu'=>['ふゅ','フュ'], 272 | 'fyo'=>['ふょ','フョ'], 273 | 'kouenji'=>['こうえんじ','コウエンジ'], 274 | 'kouennji'=>['こうえんじ','コウエンジ'], 275 | 'nisinippori'=>['にしにっぽり','ニシニッポリ'], 276 | 'nishinippori'=>['にしにっぽり','ニシニッポリ'], 277 | 'himonnya'=>['ひもんや','ヒモンヤ'], 278 | } 279 | 280 | @@hiragana_data = { 281 | 'あ'=>['a','ア'], 282 | 'い'=>['i','イ'], 283 | 'う'=>['u','ウ'], 284 | 'え'=>['e','エ'], 285 | 'お'=>['o','オ'], 286 | 'か'=>['ka','カ'], 287 | 'き'=>['ki','キ'], 288 | 'く'=>['ku','ク'], 289 | 'け'=>['ke','ケ'], 290 | 'こ'=>['ko','コ'], 291 | 'きゃ'=>['kya','キャ'], 292 | 'きゅ'=>['kyu','キュ'], 293 | 'きょ'=>['kyo','キョ'], 294 | 'さ'=>['sa','サ'], 295 | 'し'=>['shi','シ'], 296 | 'す'=>['su','ス'], 297 | 'せ'=>['se','セ'], 298 | 'そ'=>['so','ソ'], 299 | 'しゃ'=>['sha','シャ'], 300 | 'しゅ'=>['shu','シュ'], 301 | 'しょ'=>['sho','ショ'], 302 | 'た'=>['ta','タ'], 303 | 'ち'=>['chi','チ'], 304 | 'つ'=>['tsu','ツ'], 305 | 'て'=>['te','テ'], 306 | 'と'=>['to','ト'], 307 | 'ちゃ'=>['cha','チャ'], 308 | 'ちゅ'=>['chu','チュ'], 309 | 'ちょ'=>['cho','チョ'], 310 | 'な'=>['na','ナ'], 311 | 'に'=>['ni','ニ'], 312 | 'ぬ'=>['nu','ヌ'], 313 | 'ね'=>['ne','ネ'], 314 | 'の'=>['no','ノ'], 315 | 'にゃ'=>['nya','ニャ'], 316 | 'にゅ'=>['nyu','ニュ'], 317 | 'にょ'=>['nyo','ニョ'], 318 | 'は'=>['ha','ハ'], 319 | 'ひ'=>['hi','ヒ'], 320 | 'ふ'=>['fu','フ'], 321 | 'へ'=>['he','ヘ'], 322 | 'ほ'=>['ho','ホ'], 323 | 'ひゃ'=>['hya','ヒャ'], 324 | 'ひゅ'=>['hyu','ヒュ'], 325 | 'ひょ'=>['hyo','ヒョ'], 326 | 'ま'=>['ma','マ'], 327 | 'み'=>['mi','ミ'], 328 | 'む'=>['mu','ム'], 329 | 'め'=>['me','メ'], 330 | 'も'=>['mo','モ'], 331 | 'みゃ'=>['mya','ミャ'], 332 | 'みゅ'=>['myu','ミュ'], 333 | 'みょ'=>['myo','ミョ'], 334 | 'や'=>['ya','ヤ'], 335 | 'ゆ'=>['yu','ユ'], 336 | 'よ'=>['yo','ヨ'], 337 | 'ら'=>['ra','ラ'], 338 | 'り'=>['ri','リ'], 339 | 'る'=>['ru','ル'], 340 | 'れ'=>['re','レ'], 341 | 'ろ'=>['ro','ロ'], 342 | 'りゃ'=>['rya','リャ'], 343 | 'りゅ'=>['ryu','リュ'], 344 | 'りょ'=>['ryo','リョ'], 345 | 'わ'=>['wa','ワ'], 346 | 'を'=>['o','ヲ'], 347 | 'ん'=>['n','ン'], 348 | 'が'=>['ga','ガ'], 349 | 'ぎ'=>['gi','ギ'], 350 | 'ぐ'=>['gu','グ'], 351 | 'げ'=>['ge','ゲ'], 352 | 'ご'=>['go','ゴ'], 353 | 'ぎゃ'=>['gya','ギャ'], 354 | 'ぎゅ'=>['gyu','ギュ'], 355 | 'ぎょ'=>['gyo','ギョ'], 356 | 'ざ'=>['za','ザ'], 357 | 'じ'=>['ji','ジ'], 358 | 'ず'=>['zu','ズ'], 359 | 'ぜ'=>['ze','ゼ'], 360 | 'ぞ'=>['zo','ゾ'], 361 | 'じゃ'=>['ja','ジャ'], 362 | 'じゅ'=>['ju','ジュ'], 363 | 'じょ'=>['jo','ジョ'], 364 | 'だ'=>['da','ダ'], 365 | 'ぢ'=>['ji','ヂ'], 366 | 'づ'=>['zu','ヅ'], 367 | 'で'=>['de','デ'], 368 | 'ど'=>['do','ド'], 369 | 'ぢゃ'=>['ja','ヂャ'], 370 | 'ぢゅ'=>['ju','ヂュ'], 371 | 'ぢょ'=>['jo','ヂョ'], 372 | 'ば'=>['ba','バ'], 373 | 'び'=>['bi','ビ'], 374 | 'ぶ'=>['bu','ブ'], 375 | 'べ'=>['be','ベ'], 376 | 'ぼ'=>['bo','ボ'], 377 | 'びゃ'=>['bya','ビャ'], 378 | 'びゅ'=>['byu','ビュ'], 379 | 'びょ'=>['byo','ビョ'], 380 | 'ぱ'=>['pa','パ'], 381 | 'ぴ'=>['pi','ピ'], 382 | 'ぷ'=>['pu','プ'], 383 | 'ぺ'=>['pe','ペ'], 384 | 'ぽ'=>['po','ポ'], 385 | 'ぴゃ'=>['pya','ピャ'], 386 | 'ぴゅ'=>['pyu','ピュ'], 387 | 'ぴょ'=>['pyo','ピョ'], 388 | 'ふぁ'=>['fa','ファ'], 389 | 'ふぃ'=>['fi','フィ'], 390 | 'ふぇ'=>['fe','フェ'], 391 | 'ふぉ'=>['fo','フォ'], 392 | # 'ふゃ'=>['fya','フャ'], 393 | # 'ふゅ'=>['fyu','フュ'], 394 | # 'ふょ'=>['fyo','フョ'], 395 | 'ゔぁ'=>['va','ヴァ'], 396 | 'ゔぃ'=>['vi','ヴィ'], 397 | 'ゔ'=>['vu','ヴ'], 398 | 'ゔぇ'=>['ve','ヴェ'], 399 | 'ゔぉ'=>['vo','ヴォ'], 400 | 'こうえんじ'=>['kouenji','コウエンジ'], 401 | 'にしにっぽり'=>['nishinippori','ニシニッポリ'], 402 | } 403 | 404 | @@katakana_data = { 405 | 'ア'=>['a','あ'], 406 | 'イ'=>['i','い'], 407 | 'ウ'=>['u','う'], 408 | 'エ'=>['e','え'], 409 | 'オ'=>['o','お'], 410 | 'カ'=>['ka','か'], 411 | 'キ'=>['ki','き'], 412 | 'ク'=>['ku','く'], 413 | 'ケ'=>['ke','け'], 414 | 'コ'=>['ko','こ'], 415 | 'キャ'=>['kya','きゃ'], 416 | 'キュ'=>['kyu','きゅ'], 417 | 'キョ'=>['kyo','きょ'], 418 | 'サ'=>['sa','さ'], 419 | 'シ'=>['shi','し'], 420 | 'ス'=>['su','す'], 421 | 'セ'=>['se','せ'], 422 | 'ソ'=>['so','そ'], 423 | 'シャ'=>['sha','しゃ'], 424 | 'シュ'=>['shu','しゅ'], 425 | 'ショ'=>['sho','しょ'], 426 | 'タ'=>['ta','た'], 427 | 'チ'=>['chi','ち'], 428 | 'ツ'=>['tsu','つ'], 429 | 'テ'=>['te','て'], 430 | 'ト'=>['to','と'], 431 | 'チャ'=>['cha','ちゃ'], 432 | 'チュ'=>['chu','ちゅ'], 433 | 'チョ'=>['cho','ちょ'], 434 | 'ナ'=>['na','な'], 435 | 'ニ'=>['ni','に'], 436 | 'ヌ'=>['nu','ぬ'], 437 | 'ネ'=>['ne','ね'], 438 | 'ノ'=>['no','の'], 439 | 'ニャ'=>['nya','にゃ'], 440 | 'ニュ'=>['nyu','にゅ'], 441 | 'ニョ'=>['nyo','にょ'], 442 | 'ハ'=>['ha','は'], 443 | 'ヒ'=>['hi','ひ'], 444 | 'フ'=>['fu','ふ'], 445 | 'ヘ'=>['he','へ'], 446 | 'ホ'=>['ho','ほ'], 447 | 'ヒャ'=>['hya','ひゃ'], 448 | 'ヒュ'=>['hyu','ひゅ'], 449 | 'ヒョ'=>['hyo','ひょ'], 450 | 'マ'=>['ma','ま'], 451 | 'ミ'=>['mi','み'], 452 | 'ム'=>['mu','む'], 453 | 'メ'=>['me','め'], 454 | 'モ'=>['mo','も'], 455 | 'ミャ'=>['mya','みゃ'], 456 | 'ミュ'=>['myu','みゅ'], 457 | 'ミョ'=>['myo','みょ'], 458 | 'ヤ'=>['ya','や'], 459 | 'ユ'=>['yu','ゆ'], 460 | 'ヨ'=>['yo','よ'], 461 | 'ラ'=>['ra','ら'], 462 | 'リ'=>['ri','り'], 463 | 'ル'=>['ru','る'], 464 | 'レ'=>['re','れ'], 465 | 'ロ'=>['ro','ろ'], 466 | 'リャ'=>['rya','りゃ'], 467 | 'リュ'=>['ryu','りゅ'], 468 | 'リョ'=>['ryo','りょ'], 469 | 'ワ'=>['wa','わ'], 470 | 'ヲ'=>['o','を'], 471 | 'ン'=>['n','ん'], 472 | 'ガ'=>['ga','が'], 473 | 'ギ'=>['gi','ぎ'], 474 | 'グ'=>['gu','ぐ'], 475 | 'ゲ'=>['ge','げ'], 476 | 'ゴ'=>['go','ご'], 477 | 'ギャ'=>['gya','ぎゃ'], 478 | 'ギュ'=>['gyu','ぎゅ'], 479 | 'ギョ'=>['gyo','ぎょ'], 480 | 'ザ'=>['za','ざ'], 481 | 'ジ'=>['ji','じ'], 482 | 'ズ'=>['zu','ず'], 483 | 'ゼ'=>['ze','ぜ'], 484 | 'ゾ'=>['zo','ぞ'], 485 | 'ジャ'=>['ja','じゃ'], 486 | 'ジュ'=>['ju','じゅ'], 487 | 'ジョ'=>['jo','じょ'], 488 | 'ダ'=>['da','だ'], 489 | 'ヂ'=>['ji','ぢ'], 490 | 'ヅ'=>['zu','づ'], 491 | 'デ'=>['de','で'], 492 | 'ド'=>['do','ど'], 493 | 'ヂャ'=>['ja','ぢゃ'], 494 | 'ヂュ'=>['ju','ぢゅ'], 495 | 'ヂョ'=>['jo','ぢょ'], 496 | 'バ'=>['ba','ば'], 497 | 'ビ'=>['bi','び'], 498 | 'ブ'=>['bu','ぶ'], 499 | 'ベ'=>['be','べ'], 500 | 'ボ'=>['bo','ぼ'], 501 | 'ビャ'=>['bya','びゃ'], 502 | 'ビュ'=>['byu','びゅ'], 503 | 'ビョ'=>['byo','びょ'], 504 | 'パ'=>['pa','ぱ'], 505 | 'ピ'=>['pi','ぴ'], 506 | 'プ'=>['pu','ぷ'], 507 | 'ペ'=>['pe','ぺ'], 508 | 'ポ'=>['po','ぽ'], 509 | 'ピャ'=>['pya','ぴゃ'], 510 | 'ピュ'=>['pyu','ぴゅ'], 511 | 'ピョ'=>['pyo','ぴょ'], 512 | 'ファ'=>['fa','ふぁ'], 513 | 'フィ'=>['fi','ふぃ'], 514 | 'フェ'=>['fe','ふぇ'], 515 | 'フォ'=>['fo','ふぉ'], 516 | # 'フャ'=>['fya','ふゃ'], 517 | # 'フュ'=>['fyu','ふゅ'], 518 | # 'フョ'=>['fyo','ふょ'], 519 | 'ヴァ'=>['va','ゔぁ'], 520 | 'ヴィ'=>['vi','ゔぃ'], 521 | 'ヴ'=>['vu','ゔ'], 522 | 'ヴェ'=>['ve','ゔぇ'], 523 | 'ヴォ'=>['vo','ゔぉ'], 524 | 'コウエンジ'=>['kouenji','こうえんじ'], 525 | 'ニシニッポリ'=>['nishinippori','にしにっぽり'], 526 | } 527 | 528 | 529 | def test_roman_to_hiragana1 530 | puts "\n\n#{@method_name}\n" 531 | 532 | puts 'ローマ字→ひらがな(to_hiragana)' 533 | puts '{' 534 | @@roma_data.each{|key, value| 535 | assert_equal(value[0], key.to_hiragana) 536 | puts "'#{key}'=>'#{key.to_hiragana}'," 537 | } 538 | puts'}' 539 | puts "\n\n" 540 | end 541 | 542 | def test_roman_to_hiragana2 543 | puts "\n\n#{@method_name}\n" 544 | 545 | puts 'ローマ字→ひらがな(to_hiragana)' 546 | puts '{' 547 | @@roma_data.each{|key, value| 548 | assert_equal(value[0], key.roman_to_hiragana) 549 | puts "'#{key}'=>'#{key.roman_to_hiragana}'," 550 | } 551 | puts'}' 552 | puts "\n\n" 553 | end 554 | 555 | def test_roman_to_katakana1 556 | puts "\n\n#{@method_name}\n" 557 | 558 | puts 'ローマ字→カタカナ(to_katakana)' 559 | puts '{' 560 | @@roma_data.each{|key, value| 561 | assert_equal(value[1], key.to_katakana) 562 | puts "'#{key}'=>'#{key.to_katakana}'," 563 | } 564 | puts'}' 565 | puts "\n\n" 566 | end 567 | 568 | def test_roman_to_katakana2 569 | puts "\n\n#{@method_name}\n" 570 | 571 | puts 'ローマ字→カタカナ(roman_to_katakana)' 572 | puts '{' 573 | @@roma_data.each{|key, value| 574 | assert_equal(value[1], key.roman_to_katakana) 575 | puts "'#{key}'=>'#{key.roman_to_katakana}'," 576 | } 577 | puts'}' 578 | puts "\n\n" 579 | end 580 | 581 | def test_hiragana_to_roman1 582 | puts "\n\n#{@method_name}\n" 583 | 584 | puts 'ひらがな→ローマ字(to_roman)' 585 | puts '{' 586 | @@hiragana_data.each{|key, value| 587 | assert_equal(value[0], key.to_roman) 588 | puts "'#{key}'=>'#{key.to_roman}'," 589 | } 590 | puts'}' 591 | puts "\n\n" 592 | end 593 | 594 | def test_hiragana_to_roman2 595 | puts "\n\n#{@method_name}\n" 596 | 597 | puts 'ひらがな→ローマ字(hiragana_to_roman)' 598 | puts '{' 599 | @@hiragana_data.each{|key, value| 600 | assert_equal(value[0], key.hiragana_to_roman) 601 | puts "'#{key}'=>'#{key.hiragana_to_roman}'," 602 | } 603 | puts'}' 604 | puts "\n\n" 605 | end 606 | 607 | def test_katakana_to_roman1 608 | puts "\n\n#{@method_name}\n" 609 | 610 | puts 'カタカナ→ローマ字(to_roman)' 611 | puts '{' 612 | @@katakana_data.each{|key, value| 613 | assert_equal(value[0], key.to_roman) 614 | puts "'#{key}'=>'#{key.to_roman}'," 615 | } 616 | puts'}' 617 | puts "\n\n" 618 | end 619 | 620 | def test_katakana_to_roman2 621 | puts "\n\n#{@method_name}\n" 622 | 623 | puts 'カタカナ→ローマ字(katakana_to_roman)' 624 | puts '{' 625 | @@katakana_data.each{|key, value| 626 | assert_equal(value[0], key.katakana_to_roman) 627 | puts "'#{key}'=>'#{key.katakana_to_roman}'," 628 | } 629 | puts'}' 630 | puts "\n\n" 631 | end 632 | 633 | def test_hiragana_to_katakana 634 | puts "\n\n#{@method_name}\n" 635 | 636 | puts 'ひらがな→カタカナ(to_katakana)' 637 | puts '{' 638 | @@hiragana_data.each{|key, value| 639 | assert_equal(value[1], key.to_katakana) 640 | puts "'#{key}'=>'#{key.to_katakana}'," 641 | } 642 | puts'}' 643 | puts "\n\n" 644 | end 645 | 646 | def test_katakana_to_hiragana 647 | puts "\n\n#{@method_name}\n" 648 | 649 | puts 'カタカナ→ひらがな(to_hiragana)' 650 | puts '{' 651 | @@katakana_data.each{|key, value| 652 | assert_equal(value[1], key.to_hiragana) 653 | puts "'#{key}'=>'#{key.to_hiragana}'," 654 | } 655 | puts'}' 656 | puts "\n\n" 657 | end 658 | 659 | end 660 | --------------------------------------------------------------------------------