diff --git a/src/rime/gear/script_translator.cc b/src/rime/gear/script_translator.cc index d0abf5edd7..79be7abe8e 100644 --- a/src/rime/gear/script_translator.cc +++ b/src/rime/gear/script_translator.cc @@ -311,7 +311,7 @@ string ScriptSyllabifier::GetPreeditString(const Phrase& cand) const { const auto& delimiters = translator_->delimiters(); std::stack lengths; string output; - SyllabifyTask task{cand.code(), syllable_graph_, cand.end() - start_, + SyllabifyTask task{cand.matching_code(), syllable_graph_, cand.end() - start_, [&](SyllabifyTask* task, size_t depth, size_t current_pos, size_t next_pos) { size_t len = output.length(); diff --git a/src/rime/gear/translator_commons.h b/src/rime/gear/translator_commons.h index a004d9f8e2..f4aac18f4d 100644 --- a/src/rime/gear/translator_commons.h +++ b/src/rime/gear/translator_commons.h @@ -81,6 +81,24 @@ class Phrase : public Candidate { Code& code() const { return entry_->code; } const DictEntry& entry() const { return *entry_; } const Language* language() const { return language_; } + size_t matching_code_size() const { + return entry_->matching_code_size != 0 ? entry_->matching_code_size + : entry_->code.size(); + } + bool is_exact_match() const { + return entry_->matching_code_size == 0 || + entry_->matching_code_size == entry_->code.size(); + } + bool is_predicitve_match() const { + return entry_->matching_code_size != 0 && + entry_->matching_code_size < entry_->code.size(); + } + Code matching_code() const { + return entry_->matching_code_size == 0 + ? entry_->code + : Code(entry_->code.begin(), + entry_->code.begin() + entry_->matching_code_size); + } Spans spans() { return syllabifier_ ? syllabifier_->Syllabify(this) : Spans(); }