パスワードを忘れた? アカウント作成
486719 journal

moriokaの日記: hondana.orgユーティリティ

日記 by morioka
#
# 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
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

皆さんもソースを読むときに、行と行の間を読むような気持ちで見てほしい -- あるハッカー

読み込み中...