PageRenderTime 65ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/ruby-romkan-0.4/romkan.rb

#
Ruby | 313 lines | 256 code | 32 blank | 25 comment | 4 complexity | 0fc41b5e4d62053c5c63e178df4fd854 MD5 | raw file
  1. # -*- encoding:euc-jp -*-
  2. #
  3. # Ruby/Romkan - a Romaji <-> Kana conversion library for Ruby.
  4. #
  5. # Copyright (C) 2001 Satoru Takabayashi <satoru@namazu.org>
  6. # All rights reserved.
  7. # This is free software with ABSOLUTELY NO WARRANTY.
  8. #
  9. # You can redistribute it and/or modify it under the terms of
  10. # the Ruby's licence.
  11. #
  12. # NOTE: Ruby/Romkan can work only with EUC_JP encoding. ($KCODE="e")
  13. #
  14. module Romkan
  15. VERSION = '0.4'
  16. end
  17. class Array
  18. def pairs(s=2)
  19. 0.step(self.size-1,s){
  20. |x| yield self.slice(x,s)
  21. }
  22. end
  23. end
  24. class String
  25. # This table is imported from KAKASI <http://kakasi.namazu.org/> and modified.
  26. KUNREITAB = "\
  27. ? xa ? a ? xi ? i ? xu
  28. ? u ?? vu ??? va ??? vi ??? ve
  29. ??? vo ? xe ? e ? xo ? o
  30. ? ka ? ga ? ki ?? kya ?? kyu
  31. ?? kyo ? gi ?? gya ?? gyu ?? gyo
  32. ? ku ? gu ? ke ? ge ? ko
  33. ? go
  34. ? sa ? za ? si ?? sya ?? syu
  35. ?? syo ? zi ?? zya ?? zyu ?? zyo
  36. ? su ? zu ? se ? ze ? so
  37. ? zo
  38. ? ta ? da ? ti ?? tya ?? tyu
  39. ?? tyo ? di ?? dya ?? dyu ?? dyo
  40. ? xtu
  41. ??? vvu ???? vva ???? vvi
  42. ???? vve ???? vvo
  43. ?? kka ?? gga ?? kki ??? kkya
  44. ??? kkyu ??? kkyo ?? ggi ??? ggya
  45. ??? ggyu ??? ggyo ?? kku ?? ggu
  46. ?? kke ?? gge ?? kko ?? ggo ?? ssa
  47. ?? zza ?? ssi ??? ssya
  48. ??? ssyu ??? ssho
  49. ?? zzi ??? zzya ??? zzyu ??? zzyo
  50. ?? ssu ?? zzu ?? sse ?? zze ?? sso
  51. ?? zzo ?? tta ?? dda ?? tti
  52. ??? ttya ??? ttyu ??? ttyo ?? ddi
  53. ??? ddya ??? ddyu ??? ddyo ?? ttu
  54. ?? ddu ?? tte ?? dde ?? tto ?? ddo
  55. ?? hha ?? bba ?? ppa ?? hhi
  56. ??? hhya ??? hhyu ??? hhyo ?? bbi
  57. ??? bbya ??? bbyu ??? bbyo ?? ppi
  58. ??? ppya ??? ppyu ??? ppyo ?? hhu
  59. ??? ffa ??? ffi ??? ffe ??? ffo
  60. ?? bbu ?? ppu ?? hhe ?? bbe ?? ppe
  61. ?? hho ?? bbo ?? ppo ?? yya ?? yyu
  62. ?? yyo ?? rra ?? rri ??? rrya
  63. ??? rryu ??? rryo ?? rru ?? rre
  64. ?? rro
  65. ? tu ? du ? te ? de ? to
  66. ? do
  67. ? na ? ni ?? nya ?? nyu ?? nyo
  68. ? nu ? ne ? no
  69. ? ha ? ba ? pa ? hi ?? hya
  70. ?? hyu ?? hyo ? bi ?? bya ?? byu
  71. ?? byo ? pi ?? pya ?? pyu ?? pyo
  72. ? hu ?? fa ?? fi ?? fe ?? fo
  73. ? bu ? pu ? he ? be ? pe
  74. ? ho ? bo ? po
  75. ? ma ? mi ?? mya ?? myu ?? myo
  76. ? mu ? me ? mo
  77. ? xya ? ya ? xyu ? yu ? xyo
  78. ? yo
  79. ? ra ? ri ?? rya ?? ryu ?? ryo
  80. ? ru ? re ? ro
  81. ? xwa ? wa ? wi ? we
  82. ? wo ? n
  83. ? n'
  84. ?? dyi
  85. ? -
  86. ?? tye
  87. ??? ttye
  88. ?? zye
  89. "
  90. HEPBURNTAB = "\
  91. ? xa ? a ? xi ? i ? xu
  92. ? u ?? vu ??? va ??? vi ??? ve
  93. ??? vo ? xe ? e ? xo ? o
  94. ? ka ? ga ? ki ?? kya ?? kyu
  95. ?? kyo ? gi ?? gya ?? gyu ?? gyo
  96. ? ku ? gu ? ke ? ge ? ko
  97. ? go
  98. ? sa ? za ? shi ?? sha ?? shu
  99. ?? sho ? ji ?? ja ?? ju ?? jo
  100. ? su ? zu ? se ? ze ? so
  101. ? zo
  102. ? ta ? da ? chi ?? cha ?? chu
  103. ?? cho ? di ?? dya ?? dyu ?? dyo
  104. ? xtsu
  105. ??? vvu ???? vva ???? vvi
  106. ???? vve ???? vvo
  107. ?? kka ?? gga ?? kki ??? kkya
  108. ??? kkyu ??? kkyo ?? ggi ??? ggya
  109. ??? ggyu ??? ggyo ?? kku ?? ggu
  110. ?? kke ?? gge ?? kko ?? ggo ?? ssa
  111. ?? zza ?? sshi ??? ssha
  112. ??? sshu ??? ssho
  113. ?? jji ??? jja ??? jju ??? jjo
  114. ?? ssu ?? zzu ?? sse ?? zze ?? sso
  115. ?? zzo ?? tta ?? dda ?? cchi
  116. ??? ccha ??? cchu ??? ccho ?? ddi
  117. ??? ddya ??? ddyu ??? ddyo ?? ttsu
  118. ?? ddu ?? tte ?? dde ?? tto ?? ddo
  119. ?? hha ?? bba ?? ppa ?? hhi
  120. ??? hhya ??? hhyu ??? hhyo ?? bbi
  121. ??? bbya ??? bbyu ??? bbyo ?? ppi
  122. ??? ppya ??? ppyu ??? ppyo ?? ffu
  123. ??? ffa ??? ffi ??? ffe ??? ffo
  124. ?? bbu ?? ppu ?? hhe ?? bbe ?? ppe
  125. ?? hho ?? bbo ?? ppo ?? yya ?? yyu
  126. ?? yyo ?? rra ?? rri ??? rrya
  127. ??? rryu ??? rryo ?? rru ?? rre
  128. ?? rro
  129. ? tsu ? du ? te ? de ? to
  130. ? do
  131. ? na ? ni ?? nya ?? nyu ?? nyo
  132. ? nu ? ne ? no
  133. ? ha ? ba ? pa ? hi ?? hya
  134. ?? hyu ?? hyo ? bi ?? bya ?? byu
  135. ?? byo ? pi ?? pya ?? pyu ?? pyo
  136. ? fu ?? fa ?? fi ?? fe ?? fo
  137. ? bu ? pu ? he ? be ? pe
  138. ? ho ? bo ? po
  139. ? ma ? mi ?? mya ?? myu ?? myo
  140. ? mu ? me ? mo
  141. ? xya ? ya ? xyu ? yu ? xyo
  142. ? yo
  143. ? ra ? ri ?? rya ?? ryu ?? ryo
  144. ? ru ? re ? ro
  145. ? xwa ? wa ? wi ? we
  146. ? wo ? n
  147. ? n'
  148. ?? dyi
  149. ? -
  150. ?? che
  151. ??? cche
  152. ?? je
  153. "
  154. KANROM = (kanaroma = Hash.new
  155. (KUNREITAB + HEPBURNTAB).split(/\s+/).pairs {|x|
  156. kana, roma = x
  157. kanaroma[kana] = roma
  158. }
  159. kanaroma)
  160. ROMKAN = (romakana = Hash.new
  161. (KUNREITAB + HEPBURNTAB).split(/\s+/).pairs {|x|
  162. kana, roma = x
  163. romakana[roma] = kana
  164. }
  165. romakana)
  166. # Sort in long order so that a longer Romaji sequence precedes.
  167. ROMPAT = ROMKAN.keys.sort {|a, b| b.length <=> a.length}.join "|"
  168. KANPAT = KANROM.keys.sort {|a, b|
  169. b.length <=> a.length ||
  170. KANROM[a].length <=> KANROM[b].length
  171. }.join "|"
  172. KUNREI = (i = 0; KUNREITAB. split(/\s+/).select {i += 1; i % 2 == 0})
  173. HEPBURN = (i = 0; HEPBURNTAB.split(/\s+/).select {i += 1; i % 2 == 0})
  174. KUNPAT = KUNREI.sort {|a, b| b.length <=> a.length }.join "|"
  175. HEPPAT = HEPBURN.sort {|a, b| b.length <=> a.length }.join "|"
  176. TO_HEPBURN = (romrom = Hash.new
  177. KUNREI.each_with_index {|x, i|
  178. romrom[KUNREI[i]] = HEPBURN[i]}
  179. romrom)
  180. TO_KUNREI = (romrom = Hash.new
  181. HEPBURN.each_with_index {|x, i|
  182. romrom[HEPBURN[i]] = KUNREI[i]}
  183. romrom)
  184. # FIXME: ad hod solution
  185. # tanni => tan'i
  186. # kannji => kanji
  187. # hannnou => han'nou
  188. # hannnya => han'nya
  189. def normalize_double_n
  190. self.gsub(/nn/, "n'").gsub(/n\'(?=[^aiueoyn]|$)/, "n")
  191. end
  192. def normalize_double_n!
  193. self.gsub!(/nn/, "n'")
  194. self.gsub!(/n\'(?=[^aiueoyn]|$)/, "n")
  195. self
  196. end
  197. # Romaji -> Kana
  198. # It can handle both Hepburn and Kunrei sequences.
  199. def to_kana
  200. tmp = self.normalize_double_n
  201. tmp.gsub(/(#{ROMPAT})/) { ROMKAN[$1] }
  202. end
  203. # Kana -> Romaji.
  204. # Return Hepburn sequences.
  205. def to_roma
  206. tmp = self.gsub(/(#{KANPAT})/) { KANROM[$1] }
  207. tmp.gsub(/n'(?=[^aeiuoyn]|$)/, "n")
  208. end
  209. # Romaji -> Romaji
  210. # Normalize into Hepburn sequences.
  211. # e.g. kannzi -> kanji, tiezo -> chiezo
  212. def to_hepburn
  213. tmp = self.normalize_double_n
  214. tmp.gsub(/\G((?:#{HEPPAT})*?)(#{KUNPAT})/) { $1 + TO_HEPBURN[$2]}
  215. end
  216. # Romaji -> Romaji
  217. # Normalize into Kunrei sequences.
  218. # e.g. kanji -> kanzi, chiezo -> tiezo
  219. def to_kunrei
  220. tmp = self.normalize_double_n
  221. tmp.gsub(/\G((?:#{KUNPAT})*?)(#{HEPPAT})/) { $1 + TO_KUNREI[$2]}
  222. end
  223. def to_kana!
  224. self.normalize_double_n!
  225. self.gsub!(/(#{ROMPAT})/) { ROMKAN[$1] }
  226. self
  227. end
  228. def to_roma!
  229. self.gsub!(/(#{KANPAT})/) { KANROM[$1] }
  230. self.gsub!(/n'(?=[^aeiuoyn]|$)/, "n")
  231. self
  232. end
  233. def to_hepburn!
  234. self.normalize_double_n!
  235. self.gsub!(/\G((?:#{HEPPAT})*?)(#{KUNPAT})/) { $1 + TO_HEPBURN[$2]}
  236. self
  237. end
  238. def to_kunrei!
  239. tmp = self.normalize_double_n!
  240. tmp.gsub!(/\G((?:#{KUNPAT})*?)(#{HEPPAT})/) { $1 + TO_KUNREI[$2]}
  241. end
  242. def consonant?
  243. if /^[ckgszjtdhfpbmyrwxn]$/.match(self)
  244. true
  245. else
  246. false
  247. end
  248. end
  249. def vowel?
  250. if /^[aeiou]$/.match(self)
  251. true
  252. else
  253. false
  254. end
  255. end
  256. # `z' => (za ze zi zo zu)
  257. def expand_consonant
  258. ROMKAN.keys.select do |x|
  259. /^#{self}.$/ =~ x
  260. end
  261. end
  262. end