IniFile.rb

事情あって、Ruby実装のINIファイルパーサが必要になった。Rubyなら普通YAMLってことなのか、ググってみたが見つからない。Windows APIを使えばいいだろうって?Mac OS Xには、そんなものないです!
仕方ないから、書きましたよ。ええ。ちゃんとRubyっぽいコードになってるか、あんまり自信ないんですが。

class IniFile < File
  attr_accessor :prefix

  def readlines
    if @lines == nil
      @lines = []
      File.open(self.path) do |file|
        file.readlines.each do |line|
          line.chomp!.gsub!(/;.*$/, '')
          @lines.push(line) if (/^ *$/ != line)
        end
      end
    end
    return @lines
  end

  def settings
    if @settings == nil
      @settings = {}
      section_name = nil
      self.readlines.each do |line|
        if /^\[\..*\] *$/ =~ line
          section_name = nil
        elsif /^\[(.*)\] *$/ =~ line
          section_name = $~.captures[0]
        elsif /^ *([a-z0-9_]+) *= *[\'\"]?([^\'\"]*)[\'\"]? *$/i =~ line
          key = $~.captures
          value = key.pop
          key.unshift(section_name) if (section_name != nil)
          key.unshift(self.prefix) if (self.prefix != nil)
          @settings.store(key.join('_').upcase, value)
        end
      end
      @settings.each do |key, value|
        @settings.delete(key) if (value.length == 0)
      end
    end
    return @settings
  end
end

こんな変態的なコードに興味を持つ人がいらっしゃるかは定かではないが、こんなふうに使う。

require 'pp'
ini = IniFile.new('carrot.ini')
ini.prefix = 'bs'
pp ini.settings

上記サンプルコードに以下の様なINIファイルを食わせると、

[.carrot]
  CARROT_VER = "1.9.7"
  SCRIPT_ENCODING = "utf-8"
  SERVER_ACCESSOR = "s"

[SMARTY]
  TEMPLATE_ENCODING = "utf-8"

[FEED]
  CLASS = "BSRSS20Document"

こんなハッシュを吐き出す。

{"BS_SMARTY_TEMPLATE_ENCODING"=>"utf-8",
 "BS_SCRIPT_ENCODING"=>"utf-8",
 "BS_FEED_CLASS"=>"BSRSS20Document",
 "BS_SERVER_ACCESSOR"=>"s",
 "BS_CARROT_VER"=>"1.9.7"}

汎用的なINIパーサとは言い難いけど、ぼく自身の要件は一応満たしているので、ツッコミはご容赦くだされ。また、ご利用はくれぐれも自己責任で。
ググっても見つからなかったのは、ふつうのRubyistさんならこんなの、鼻歌まじりで書いちゃうからなんだろうね。

トラックバック

コメント

poozaが着手したの?

狙い撃ちってなに?

参考になりました。


コメントはすぐには反映しません。
ほぼ毎日チェックしていますが、翌日以降の反映となることもあります。

Twitter