英辞郎辞書変換用スクリプトの作成

Ubuntu 8.10 に切り替えてから1ヶ月ほど。これまで gnome-dictionary を使ってたんだけど、dictd と組み合せないとオフラインでは使えなかったりちょっと使い勝手に難があった。ってなわけで、http://stardict.sourceforge.net:StarDict に乗り換えてみた。

StarDict は GPL2 で普通に universe にあるのでインストールに難しいことは何もない。"stardict" が StarDict のプログラム本体が含まれるパッケージで、"stardict-tools" には辞書の変換用スクリプトが含まれているようだ。

% sudo aptitude install stardict stardict-tools

StarDict で使える形式の辞書を作成するためには、以下のステップを踏む。

  1. 検索キーと内容をタブで区切った UTF-8 なファイルを用意する
  2. stardict-tools に含まれる /usr/lib/stardict-tools/tabfile *1 に前段で作成したファイルを食べさせて変換させる
  3. できあがった辞書ファイル (*.dict.dz, *.idx, *.ifo) を /usr/share/stardict/dic に配置する

手元に 2005 年頃に買った英辞郎の辞書データがあったので、こいつを StarDict に取り込めるように変換スクリプトでも書いてみようと思ったが…、実際には英辞郎の辞書形式もタブ区切りなファイルだったので文字コード以外は特に変換すべき項目はない。おまけに、手元に保存していた英辞郎の辞書ファイルは以前に UTF-8 に変換していたこともあって、特に何も変換すべきことはなかった。

そんなことに気づいたのはスクリプトの体裁を整えた後だったのだけど、短いとは言えせっかく作ったものをローカルディスクに死蔵させておくのももったいないので晒しておくことにする。自分の例の場合には使わなかったものの、Iconv を使って文字コードの変換もできるようにはしてある。

#!/usr/bin/env ruby
# Eijiro Dictionary format to Stardict converter

require "iconv"

class EijiroEntry
  DEFAULT_OPTIONS = {
#   :input_charset  => "Shift_JIS",
    :input_charset  => "UTF-8",
    :output_charset => "UTF-8"
  }

  def initialize(key, value, options={})
    @key    = key
    @value  = value
    @string = nil

    @input_charset = nil
    @output_charset = nil

    parse_options(options)
  end
  attr_reader :key
  attr_reader :value

  def to_s()
    @string ||= convert_charset(@key + "\t" + @value)
  end

  private
  def parse_options(options)
    options = DEFAULT_OPTIONS.merge(options)
    @input_charset = options[:input_charset]
    @output_charset = options[:output_charset]
  end
  def convert_charset(str)
    if @input_charset != @output_charset
      if @input_charset.nil?
        raise("i do not know how to guess the charcode of input string with iconv")
      else
        str = Iconv.conv(@input_charset, @output_charset, str)
      end
    end
    str
  end
end

ARGF.each { |line|
  key, value = line.split(/\t/, 2)
  STDOUT.puts(EijiroEntry.new(key, value))
}

上記の Ruby スクリプトを e2sd.rb とか言う名前で保存して、以下のように変換する。英辞郎辞書のファイル名はそれぞれ eijiro81.txt, reiji81.txt, ryaku81.txt, waeiji81.txt としています。

% chmod 755 e2sd.rb
% for f in eijiro81.txt reiji81.txt ryaku81.txt waeiji81.txt; do
  ./e2sd.rb $f > `basename $f .txt`.utf8
  /usr/lib/stardict-tools/tabfile `basename $f .txt`.utf8
  sudo mv `basename $f .txt`{.dict.dz,.idx,.ifo} /usr/share/stardict/dict/
done

*1:インストール方法によってはパスは異なるかも知れない。