技術情報
skkIMのコードは、SKKのロジックとOS依存の表示系の部分などを分離して
実装してあります。この章では、skkIMを他の環境へ移植するための
最低限の実装の解説を行います。
クラス階層
アーカイブ中、"Skk"のプレフィクスがついているソースが、
OS非依存のコードです。
代表的なクラスに以下のような物があります。
- skk_candidate
- 単一の候補をあらわす構造体です。
- SkkEntry
- 辞書の検索結果をあらわすクラスです。
- 検索結果のマージ、展開などの操作をサポートします。
- SkkDictionary
- 辞書をあらわす抽象クラスです。
- 候補の検索、挿入、削除などの操作をサポートします。
- SkkAutomaton
- 決定性オートマトンのクラスです。
- ローマ字かな変換などの変換操作をサポートします。
- SkkControler
- SKKのロジックとOS依存コードのインターフェースとなるクラスです。
- このクラスを継承して、OS依存の適切な実装を行なった
クラスを作り、そのクラスを通してインタラクションを行ないます。
- SkkUtils
-
各種の文字列変換を行なうライブラリクラスです。
skk_candidate
struct skk_candidate
{
string yomi_kana;
string okuri_kana;
string okuri_prefix;
string gokan;
};
typedef vector<skk_candidate> skk_candidate_array;
|
単一の候補をあらわす構造体で、読み仮名、送り仮名、送りプレフィクス、語幹の
4つのフィールドを持ちます。
プログラム中で候補を表現するほとんどの場面で使わます。
状況によって、キーとして扱われたり、検索結果を格納する形で
扱われたりします。
また、skk_candidateのvectorが
skk_candidate_arrayの名前でtypedefされています。
SkkEntry
struct SkkEntry
{
void Merge(const SkkEntry &rhl);
void Insert(const skk_candidate &candidate);
void Remove(const skk_candidate &candidate);
void Fill(const skk_candidate &key, skk_candidate_array &candidates);
};
|
辞書の「キー」に対する「値」です。
キーに対する複数の候補、送り仮名に対する優先度を格納しています。
- void Merge(const SkkEntry &rhl);
- 2つのエントリーを順序を保ったままマージします。
右辺の要素は左辺の要素の後に配置され、右辺と左辺に
同じ要素がある場合は、左辺の要素のみが残されます。
- void Insert(const skk_candidate &candidate);
- 候補をエントリに登録します。
- void Remove(const skk_candidate &candidate);
- 候補をエントリから削除します。
- void Fill(const skk_candidate &key, skk_candidate_array &candidates);
- keyのokuri_kanaフィールドを参考に、エントリの内容を
skk_candidate_arrayに展開します。展開された内容は、
候補の優先度順に並んでいます。
SkkDictionary
class SkkDictionary
{
virtual void Read(istream &in);
virtual void Write(ostream &out);
virtual SkkEntry FindEntry(const skk_candidate &key);
virtual void InsertCandidate(const skk_candidate &candidate);
virtual void RemoveCandidate(const skk_candidate &candidate);
};
|
辞書操作を行なう抽象クラスです。
SkkDictionaryには、
候補の挿入/削除の行えないSkkStaticDictionaryと、
候補の挿入/削除が自由に行えるSkkDynamicDictionaryの
2つの継承クラスが用意されています。
自由度はSkkDynamciDictionaryの方が高いですが、
消費メモリはSkkStaticDictionaryの方が格段に
少ないです。
- virtual void Read(istream &in);
- streamから辞書の内容を読み込みます。
- virtual void Write(ostream &out);
- streamへ辞書の内容を書き出します。
- virtual SkkEntry FindEntry(const skk_candidate &key);
- keyのyomi_kanaフィールドとokuri_prefixフィールドに対応する
エントリを返します。
- virtual void InsertCandidate(const skk_candidate &candidate);
- 辞書に候補を追加します。
- virtual void RemoveCandidate(const skk_candidate &candidate);
- 辞書から候補を削除します。
skk_input
struct skk_input
{
int ascii;
int key;
};
|
キー入力をあらわすクラスです。
asciiがキーのアスキーコード、keyがキーのキーコードをあらわします。
keyの値は機種固有の値なので、"Skk"コード内では参照していません。
SkkAutomaton
ソースの解説
構造体の解説
skk_candidate
skk_candidate_array
クラスの解説
SkkEntry
SkkKey
SkkDictionary
SkkAutomaton
SkkControler
入力の解説