libime
pinyinime.cpp
1 /*
2  * SPDX-FileCopyrightText: 2017-2017 CSSlayer <wengxt@gmail.com>
3  *
4  * SPDX-License-Identifier: LGPL-2.1-or-later
5  */
6 #include "pinyinime.h"
7 #include <cstddef>
8 #include <limits>
9 #include <memory>
10 #include <string>
11 #include <utility>
12 #include <fcitx-utils/connectableobject.h>
13 #include <fcitx-utils/macros.h>
14 #include "libime/core/decoder.h"
15 #include "libime/core/lattice.h"
16 #include "libime/core/userlanguagemodel.h"
17 #include "libime/pinyin/pinyincorrectionprofile.h"
18 #include "libime/pinyin/pinyindecoder.h"
19 #include "libime/pinyin/pinyindecoder_p.h"
20 #include "libime/pinyin/pinyinencoder.h"
21 
22 namespace libime {
23 
24 class PinyinIMEPrivate : fcitx::QPtrHolder<PinyinIME> {
25 public:
26  PinyinIMEPrivate(PinyinIME *q, std::unique_ptr<PinyinDictionary> dict,
27  std::unique_ptr<UserLanguageModel> model)
28  : fcitx::QPtrHolder<PinyinIME>(q), dict_(std::move(dict)),
29  model_(std::move(model)),
30  decoder_(std::make_unique<PinyinDecoder>(dict_.get(), model_.get())) {
31  model_->setCodeExtractor([](const WordNode *node) -> std::string {
32  if (const auto *pinyinNode =
33  dynamic_cast<const PinyinLatticeNode *>(node)) {
34  return pinyinNode->encodedPinyin();
35  }
36  if (const auto *wordNode =
37  dynamic_cast<const PinyinWordNode *>(node)) {
38  return wordNode->encodedPinyin();
39  }
40  return "";
41  });
42  }
43 
44  FCITX_DEFINE_SIGNAL_PRIVATE(PinyinIME, optionChanged);
45 
46  PinyinFuzzyFlags flags_;
47  std::unique_ptr<PinyinDictionary> dict_;
48  std::unique_ptr<UserLanguageModel> model_;
49  std::unique_ptr<PinyinDecoder> decoder_;
50  std::shared_ptr<const ShuangpinProfile> spProfile_;
51  std::shared_ptr<const PinyinCorrectionProfile> correctionProfile_;
52  size_t nbest_ = 1;
53  size_t beamSize_ = Decoder::beamSizeDefault;
54  size_t frameSize_ = Decoder::frameSizeDefault;
55  size_t partialLongWordLimit_ = 0;
56  size_t wordCandidateLimit_ = 15;
57  float maxDistance_ = std::numeric_limits<float>::max();
58  float minPath_ = -std::numeric_limits<float>::max();
59  PinyinPreeditMode preeditMode_ = PinyinPreeditMode::RawText;
60 };
61 
62 PinyinIME::PinyinIME(std::unique_ptr<PinyinDictionary> dict,
63  std::unique_ptr<UserLanguageModel> model)
64  : d_ptr(std::make_unique<PinyinIMEPrivate>(this, std::move(dict),
65  std::move(model))) {}
66 
67 PinyinIME::~PinyinIME() {}
68 
69 PinyinFuzzyFlags PinyinIME::fuzzyFlags() const {
70  FCITX_D();
71  return d->flags_;
72 }
73 
74 void PinyinIME::setFuzzyFlags(PinyinFuzzyFlags flags) {
75  FCITX_D();
76  d->flags_ = flags;
77  emit<PinyinIME::optionChanged>();
78 }
79 
80 PinyinDictionary *PinyinIME::dict() {
81  FCITX_D();
82  return d->dict_.get();
83 }
84 
85 const PinyinDictionary *PinyinIME::dict() const {
86  FCITX_D();
87  return d->dict_.get();
88 }
89 
90 const PinyinDecoder *PinyinIME::decoder() const {
91  FCITX_D();
92  return d->decoder_.get();
93 }
94 
95 UserLanguageModel *PinyinIME::model() {
96  FCITX_D();
97  return d->model_.get();
98 }
99 
100 const UserLanguageModel *PinyinIME::model() const {
101  FCITX_D();
102  return d->model_.get();
103 }
104 
105 size_t PinyinIME::nbest() const {
106  FCITX_D();
107  return d->nbest_;
108 }
109 
110 void PinyinIME::setNBest(size_t n) {
111  FCITX_D();
112  if (d->nbest_ != n) {
113  d->nbest_ = n;
114  emit<PinyinIME::optionChanged>();
115  }
116 }
117 
118 size_t PinyinIME::beamSize() const {
119  FCITX_D();
120  return d->beamSize_;
121 }
122 
123 void PinyinIME::setBeamSize(size_t n) {
124  FCITX_D();
125  if (d->beamSize_ != n) {
126  d->beamSize_ = n;
127  emit<PinyinIME::optionChanged>();
128  }
129 }
130 
131 size_t PinyinIME::frameSize() const {
132  FCITX_D();
133  return d->frameSize_;
134 }
135 
136 void PinyinIME::setFrameSize(size_t n) {
137  FCITX_D();
138  if (d->frameSize_ != n) {
139  d->frameSize_ = n;
140  emit<PinyinIME::optionChanged>();
141  }
142 }
143 
144 size_t PinyinIME::partialLongWordLimit() const {
145  FCITX_D();
146  return d->partialLongWordLimit_;
147 }
148 
149 void PinyinIME::setPartialLongWordLimit(size_t n) {
150  FCITX_D();
151  if (d->partialLongWordLimit_ != n) {
152  d->partialLongWordLimit_ = n;
153  emit<PinyinIME::optionChanged>();
154  }
155 }
156 
158  FCITX_D();
159  return d->wordCandidateLimit_;
160 }
161 
163  FCITX_D();
164  if (d->wordCandidateLimit_ != n) {
165  d->wordCandidateLimit_ = n;
166  emit<PinyinIME::optionChanged>();
167  }
168 }
169 
170 void PinyinIME::setPreeditMode(PinyinPreeditMode mode) {
171  FCITX_D();
172  if (d->preeditMode_ != mode) {
173  d->preeditMode_ = mode;
174  emit<PinyinIME::optionChanged>();
175  }
176 }
177 
178 PinyinPreeditMode PinyinIME::preeditMode() const {
179  FCITX_D();
180  return d->preeditMode_;
181 }
182 
183 void PinyinIME::setScoreFilter(float maxDistance, float minPath) {
184  FCITX_D();
185  if (d->maxDistance_ != maxDistance || d->minPath_ != minPath) {
186  d->maxDistance_ = maxDistance;
187  d->minPath_ = minPath;
188  emit<PinyinIME::optionChanged>();
189  }
190 }
191 
192 float PinyinIME::maxDistance() const {
193  FCITX_D();
194  return d->maxDistance_;
195 }
196 
197 float PinyinIME::minPath() const {
198  FCITX_D();
199  return d->minPath_;
200 }
201 
202 void PinyinIME::setShuangpinProfile(
203  std::shared_ptr<const ShuangpinProfile> profile) {
204  FCITX_D();
205  if (d->spProfile_ != profile) {
206  d->spProfile_ = std::move(profile);
207  emit<PinyinIME::optionChanged>();
208  }
209 }
210 
211 std::shared_ptr<const ShuangpinProfile> PinyinIME::shuangpinProfile() const {
212  FCITX_D();
213  return d->spProfile_;
214 }
215 
216 void PinyinIME::setCorrectionProfile(
217  std::shared_ptr<const PinyinCorrectionProfile> profile) {
218  FCITX_D();
219  if (d->correctionProfile_ != profile) {
220  d->correctionProfile_ = std::move(profile);
221  emit<PinyinIME::optionChanged>();
222  }
223 }
224 
225 std::shared_ptr<const PinyinCorrectionProfile>
226 PinyinIME::correctionProfile() const {
227  FCITX_D();
228  return d->correctionProfile_;
229 }
230 
231 } // namespace libime
PinyinDictionary is a set of dictionaries for Pinyin.
Provides shared data for PinyinContext.
Definition: pinyinime.h:28
void setWordCandidateLimit(size_t n)
Set the maximum number of candidates that is a word.
Definition: pinyinime.cpp:162
size_t wordCandidateLimit() const
The maximum number of candidates that is a word.
Definition: pinyinime.cpp:157