# frozen_string_literal: true module Textbringer class HiraganaInputMethod < InputMethod HIRAGANA_TABLE = { "a" => "あ", "i" => "い", "u" => "う", "e" => "え", "o" => "お", "ka" => "か", "ki" => "き", "ku" => "く", "ke" => "け", "ko" => "こ", "ga" => "が", "gi" => "ぎ", "gu" => "ぐ", "ge" => "げ", "go" => "ご", "sa" => "さ", "si" => "し", "su" => "す", "se" => "せ", "so" => "そ", "za" => "ざ", "zi" => "じ", "zu" => "ず", "ze" => "ぜ", "zo" => "ぞ", "sha" => "しゃ", "shi" => "し", "shu" => "しゅ", "she" => "しぇ", "sho" => "しょ", "ja" => "じゃ", "ji" => "じ", "ju" => "じゅ", "je" => "じぇ", "jo" => "じょ", "ta" => "た", "ti" => "ち", "tu" => "つ", "te" => "て", "to" => "と", "da" => "だ", "di" => "ぢ", "du" => "づ", "de" => "で", "do" => "ど", "cha" => "ちゃ", "chi" => "ち", "chu" => "ちゅ", "che" => "ちぇ", "cho" => "ちょ", "na" => "な", "ni" => "に", "nu" => "ぬ", "ne" => "ね", "no" => "の", "ha" => "は", "hi" => "ひ", "hu" => "ふ", "he" => "へ", "ho" => "ほ", "ba" => "ば", "bi" => "び", "bu" => "ぶ", "be" => "べ", "bo" => "ぼ", "pa" => "ぱ", "pi" => "ぴ", "pu" => "ぷ", "pe" => "ぺ", "po" => "ぽ", "ma" => "ま", "mi" => "み", "mu" => "む", "me" => "め", "mo" => "も", "ya" => "や", "yi" => "い", "yu" => "ゆ", "ye" => "いぇ", "yo" => "よ", "ra" => "ら", "ri" => "り", "ru" => "る", "re" => "れ", "ro" => "ろ", "wa" => "わ", "wi" => "ゐ", "wu" => "う", "we" => "ゑ", "wo" => "を", "nn" => "ん" } HIRAGANA_PREFIXES = HIRAGANA_TABLE.keys.flat_map { |s| (s.size - 1).times.map { |i| s[0, i + 1] } }.uniq def initialize super @input_buffer = +"" end def status "あ" end def handle_event(event) if !event.is_a?(String) if !@input_buffer.empty? @input_buffer = +"" end return event end @input_buffer << event s = HIRAGANA_TABLE[@input_buffer] if s return flush(s) end if HIRAGANA_PREFIXES.include?(@input_buffer) return nil end flush(@input_buffer) end def flush(s) if !@input_buffer.empty? @input_buffer = +"" end if s.size == 1 s else Buffer.current.insert(s) Window.redisplay nil end end end end