## SKK の辞書を POBox の辞書に変換する ## Time-stamp: Itou Hiroki ## ## Usage: ## $ perl skk2pbdic.pl ../.skk-jisyo kanaroma.txt > skk.dic ## .skk-jisyo is generated from skk8.6, skk9.6, skk10.62a ## learndic is generated from pobox-1.2.5, pbserver masui ban ## pobox-el_1.15.0 client komatsu ban ## ## かな → ローマ字変換 のルール読み込み ## 上にある変換規則のほうが優先される open(CONV, $ARGV[1]); my $i = 0; my %roma; my @romakana; #ハッシュは順序がないので、順序付けのために配列も用意 while(){ /^(.*)\t(.*)$/; ## 同じかなに違うローマ字を割り当てるエントリが存在するとエラー if(defined($roma{$1}) && $roma{$1} ne $2){ die "error $1 $roma{$1} $2\n"; } $roma{$1} = $2; $romakana[$i] = $1; $i++; } close(CONV); ## SKK辞書を読み込む open(SKKDIC, $ARGV[0]); $okuri_ari = 0; while(){ chomp(); if(/^;;/){ if(/okuri-ari/){ $okuri_ari = 1; }else{ $okuri_ari = 0; } }else{ if($okuri_ari){ ; # 送り仮名ありのエントリは無視する。面倒/POBoxの機能で足りるから }else{ ; # 送り仮名なしのエントリを POBoxの学習辞書に変換する if(/skk-/){ ; # 'skk-ignore-dic-word' などがあるエントリは無視する ; # 処理するのが面倒だから }else{ my @elem = split(/[ \t]/, $_); my $src = $elem[0]; my @dst = split(/\//, $elem[1]); ##なぜか $dst[0] が空文字列になるので回避策 # die "elem[1]='$elem[1]' dst[0]='$dst[0]' dst[1]='$dst[1]'\n"; if($dst[0] eq ""){ shift @dst; } ## かな → ローマ字変換 foreach(@romakana){ if($src =~ /$_/){ $src =~ s/$_/$roma{$_}/g; } } ## 出力 foreach (@dst){ my $entry = "$src\t$_\n"; print $entry; } } } } } close(SKKDIC);