From 5c01033ae7d3470ae7add3a7ceca5dbd96e1a864 Mon Sep 17 00:00:00 2001 From: Naoaki Iwakiri Date: Fri, 30 Sep 2022 10:11:17 +0900 Subject: [PATCH] Fix kana input on clear preconversion (#204) --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/lib.rs | 38 +++++++++++++++++++++++++++++++++++++- tests/tests.rs | 15 +++++++++++++++ 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d0fcd8e..14f2413 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -42,7 +42,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cskk" -version = "0.10.1" +version = "0.10.3" dependencies = [ "anyhow", "bitflags", diff --git a/Cargo.toml b/Cargo.toml index 7aaf8b5..0f6d516 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "cskk" # Have to also change the deb package destination filename below -version = "0.10.2" +version = "0.10.3" authors = ["Naoaki Iwakiri "] license = "GPL-3.0-or-later" edition = "2018" diff --git a/src/lib.rs b/src/lib.rs index e874323..075e039 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -833,6 +833,8 @@ impl CskkContext { { let combined_raw = KanaBuilder::combine_raw(key_event, &initial_unprocessed_vector); let combined_lower = KanaBuilder::combine_lower(key_event, &initial_unprocessed_vector); + let alone_raw = KanaBuilder::combine_raw(key_event, &[]); + let alone_lower = KanaBuilder::combine_lower(key_event, &[]); // 上の間の処理で所有権を失っているので再度convert_non_partialを呼ぶ。 // FIXME: RustのバージョンがあがってSome内部のrefを上手くto_ownedみたいな扱いが簡単に書けるようになったら @@ -883,7 +885,7 @@ impl CskkContext { let current_input_mode = self.current_state_ref().input_mode; if let Some(key_char) = key_event.get_symbol_char() { - // カンマピリオドは特殊な設定と処理がある。 TODO: + // カンマピリオドは特殊な設定と処理がある。 TODO: これも一般化したい。 if let Some(converted) = self.kana_converter.convert_periods( &key_char, self.config.period_style, @@ -934,6 +936,40 @@ impl CskkContext { ); let lower_key_event = key_event.to_lower(); self.input_as_continuous_kana(&lower_key_event); + } else if let Some((converted, carry_over)) = + self.kana_converter.convert_non_partial(&alone_raw) + { + // かな入力として成立しないが単純変換のある入力。続けて入力はできないがかな変換はできる文字。 + let converted = converted.to_owned(); + let carry_over = carry_over.clone(); + self.input_converted_kana( + &converted, + carry_over, + false, + initial_unprocessed_vector, + ); + return true; + } else if let Some((converted, carry_over)) = + self.kana_converter.convert_non_partial(&alone_lower) + { + // かな入力として成立しないがモード変更と捉えればかな単純変換の入力となる文字 + if key_event.is_upper() { + let converted = converted.to_owned(); + let carry_over = carry_over.clone(); + let did_change_mode = self.transition_composition_mode_by_capital_letter( + key_event, + initial_kanainput_composition_mode, + false, + ); + + self.input_converted_kana( + &converted, + carry_over, + did_change_mode, + initial_unprocessed_vector, + ); + return true; + } } else if self.kana_converter.can_continue(key_event, &[]) { // かな入力として成立しない子音の連続等、続けては入力できないがkanabuilderで扱える文字。 // まずpre_convertedを整理してから入力として扱う。 diff --git a/tests/tests.rs b/tests/tests.rs index b9161f5..047d34e 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -1263,3 +1263,18 @@ fn prevent_no_kana_henkan() { ); skk_context_reset_rs(&mut context); } + +#[test] +fn preconversion_clear_and_input() { + init_test_logger(); + let mut context = default_test_context(); + transition_check( + &mut context, + CompositionMode::Direct, + InputMode::Hiragana, + "c minus", + "", + "ー", + InputMode::Hiragana, + ); +}