route99の日記: pfaedit 日本語化
日記 by
route99
BSDタイプライセンスのフォントエディタpfaeditを日本語化するには、
1、インプットメソッド有効化
1、EUC-JPのカタログ作成
1、カタログの翻訳
pfaeditは独自ツールキットgdrawがある。インプットメソッドはgtextfield.c
に追加する形になるだろう。
カタログはアーカイブ内の pfaedit/nomen.*.c である。
日本語なら pfaedit/nomen.ja.c を作る。
ファイルを置くだけでよく、Makefile 等の変更はいらない。
通常は pfaedit/nomen.en.c をコピーして文字列宣言を
書き変えることにするのがよいだろう。唯一やることは
static enum encoding enc = e_iso8859_1;
を該当のエンコーディングに変えることだ。
エンコーディングのリストは inc/charset.h にある。
すでにShift_JIS(e_sjis)はうまくいく。しかし、「表」のように2バイト目に「'\'」
が来るものはそのあとに\を入れる必要がある。
e_sjis が良いなら同じように e_euc も使えそうだがそうではない。
コードに埋めこむためのツールのソース pfaedit/makenomenh.c を
みるとすぐ分るが、なかで e_sjis などがハードコードされている。
そのため、そのままで使える日本語エンコーディングはe_sjis しかない。
そこでEUC-JP(e_euc)に対応させてみる。
まず、nomen.*.c はどう使われているかをみる。
一度ビルドした後、nomen.*.cを編集してmakeしてみる、
するとmakenomenhにより、Cソースを生成し、それをコンパイル
しているようだ。そのため pfaedit/makenomenh.c を見る。
とりあえず、237行目にsjisという文字列がある。
どうやらここで変換しているようだ。
また、400行目くらいにある配列で
{e_sjis, "e_sjis"},
という宣言がある。パーズや生成でつかうのだろう。
とりあえず、このあとに
{e_euc, "e_euc"},
を埋めておく。
237行目にもどる。
どうやら1文字読みこみ、ASCII(<0x80)ならリターン、
コメントから片仮名ならunicode_from_jis201というテーブルを引いて
リターンしている。
それ以外ならもう一文字読みこんで、引き算でやってるのでよけいに分り
にくいがこれはSJIS漢字コードをJISコード(0x2121で始まるやつ)に変換しているだけだ。
最後にunicode_from_jis208テーブルを引いて返している。
ただこのテーブルは0x2121が先頭に来るようで、添字で行っている
計算はそのためのようだ。
これならeuc変換を追加することは簡単である(jisx0201なしで)。
else の直前に以下のelse ifを追加すればいい。
} else if ( enc == e_euc ) {
ch1 = charval(buffer);
if ( ch1 < 0x80 )
return( ch1 );
ch2 = charval(buffer);
ch1 &= 0x7f;
ch2 &= 0x7f;
return( unicode_from_jis208[(ch1-21)*94+(ch2-21)] );
結局SJISと違うのは、&= のとこだけ。
pfaedit/nomen.ja.c をいくつか 日本語訳してから、
make し、 ./pfaedit/pfaedit してみる。
予想通りうまく行った。
1、インプットメソッド有効化
1、EUC-JPのカタログ作成
1、カタログの翻訳
pfaeditは独自ツールキットgdrawがある。インプットメソッドはgtextfield.c
に追加する形になるだろう。
カタログはアーカイブ内の pfaedit/nomen.*.c である。
日本語なら pfaedit/nomen.ja.c を作る。
ファイルを置くだけでよく、Makefile 等の変更はいらない。
通常は pfaedit/nomen.en.c をコピーして文字列宣言を
書き変えることにするのがよいだろう。唯一やることは
static enum encoding enc = e_iso8859_1;
を該当のエンコーディングに変えることだ。
エンコーディングのリストは inc/charset.h にある。
すでにShift_JIS(e_sjis)はうまくいく。しかし、「表」のように2バイト目に「'\'」
が来るものはそのあとに\を入れる必要がある。
e_sjis が良いなら同じように e_euc も使えそうだがそうではない。
コードに埋めこむためのツールのソース pfaedit/makenomenh.c を
みるとすぐ分るが、なかで e_sjis などがハードコードされている。
そのため、そのままで使える日本語エンコーディングはe_sjis しかない。
そこでEUC-JP(e_euc)に対応させてみる。
まず、nomen.*.c はどう使われているかをみる。
一度ビルドした後、nomen.*.cを編集してmakeしてみる、
するとmakenomenhにより、Cソースを生成し、それをコンパイル
しているようだ。そのため pfaedit/makenomenh.c を見る。
とりあえず、237行目にsjisという文字列がある。
どうやらここで変換しているようだ。
また、400行目くらいにある配列で
{e_sjis, "e_sjis"},
という宣言がある。パーズや生成でつかうのだろう。
とりあえず、このあとに
{e_euc, "e_euc"},
を埋めておく。
237行目にもどる。
どうやら1文字読みこみ、ASCII(<0x80)ならリターン、
コメントから片仮名ならunicode_from_jis201というテーブルを引いて
リターンしている。
それ以外ならもう一文字読みこんで、引き算でやってるのでよけいに分り
にくいがこれはSJIS漢字コードをJISコード(0x2121で始まるやつ)に変換しているだけだ。
最後にunicode_from_jis208テーブルを引いて返している。
ただこのテーブルは0x2121が先頭に来るようで、添字で行っている
計算はそのためのようだ。
これならeuc変換を追加することは簡単である(jisx0201なしで)。
else の直前に以下のelse ifを追加すればいい。
} else if ( enc == e_euc ) {
ch1 = charval(buffer);
if ( ch1 < 0x80 )
return( ch1 );
ch2 = charval(buffer);
ch1 &= 0x7f;
ch2 &= 0x7f;
return( unicode_from_jis208[(ch1-21)*94+(ch2-21)] );
結局SJISと違うのは、&= のとこだけ。
pfaedit/nomen.ja.c をいくつか 日本語訳してから、
make し、 ./pfaedit/pfaedit してみる。
予想通りうまく行った。
pfaedit 日本語化 More ログイン