/***************************************************************************
* Copyright (C) 2004 by TAM(Teppei Tamra) *
* tam-t@par.odn.ne.jp *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "anthyconversion.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#ifdef HAVE_GETTEXT
#include <libintl.h>
#define _(String) dgettext(GETTEXT_PACKAGE,String)
#define N_(String) (String)
#else
#define _(String) (String)
#define N_(String) (String)
#define bindtextdomain(Package,Directory)
#define textdomain(domain)
#define bind_textdomain_codeset(domain,codeset)
#endif
// プライグイン化のおまじないです。
//HonokaPluginRegister(AnthyConversion);
AnthyConversion::AnthyConversion(ConfigPointer cfg) : Convertor(cfg)
{
m_iconv.set_encoding ("EUC-JP");
pos = 0;
current = false;
anthy_init();
context = anthy_create_context();
#ifdef HAS_ANTHY_SET_RECONVERSION_MODE
// anthy-7929以上の逆変換制御を利用。
anthy_set_reconversion_mode(context,ANTHY_RECONVERT_DISABLE);
#endif
}
AnthyConversion::~AnthyConversion()
{
}
bool AnthyConversion::isConnected() {
return current;
}
void AnthyConversion::reset(){
//anthy_release_context(context);
//anthy_init();
//context = anthy_create_context();
anthy_reset_context(context);
return;
}
void AnthyConversion::setYomiText(WideString yomi) {
yomiText = yomi;
}
int AnthyConversion::ren_conversion() {
#ifndef HAS_ANTHY_SET_RECONVERSION_MODE
if (!current) return 0;
#endif
/*
WideString yt;
for(int i = 0;i < yomiText.length();i ++) {
if (yomiText[i] == 0x30F4) {
yt.push_back(0x30A6);
yt.push_back(0x309B);
}
else yt.push_back(yomiText[i]);
}
yomiText = yt;
*/
String y;
anthy_reset_context(context);
m_iconv.convert(y,yomiText);
anthy_set_string(context,y.c_str());
struct anthy_conv_stat stat;
anthy_get_stat(context,&stat);
pos = 0;
buildResult();
return stat.nr_segment;
}
const vector<Segment> AnthyConversion::getSegmentList() {
vector<Segment> result;
for(unsigned int i = 0;i < convResult.size();i ++) result.push_back(Segment(convResult[i].kouho[convResult[i].pos].kanji,convResult[i].Yomi));
return result;
};
int AnthyConversion::setPos(int p){
if ((p < convResult.size()) && (p >= 0)) pos = p;
return pos;
}
int AnthyConversion::getPos() {
return pos;
}
ResultList AnthyConversion::getResultList(int p,ResultType kt){
if (p == -1) p = pos;
if (p >= convResult.size()) return ResultList();
if ((kt != DEFAULT) || (p >= convResult.size())) return ResultList();
setPos(p);
return convResult[p];
}
bool AnthyConversion::select(int p) {
if (p < convResult[pos].count()) {
convResult[pos].pos = p;
return true;
}
return false;
}
bool AnthyConversion::resizeRegion(int w) {
//if ((convResult[pos].kouho[convResult[pos].pos].length() + w) < 1) return false;
if ((convResult[pos].Yomi.length() + w) < 1) return false;
if ((pos >= (convResult.size() - 1)) && (w > 0)) return false;
anthy_resize_segment(context,pos,w);
buildResult();
return true;
}
void AnthyConversion::updateFrequency() {
for(unsigned int i = 0;i < convResult.size();i ++) {
anthy_commit_segment(context,i,convResult[i].pos);
}
return;
}
bool AnthyConversion::connect() {
#ifndef HAS_ANTHY_SET_RECONVERSION_MODE
return current;
#else
return true;
#endif
}
void AnthyConversion::disconnect() {
return;
}
void AnthyConversion::selected() {
current = true;
}
void AnthyConversion::unSelected() {
current = false;
}
void AnthyConversion::buildResult() {
struct anthy_conv_stat stat;
anthy_get_stat(context,&stat);
int slen = 0;
convResult.clear();
for(int i = 0;i < stat.nr_segment;i ++) {
ResultList l;
l.kType = DEFAULT;
l.Title = utf8_mbstowcs(String(_("lookup result")));
struct anthy_segment_stat sstat;
anthy_get_segment_stat(context,i,&sstat);
//l.count = sstat.nr_candidate;
//l.Yomi = yomiText.substr(slen,sstat.seg_len);
//slen += sstat.seg_len;
l.pos = 0;
for(int j = 0;j < sstat.nr_candidate;j ++) {
char res[256];
int c = anthy_get_segment(context,i,j,0,0);
if (c > 255) c = 255;
anthy_get_segment(context,i,j,res,c + 1);
WideString w;
m_iconv.convert(w,String(res));
l.kouho.push_back(w);
//if ((w == yomiText.substr(slen,w.length())) && (l.Yomi.length() < w.length())) {
// l.Yomi = w;
// slen += w.length();
//}
}
char res[256];
int c = anthy_get_segment(context,i,NTH_UNCONVERTED_CANDIDATE,0,0);
if (c > 255) c = 255;
anthy_get_segment(context,i,NTH_UNCONVERTED_CANDIDATE,res,c + 1);
WideString w;
m_iconv.convert(w,String(res));
l.Yomi = w;
convResult.push_back(l);
}
}
String AnthyConversion::getName()
{
return String("Anthy");
}
String AnthyConversion::getPropertyName()
{
return String(_("AnthyConversion"));
}