class ShuangPinTutorial::Data
Constants
- LEGAL_COMPOSITE
聲母對應合法的韻母組合
- SHENG_MU
聲母列表 23 個 + 一個特殊的聲母 o 用來輸入單音節的韻母字
- SHENG_YUN_WORD_TABLE
普通話聲韻配合表
- VALID_COMPOSITE
每個按鍵對應的雙拼表
- YUN_MU
韻母列表 35 個
Public Class Methods
new()
click to toggle source
# File lib/shuang_pin_tutorial/data.rb, line 136 def initialize() SHENG_MU.freeze YUN_MU.freeze LEGAL_COMPOSITE.freeze SHENG_YUN_WORD_TABLE.freeze VALID_COMPOSITE.freeze end
Public Instance Methods
get_correct_keys(input_pinyin)
click to toggle source
計算拼音輸入碼答案部分 recursive way
# File lib/shuang_pin_tutorial/data.rb, line 203 def get_correct_keys(input_pinyin) return get_correct_keys_helper(input_pinyin, 2) end
get_correct_keys_helper(input_pinyin, output_keys)
click to toggle source
# File lib/shuang_pin_tutorial/data.rb, line 207 def get_correct_keys_helper(input_pinyin, output_keys) press_keys = nil input_pinyin = input_pinyin.downcase.strip if output_keys == 0 return press_keys.to_s elsif output_keys == 1 VALID_COMPOSITE.each do |key, value| press_keys = key.to_s if value.include?(input_pinyin) break if press_keys end return press_keys.to_s elsif output_keys == 2 if LEGAL_COMPOSITE[:o].include?(input_pinyin) # 韻母單音節字 press_keys = 'O' + get_correct_keys_helper(input_pinyin, 1) elsif input_pinyin.start_with?('zh', 'ch', 'sh') press_keys = get_correct_keys_helper(input_pinyin[0,2], 1) + get_correct_keys_helper(input_pinyin[2..input_pinyin.length], 1) else press_keys = get_correct_keys_helper(input_pinyin[0,1], 1) + get_correct_keys_helper(input_pinyin[1..input_pinyin.length], 1) end else raise(RangeError, '未需支援兩個以上拼音碼') end press_keys.to_s end
get_cw(sheng, yun)
click to toggle source
# File lib/shuang_pin_tutorial/data.rb, line 196 def get_cw(sheng, yun) #sheng, yun: sym cw = SHENG_YUN_WORD_TABLE.fetch(sheng.to_sym).fetch(yun.to_sym) rescue puts("內部錯誤:資料中查無此字 【#{sheng}#{yun}】") cw ||= '' end
get_rand_sheng_yun_sym()
click to toggle source
提取隨機文字部分
# File lib/shuang_pin_tutorial/data.rb, line 145 def get_rand_sheng_yun_sym() sheng = SHENG_MU.keys.sample.to_sym yun = LEGAL_COMPOSITE[sheng].sample.to_sym [sheng, yun] end
get_sheng_yun_zy(sheng, yun)
click to toggle source
# File lib/shuang_pin_tutorial/data.rb, line 151 def get_sheng_yun_zy(sheng, yun) sheng_zy = SHENG_MU[sheng.to_sym].to_s.strip yun_zy = YUN_MU[yun.to_sym].to_s.strip [sheng_zy, yun_zy] end
get_sy(sheng, yun)
click to toggle source
# File lib/shuang_pin_tutorial/data.rb, line 192 def get_sy(sheng, yun) #sheng, yun: sym (sheng.to_s.strip + yun.to_s.strip).sub(/^o/,'') end
get_zy(sheng, yun)
click to toggle source
# File lib/shuang_pin_tutorial/data.rb, line 157 def get_zy(sheng, yun) #sheng, yun: sym shengyun = get_sy(sheng, yun) sheng_zy, yun_zy = get_sheng_yun_zy(sheng, yun) case shengyun # special cases for zhuyin required to fine-adjust when 'zhi' SHENG_MU[:zh] when 'chi' SHENG_MU[:ch] when 'shi' SHENG_MU[:sh] when 'ri' SHENG_MU[:r] when 'zi' SHENG_MU[:z] when 'ci' SHENG_MU[:c] when 'si' SHENG_MU[:s] when 'yu', 'yü' YUN_MU[:ü] when 'yuan', 'yüan' YUN_MU[:üan] when 'yue', 'yüe' YUN_MU[:üe] when 'yun', 'yün' YUN_MU[:ün] when 'yong' YUN_MU[:iong] when 'ju', 'jü', 'qu', 'qü', 'xu', 'xü' (SHENG_MU[sheng] + YUN_MU[:ü]).chars.uniq.join else (sheng_zy + yun_zy).chars.uniq.join end end