From 8f2e8d6430aca4a482f06d5a4c8e04bab601f273 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=85=E6=88=8E=E6=B0=8F?= Date: Tue, 12 Dec 2023 18:39:19 +0800 Subject: [PATCH] feat(engine): translate zero-length prediction allow zero-length segment to be translated. add `placeholder` tag to the segment to prevent it from being trimmed. --- src/rime/engine.cc | 14 +++++++++----- tools/rime_api_console.cc | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/rime/engine.cc b/src/rime/engine.cc index 3ccc374e9a..64c0fb68b2 100644 --- a/src/rime/engine.cc +++ b/src/rime/engine.cc @@ -162,10 +162,12 @@ void ConcreteEngine::Compose(Context* ctx) { } CalculateSegmentation(&comp); TranslateSegments(&comp); - DLOG(INFO) << "composition: " << comp.GetDebugText(); + DLOG(INFO) << "composition: [" << comp.GetDebugText() << "]"; } void ConcreteEngine::CalculateSegmentation(Segmentation* segments) { + DLOG(INFO) << "CalculateSegmentation, segments: " << segments->size() + << ", finished? " << segments->HasFinishedSegmentation(); while (!segments->HasFinishedSegmentation()) { size_t start_pos = segments->GetCurrentStartPosition(); size_t end_pos = segments->GetCurrentEndPosition(); @@ -189,20 +191,22 @@ void ConcreteEngine::CalculateSegmentation(Segmentation* segments) { segments->Forward(); } // start an empty segment only at the end of a confirmed composition. - segments->Trim(); + if (!segments->empty() && !segments->back().HasTag("placeholder")) + segments->Trim(); if (!segments->empty() && segments->back().status >= Segment::kSelected) segments->Forward(); } void ConcreteEngine::TranslateSegments(Segmentation* segments) { + DLOG(INFO) << "TranslateSegments: " << *segments; for (Segment& segment : *segments) { + DLOG(INFO) << "segment [" << segment.start << ", " << segment.end + << "), status: " << segment.status; if (segment.status >= Segment::kGuess) continue; size_t len = segment.end - segment.start; - if (len == 0) - continue; string input = segments->input().substr(segment.start, len); - DLOG(INFO) << "translating segment: " << input; + DLOG(INFO) << "translating segment: [" << input << "]"; auto menu = New(); for (auto& translator : translators_) { auto translation = translator->Query(input, segment); diff --git a/tools/rime_api_console.cc b/tools/rime_api_console.cc index e3cb274ac2..f40fe01f39 100644 --- a/tools/rime_api_console.cc +++ b/tools/rime_api_console.cc @@ -64,7 +64,7 @@ void print_menu(RimeMenu* menu) { } void print_context(RimeContext* context) { - if (context->composition.length > 0) { + if (context->composition.length > 0 || context->menu.num_candidates > 0) { print_composition(&context->composition); } else { printf("(not composing)\n");