超多段シフト方式日本語入力システム「風」
の関連ページ。
若干アバウトなつくりですが、一応それっぽいものが作られます。
#!/usr/local/bin/ruby
# $Id: KazeIme.html,v 1.1 2001/12/24 00:50:45 cake Exp $
# 風 for Win の辞書を sms.txt 形式に変換する
# 超いーかげんなスクリプト
READ_DIC_HEADER_SIZE = 0x280
READ_DIC_ENTRY_SIZE = 12
KANJI_DIC_HEADER_SIZE = 0x50
KANJI_DIC_ENTRY_SIZE = 3
KEY_CODE_TABLE =
[ 40, 38, 32, 34, 36, 35, 33, 31, 37, 39,
22, 16, 6, 10, 14, 13, 9, 5, 15, 21,
18, 12, 2, 4, 8, 7, 3, 1, 11, 17,
30, 28, 20, 24, 26, 25, 23, 19, 27, 29 ]
# ファイルをオープンする
Read_dic = open( "Wind2.rea", "r" )
Kanji_dic = open( "Wind2.dic", "r" )
exit unless Read_dic or Kanji_dic
# 読み辞書のヘッダを読み飛ばす
Read_dic.seek( READ_DIC_HEADER_SIZE, 0 )
while r_entry = Read_dic.read( READ_DIC_ENTRY_SIZE ) do
# 読み仮名 8byte, 配列辞書のオフセット 2byte, 謎の 2byte(^^;
( yomi, pos, nazo ) = r_entry.unpack( "A8vv" )
# 配列辞書の該当箇所に飛ぶ
Kanji_dic.seek( pos + KANJI_DIC_HEADER_SIZE, 0 )
last_code = nil
current_kanji_table = Array.new # Hash の方がいいかも知れない
kanji_num = 0
# 配列辞書の内容を読む。
while true
k_entry = Kanji_dic.read( KANJI_DIC_ENTRY_SIZE )
if k_entry == nil then
printf( STDERR, "k_entry is nil at %d.\n", pos )
break
end
# 鍵盤位置 1byte, 漢字 2byte (S-JIS)
( key_code, kanji_char ) = k_entry.unpack( "Ca2" )
# 鍵盤がダブっていたら読み飛ばす(辞書のバグ:-P)
next if current_kanji_table[ key_code ] != nil
# 鍵盤の位置が若かったら次のエントリと認識。←この判定方法はヘボいっす
break if last_code != nil and last_code > key_code
current_kanji_table[ key_code ] = kanji_char
last_code = key_code
kanji_num += 1
end
printf( "#YOMI:%s\n", yomi )
printf( STDERR, "yomi = %s, pos = %x num = %d\n", yomi, pos, kanji_num )
# キーボードの左上から書き出す。このループはダサい。
base = 0
print_count = 0
i = 1
while true
KEY_CODE_TABLE.each do
| key |
if current_kanji_table[ key + 40 * base ] then
print( current_kanji_table[ key + 40 * base ] )
print_count += 1
else
print( " " )
end
if i % 10 == 0 then
print "\n"
end
i += 1
end
print "#\n"
# 読みに対する漢字をすべて書き出したらループ終了
break if print_count >= kanji_num
base += 1
printf( STDERR, "count = %d, max = %d\n", print_count, kanji_num )
end
end
Rubyを使っているにもかかわらず、見事なまでに手続き指向なスクリプトですね。:D