/*************************************************************************** * Copyright (C) 2005 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 "skkdic.h" SKKDic::SKKDic(String file) { filename = file; iconv.set_encoding("EUC-JP"); init(); } SKKDic::~SKKDic() { } /*! \fn SKKDic::init() */ void SKKDic::init() { bool okuri = true; FILE *f = fopen(filename.c_str(),"r"); if (!f) return; while(-1) { char s[1024]; if(fgets(s,1024,f) == NULL) break; if (String(s) == String(";; okuri-ari entries.")) { okuri = true; continue; } else if (String(s) == String(";; okuri-nasi entries.")) { okuri = false; continue; } if (String(s).length() >= 2) if (String(s).substr(0,2) == ";;") continue; vector<WideString> sList; WideString wstr; iconv.convert(wstr,String(s)); if (!wstr.length()) continue; uint pos = 0,count = 0; // "/"でsplit。 while(-1) { if ((pos + count) >= wstr.length()) break; if (wstr.at(pos + count) == utf8_mbstowcs(String("/"))[0]) { if (count) sList.push_back(wstr.substr(pos,count)); pos += (count + 1); count = 0; continue; } count ++; } // 読みの空白を削除。 // @todo okuri-ari wstr = WideString(); if (sList.size() < 2) continue; for(unsigned int i = 0;i < sList[0].length();i ++) { if (sList[0][i] != utf8_mbstowcs(String(" "))[0]) { wstr = wstr + sList[0][i]; } } sList[0] = wstr; // アノテーション/候補摘出。 SKKDicEntry dic; for(unsigned int i = 1;i < sList.size();i ++) { SKKDicEntryData e; e.cache = false; wstr = sList[i]; /*if (!wstr.length()) continue; for(unsigned int j = 1;j < (wstr.length() - 1);j ++) { if (wstr.at(j) == utf8_mbstowcs(String(";"))[0]) { e.annotation = wstr.substr(j + 1); wstr = wstr.substr(0,j); break; } } //if (!e.annotation.length()) */ e.kouho = wstr; dic.data.push_back(e); } dic_data.insert(pair<WideString,SKKDicEntry>(sList[0],dic)); } fclose(f); } /*! \fn SKKDic::find(WideString text) */ const vector<SKKDicEntryData> SKKDic::find(WideString text) { map<WideString,SKKDicEntry>::iterator it = dic_data.find(text); if (it == dic_data.end()) return vector<SKKDicEntryData>(); //return it->second.data; vector<SKKDicEntryData> d; for(unsigned int i = 0;i < it->second.data.size();i ++) { if (!it->second.data[i].cache) { d.push_back(annotationParser(it->second.data[i].kouho)); } else d.push_back(it->second.data[i]); } return d; } /*! \fn SKKDic::annotationParser(WideString) */ SKKDicEntryData SKKDic::annotationParser(WideString l) { SKKDicEntryData e; e.cache = true; if (l.length() <= 2) { e.kouho = l; return e; } for(unsigned int j = 1;j < (l.length() - 1);j ++) { if (l.at(j) == utf8_mbstowcs(String(";"))[0]) { e.annotation = l.substr(j + 1); e.kouho = l.substr(0,j); break; } } if (!e.kouho.length()) e.kouho = l; return e; }