diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/DynamicSpecialPhrase.cc | 4 | ||||
-rw-r--r-- | src/DynamicSpecialPhrase.h | 1 | ||||
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/SpecialPhrase.cc | 263 | ||||
-rw-r--r-- | src/SpecialPhrase.h | 2 | ||||
-rw-r--r-- | src/SpecialPhraseTable.cc | 80 | ||||
-rw-r--r-- | src/SpecialPhraseTable.h | 1 |
7 files changed, 60 insertions, 292 deletions
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; } |