Advertisement
Guest User

Untitled

a guest
Apr 6th, 2020
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 8.70 KB | None | 0 0
  1. require 'io/console'
  2.  
  3. dubeolsik = {
  4.   "q" => "ㅂ",
  5.   "Q" => "ㅃ",
  6.   "w" => "ㅈ",
  7.   "W" => "ㅉ",
  8.   "e" => "ㄷ",
  9.   "E" => "ㄸ",
  10.   "r" => "ㄱ",
  11.   "R" => "ㄲ",
  12.   "t" => "ㅅ",
  13.   "T" => "ㅆ",
  14.   "a" => "ㅁ",
  15.   "s" => "ㄴ",
  16.   "d" => "ㅇ",
  17.   "f" => "ㄹ",
  18.   "g" => "ㅎ",
  19.   "z" => "ㅋ",
  20.   "x" => "ㅌ",
  21.   "c" => "ㅊ",
  22.   "v" => "ㅍ",
  23.   "y" => "ㅛ",
  24.   "u" => "ㅕ",
  25.   "i" => "ㅑ",
  26.   "o" => "ㅐ",
  27.   "O" => "ㅒ",
  28.   "p" => "ㅔ",
  29.   "P" => "ㅖ",
  30.   "h" => "ㅗ",
  31.   "j" => "ㅓ",
  32.   "k" => "ㅏ",
  33.   "l" => "ㅣ",
  34.   "b" => "ㅠ",
  35.   "n" => "ㅜ",
  36.   "m" => "ㅡ"
  37. }
  38.  
  39. @l_index = {
  40.   "ㄱ" =>  0,
  41.   "ㄲ" =>  1,
  42.   "ㄴ" =>  2,
  43.   "ㄷ" =>  3,
  44.   "ㄸ" =>  4,
  45.   "ㄹ" =>  5,
  46.   "ㅁ" =>  6,
  47.   "ㅂ" =>  7,
  48.   "ㅃ" =>  8,
  49.   "ㅅ" =>  9,
  50.   "ㅆ" => 10,
  51.   "ㅇ" => 11,
  52.   "ㅈ" => 12,
  53.   "ㅉ" => 13,
  54.   "ㅊ" => 14,
  55.   "ㅋ" => 15,
  56.   "ㅌ" => 16,
  57.   "ㅍ" => 17,
  58.   "ㅎ" => 18
  59. }
  60.  
  61. @v_index = {
  62.   "ㅏ" =>  0,
  63.   "ㅐ" =>  1,
  64.   "ㅑ" =>  2,
  65.   "ㅒ" =>  3,
  66.   "ㅓ" =>  4,
  67.   "ㅔ" =>  5,
  68.   "ㅕ" =>  6,
  69.   "ㅖ" =>  7,
  70.   "ㅗ" =>  8,
  71.   "ㅘ" =>  9,
  72.   "ㅙ" => 10,
  73.   "ㅚ" => 11,
  74.   "ㅛ" => 12,
  75.   "ㅜ" => 13,
  76.   "ㅝ" => 14,
  77.   "ㅞ" => 15,
  78.   "ㅟ" => 16,
  79.   "ㅠ" => 17,
  80.   "ㅡ" => 18,
  81.   "ㅢ" => 19,
  82.   "ㅣ" => 20
  83. }
  84.  
  85. @t_index = {
  86.   nil  =>  0,
  87.   "ㄱ" =>  1,
  88.   "ㄲ" =>  2,
  89.   "ㄳ" =>  3,
  90.   "ㄴ" =>  4,
  91.   "ㄵ" =>  5,
  92.   "ㄶ" =>  6,
  93.   "ㄷ" =>  7,
  94.   "ㄹ" =>  8,
  95.   "ㄺ" =>  9,
  96.   "ㄻ" => 10,
  97.   "ㄼ" => 11,
  98.   "ㄽ" => 12,
  99.   "ㄾ" => 13,
  100.   "ㄿ" => 14,
  101.   "ㅀ" => 15,
  102.   "ㅁ" => 16,
  103.   "ㅂ" => 17,
  104.   "ㅄ" => 18,
  105.   "ㅅ" => 19,
  106.   "ㅆ" => 20,
  107.   "ㅇ" => 21,
  108.   "ㅈ" => 22,
  109.   "ㅊ" => 23,
  110.   "ㅋ" => 24,
  111.   "ㅌ" => 25,
  112.   "ㅍ" => 26,
  113.   "ㅎ" => 27
  114. }
  115.  
  116. cc_rules = {
  117.   "ㄱㅅ" => "ㄳ",
  118.   "ㄴㅈ" => "ㄵ",
  119.   "ㄴㅎ" => "ㄶ",
  120.   "ㄹㄱ" => "ㄺ",
  121.   "ㄹㅁ" => "ㄻ",
  122.   "ㄹㅂ" => "ㄼ",
  123.   "ㄹㅅ" => "ㄽ",
  124.   "ㄹㅌ" => "ㄾ",
  125.   "ㄹㅍ" => "ㄿ",
  126.   "ㄹㅎ" => "ㅀ",
  127.   "ㅂㅅ" => "ㅄ",
  128. }
  129.  
  130. vv_rules = {
  131.   "ㅗㅏ" => "ㅘ",
  132.   "ㅗㅐ" => "ㅙ",
  133.   "ㅗㅣ" => "ㅚ",
  134.   "ㅜㅓ" => "ㅝ",
  135.   "ㅜㅔ" => "ㅞ",
  136.   "ㅜㅣ" => "ㅟ",
  137.   "ㅡㅣ" => "ㅢ"
  138. }
  139.  
  140. @state = :none
  141. @seq = []
  142.  
  143. def reset
  144.   puts @c
  145.   @seq = []
  146.   @state = :none
  147. end
  148.  
  149. def compose_hangul (l, v, t)
  150.   (@l_index[l] * 588 + @v_index[v] * 28 + @t_index[t] + 0xac00).chr("utf-8")
  151. end
  152.  
  153. loop do
  154.   @c = STDIN.getch
  155.   @c.chomp!
  156.  
  157.   if @c.empty?
  158.     puts
  159.     exit
  160.   end
  161.  
  162.   unless dubeolsik[@c]
  163.     reset
  164.     next
  165.   end
  166.  
  167.   case @state
  168.   when :none
  169.     puts "preedit: " + dubeolsik[@c]
  170.     @seq << @c
  171.     @state = :c if @l_index.include? dubeolsik[@c]
  172.     @state = :v if @v_index.include? dubeolsik[@c]
  173.   when :c
  174.     if @l_index.include? dubeolsik[@c]
  175.       cc = cc_rules[dubeolsik[@seq[0]] + dubeolsik[@c]]
  176.       if cc
  177.         puts "preedit: " + cc
  178.         @seq << @c
  179.         @state = :cc
  180.       else
  181.         puts "commit: " + dubeolsik[@seq[0]]
  182.         puts "preedit: " + dubeolsik[@c]
  183.         @seq = []
  184.         @seq << @c
  185.         @state = :c
  186.       end
  187.     elsif @v_index.include? dubeolsik[@c]
  188.       puts "preedit: " + compose_hangul(dubeolsik[@seq[0]], dubeolsik[@c], nil)
  189.       @seq << @c
  190.       @state = :lv
  191.     end
  192.   when :v
  193.     if @l_index.include? dubeolsik[@c]
  194.       puts "commit: " + dubeolsik[@seq[0]]
  195.       puts "preedit: " + dubeolsik[@c]
  196.       @seq = []
  197.       @seq << @c
  198.       @state = :c
  199.     elsif @v_index.include? dubeolsik[@c]
  200.       vv = vv_rules[dubeolsik[@seq[0]] + dubeolsik[@c]]
  201.       if vv
  202.         puts "preedit: " + vv
  203.         @seq << @c
  204.         @state = :vv
  205.       else
  206.         puts "commit: " + dubeolsik[@seq[0]]
  207.         puts "preedit: " + dubeolsik[@c]
  208.         @seq = []
  209.         @seq << @c
  210.         @state = :v
  211.       end
  212.     end
  213.   when :lv
  214.     if @t_index.include? dubeolsik[@c]
  215.       puts "preedit: " + compose_hangul(dubeolsik[@seq[0]], dubeolsik[@seq[1]], dubeolsik[@c])
  216.       @seq << @c
  217.       @state = :lvt
  218.     elsif @l_index.include? dubeolsik[@c]
  219.       puts "commit: " +  compose_hangul(dubeolsik[@seq[0]], dubeolsik[@seq[1]], nil)
  220.       puts "preedit: " + dubeolsik[@c]
  221.       @seq = []
  222.       @seq << @c
  223.       @state = :c
  224.     elsif @v_index.include? dubeolsik[@c]
  225.       vv = vv_rules[dubeolsik[@seq[1]] + dubeolsik[@c]]
  226.       if vv
  227.         puts "preedit: " + compose_hangul(dubeolsik[@seq[0]], vv, nil)
  228.         @seq << @c
  229.         @state = :lvv
  230.       else
  231.         puts "commit: " + compose_hangul(dubeolsik[@seq[0]], dubeolsik[@seq[1]], nil)
  232.         puts "preedit: " + dubeolsik[@c]
  233.         @seq = []
  234.         @seq << @c
  235.         @state = :v
  236.       end
  237.     end
  238.   when :cc
  239.     if @l_index.include? dubeolsik[@c]
  240.       puts "commit: " + cc_rules[dubeolsik[@seq[0]] + dubeolsik[@seq[1]]]
  241.       puts "preedit: " + dubeolsik[@c]
  242.       @seq = []
  243.       @seq << @c
  244.       @state = :c
  245.     elsif @v_index.include? dubeolsik[@c]
  246.       puts "commit: " + dubeolsik[@seq[0]]
  247.       puts "preedit: " + compose_hangul(dubeolsik[@seq[1]], dubeolsik[@c], nil)
  248.       @seq.shift 1
  249.       @seq << @c
  250.       @state = :lv
  251.     end
  252.   when :vv
  253.     puts "commit: " + vv_rules[dubeolsik[@seq[0]] + dubeolsik[@seq[1]]]
  254.     puts "preedit: " + dubeolsik[@c]
  255.     @seq = []
  256.     @seq << @c
  257.     if @l_index.include? dubeolsik[@c]
  258.       @state = :c
  259.     elsif @v_index.include? dubeolsik[@c]
  260.       @state = :v
  261.     end
  262.   when :lvv
  263.     vv = vv_rules[dubeolsik[@seq[1]] + dubeolsik[@seq[2]]]
  264.     if @t_index.include? dubeolsik[@c]
  265.       puts "preedit: " + compose_hangul(dubeolsik[@seq[0]], vv, dubeolsik[@c])
  266.       @seq << @c
  267.       @state = :lvvt
  268.     elsif @l_index.include? dubeolsik[@c]
  269.       puts "commit: " +  compose_hangul(dubeolsik[@seq[0]], vv, nil)
  270.       puts "preedit: " + dubeolsik[@c]
  271.       @seq = []
  272.       @seq << @c
  273.       @state = :c
  274.     elsif @v_index.include? dubeolsik[@c]
  275.       puts "commit: " + compose_hangul(dubeolsik[@seq[0]], vv, nil)
  276.       puts "preedit: " + dubeolsik[@c]
  277.       @seq = []
  278.       @seq << @c
  279.       @state = :v
  280.     end
  281.   when :lvt
  282.     if @l_index.include? dubeolsik[@c]
  283.       cc = cc_rules[dubeolsik[@seq[2]] + dubeolsik[@c]]
  284.       if cc
  285.         puts "preedit: " + compose_hangul(dubeolsik[@seq[0]], dubeolsik[@seq[1]], cc)
  286.         @seq << @c
  287.         @state = :lvtt
  288.       else
  289.         puts "commit: " + compose_hangul(dubeolsik[@seq[0]], dubeolsik[@seq[1]], dubeolsik[@seq[2]])
  290.         puts "preedit: " + dubeolsik[@c]
  291.         @seq = []
  292.         @seq << @c
  293.         @state = :c
  294.       end
  295.     elsif @v_index.include? dubeolsik[@c]
  296.       puts "commit: " + compose_hangul(dubeolsik[@seq[0]], dubeolsik[@seq[1]], nil)
  297.       puts "preedit: " + compose_hangul(dubeolsik[@seq[2]], dubeolsik[@c], nil)
  298.       @seq.shift 2
  299.       @seq << @c
  300.       @state = :lv
  301.     end
  302.   when :lvvt
  303.     if @l_index.include? dubeolsik[@c]
  304.       vv = vv_rules[dubeolsik[@seq[1]] + dubeolsik[@seq[2]]]
  305.       cc = cc_rules[dubeolsik[@seq[3]] + dubeolsik[@c]]
  306.       if cc
  307.         puts "preedit: " + compose_hangul(dubeolsik[@seq[0]], vv, cc)
  308.         @seq << @c
  309.         @state = :lvvtt
  310.       else
  311.         puts "commit: " + compose_hangul(dubeolsik[@seq[0]], vv, dubeolsik[@seq[3]])
  312.         puts "preedit: " + dubeolsik[@c]
  313.         @seq = []
  314.         @seq << @c
  315.         @state = :c
  316.       end
  317.     elsif @v_index.include? dubeolsik[@c]
  318.       vv = vv_rules[dubeolsik[@seq[1]] + dubeolsik[@seq[2]]]
  319.       puts "commit: " + compose_hangul(dubeolsik[@seq[0]], vv, nil)
  320.       puts "preedit: " + compose_hangul(dubeolsik[@seq[3]], dubeolsik[@c], nil)
  321.       @seq.shift 3
  322.       @seq << @c
  323.       @state = :lv
  324.     end
  325.   when :lvtt
  326.     if @l_index.include? dubeolsik[@c]
  327.       cc = cc_rules[dubeolsik[@seq[2]] + dubeolsik[@seq[3]]]
  328.       puts "commit: " +  compose_hangul(dubeolsik[@seq[0]], dubeolsik[@seq[1]], cc)
  329.       puts "preedit: " + dubeolsik[@c]
  330.       @seq = []
  331.       @seq << @c
  332.       @state = :c
  333.     elsif @v_index.include? dubeolsik[@c]
  334.       puts "commit: " + compose_hangul(dubeolsik[@seq[0]], dubeolsik[@seq[1]], dubeolsik[@seq[2]])
  335.       puts "preedit: " + compose_hangul(dubeolsik[@seq[3]], dubeolsik[@c], nil)
  336.       @seq.shift 3
  337.       @seq << @c
  338.       @state = :lv
  339.     end
  340.   when :lvvtt
  341.     cc = cc_rules[dubeolsik[@seq[3]] + dubeolsik[@seq[4]]]
  342.     vv = vv_rules[dubeolsik[@seq[1]] + dubeolsik[@seq[2]]]
  343.     if @l_index.include? dubeolsik[@c]
  344.       puts "commit: " + compose_hangul(dubeolsik[@seq[0]], vv, cc)
  345.       puts "preedit: " + dubeolsik[@c]
  346.       @seq = []
  347.       @seq << @c
  348.       @state = :c
  349.     elsif @v_index.include? dubeolsik[@c]
  350.       puts "commit: " + compose_hangul(dubeolsik[@seq[0]], vv, dubeolsik[@seq[3]])
  351.       puts "preedit: " + compose_hangul(dubeolsik[@seq[4]], dubeolsik[@c], nil)
  352.       @seq.shift 4
  353.       @seq << @c
  354.       @state = :lv
  355.     end
  356.   else
  357.     raise "Unknown state #{@state.to_s}"
  358.   end
  359. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement