class ShuangPinTutorial::Data

Constants

聲母對應合法的韻母組合

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