From 0884a67e7f67d141d1af3943bdfb31cdce2b1234 Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Fri, 23 Sep 2011 14:15:00 +0800 Subject: add correction options to pinyin custom settings --- src/storage/pinyin_base.cpp | 2 +- src/storage/pinyin_custom.h | 78 +++++++++++++++++++++++++++++++++++++++------ 2 files changed, 70 insertions(+), 10 deletions(-) diff --git a/src/storage/pinyin_base.cpp b/src/storage/pinyin_base.cpp index 25c33e1..acb5ee8 100644 --- a/src/storage/pinyin_base.cpp +++ b/src/storage/pinyin_base.cpp @@ -745,7 +745,7 @@ PinyinParser::normalize (PinyinKey &key) { static const PinyinReplaceRulePair rules [] = { -#if 1 +#if 0 {PINYIN_ZeroInitial, PINYIN_I, PINYIN_Yi, PINYIN_I}, {PINYIN_ZeroInitial, PINYIN_Ia, PINYIN_Yi, PINYIN_A}, {PINYIN_ZeroInitial, PINYIN_Ian, PINYIN_Yi, PINYIN_An}, diff --git a/src/storage/pinyin_custom.h b/src/storage/pinyin_custom.h index e80d78e..3e66305 100644 --- a/src/storage/pinyin_custom.h +++ b/src/storage/pinyin_custom.h @@ -59,6 +59,29 @@ enum PinyinAmbiguity PINYIN_AmbLast = PINYIN_AmbIngIn }; +/** + * @brief enums of pinyin corrections. + * + * These options will be enabled in the second major libpinyin release. + */ + +enum PinyinCorrection{ + PINYIN_CorrectAny = 0, +#if 0 + PINYIN_CorrectZeroInitial, + PINYIN_CorrectGNtoNG, + PINYIN_CorrectMGtoNG, + PINYIN_CorrectIOUtoIU, + PINYIN_CorrectUEItoUI, + PINYIN_CorrectUENtoUN, + PINYIN_CorrectUEtoVE, + PINYIN_CorrectONtoONG, +#endif + PINYIN_CorrectVtoU, + PINYIN_CorrectLast = PINYIN_CorrectVtoU, +}; + + /** * @brief Structure to hold pinyin custom settings. * @@ -67,26 +90,32 @@ enum PinyinAmbiguity struct PinyinCustomSettings { bool use_incomplete; - /**< allow incomplete pinyin key which only has inital. */ + /**< allow incomplete pinyin key which only has inital. */ bool use_ambiguities [PINYIN_AmbLast + 1]; - /**< allow ambiguous pinyin elements or not. */ + /**< allow ambiguous pinyin elements or not. */ + + bool use_corrections [PINYIN_CorrectLast + 1]; + /**< allow pinyin corrections or not. */ PinyinCustomSettings () :use_incomplete (true) { for (size_t i=0; i<=PINYIN_AmbLast; ++i) use_ambiguities [i] = false; + for (size_t i=0; i<=PINYIN_CorrectLast; ++i) + use_corrections [i] = false; } void set_use_incomplete (bool use) { use_incomplete = use; } void set_use_ambiguities (PinyinAmbiguity amb, bool use) { if (amb == PINYIN_AmbAny) - for (size_t i=0; i<=PINYIN_AmbLast; ++i) use_ambiguities [i] = use; + for (size_t i=0; i<=PINYIN_AmbLast; ++i) + use_ambiguities [i] = use; else { use_ambiguities [0] = false; - use_ambiguities [static_cast(amb)] = use; + use_ambiguities [static_cast(amb)] = use; for (size_t i=1; i<=PINYIN_AmbLast; ++i) if (use_ambiguities [i]) { use_ambiguities [0] = true; @@ -95,15 +124,37 @@ struct PinyinCustomSettings } } + void set_use_corrections (PinyinCorrection correct, bool use) + { + size_t i; + if (correct == PINYIN_CorrectAny) + for (i=0; i<=PINYIN_CorrectLast; ++i) + use_corrections [i] = use; + else { + use_corrections [0] = false; + use_corrections [static_cast(correct)] = use; + for (i = 1; i<=PINYIN_CorrectLast; ++i) + if (use_corrections [i]) { + use_corrections [0] = true; + break; + } + } + } + bool operator == (const PinyinCustomSettings &rhs) const { + size_t i; if (use_incomplete != rhs.use_incomplete) return false; - for (size_t i=0; i <= PINYIN_AmbLast; ++i) + for (i=0; i <= PINYIN_AmbLast; ++i) if (use_ambiguities [i] != rhs.use_ambiguities [i]) return false; + for (i=0; i <= PINYIN_CorrectLast; ++i) + if (use_corrections [i] != rhs.use_corrections [i]) + return false; + return true; } @@ -115,22 +166,31 @@ struct PinyinCustomSettings guint32 to_value () const { guint32 val = 0; + size_t i; if (use_incomplete) val |= 1; - for (size_t i=0; i <= PINYIN_AmbLast; ++i) + for (i=0; i <= PINYIN_AmbLast; ++i) if (use_ambiguities [i]) - val |= (1 << (i+1)); + val |= (1 << (i + 1)); + + for (i=0; i <= PINYIN_CorrectLast; ++i) + if (use_corrections [i]) + val |= (1 << (i + PINYIN_AmbLast + 2 )); return val; } void from_value (guint32 val) { + size_t i; use_incomplete = ((val & 1) != 0); - for (size_t i=0; i <= PINYIN_AmbLast; ++i) - use_ambiguities [i] = ((val & (1 << (i+1))) != 0); + for (i=0; i <= PINYIN_AmbLast; ++i) + use_ambiguities [i] = (val & (1 << (i + 1))) != 0; + + for (i=0; i <= PINYIN_CorrectLast; ++i) + use_corrections [i] = (val & (1 << (i + PINYIN_AmbLast + 2))) != 0; } }; -- cgit