lib/gimchi/pronouncer.rb in gimchi-0.1.9 vs lib/gimchi/pronouncer.rb in gimchi-0.2.0
- old
+ new
@@ -1,25 +1,25 @@
# encoding: UTF-8
-module Gimchi
-class Korean
+class Gimchi
# Private class.
# Partial implementation of Korean pronouncement pronunciation rules specified in
# http://http://www.korean.go.kr/
+ # @private
class Pronouncer
private
- def initialize korean
- @korean = korean
- @pconfig = korean.config['pronouncer']
+ def initialize gimchi
+ @gimchi = gimchi
+ @pconfig = gimchi.config[:pronouncer]
end
def pronounce! str, options = {}
- @sequence = @pconfig['transformation']['sequence for ' +
- (options[:pronounce_each_char] ? '1' : '2')] - options[:except]
+ @sequence = @pconfig[:transformation][
+ "sequence_for_#{options[:each_char] ? '1' : '2'}".to_sym] - options[:except]
# Dissecting
- @chars = @korean.convert str
+ @chars = str.each_char.map { |c| @gimchi.kchar(c) rescue c }
@orig_chars = @chars.dup
# Padding
@chars.each { |c| pad c }
@@ -33,13 +33,13 @@
@initial_chars = @chars.map { |c| c.dup }
# Transform one by one
applied += (0...@chars.length).inject([]) { | arr, i | arr + transform(i); }
- # Post-processing (actually just for :pronounce_each_char option)
- @chars.select { |c| c.is_a?(Korean::Char) && c.jongsung }.each do | c |
- c.jongsung = @pconfig['jongsung sound'][c.jongsung]
+ # Post-processing (actually just for :each_char option)
+ @chars.select { |c| c.is_a?(Gimchi::Char) && c.jongsung }.each do | c |
+ c.jongsung = @pconfig[:jongsung_sound][c.jongsung]
end
break unless options[:slur]
end
@@ -50,24 +50,24 @@
def transform idx
@cursor = idx
kc = @chars[@cursor]
# Not korean
- return [] unless kc.is_a? Korean::Char
+ return [] unless kc.is_a? Gimchi::Char
# Setting up variables for fast lookup
@kc = kc
- @next_kc = (nkc = @chars[@cursor + 1]).is_a?(Korean::Char) ? nkc : nil
+ @next_kc = (nkc = @chars[@cursor + 1]).is_a?(Gimchi::Char) ? nkc : nil
@kc_org = @initial_chars[@cursor]
- @next_kc_org = (nkco = @initial_chars[@cursor + 1]).is_a?(Korean::Char) ? nkco : nil
+ @next_kc_org = (nkco = @initial_chars[@cursor + 1]).is_a?(Gimchi::Char) ? nkco : nil
# Cannot properly pronounce
return [] if @kc.chosung.nil? && @kc.jungsung.nil? && @kc.jongsung.nil?
applied = []
not_todo = []
- blocking_rule = @pconfig['transformation']['blocking rule']
+ blocking_rule = @pconfig[:transformation][:blocking_rule]
@sequence.each do | rule |
next if not_todo.include?(rule)
if self.send(rule)
applied << rule
@@ -76,24 +76,24 @@
end
applied
end
def pad c
- return unless c.is_a? Korean::Char
+ return unless c.is_a? Gimchi::Char
c.chosung = 'ㅇ' if c.chosung.nil?
c.jungsung = 'ㅡ' if c.jungsung.nil?
end
# shortcut
def fortis_map
- @korean.config['structure']['fortis map']
+ @gimchi.config[:structure][:fortis_map]
end
# shortcut
def double_consonant_map
- @korean.config['structure']['double consonant map']
+ @gimchi.config[:structure][:double_consonant_map]
end
# 제5항: ‘ㅑ ㅒ ㅕ ㅖ ㅘ ㅙ ㅛ ㅝ ㅞ ㅠ ㅢ’는 이중 모음으로 발음한다.
# 다만 1. 용언의 활용형에 나타나는 ‘져, 쪄, 쳐’는 [저, 쩌, 처]로 발음한다.
# 다만 3. 자음을 첫소리로 가지고 있는 음절의 ‘ㅢ’는 [ㅣ]로 발음한다.
@@ -191,11 +191,11 @@
map_12_1 = {
'ㄱ' => 'ㅋ',
'ㄷ' => 'ㅌ',
'ㅈ' => 'ㅊ' }
- if %w[ㅎ ㄶ ㅀ].include?(@kc.jongsung)
+ if %w[ㅎ ㄶ ㅀ].include?(@kc.jongsung)
# 12-1
if map_12_1.keys.include?(@next_kc.chosung)
@next_kc.chosung = map_12_1[@next_kc.chosung]
@kc.jongsung = (dc = double_consonant_map[@kc.jongsung]) && dc.first
@@ -275,11 +275,11 @@
def rule_15
return if @kc.jongsung.nil? || @kc.jongsung == 'ㅇ' || @next_kc.nil? || @next_kc.chosung != 'ㅇ'
if false && %w[ㅏ ㅓ ㅗ ㅜ ㅟ].include?(@next_kc.jungsung) &&
%[ㅆ ㄲ ㅈ ㅊ ㄵ ㄻ ㄾ ㄿ ㄺ].include?(@kc.jongsung) == false # PATCH
- @next_kc.chosung = @pconfig['jongsung sound'][ @kc.jongsung ]
+ @next_kc.chosung = @pconfig[:jongsung_sound][ @kc.jongsung ]
@kc.jongsung = nil
true
end
end
@@ -297,11 +297,11 @@
'피읖' => '피읍',
'히읗' => '히읏'}
word = @kc.to_s + @next_kc.to_s
if map.keys.include? word
- new_char = @korean.kchar(map[word].scan(/./mu)[1])
+ new_char = @gimchi.kchar(map[word].scan(/./mu)[1])
@next_kc.chosung = new_char.chosung
@next_kc.jongsung = new_char.jongsung
true
end
@@ -329,12 +329,12 @@
# 제18항: 받침 ‘ㄱ(ㄲ, ㅋ, ㄳ, ㄺ), ㄷ(ㅅ, ㅆ, ㅈ, ㅊ, ㅌ, ㅎ), ㅂ(ㅍ, ㄼ,
# ㄿ, ㅄ)’은 ‘ㄴ, ㅁ’ 앞에서 [ㅇ, ㄴ, ㅁ]으로 발음한다.
def rule_18
map = {
- %w[ㄱ ㄲ ㅋ ㄳ ㄺ] => 'ㅇ',
- %w[ㄷ ㅅ ㅆ ㅈ ㅊ ㅌ ㅎ] => 'ㄴ',
+ %w[ㄱ ㄲ ㅋ ㄳ ㄺ] => 'ㅇ',
+ %w[ㄷ ㅅ ㅆ ㅈ ㅊ ㅌ ㅎ] => 'ㄴ',
%w[ㅂ ㅍ ㄼ ㄿ ㅄ] => 'ㅁ'
}
if @next_kc && map.keys.flatten.include?(@kc.jongsung) && %w[ㄴ ㅁ].include?(@next_kc.chosung)
@kc.jongsung = map[ map.keys.find { |e| e.include? @kc.jongsung } ]
@@ -393,11 +393,11 @@
# 제24항: 어간 받침 ‘ㄴ(ㄵ), ㅁ(ㄻ)’ 뒤에 결합되는 어미의 첫소리 ‘ㄱ, ㄷ, ㅅ, ㅈ’은 된소리로 발음한다.
# 다만, 피동, 사동의 접미사 ‘-기-’는 된소리로 발음하지 않는다.
# 용언 어간에만 적용.
def rule_24
- return if @next_kc.nil? ||
+ return if @next_kc.nil? ||
@next_kc.to_s == '기' # FIXME 피동/사동 여부 판단 불가. e.g. 줄넘기
# FIXME 용언 여부를 판단. 정확한 판단 불가.
return unless case @kc.jongsung
when 'ㄵ'
@@ -439,11 +439,11 @@
def rule_27
# FIXME: NOT PROPERLY IMPLEMENTED
return if @next_kc.nil?
# 비교적 확률이 높은 경우들에 대해서만 처리. "일" 은 제외.
- if %w[할 갈 날 볼 을 앨 말 힐].include?(@kc.to_s) && # @kc.jongsung == 'ㄹ' &&
+ if %w[할 갈 날 볼 을 앨 말 힐].include?(@kc.to_s) && # @kc.jongsung == 'ㄹ' &&
%w[ㄱ ㄷ ㅂ ㅅ ㅈ].include?(@next_kc.chosung)
@next_kc.chosung = fortis_map[@next_kc.chosung]
true
end
end
@@ -465,11 +465,11 @@
# 제30항: 사이시옷이 붙은 단어는 다음과 같이 발음한다.
# 1. ‘ㄱ, ㄷ, ㅂ, ㅅ, ㅈ’으로 시작하는 단어 앞에 사이시옷이 올 때는 이들
# 자음만을 된소리로 발음하는 것을 원칙으로 하되, 사이시옷을 [ㄷ]으로
# 발음하는 것도 허용한다.
- # 2. 사이시옷 뒤에 ‘ㄴ, ㅁ’이 결합되는 경우에는 [ㄴ]으로 발음한다.
+ # 2. 사이시옷 뒤에 ‘ㄴ, ㅁ’이 결합되는 경우에는 [ㄴ]으로 발음한다.
# 3. 사이시옷 뒤에 ‘이’ 음이 결합되는 경우에는 [ㄴㄴ]으로 발음한다.
def rule_30
return if @next_kc.nil? || @kc.jongsung != 'ㅅ'
if %w[ㄱ ㄷ ㅂ ㅅ ㅈ].include? @next_kc.chosung
@@ -488,7 +488,6 @@
true
end
end
end#Pronouncer
-end#Korean
end#Gimchi