summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeng Wu <alexepico@gmail.com>2011-09-23 14:15:00 +0800
committerPeng Wu <alexepico@gmail.com>2011-09-23 14:15:00 +0800
commit0884a67e7f67d141d1af3943bdfb31cdce2b1234 (patch)
treed4a93a6462249e66d97269a807f75906423a32e2
parentbe59e5b5f901f0959e8824e81a7f49c434229440 (diff)
downloadlibpinyin-0884a67e7f67d141d1af3943bdfb31cdce2b1234.tar.gz
libpinyin-0884a67e7f67d141d1af3943bdfb31cdce2b1234.tar.xz
libpinyin-0884a67e7f67d141d1af3943bdfb31cdce2b1234.zip
add correction options to pinyin custom settings
-rw-r--r--src/storage/pinyin_base.cpp2
-rw-r--r--src/storage/pinyin_custom.h78
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
@@ -60,6 +60,29 @@ enum PinyinAmbiguity
};
/**
+ * @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.
*
* user can custom the behavor of libpinyin by these 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<size_t>(amb)] = use;
+ use_ambiguities [static_cast<size_t>(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<size_t>(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;
}
};