From b956e0d45388a70db9be4ad154a124c82677c73d Mon Sep 17 00:00:00 2001 From: fanlusky <1730976608@qq.com> Date: Mon, 22 Jun 2026 20:49:19 +0800 Subject: [PATCH] Fix the issue where the auxiliary code is not cleared during full-pinyin word creation. --- server/MetasequoiaImeEngine | 2 +- server/src/session/engine_input_session.cpp | 12 +++++++++--- .../tests/src/test_engine_shuangpin_session.cpp | 17 +++++++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/server/MetasequoiaImeEngine b/server/MetasequoiaImeEngine index d1c88037..d64ef643 160000 --- a/server/MetasequoiaImeEngine +++ b/server/MetasequoiaImeEngine @@ -1 +1 @@ -Subproject commit d1c88037c07d6cd030b48c91a239f7ec8e967967 +Subproject commit d64ef643102a3581057e33619efd09af4925d22a diff --git a/server/src/session/engine_input_session.cpp b/server/src/session/engine_input_session.cpp index 94cf2923..e9ef98ff 100644 --- a/server/src/session/engine_input_session.cpp +++ b/server/src/session/engine_input_session.cpp @@ -297,8 +297,13 @@ IInputSession::SelectionTransition EngineInputSession::advance_composition_after request().normalized_segmentation.empty() ? request().segmentation : request().normalized_segmentation; const std::string current_segmentation_with_cases = get_pinyin_segmentation_with_cases(); const std::string selected_pure_pinyin = remove_delimiters(selected_pinyin); + const std::string raw_input_without_helpcodes = + quanpin::strip_active_helpcodes(request().raw_input, request().raw_input_with_cases); + const std::string raw_input_with_cases_without_helpcodes = + quanpin::strip_active_helpcodes_with_cases(request().raw_input, request().raw_input_with_cases); - size_t consumed_raw_length = raw_length_for_normalized_prefix(request().raw_input_with_cases, selected_pure_pinyin.size()); + size_t consumed_raw_length = + raw_length_for_normalized_prefix(raw_input_with_cases_without_helpcodes, selected_pure_pinyin.size()); transition.continues_composition = !selected_pure_pinyin.empty() && selected_pure_pinyin.size() < transition.full_pure_pinyin.size() && @@ -306,8 +311,9 @@ IInputSession::SelectionTransition EngineInputSession::advance_composition_after if (transition.continues_composition) { - const std::string rest_raw_input = request().raw_input.substr(consumed_raw_length); - const std::string rest_raw_input_with_cases = request().raw_input_with_cases.substr(consumed_raw_length); + const std::string rest_raw_input = raw_input_without_helpcodes.substr(consumed_raw_length); + const std::string rest_raw_input_with_cases = + raw_input_with_cases_without_helpcodes.substr(consumed_raw_length); session_.replace_quanpin_raw_input(rest_raw_input, rest_raw_input_with_cases); transition.current_segmentation = get_pinyin_segmentation(); transition.current_segmentation_with_cases = get_pinyin_segmentation_with_cases(); diff --git a/server/tests/src/test_engine_shuangpin_session.cpp b/server/tests/src/test_engine_shuangpin_session.cpp index 07a25c4c..0b9a036d 100644 --- a/server/tests/src/test_engine_shuangpin_session.cpp +++ b/server/tests/src/test_engine_shuangpin_session.cpp @@ -148,3 +148,20 @@ TEST_CASE(EngineQuanpinSessionContinuesCompositionAfterMultiSyllableSelection) REQUIRE_EQ(progress.word, std::string("正向")); REQUIRE_EQ(progress.preedit, std::string("正向hua'fen")); } + +TEST_CASE(EngineQuanpinSessionContinuesCompositionWithoutRetainingHelpcodes) +{ + EngineInputSession session(SchemeType::Quanpin); + InputLetters(session, "nishuoneNV"); + + const auto transition = session.advance_composition_after_selection("ni'shuo", "你说"); + REQUIRE(transition.continues_composition); + REQUIRE_EQ(session.get_pinyin_sequence(), std::string("ne")); + REQUIRE_EQ(session.get_pinyin_sequence_with_cases(), std::string("ne")); + REQUIRE_EQ(session.get_pinyin_segmentation_with_cases(), std::string("ne")); + + const auto progress = session.update_creating_word_progress("", "", "你说", transition); + REQUIRE_EQ(progress.pinyin, std::string("nishuone")); + REQUIRE_EQ(progress.word, std::string("你说")); + REQUIRE_EQ(progress.preedit, std::string("你说ne")); +}