6 #ifndef _FCITX_LIBIME_PINYIN_PINYINENCODER_H_ 7 #define _FCITX_LIBIME_PINYIN_PINYINENCODER_H_ 11 #include <string_view> 14 #include <fcitx-utils/flags.h> 15 #include <fcitx-utils/log.h> 16 #include <fcitx-utils/macros.h> 17 #include <libime/core/segmentgraph.h> 18 #include <libime/pinyin/libimepinyin_export.h> 22 class ShuangpinProfile;
23 class PinyinCorrectionProfile;
25 enum class PinyinFuzzyFlag {
28 NG_GN [[deprecated]] = CommonTypo,
44 PartialFinal = 1 << 16,
56 AdvancedTypo = 1 << 18,
73 using PinyinFuzzyFlags = fcitx::Flags<PinyinFuzzyFlag>;
75 LIBIMEPINYIN_EXPORT fcitx::LogMessageBuilder &
76 operator<<(fcitx::LogMessageBuilder &log, PinyinFuzzyFlags fuzzy);
78 enum class PinyinInitial : char {
106 inline bool operator<(PinyinInitial l, PinyinInitial r) {
107 return static_cast<char>(l) < static_cast<char>(r);
110 inline bool operator<=(PinyinInitial l, PinyinInitial r) {
111 return l < r || l == r;
114 inline bool operator>(PinyinInitial l, PinyinInitial r) {
return !(l <= r); }
116 inline bool operator>=(PinyinInitial l, PinyinInitial r) {
return !(l < r); }
118 LIBIMEPINYIN_EXPORT fcitx::LogMessageBuilder &
119 operator<<(fcitx::LogMessageBuilder &log, PinyinInitial initial);
121 enum class PinyinFinal : char {
187 inline bool operator<(PinyinFinal l, PinyinFinal r) {
188 return static_cast<char>(l) < static_cast<char>(r);
191 inline bool operator<=(PinyinFinal l, PinyinFinal r) {
return l < r || l == r; }
193 inline bool operator>(PinyinFinal l, PinyinFinal r) {
return !(l <= r); }
195 inline bool operator>=(PinyinFinal l, PinyinFinal r) {
return !(l < r); }
197 LIBIMEPINYIN_EXPORT fcitx::LogMessageBuilder &
198 operator<<(fcitx::LogMessageBuilder &log, PinyinFinal
final);
203 : initial_(initial), final_(
final) {}
206 PinyinInitial initial()
const {
return initial_; }
207 PinyinFinal
final()
const {
return final_; }
209 std::string toString()
const;
212 return initial_ == other.initial_ && final_ == other.final_;
216 return !(*
this == other);
219 return std::make_pair(initial_, final_) <
220 std::make_pair(other.initial_, other.final_);
223 return *
this < other || *
this == other;
226 return !(*
this <= other);
229 return !(*
this < other);
233 PinyinInitial initial_;
237 LIBIMEPINYIN_EXPORT fcitx::LogMessageBuilder &
240 template <
typename FuzzyValue>
241 using FuzzyPinyinSyllables = std::vector<
242 std::pair<PinyinInitial, std::vector<std::pair<PinyinFinal, FuzzyValue>>>>;
244 using MatchedPinyinSyllables = FuzzyPinyinSyllables<bool>;
246 using MatchedPinyinSyllablesWithFuzzyFlags =
247 FuzzyPinyinSyllables<PinyinFuzzyFlags>;
252 PinyinFuzzyFlags flags);
255 PinyinFuzzyFlags flags);
257 static SegmentGraph parseUserShuangpin(std::string pinyin,
259 PinyinFuzzyFlags flags);
267 static std::vector<char> encodeFullPinyin(std::string_view pinyin);
277 static std::vector<char> encodeFullPinyinWithFlags(std::string_view pinyin,
278 PinyinFuzzyFlags flags);
279 static std::vector<char> encodeOneUserPinyin(std::string pinyin);
281 static std::string shuangpinToPinyin(std::string_view pinyin,
284 static bool isValidUserPinyin(
const char *data,
size_t size);
286 static bool isValidUserPinyin(
const std::vector<char> &v) {
287 return isValidUserPinyin(v.data(), v.size());
290 static std::string decodeFullPinyin(
const std::vector<char> &v) {
291 return decodeFullPinyin(v.data(), v.size());
293 static std::string decodeFullPinyin(std::string_view s) {
294 return decodeFullPinyin(s.data(), s.size());
296 static std::string decodeFullPinyin(
const char *data,
size_t size);
298 static const std::string &initialToString(PinyinInitial initial);
299 static PinyinInitial stringToInitial(
const std::string &str);
300 static bool isValidInitial(
char c) {
301 return c >= firstInitial && c <= lastInitial;
304 static const std::string &finalToString(PinyinFinal
final);
305 static PinyinFinal stringToFinal(
const std::string &str);
306 static bool isValidFinal(
char c) {
307 return c >= firstFinal && c <= lastFinal;
310 static bool isValidInitialFinal(PinyinInitial initial, PinyinFinal
final);
316 static bool isFinalLetter(PinyinFinal
final);
318 static PinyinFinal letterToFinal(
char c);
321 static std::string initialFinalToPinyinString(PinyinInitial initial,
324 static MatchedPinyinSyllables stringToSyllables(std::string_view pinyin,
325 PinyinFuzzyFlags flags);
327 static MatchedPinyinSyllablesWithFuzzyFlags
328 stringToSyllablesWithFuzzyFlags(std::string_view pinyin,
330 PinyinFuzzyFlags flags);
332 static MatchedPinyinSyllables
334 PinyinFuzzyFlags flags);
335 static MatchedPinyinSyllablesWithFuzzyFlags
336 shuangpinToSyllablesWithFuzzyFlags(std::string_view pinyin,
338 PinyinFuzzyFlags flags);
340 static constexpr
char firstInitial =
static_cast<char>(PinyinInitial::B);
341 static constexpr
char lastInitial =
static_cast<char>(PinyinInitial::Zero);
342 static constexpr
char firstFinal =
static_cast<char>(PinyinFinal::A);
343 static constexpr
char lastFinal =
static_cast<char>(PinyinFinal::Zero);
344 static constexpr
char firstLetter =
345 static_cast<char>(PinyinFinal::Letter_A);
346 static constexpr
char lastLetter =
static_cast<char>(PinyinFinal::Letter_Z);
350 #endif // _FCITX_LIBIME_PINYIN_PINYINENCODER_H_
Class that holds updated Pinyin correction mapping based on correction mapping.