Skip to content

Commit

Permalink
add Python plugin support. refact uiobjects: CCandidateList and CPree…
Browse files Browse the repository at this point in the history
…ditString.
  • Loading branch information
mikeandmore committed Jul 22, 2011
1 parent e520d22 commit 57370b8
Show file tree
Hide file tree
Showing 11 changed files with 303 additions and 94 deletions.
19 changes: 17 additions & 2 deletions SConstruct
Expand Up @@ -57,7 +57,8 @@ imesource=['src/portability.cpp',
'src/ime-core/imi_funcobjs.cpp',
'src/ime-core/imi_options.cpp',
'src/ime-core/imi_option_event.cpp',
'src/ime-core/userdict.cpp']
'src/ime-core/userdict.cpp',
'src/ime-core/imi_plugin.cpp']

headers=['src/slm/ids2ngram/idngram.h',
'src/slm/ids2ngram/idngram_merge.h',
Expand All @@ -83,6 +84,7 @@ headers=['src/slm/ids2ngram/idngram.h',
'src/ime-core/imi_funcobjs.h',
'src/ime-core/imi_context.h',
'src/ime-core/imi_winHandler.h',
'src/ime-core/imi_gtkHandler.h',
'src/ime-core/userdict.h',
'src/ime-core/imi_option_event.h',
'src/ime-core/imi_data.h',
Expand All @@ -92,6 +94,7 @@ headers=['src/slm/ids2ngram/idngram.h',
'src/ime-core/imi_options.h',
'src/ime-core/imi_defines.h',
'src/ime-core/imi_view.h',
'src/ime-core/imi_plugin.h',
'src/portability.h',
'src/pinyin/segmentor.h',
'src/pinyin/shuangpin_seg.h',
Expand Down Expand Up @@ -217,6 +220,15 @@ def CheckPKG(context, name):
context.Result(ret)
return ret

def CheckPython(context):
context.Message('Checking for Python library...')
ret = context.TryAction('python-config --prefix')[0]
context.Result(ret)
if ret:
context.env.MergeFlags(['!python-config --includes',
'!python-config --libs'])
return ret

def AppendEndianCheck(conf):
conf.config_h_text += r'''
Expand Down Expand Up @@ -251,7 +263,8 @@ def AppendEndianCheck(conf):

conf = env.Configure(clean=False, help=False, config_h='config.h',
custom_tests={'CheckPKGConfig' : CheckPKGConfig,
'CheckPKG' : CheckPKG})
'CheckPKG' : CheckPKG,
'CheckPython': CheckPython})

def DoConfigure():
if GetOption('clean'):
Expand All @@ -268,6 +281,8 @@ def DoConfigure():
if not conf.CheckPKG('sqlite3'):
Exit(1)

conf.CheckPython()

conf.Define('ENABLE_NLS', 1)
conf.Define('GETTEXT_PACKAGE', '"sunpinyin2"')
conf.CheckCHeader('assert.h')
Expand Down
71 changes: 65 additions & 6 deletions src/ime-core/imi_uiobjects.cpp
Expand Up @@ -136,7 +136,7 @@ ICandidateList::~ICandidateList()
}

CCandidateList::CCandidateList()
: m_total(0), m_first(0)
: m_total(0), m_first(0), m_size(0)
{
}

Expand Down Expand Up @@ -215,18 +215,18 @@ CCandidateList::candiCharTypeAt(unsigned item, unsigned idx) const
void
CCandidateList::clear()
{
m_first = m_total = 0;
m_size = m_first = m_total = 0;
m_candiStrings.clear();
m_candiTypes.clear();
m_candiCharTypeVecs.clear();
m_candiUserIndex.clear();
m_candiStringsIndex.clear();
}

void
CCandidateList::reserve(int count)
CCandidateList::setSize(int count)
{
m_candiStrings.reserve(count);
m_candiTypes.reserve(count);
m_candiCharTypeVecs.reserve(count);
m_size = count;
}

ICandidateList::CCandiStrings &
Expand All @@ -246,3 +246,62 @@ CCandidateList::getCharTypeVecs()
{
return m_candiCharTypeVecs;
}

void
CCandidateList::pushBackCandidate(wstring wstr, int type, int userIdx)
{
if (m_candiStringsIndex.find(wstr) == m_candiStringsIndex.end()) {
m_candiStringsIndex.insert(std::make_pair(wstr, m_candiStrings.size()));
m_candiStrings.push_back(wstr);
m_candiTypes.push_back(type);
m_candiUserIndex.push_back(userIdx);
}
}

void
CCandidateList::insertCandidate(wstring wstr, int type, int rank, int userIdx)
{
if (rank > m_candiStrings.size()) {
rank = m_candiStrings.size();
}
if (m_candiStringsIndex.find(wstr) == m_candiStringsIndex.end()) {
m_candiStringsIndex.insert(std::make_pair(wstr, m_candiStrings.size()));
m_candiStrings.insert(m_candiStrings.begin() + rank, wstr);
m_candiTypes.insert(m_candiTypes.begin() + rank, type);
m_candiUserIndex.push_back(userIdx);
} else {
int idx = m_candiStringsIndex[wstr];
if (rank >= idx) {
return;
}
m_candiStringsIndex[wstr] = rank;
m_candiStrings.erase(m_candiStrings.begin() + idx);
m_candiTypes.erase(m_candiTypes.begin() + idx);
m_candiUserIndex.erase(m_candiUserIndex.begin() + idx);
m_candiStrings.insert(m_candiStrings.begin() + rank, wstr);
m_candiTypes.insert(m_candiTypes.begin() + rank, type);
m_candiUserIndex.insert(m_candiUserIndex.begin() + rank, userIdx);
}
}

void
CCandidateList::shrinkList()
{
if ((int) m_candiStrings.size() > m_first) {
m_candiStrings.erase(m_candiStrings.begin(),
m_candiStrings.begin() + m_first);
m_candiTypes.erase(m_candiTypes.begin(),
m_candiTypes.begin() + m_first);
m_candiUserIndex.erase(m_candiUserIndex.begin(),
m_candiUserIndex.begin() + m_first);
}

if ((int) m_candiStrings.size() > m_size) {
m_candiStrings.erase(m_candiStrings.begin() + m_size,
m_candiStrings.end());
m_candiTypes.erase(m_candiTypes.begin() + m_size,
m_candiTypes.end());
m_candiUserIndex.erase(m_candiUserIndex.begin() + m_size,
m_candiUserIndex.end());
}
}
24 changes: 22 additions & 2 deletions src/ime-core/imi_uiobjects.h
Expand Up @@ -42,6 +42,7 @@

#include <vector>
#include <string>
#include <map>

#include "imi_context.h"

Expand Down Expand Up @@ -138,6 +139,7 @@ class ICandidateList : public virtual IECharType {
BEST_WORD,
USER_SELECTED_WORD,
BEST_TAIL,
PLUGIN_TAIL,
OTHER_BEST_TAIL
};

Expand Down Expand Up @@ -174,8 +176,14 @@ class ICandidateList : public virtual IECharType {
virtual void clear() = 0;
virtual void setTotal(int total) = 0;
virtual void setFirst(int first) = 0;
virtual void setSize(int count) = 0;

virtual void shrinkList() = 0;
virtual void pushBackCandidate(wstring wstr, int type,
int userIdx = -1) = 0;
virtual void insertCandidate(wstring wstr, int type, int rank,
int userIdx = -1) = 0;

virtual void reserve(int count) = 0;
virtual CCandiStrings & getCandiStrings() = 0;
virtual CCandiTypeVec & getCandiTypeVec() = 0;
virtual CCharTypeVecs & getCharTypeVecs() = 0;
Expand Down Expand Up @@ -206,18 +214,30 @@ class CCandidateList : virtual public ICandidateList {
virtual void clear();
virtual void setTotal(int total);
virtual void setFirst(int first);
virtual void reserve(int count);
virtual void setSize(int size);

virtual void shrinkList();
virtual void pushBackCandidate(wstring wstr, int type, int userIdx = -1);
virtual void insertCandidate(wstring wstr, int type, int rank,
int userIdx = -1);

virtual CCandiStrings & getCandiStrings();
virtual CCandiTypeVec & getCandiTypeVec();
virtual CCharTypeVecs & getCharTypeVecs();
/*@}*/

int getUserIndex(int idx) { return m_candiUserIndex[idx]; }

protected:
int m_total;
int m_first;
int m_size;
CCandiStrings m_candiStrings;
CCandiTypeVec m_candiTypes;
std::vector<int> m_candiUserIndex;
CCharTypeVecs m_candiCharTypeVecs;

std::map<wstring, int> m_candiStringsIndex;
};

#endif
100 changes: 100 additions & 0 deletions src/ime-core/imi_view.cpp
Expand Up @@ -42,6 +42,8 @@
#include "imi_view.h"
#include "imi_view_classic.h"

#include "imi_plugin.h"

// #pragma setlocale("zh_CN.UTF-8")

CHotkeyProfile::CHotkeyProfile()
Expand Down Expand Up @@ -101,3 +103,101 @@ CIMIView::getStatusAttrValue(int key)
}
return 0;
}

void
CIMIView::handlerUpdatePreedit(const IPreeditString* ppd)
{
if (m_pWinHandler == NULL || ppd == NULL) {
return;
}
// nothing to do here for plugins
m_pWinHandler->updatePreedit(ppd);
}

void
CIMIView::_pluginProvideCandidates(wstring preedit, ICandidateList* pcl)
{
CIMIPluginManager& manager = AIMIPluginManager::instance();
if (preedit.size() == 0) {
return;
}

for (size_t i = 0; i < manager.getPluginSize(); i++) {
CIMIPlugin* plugin = manager.getPlugin(i);
int wait_time = -1;
TPluginCandidates candidates = plugin->provide_candidates(preedit,
&wait_time);
if (wait_time != 0) {
manager.markWaitTime(wait_time);
continue;
}

for (size_t j = 0; j < candidates.size(); j++) {
const TPluginCandidateItem& item = candidates[j];
pcl->insertCandidate(item.m_candidate, ICandidateList::PLUGIN_TAIL,
item.m_rank);
}
}
}

void
CIMIView::_pluginTranslateCandidate(ICandidateList* pcl)
{
CIMIPluginManager& manager = AIMIPluginManager::instance();
ICandidateList::CCandiStrings& css = pcl->getCandiStrings();
if (css.size() == 0) {
return;
}

for (size_t i = 0; i < css.size(); i++) {
for (size_t j = 0; j < manager.getPluginSize(); j++) {
CIMIPlugin* plugin = manager.getPlugin(j);
int wait_time = -1;
wstring result = plugin->translate_candidate(css[i], &wait_time);
if (wait_time != 0) {
manager.markWaitTime(wait_time);
} else {
css[i] = result;
}
}
}
}

void
CIMIView::handlerUpdateCandidates(IPreeditString* ppd,
ICandidateList* pcl)
{
if (m_pWinHandler == NULL || pcl == NULL) {
return;
}
CIMIPluginManager& manager = AIMIPluginManager::instance();
_pluginProvideCandidates(ppd->getString(), pcl);
pcl->shrinkList();
_pluginTranslateCandidate(pcl);

m_pWinHandler->updateCandidates(pcl);
m_pWinHandler->enableDeferedUpdate(this, manager.getWaitTime());
manager.resetWaitTime();
}

void
CIMIView::handlerCommit(const wstring& wstr)
{
if (m_pWinHandler == NULL) {
return;
}
wstring commit_result = wstr;
CIMIPluginManager& manager = AIMIPluginManager::instance();
// re-run filter again
for (size_t i = 0; i < manager.getPluginSize(); i++) {
CIMIPlugin* plugin = manager.getPlugin(i);
int wait_time = -1;
wstring result = plugin->translate_candidate(commit_result, &wait_time);
if (wait_time != 0) {
continue;
}
commit_result = result;
}
m_pWinHandler->commit(commit_result.c_str());
m_pWinHandler->disableDeferedUpdate();
}
9 changes: 8 additions & 1 deletion src/ime-core/imi_view.h
Expand Up @@ -189,14 +189,21 @@ class CIMIView {

virtual void setStatusAttrValue(int key, int value);
virtual int getStatusAttrValue(int key);
virtual void updateWindows(unsigned mask) = 0;
virtual void updateWindows(unsigned mask = CANDIDATE_MASK) = 0;

virtual void getPreeditString(IPreeditString& ps) = 0;
virtual void getCandidateList(ICandidateList& cl, int start, int size) = 0;

virtual int onCandidatePageRequest(int pgno, bool relative) = 0; //pgno == -1, relative == false means last page
virtual int onCandidateSelectRequest(int index) = 0;

virtual void handlerUpdatePreedit(const IPreeditString* ppd);
virtual void handlerUpdateCandidates(IPreeditString* ppd,
ICandidateList* pcl);
virtual void handlerCommit(const wstring& wstr);
private:
void _pluginProvideCandidates(wstring preedit, ICandidateList* pcl);
void _pluginTranslateCandidate(ICandidateList* pcl);
protected:
CIMIContext *m_pIC;
CIMIWinHandler *m_pWinHandler;
Expand Down

0 comments on commit 57370b8

Please sign in to comment.