moriokaの日記: hondana.orgユーティリティ
# hondana.rb - hondana.org utiliity
#
# Yashiro Morioka
# 2007-08-22
#
# hondana.orgのバックアップデータを収集しCSVに直すなど
#
# Windows上(ActiveScript Ruby)のせいか、あちこちでSJISに直してから
# 文字列処理を行わないとうまく行かない( -Ke でもうまくない?)ことが
# あったため、メモリ効率的に無駄な部分が多くあります。
#
require 'kconv'
require 'open-uri'
class Hondana
HONDANA_HOST= 'www.hondana.org'
HONDANA_PORT = 80
HONDANA_PATH = '/programs/backup.cgi?shelf=%s' # %sはEUC文字列をURLエンコードしたもの
def initialize
# そのうち、本棚の description 等の情報も?
@books = Array.new
end
def load(filename)
if filename.class == String
File.open( filename, 'r' ) do |f|
load2(f)
end
else # IOクラスを想定
load2(filename)
end
@books.length
end
def load2( io ) # もう少しきれいにしたい
while (s = io.gets)
s = Kconv.tosjis(s) # EUC_to_SJIS
# 書籍エントリの作成
if /isbn:\t(.*)/ =~ s # "isbn:"の行が切れ目
@books << Book.new
end
# 書籍要素の抽出と代入
if @books.last != nil
[ 'isbn', 'score', 'category', 'title',
'date', 'amazonurl', 'publisher', 'authors',
'comment', 'imageurl'].each { |k| # 一部要素の登場順序が変化することあり
if Regexp.new( sprintf("%s:\t(.*)", k) ) =~ s
@books.last.send( sprintf("%s=", k), $1 )
end
}
end
end
end
def download( name, proxy = nil )
if name == nil
return
end
OpenURI::open_uri(
sprintf("http://%s:%s%s",
HONDANA_HOST, HONDANA_PORT,
sprintf(HONDANA_PATH, URI::encode(Kconv.toeuc(name))) ),
{ :proxy => proxy }) { |f|
load2(f)
}
end
# どういうメソッド名がよい?
def delete( name )
if name == nil
return
end
# 本棚の削除?
end
def upload( name, proxy = nil )
if name == nil
return
end
# 本棚の更新
# 作る+更新する。ただし削除はしない
# 削除を含むなら、本棚自体を削除して作り直しか?
end
def create( isbn, name, proxy = nil )
# 書籍要素の作成
end
def update( book, name, proxy = nil )
# 書籍情報の更新
end
def get( isbn, name, proxy = nil )
# 書籍情報の取得
end
attr_accessor :books
end
class Book
def initialize
@isbn = nil
@score = nil
@category = nil
@title = nil
@date = nil
@amazonurl = nil
@publisher = nil
@authors = nil
@comment = nil
@imageurl = nil
end
def csv
sprintf "\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\"\n", @isbn, @score, @category, @title, @date, @amazonurl, @publisher, @authors, @comment, @imageurl
end
attr_accessor :isbn, :title, :publisher, :authors
attr_accessor :score, :category, :comment, :date
attr_accessor :amazonurl, :imageurl
end
if __FILE__ == $0
if ARGV[0] == "--help"
print " \%hondana <STDIN>\n"
print " \%hondana hondana_name (proxy_url)\n"
exit
end
hondana = Hondana.new
#hondana.load( STDIN )
#hondana.load( "バックアップ.htm" )
#hondana.download("m")
if ARGV.length == 0
hondana.load( STDIN )
else
hondana.download( ARGV[0], ARGV[1] )
end
printf "count=%d\n", hondana.books.length
hondana.books.each { |book|
print book.csv
}
end # if __FILE__ == $0