IniFile.rb
2007/07/15 00:03
事情あって、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さんならこんなの、鼻歌まじりで書いちゃうからなんだろうね。
