2007年12月2日日曜日

D言語でローマ字変換するの巻

 そもそも自作のコマンドプロンプトつくりたいと考えたのは、コマンドプロンプトだと全角半角のファイル名の入力がメンド臭かったから。「だったらファイル名に全角文字なんか入れなきゃいいじゃん。」とも思うのですが、仕事で送られてくるファイルは100%全角だし、やっぱり見やすいから自分でも日本語のファイル名にしてしまうんですよねぇ。
 なんで、migemo でファイル名を指定できたら、全角/半角の切替をしなくて済むから便利だな、って考えてプロンプトの自作を夢想するようになりました。

 でも、普段は日本語入力IMEはskkimeを利用してるので、プロンプトからまんまskk方式で入力できたら、もっと便利だなぁと最近気付きました。プロンプトの入力部分を自作するんであれば、それも可能です。「小文字で入力したら半角入力と判断、大文字で(頭文字を)入力したら全角変換できる」っていうイメージ。Windowsのファイル名は大文字小文字の区別がないから、それで充分使えるなぁ。

 という訳で、ローマ字入力するサンプルを作成。ローマ字入力すると平仮名変換するので、あとはSKKIMEの辞書ファイルをこれで読みにいけばいいのかな?

import std.stdio;
import std.windows.charset;

string[string] roma;

void main(){

init_roma();

string line;
string word;

while(true){

printf("word:");
line = readln();

if(line == "exit\n")
break;

word = convert_hira(line);

printf(toMBSz(word));
printf("\n");

}
}

string convert_hira(string line){

string word = "";
string key = "";
string* check;

foreach(c ; line){

key ~= c;

check = key in roma;

if(check !is null){
word ~= *check;
key = "";
}
}

if(key.length > 0)
word ~= key;

return word;
}

void init_roma(){
roma["a"] = "あ"; roma["i"] = "い"; roma["u"] = "う";
roma["e"] = "え"; roma["o"] = "お"; roma["ka"] = "か";
roma["ki"] = "き"; roma["ku"] = "く"; roma["ke"] = "け";
roma["ko"] = "こ"; roma["sa"] = "さ"; roma["si"] = "し";
roma["su"] = "す"; roma["se"] = "せ"; roma["so"] = "そ";
roma["ta"] = "た"; roma["ti"] = "ち"; roma["tu"] = "つ";
roma["te"] = "て"; roma["to"] = "と"; roma["na"] = "な";
roma["ni"] = "に"; roma["nu"] = "ぬ"; roma["ne"] = "ね";
roma["no"] = "の"; roma["ha"] = "は"; roma["hi"] = "ひ";
roma["hu"] = "ふ"; roma["he"] = "へ"; roma["ho"] = "ほ";
roma["ma"] = "ま"; roma["mi"] = "み"; roma["mu"] = "む";
roma["me"] = "め"; roma["mo"] = "も"; roma["ya"] = "や";
roma["yu"] = "ゆ"; roma["yo"] = "よ"; roma["ra"] = "ら";
roma["ri"] = "り"; roma["ru"] = "る"; roma["re"] = "れ";
roma["ro"] = "ろ"; roma["wa"] = "わ"; roma["wo"] = "を";
roma["nn"] = "ん";
roma["kya"] = "きゃ"; roma["kyu"] = "きゅ"; roma["kyo"] = "きょ";
roma["sha"] = "しゃ"; roma["shu"] = "しゅ"; roma["sho"] = "しょ";
roma["cha"] = "ちゃ"; roma["chu"] = "ちゅ"; roma["cho"] = "ちょ";
roma["nya"] = "にゃ"; roma["nyu"] = "にゅ"; roma["nyo"] = "にょ";
roma["hya"] = "ひゃ"; roma["hyu"] = "ひゅ"; roma["hyo"] = "ひょ";
roma["mya"] = "みゃ"; roma["myu"] = "みゅ"; roma["myo"] = "みょ";
roma["rya"] = "りゃ"; roma["ryu"] = "りゅ"; roma["ryo"] = "りょ";
roma["ga"] = "が"; roma["gi"] = "ぎ"; roma["gu"] = "ぐ";
roma["ge"] = "げ"; roma["go"] = "ご"; roma["gya"] = "ぎゃ";
roma["gyu"] = "ぎゅ"; roma["gyo"] = "ぎょ"; roma["za"] = "ざ";
roma["zi"] = "じ"; roma["zu"] = "ず"; roma["ze"] = "ぜ";
roma["zo"] = "ぞ"; roma["ja"] = "じゃ"; roma["ju"] = "じゅ";
roma["jo"] = "じょ"; roma["da"] = "だ"; roma["di"] = "ぢ";
roma["du"] = "づ"; roma["de"] = "で"; roma["do"] = "ど";
roma["ba"] = "ば"; roma["bi"] = "び"; roma["bu"] = "ぶ";
roma["be"] = "べ"; roma["bo"] = "ぼ"; roma["bya"] = "びゃ";
roma["byu"] = "びゅ"; roma["byo"] = "ぴょ"; roma["pa"] = "ぱ";
roma["pi"] = "ぴ"; roma["pu"] = "ぷ"; roma["pe"] = "ぺ";
roma["po"] = "ぽ"; roma["pya"] = "ぴゃ"; roma["pyu"] = "ぴゅ";
roma["pyo"] = "ぴょ";
roma["ppa"] = "っぱ";
}


 サンプルなのでローマ変換の設定は途中まで。設定の中身を増やせば ACT とか AZIC にも対応できるはず。

0 件のコメント: