Home | Index | Changes | Diaries

Kaze Ime

超多段シフト方式日本語入力システム「風」

の関連ページ。

辞書変換スクリプト

Rubyで書かれています。Windows版日本語入力IME「風」の読み・配列辞書を、 sms形式に変換するスクリプトです。

若干アバウトなつくりですが、一応それっぽいものが作られます。


#!/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