超多段シフト方式日本語入力システム「風」
の関連ページ。
若干アバウトなつくりですが、一応それっぽいものが作られます。
#!/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