Class: Nihonjin::Moji

Inherits:
Object
  • Object
show all
Defined in:
lib/nihonjin/moji.rb

Constant Summary collapse

Hiragana =
{
  kya: "きゃ",        kyu: "きゅ",        kyo: "きょ",
  sha: "しゃ",        shu: "しゅ", she: "しぇ", sho: "しょ",
  cha: "ちゃ",        chu: "ちゅ",        cho: "ちょ",
  dya: "ぢゃ",        dyu: "ぢゅ",        dyo: "ぢょ",
  nya: "にゃ",        nyu: "にゅ",        nyo: "にょ",
  hya: "ひゃ",        hyu: "ひゅ",        hyo: "ひょ",
  mya: "みゃ",        myu: "みゅ",        myo: "みょ",
  rya: "りゃ",        ryu: "りゅ",        ryo: "りょ",

  gya: "ぎゃ",        gyu: "ぎゅ",        gyo: "ぎょ",
  ja: "じゃ",         ju: "じゅ", je: "じぇ", jo: "じょ",
  jya: "じゃ",         jyu: "じゅ",       jyo: "じょ",
  bya: "びゃ",        byu: "びゅ",        byo: "びょ",

  pya: "ぴゃ",        pyu: "ピュ",        pyo: "ぴょ",

  tsu: "",
  tu: "",

  ka: "", ki: "", ku: "", ke: "", ko: "",
  sa: "", shi: "", si: "", su: "", se: "", so: "",
  ta: "", chi: "", te: "", to: "",
  na: "", ni: "", nu: "", ne: "", no: "",
  ha: "", hi: "", fu: "", he: "", ho: "",
  ma: "", mi: "", mu: "", me: "", mo: "",
  ya: "",           yu: "",          yo: "",
  ra: "", ri: "", ru: "", re: "", ro: "",
  wa: "", wi: "",           we: "", wo: "",
  n: "", n_: "", # 「n_」というのは、「はんい」みたいな言葉を書くためです。Issue #16を見てください

  va: "ゔぁ", vi: "ゔぃ", vu: "", ve: "ゔぇ", vo: "ゔぉ",
  ga: "", gi: "", gu: "", ge: "", go: "",
  za: "", ji: "", zu: "", ze: "", zo: "",
  da: "", di: "", du: "", de: "", do: "",
                    dzu: "",
  ba: "", bi: "", bu: "", be: "", bo: "",
  pa: "", pi: "", pu: "", pe: "", po: "",

  fa: "ふぁ", fi: "ふぃ", fe: "ふぇ", fo: "ふぉ",
             di_: "でぃ",
  a: "", i: "", u: "", e: "", o: "",
                   wu: ""
}
Small_hiragana =
{
  ya: "",          yu: "",           yo: "",
  a: "", i: "", u: "", e: "", o: "",
  tsu: ""
}
Consonants =
["bb", "cc", "dd", "ff", "gg", "hh", "jj", "kk", "ll", "pp", "qq", "rr", "ss", "tt", "vv", "ww", "yy", "zz"]
Symbols =
[[".", ""], ["!", ""], ["?", ""], [",", ""], ["~", ""]]

Instance Method Summary collapse

Instance Method Details

#hankaku_katakana(str, *options) ⇒ Object



150
151
152
153
# File 'lib/nihonjin/moji.rb', line 150

def hankaku_katakana(str, *options)
  str = katakana(str, options)
  str = nkf_pass(str, '-Z4', options)
end

#hankaku_katakana!(str, *options) ⇒ Object



155
156
157
# File 'lib/nihonjin/moji.rb', line 155

def hankaku_katakana!(str, *options)
  str.sub!(str, (hankaku_katakana(str, options)))
end

#hashigiri(str) ⇒ Object

対象の文字列の端にある空白を切り落とす



239
240
241
242
243
244
245
246
247
# File 'lib/nihonjin/moji.rb', line 239

def hashigiri(str)
  if str.match(/^ /)
    str = str.sub(/^ /, " ")
  end
  if str.match(/ $/)
    str = str.sub(/ $/, " ")
  end
  str = str.strip
end

#hashigiri!(str) ⇒ Object



249
250
251
# File 'lib/nihonjin/moji.rb', line 249

def hashigiri!(str)
  str.sub!(str, hashigiri(str))
end

#hiragana(str, *options) ⇒ Object

対象の文字列をnkfで、ひらがなに変換します。#nkf_passと「たのしいRuby」299ページを参照してください



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/nihonjin/moji.rb', line 66

def hiragana(str, *options)
  
  need_to_change_encoding = check_encoding(options)
  options = setup options
  str_data = utf_8_pass(str)
  str = str_data[:string]
  str = str.downcase

  # "matte"みたいな文字列を「まって」に変換します
  Consonants.each do |c|
    if str.match(c)
      str = str.gsub(c, ("" + c[0]))
    end
  end

  # 対象の文字列にはローマ字がある場合ひらがなに変換します
  Hiragana.each do |key, value|
    re = Regexp.new(key.to_s)
    if str.match(re)
      str = str.gsub(re, Hiragana[key])
    end
  end

  # 「x」を文字の前に入れることで、小さいひらがなを定義することができます
  if str =~ /x/
    i = 0
    str_ary = str.split("")
    str_ary.each do |s|
      if s =~ /x/
        str[i + 1] = Small_hiragana[Hiragana.key(str[i + 1])]
      end
      i += 1
    end
    str = str.gsub("x", "")
  end

  # 上記Consonants.eachのコードで重なっている文字は小さい「っ」に変換されるけど、全部は変換されません
  # 子音が残ってしまえば、変換されます。
  if str =~ /[a-z]/
    i = 0
    str_ary = str.split("")
    str_ary.each do |s|
      if s =~ //
        str[i + 1] = "" if str[i + 1] =~ /[a-z]/
      end
      i += 1
    end
  end

  # びっくりマークなどの記号を日本語の文字にします
  Symbols.each do |symbol|
    str = str.gsub(symbol[0], symbol[1])
  end

  # この時点で if /[a-z]/、エラーをthrowしてください
  # raise error if str =~ /[a-zA-Z]/

  # これは要るかどうか工夫すること
  # またオプションとしては定義できるようにしたらいいかどうか工夫すること
  str = kuhaku(str, :zenkaku) 

  str = NKF.nkf(('-h1 ' + options), str)
  str = str.encode(str_data[:encoding].name) if need_to_change_encoding
  str

end

#hiragana!(str, *options) ⇒ Object



133
134
135
# File 'lib/nihonjin/moji.rb', line 133

def hiragana!(str, *options)
  str.sub!(str, (hiragana(str, options)))
end

#kana_invert(str, *options) ⇒ Object



161
162
163
164
# File 'lib/nihonjin/moji.rb', line 161

def kana_invert(str, *options)
  options = setup options
  str = nkf_pass(str, '-h3', options)
end

#kana_invert!(str, *options) ⇒ Object



166
167
168
# File 'lib/nihonjin/moji.rb', line 166

def kana_invert!(str, *options)
  str.sub!(str, (kana_invert(str, options)))
end

#katakana(str, *options) ⇒ Object



139
140
141
142
# File 'lib/nihonjin/moji.rb', line 139

def katakana(str, *options)
  str = hiragana(str, options)
  str = nkf_pass(str, '-h2', options)
end

#katakana!(str, *options) ⇒ Object



144
145
146
# File 'lib/nihonjin/moji.rb', line 144

def katakana!(str, *options)
  str.sub!(str, (katakana(str, options)))
end

#kiru(str) ⇒ Object

対象の文字列のすべての空白を切り落とす



226
227
228
229
230
231
# File 'lib/nihonjin/moji.rb', line 226

def kiru(str)
  if str.match(/ /)
    str = str.gsub(/ /, " ")
  end
  str.gsub(/\s/, "")
end

#kiru!(str) ⇒ Object



233
234
235
# File 'lib/nihonjin/moji.rb', line 233

def kiru!(str)
  str.sub!(str, kiru(str))
end

#kuhaku(str, option = nil) ⇒ Object

対象の文字列の空白を半角の空白にします:zenkakuをoptionとして渡せば、すべての空白は全角の空白に変換されます



257
258
259
260
261
262
263
264
265
266
267
# File 'lib/nihonjin/moji.rb', line 257

def kuhaku(str, option=nil)
  str_data = utf_8_pass(str)
  str = str_data[:string]
  # :double というオプションを入れたい。nkfの-Z2のこと
  if option == :zenkaku
    str = str.gsub(/\s/, " ") # 全角に変える
  else
    str = str.gsub(/ /, " ") # 普通の空白に変える
  end
  str.encode(str_data[:encoding].name)
end

#kuhaku!(str, option = nil) ⇒ Object

#kuhakuの文字列を破壊的に変換します



270
271
272
# File 'lib/nihonjin/moji.rb', line 270

def kuhaku!(str, option=nil)
  str.sub!(str, kuhaku(str))
end

#kuhaku_invert(str) ⇒ Object

対象の文字列の全角と半角の空白を逆にします



276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
# File 'lib/nihonjin/moji.rb', line 276

def kuhaku_invert(str)
  str_data = utf_8_pass(str)
  str = str_data[:string]
  str = str.split("")
  str = str.map do |s|
    if s =~ /\s/ # 半角であれば
      s = " " # 全角に
    elsif s =~ / / # 全角であれば
      s = " " # 半角に
    else
      s
    end
  end
  new_str = String.new
  str.each do |s|
    new_str += s
  end
  new_str = new_str.encode(str_data[:encoding].name)
end

#kuhaku_invert!(str) ⇒ Object

#kuhaku_invertの文字列を破壊的に変換します



297
298
299
# File 'lib/nihonjin/moji.rb', line 297

def kuhaku_invert!(str)
  str.sub!(str, kuhaku_invert(str))
end

#romaji(str, encoding = :utf_8) ⇒ Object



172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
# File 'lib/nihonjin/moji.rb', line 172

def romaji(str, encoding=:utf_8)

  need_to_change_encoding = check_encoding(encoding)
  str_data = utf_8_pass(str)

  # すべての文字をひらがなに統一してからローマ字に変換されます。カタカナなどが入っている時の対応
  str = hiragana(str, encoding)
  str = str.downcase

  str_data = utf_8_pass(str)
  str = str_data[:string]

  change_to = Proc.new do |hash|
    hash.each do |key, value|
      re = Regexp.new(value)
      if str.match(re)
        str = str.gsub(re, key.to_s)
      end
    end
  end

  change_to.call(Hiragana)

  # while文はちょっと気になる
  while str =~ //
    place = str =~ //
    small_tsu_to_romaji(str, place)
  end

  # ダブっている文字が小さい「っ」に変換されてからしないといけません
  change_to.call(Small_hiragana)

  Symbols.each do |symbol|
    str = str.gsub(symbol[1], symbol[0])
  end

  str = kuhaku(str)
  str = str.encode(str_data[:encoding].name) if need_to_change_encoding
  str

end

#romaji!(str, encoding = :utf_8) ⇒ Object



214
215
216
# File 'lib/nihonjin/moji.rb', line 214

def romaji!(str, encoding=:utf_8)
  str.sub!(str, (romaji(str, encoding)))
end