summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeng Huang <shawn.p.huang@gmail.com>2010-04-15 12:09:35 +0800
committerPeng Huang <shawn.p.huang@gmail.com>2010-04-15 12:09:35 +0800
commit593375cfeaee95ff25778c06c784900a95301ec0 (patch)
tree5f12a073a7eacaa8ba338b612efa203b3ac7cda5
parent3543873912a94b38853769c4bb9c81264a54337b (diff)
downloadibus-libpinyin-593375cfeaee95ff25778c06c784900a95301ec0.tar.gz
ibus-libpinyin-593375cfeaee95ff25778c06c784900a95301ec0.tar.xz
ibus-libpinyin-593375cfeaee95ff25778c06c784900a95301ec0.zip
Add clear of SpecialPhraseTable
-rw-r--r--po/POTFILES.in1
-rw-r--r--src/DynamicSpecialPhrase.cc4
-rw-r--r--src/DynamicSpecialPhrase.h1
-rw-r--r--src/Makefile.am1
-rw-r--r--src/SpecialPhrase.cc263
-rw-r--r--src/SpecialPhrase.h2
-rw-r--r--src/SpecialPhraseTable.cc80
-rw-r--r--src/SpecialPhraseTable.h1
8 files changed, 61 insertions, 292 deletions
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 7de0831..e2721f0 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -16,6 +16,7 @@ src/PinyinEngine.cc
src/PinyinParser.cc
src/PinyinProperties.cc
src/SimpTradConverter.cc
+src/SpecialPhrase.cc
src/SpecialPhraseTable.cc
setup/main.py
[type: gettext/glade]setup/ibus-pinyin-preferences.ui
diff --git a/src/DynamicSpecialPhrase.cc b/src/DynamicSpecialPhrase.cc
index 2443a29..4c88f5c 100644
--- a/src/DynamicSpecialPhrase.cc
+++ b/src/DynamicSpecialPhrase.cc
@@ -4,6 +4,10 @@
namespace PY {
+DynamicSpecialPhrase::~DynamicSpecialPhrase (void)
+{
+}
+
std::string
DynamicSpecialPhrase::text (void)
{
diff --git a/src/DynamicSpecialPhrase.h b/src/DynamicSpecialPhrase.h
index 5ffe49c..2cce748 100644
--- a/src/DynamicSpecialPhrase.h
+++ b/src/DynamicSpecialPhrase.h
@@ -12,6 +12,7 @@ class DynamicSpecialPhrase : public SpecialPhrase {
public:
DynamicSpecialPhrase (const std::string &text, guint pos) :
SpecialPhrase (pos), m_text (text) { }
+ ~DynamicSpecialPhrase (void);
std::string text (void);
const std::string dec (gint d, const gchar *fmt = "%d");
diff --git a/src/Makefile.am b/src/Makefile.am
index b22f818..bf0bb61 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -52,6 +52,7 @@ ibus_engine_c_sources = \
PinyinProperties.cc \
SimpTradConverter.cc \
DynamicSpecialPhrase.cc \
+ SpecialPhrase.cc \
SpecialPhraseTable.cc \
$(NULL)
ibus_engine_built_h_sources = \
diff --git a/src/SpecialPhrase.cc b/src/SpecialPhrase.cc
index 125078d..23c8ce9 100644
--- a/src/SpecialPhrase.cc
+++ b/src/SpecialPhrase.cc
@@ -1,268 +1,9 @@
-#include <ctime>
-#include <cstdio>
-#include <iostream>
-#include <fstream>
-#include <string>
-#include "SpecialPhraseTable.h"
+#include "SpecialPhrase.h"
namespace PY {
-SpecialPhraseTable SpecialPhraseTable::m_instance;
-
-class StaticPhrase : public SpecialPhrase {
-public:
- StaticPhrase (const std::string &text, guint pos) :
- SpecialPhrase (pos), m_text (text) { }
-
- std::string text (void) { return m_text; }
-
-private:
- std::string m_text;
-};
-
-class DynamicPhrase : public SpecialPhrase {
-public:
- DynamicPhrase (const std::string &text, guint pos) :
- SpecialPhrase (pos), m_text (text) { }
-
- std::string text (void) {
- /* get the current time */
- std::time (&m_time);
-
- std::string result;
-
- size_t pos = 0;
- size_t pnext;
- gint s = 0;
- while (s != 2) {
- switch (s) {
- case 0:
- pnext = m_text.find ("${", pos);
- if (pnext == m_text.npos) {
- result += m_text.substr (pos);
- s = 2;
- }
- else {
- result += m_text.substr (pos, pnext - pos);
- pos = pnext + 2;
- s = 1;
- }
- break;
- case 1:
- pnext = m_text.find ("}", pos);
- if (pnext == m_text.npos) {
- result += "${";
- result += m_text.substr (pos);
- s = 2;
- }
- else {
- result += variable (m_text.substr(pos, pnext - pos));
- pos = pnext + 1;
- s = 0;
- }
- break;
- default:
- g_assert_not_reached ();
- }
- }
- return result;
- }
-
- const std::string dec (gint d, const gchar *fmt = "%d") {
- char string [32];
- std::snprintf (string, sizeof (string), fmt, d);
- return string;
- }
-
- const std::string year_cn (gboolean yy = FALSE) {
- static const gchar * digits[] = {
- "〇", "一", "二", "三", "四",
- "五", "六", "七", "八", "九"
- };
-
- gint year = localtime (&m_time)->tm_year + 1900;
- gint bit = 0;
- if (yy) {
- year %= 100;
- bit = 2;
- }
-
- std::string result;
- while (year != 0 || bit > 0) {
- result.insert(0, digits[year % 10]);
- year /= 10;
- bit -= 1;
- }
- return result;
- }
-
- const std::string month_cn (void) {
- static const gchar *month_num[] = {
- "一", "二", "三", "四", "五", "六", "七", "八",
- "九", "十", "十一", "十二"
- };
- return month_num[localtime (&m_time)->tm_mon];
- }
-
- const std::string weekday_cn (void) {
- static const gchar *week_num[] = {
- "日", "一", "二", "三", "四", "五", "六"
- };
- return week_num[localtime (&m_time)->tm_wday];
- }
-
- const std::string hour_cn (guint i) {
- static const gchar *hour_num[] = {
- "零", "一", "二", "三", "四",
- "五", "六", "七", "八", "九",
- "十", "十一", "十二", "十三", "十四",
- "十五", "十六", "十七", "十八", "十九",
- "二十", "二十一", "二十二", "二十三",
- };
- return hour_num[i];
- }
-
- const std::string fullhour_cn (void) {
- return hour_cn (localtime (&m_time)->tm_hour);
- }
-
- const std::string halfhour_cn (void) {
- return hour_cn (localtime (&m_time)->tm_hour % 12);
- }
-
- const std::string day_cn (void) {
- static const gchar *day_num[] = {
- "", "一", "二", "三", "四",
- "五", "六", "七", "八", "九",
- "", "十","二十", "三十"
- };
- guint day = localtime (&m_time)->tm_mday;
- return std::string (day_num[day / 10 + 10]) + day_num[day % 10];
- }
-
- const std::string minsec_cn (guint i) {
- static const gchar *num[] = {
- "", "一", "二", "三", "四",
- "五", "六", "七", "八", "九",
- "零", "十","二十", "三十", "四十"
- "五十", "六十"
- };
- return std::string (num[i / 10 + 10]) + num[i % 10];
- }
-
- const std::string variable (const std::string &name) {
- if (name == "year") return dec (localtime (&m_time)->tm_year + 1900);
- if (name == "year_yy") return dec ((localtime (&m_time)->tm_year + 1900) % 100, "%02d");
- if (name == "month") return dec (localtime (&m_time)->tm_mon + 1);
- if (name == "month_mm") return dec (localtime (&m_time)->tm_mon + 1, "%02d");
- if (name == "day") return dec (localtime (&m_time)->tm_mday);
- if (name == "day_dd") return dec (localtime (&m_time)->tm_mday, "%02d");
- if (name == "weekday") return dec (localtime (&m_time)->tm_wday + 1);
- if (name == "fullhour") return dec (localtime (&m_time)->tm_hour, "%02d");
- if (name == "falfhour") return dec (localtime (&m_time)->tm_hour % 12, "%02d");
- if (name == "ampm") return localtime (&m_time)->tm_hour < 12 ? "AM" : "PM";
- if (name == "minute") return dec (localtime (&m_time)->tm_min, "%02d");
- if (name == "second") return dec (localtime (&m_time)->tm_sec, "%02d");
- if (name == "year_cn") return year_cn ();
- if (name == "year_yy_cn") return year_cn (TRUE);
- if (name == "month_cn") return month_cn ();
- if (name == "day_cn") return day_cn ();
- if (name == "weekday_cn") return weekday_cn ();
- if (name == "fullhour_cn") return fullhour_cn ();
- if (name == "halfhour_cn") return halfhour_cn ();
- if (name == "ampm_cn") return localtime (&m_time)->tm_hour < 12 ? "上午" : "下午";
- if (name == "minute_cn") return minsec_cn (localtime (&m_time)->tm_min);
- if (name == "second_cn") return minsec_cn (localtime (&m_time)->tm_sec);
-
- return "${" + name + "}";
- }
-
-private:
- std::string m_text;
- time_t m_time;
-
-};
-
-SpecialPhraseTable::SpecialPhraseTable (void)
-{
- gchar * path = g_build_filename (g_get_user_config_dir (),
- "ibus", "ibus-pinyin", "phrases.txt", NULL);
-
- load ("phrases.txt") ||
- load (path) ||
- load (PKGDATADIR G_DIR_SEPARATOR_S "phrases.txt");
- g_free (path);
-}
-
-gboolean
-SpecialPhraseTable::load (const gchar *file)
-{
- std::ifstream in (file);
- if (in.fail ())
- return FALSE;
-
- std::string line;
- while (!in.eof ()) {
- getline (in, line);
- if (line.size () == 0 || line[0] == ';')
- continue;
- size_t pos = line.find ('=');
- if (pos == line.npos)
- continue;
-
- std::string command = line.substr(0, pos);
- std::string phrase = line.substr(pos + 1);
- if (command.empty () || phrase.empty ())
- continue;
-
- if (phrase[0] != '#') {
- insert (command, new StaticPhrase (phrase, 0));
- }
- else if (phrase.size () > 1) {
- insert (command, new DynamicPhrase (phrase.substr (1), 0));
- }
- }
- return TRUE;
-}
-
-#if 0
-static bool
-phraseCmp (const SpecialPhrase *first,
- const SpecialPhrase *second)
-{
- return first->position () <= second->position ();
-}
-#endif
-
-void
-SpecialPhraseTable::insert (const std::string &command,
- SpecialPhrase *phrase)
+SpecialPhrase::~SpecialPhrase (void)
{
- if (m_map.find (command) == m_map.end ()) {
- m_map[command] = List ();
- }
- List & list = m_map[command];
- list.push_back (phrase);
-#if 0
- list.sort (phraseCmp);
-#endif
-}
-
-gboolean
-SpecialPhraseTable::lookup (const std::string &command,
- std::vector<std::string> &result)
-{
- result.clear ();
-
- if (m_map.find (command) == m_map.end ())
- return FALSE;
-
- List list = m_map[command];
- for (List::iterator it = list.begin (); it != list.end (); it ++) {
- result.push_back ((*it)->text ());
- }
-
- return result.size () > 0;
}
};
diff --git a/src/SpecialPhrase.h b/src/SpecialPhrase.h
index 9126c6d..97fa02e 100644
--- a/src/SpecialPhrase.h
+++ b/src/SpecialPhrase.h
@@ -9,12 +9,14 @@ namespace PY {
class SpecialPhrase {
public:
SpecialPhrase (guint pos) : m_position (pos) { }
+ virtual ~SpecialPhrase (void);
guint position (void) const {
return m_position;
}
virtual std::string text (void) = 0;
+
private:
guint m_position;
};
diff --git a/src/SpecialPhraseTable.cc b/src/SpecialPhraseTable.cc
index 7b98bf1..28ade93 100644
--- a/src/SpecialPhraseTable.cc
+++ b/src/SpecialPhraseTable.cc
@@ -12,6 +12,7 @@ class StaticSpecialPhrase : public SpecialPhrase {
public:
StaticSpecialPhrase (const std::string &text, guint pos) :
SpecialPhrase (pos), m_text (text) { }
+ ~StaticSpecialPhrase (void) { }
std::string text (void) { return m_text; }
@@ -30,37 +31,6 @@ SpecialPhraseTable::SpecialPhraseTable (void)
g_free (path);
}
-gboolean
-SpecialPhraseTable::load (const gchar *file)
-{
- std::ifstream in (file);
- if (in.fail ())
- return FALSE;
-
- std::string line;
- while (!in.eof ()) {
- getline (in, line);
- if (line.size () == 0 || line[0] == ';')
- continue;
- size_t pos = line.find ('=');
- if (pos == line.npos)
- continue;
-
- std::string command = line.substr(0, pos);
- std::string phrase = line.substr(pos + 1);
- if (command.empty () || phrase.empty ())
- continue;
-
- if (phrase[0] != '#') {
- insert (command, new StaticSpecialPhrase (phrase, 0));
- }
- else if (phrase.size () > 1) {
- insert (command, new DynamicSpecialPhrase (phrase.substr (1), 0));
- }
- }
- return TRUE;
-}
-
#if 0
static bool
phraseCmp (const SpecialPhrase *first,
@@ -101,5 +71,53 @@ SpecialPhraseTable::lookup (const std::string &command,
return result.size () > 0;
}
+gboolean
+SpecialPhraseTable::load (const gchar *file)
+{
+ clear ();
+
+ std::ifstream in (file);
+ if (in.fail ())
+ return FALSE;
+
+ std::string line;
+ while (!in.eof ()) {
+ getline (in, line);
+ if (line.size () == 0 || line[0] == ';')
+ continue;
+ size_t pos = line.find ('=');
+ if (pos == line.npos)
+ continue;
+
+ std::string command = line.substr(0, pos);
+ std::string phrase = line.substr(pos + 1);
+ if (command.empty () || phrase.empty ())
+ continue;
+
+ if (phrase[0] != '#') {
+ insert (command, new StaticSpecialPhrase (phrase, 0));
+ }
+ else if (phrase.size () > 1) {
+ insert (command, new DynamicSpecialPhrase (phrase.substr (1), 0));
+ }
+ }
+ return TRUE;
+}
+
+void
+SpecialPhraseTable::clear (void)
+{
+ Map::iterator it;
+
+ for (it = m_map.begin (); it != m_map.end (); it ++) {
+ std::list<SpecialPhrase *>::iterator pit;
+ for (pit = (*it).second.begin (); pit != (*it).second.end (); pit ++) {
+ delete *pit;
+ }
+ }
+
+ m_map.clear ();
+}
+
};
diff --git a/src/SpecialPhraseTable.h b/src/SpecialPhraseTable.h
index f2da1c5..a4ba5fc 100644
--- a/src/SpecialPhraseTable.h
+++ b/src/SpecialPhraseTable.h
@@ -20,6 +20,7 @@ public:
private:
gboolean load (const gchar *file);
+ void clear (void);
public:
static SpecialPhraseTable & instance (void) { return m_instance; }