/ruby-romkan-0.4/romkan.rb
Ruby | 313 lines | 256 code | 32 blank | 25 comment | 4 complexity | 0fc41b5e4d62053c5c63e178df4fd854 MD5 | raw file
- # -*- encoding:euc-jp -*-
- #
- # Ruby/Romkan - a Romaji <-> Kana conversion library for Ruby.
- #
- # Copyright (C) 2001 Satoru Takabayashi <satoru@namazu.org>
- # All rights reserved.
- # This is free software with ABSOLUTELY NO WARRANTY.
- #
- # You can redistribute it and/or modify it under the terms of
- # the Ruby's licence.
- #
- # NOTE: Ruby/Romkan can work only with EUC_JP encoding. ($KCODE="e")
- #
- module Romkan
- VERSION = '0.4'
- end
- class Array
- def pairs(s=2)
- 0.step(self.size-1,s){
- |x| yield self.slice(x,s)
- }
- end
- end
-
- class String
- # This table is imported from KAKASI <http://kakasi.namazu.org/> and modified.
- KUNREITAB = "\
- ? xa ? a ? xi ? i ? xu
- ? u ?? vu ??? va ??? vi ??? ve
- ??? vo ? xe ? e ? xo ? o
- ? ka ? ga ? ki ?? kya ?? kyu
- ?? kyo ? gi ?? gya ?? gyu ?? gyo
- ? ku ? gu ? ke ? ge ? ko
- ? go
- ? sa ? za ? si ?? sya ?? syu
- ?? syo ? zi ?? zya ?? zyu ?? zyo
- ? su ? zu ? se ? ze ? so
- ? zo
- ? ta ? da ? ti ?? tya ?? tyu
- ?? tyo ? di ?? dya ?? dyu ?? dyo
- ? xtu
- ??? vvu ???? vva ???? vvi
- ???? vve ???? vvo
- ?? kka ?? gga ?? kki ??? kkya
- ??? kkyu ??? kkyo ?? ggi ??? ggya
- ??? ggyu ??? ggyo ?? kku ?? ggu
- ?? kke ?? gge ?? kko ?? ggo ?? ssa
- ?? zza ?? ssi ??? ssya
- ??? ssyu ??? ssho
- ?? zzi ??? zzya ??? zzyu ??? zzyo
- ?? ssu ?? zzu ?? sse ?? zze ?? sso
- ?? zzo ?? tta ?? dda ?? tti
- ??? ttya ??? ttyu ??? ttyo ?? ddi
- ??? ddya ??? ddyu ??? ddyo ?? ttu
- ?? ddu ?? tte ?? dde ?? tto ?? ddo
- ?? hha ?? bba ?? ppa ?? hhi
- ??? hhya ??? hhyu ??? hhyo ?? bbi
- ??? bbya ??? bbyu ??? bbyo ?? ppi
- ??? ppya ??? ppyu ??? ppyo ?? hhu
- ??? ffa ??? ffi ??? ffe ??? ffo
- ?? bbu ?? ppu ?? hhe ?? bbe ?? ppe
- ?? hho ?? bbo ?? ppo ?? yya ?? yyu
- ?? yyo ?? rra ?? rri ??? rrya
- ??? rryu ??? rryo ?? rru ?? rre
- ?? rro
- ? tu ? du ? te ? de ? to
- ? do
- ? na ? ni ?? nya ?? nyu ?? nyo
- ? nu ? ne ? no
- ? ha ? ba ? pa ? hi ?? hya
- ?? hyu ?? hyo ? bi ?? bya ?? byu
- ?? byo ? pi ?? pya ?? pyu ?? pyo
- ? hu ?? fa ?? fi ?? fe ?? fo
- ? bu ? pu ? he ? be ? pe
- ? ho ? bo ? po
- ? ma ? mi ?? mya ?? myu ?? myo
- ? mu ? me ? mo
- ? xya ? ya ? xyu ? yu ? xyo
- ? yo
- ? ra ? ri ?? rya ?? ryu ?? ryo
- ? ru ? re ? ro
- ? xwa ? wa ? wi ? we
- ? wo ? n
- ? n'
- ?? dyi
- ? -
- ?? tye
- ??? ttye
- ?? zye
- "
- HEPBURNTAB = "\
- ? xa ? a ? xi ? i ? xu
- ? u ?? vu ??? va ??? vi ??? ve
- ??? vo ? xe ? e ? xo ? o
-
- ? ka ? ga ? ki ?? kya ?? kyu
- ?? kyo ? gi ?? gya ?? gyu ?? gyo
- ? ku ? gu ? ke ? ge ? ko
- ? go
- ? sa ? za ? shi ?? sha ?? shu
- ?? sho ? ji ?? ja ?? ju ?? jo
- ? su ? zu ? se ? ze ? so
- ? zo
- ? ta ? da ? chi ?? cha ?? chu
- ?? cho ? di ?? dya ?? dyu ?? dyo
- ? xtsu
- ??? vvu ???? vva ???? vvi
- ???? vve ???? vvo
- ?? kka ?? gga ?? kki ??? kkya
- ??? kkyu ??? kkyo ?? ggi ??? ggya
- ??? ggyu ??? ggyo ?? kku ?? ggu
- ?? kke ?? gge ?? kko ?? ggo ?? ssa
- ?? zza ?? sshi ??? ssha
- ??? sshu ??? ssho
- ?? jji ??? jja ??? jju ??? jjo
- ?? ssu ?? zzu ?? sse ?? zze ?? sso
- ?? zzo ?? tta ?? dda ?? cchi
- ??? ccha ??? cchu ??? ccho ?? ddi
- ??? ddya ??? ddyu ??? ddyo ?? ttsu
- ?? ddu ?? tte ?? dde ?? tto ?? ddo
- ?? hha ?? bba ?? ppa ?? hhi
- ??? hhya ??? hhyu ??? hhyo ?? bbi
- ??? bbya ??? bbyu ??? bbyo ?? ppi
- ??? ppya ??? ppyu ??? ppyo ?? ffu
- ??? ffa ??? ffi ??? ffe ??? ffo
- ?? bbu ?? ppu ?? hhe ?? bbe ?? ppe
- ?? hho ?? bbo ?? ppo ?? yya ?? yyu
- ?? yyo ?? rra ?? rri ??? rrya
- ??? rryu ??? rryo ?? rru ?? rre
- ?? rro
- ? tsu ? du ? te ? de ? to
- ? do
- ? na ? ni ?? nya ?? nyu ?? nyo
- ? nu ? ne ? no
- ? ha ? ba ? pa ? hi ?? hya
- ?? hyu ?? hyo ? bi ?? bya ?? byu
- ?? byo ? pi ?? pya ?? pyu ?? pyo
- ? fu ?? fa ?? fi ?? fe ?? fo
- ? bu ? pu ? he ? be ? pe
- ? ho ? bo ? po
- ? ma ? mi ?? mya ?? myu ?? myo
- ? mu ? me ? mo
- ? xya ? ya ? xyu ? yu ? xyo
- ? yo
- ? ra ? ri ?? rya ?? ryu ?? ryo
- ? ru ? re ? ro
- ? xwa ? wa ? wi ? we
- ? wo ? n
- ? n'
- ?? dyi
- ? -
- ?? che
- ??? cche
- ?? je
- "
- KANROM = (kanaroma = Hash.new
- (KUNREITAB + HEPBURNTAB).split(/\s+/).pairs {|x|
- kana, roma = x
- kanaroma[kana] = roma
- }
- kanaroma)
- ROMKAN = (romakana = Hash.new
- (KUNREITAB + HEPBURNTAB).split(/\s+/).pairs {|x|
- kana, roma = x
- romakana[roma] = kana
- }
- romakana)
- # Sort in long order so that a longer Romaji sequence precedes.
- ROMPAT = ROMKAN.keys.sort {|a, b| b.length <=> a.length}.join "|"
- KANPAT = KANROM.keys.sort {|a, b|
- b.length <=> a.length ||
- KANROM[a].length <=> KANROM[b].length
- }.join "|"
- KUNREI = (i = 0; KUNREITAB. split(/\s+/).select {i += 1; i % 2 == 0})
- HEPBURN = (i = 0; HEPBURNTAB.split(/\s+/).select {i += 1; i % 2 == 0})
- KUNPAT = KUNREI.sort {|a, b| b.length <=> a.length }.join "|"
- HEPPAT = HEPBURN.sort {|a, b| b.length <=> a.length }.join "|"
- TO_HEPBURN = (romrom = Hash.new
- KUNREI.each_with_index {|x, i|
- romrom[KUNREI[i]] = HEPBURN[i]}
- romrom)
- TO_KUNREI = (romrom = Hash.new
- HEPBURN.each_with_index {|x, i|
- romrom[HEPBURN[i]] = KUNREI[i]}
- romrom)
- # FIXME: ad hod solution
- # tanni => tan'i
- # kannji => kanji
- # hannnou => han'nou
- # hannnya => han'nya
- def normalize_double_n
- self.gsub(/nn/, "n'").gsub(/n\'(?=[^aiueoyn]|$)/, "n")
- end
- def normalize_double_n!
- self.gsub!(/nn/, "n'")
- self.gsub!(/n\'(?=[^aiueoyn]|$)/, "n")
- self
- end
- # Romaji -> Kana
- # It can handle both Hepburn and Kunrei sequences.
- def to_kana
- tmp = self.normalize_double_n
- tmp.gsub(/(#{ROMPAT})/) { ROMKAN[$1] }
- end
- # Kana -> Romaji.
- # Return Hepburn sequences.
- def to_roma
- tmp = self.gsub(/(#{KANPAT})/) { KANROM[$1] }
- tmp.gsub(/n'(?=[^aeiuoyn]|$)/, "n")
- end
- # Romaji -> Romaji
- # Normalize into Hepburn sequences.
- # e.g. kannzi -> kanji, tiezo -> chiezo
- def to_hepburn
- tmp = self.normalize_double_n
- tmp.gsub(/\G((?:#{HEPPAT})*?)(#{KUNPAT})/) { $1 + TO_HEPBURN[$2]}
- end
- # Romaji -> Romaji
- # Normalize into Kunrei sequences.
- # e.g. kanji -> kanzi, chiezo -> tiezo
- def to_kunrei
- tmp = self.normalize_double_n
- tmp.gsub(/\G((?:#{KUNPAT})*?)(#{HEPPAT})/) { $1 + TO_KUNREI[$2]}
- end
- def to_kana!
- self.normalize_double_n!
- self.gsub!(/(#{ROMPAT})/) { ROMKAN[$1] }
- self
- end
- def to_roma!
- self.gsub!(/(#{KANPAT})/) { KANROM[$1] }
- self.gsub!(/n'(?=[^aeiuoyn]|$)/, "n")
- self
- end
- def to_hepburn!
- self.normalize_double_n!
- self.gsub!(/\G((?:#{HEPPAT})*?)(#{KUNPAT})/) { $1 + TO_HEPBURN[$2]}
- self
- end
- def to_kunrei!
- tmp = self.normalize_double_n!
- tmp.gsub!(/\G((?:#{KUNPAT})*?)(#{HEPPAT})/) { $1 + TO_KUNREI[$2]}
- end
- def consonant?
- if /^[ckgszjtdhfpbmyrwxn]$/.match(self)
- true
- else
- false
- end
- end
- def vowel?
- if /^[aeiou]$/.match(self)
- true
- else
- false
- end
- end
- # `z' => (za ze zi zo zu)
- def expand_consonant
- ROMKAN.keys.select do |x|
- /^#{self}.$/ =~ x
- end
- end
- end