# random_amazon.rb $Revision: 1.0.1 $ # # random_amazon: 日記からランダムに抽出した単語を Amazon で書籍検索するリンクを生成する # # 使い方: # tDiaryの設定画面からどうぞ. # # ※ アソシエイト ID は設定画面にて忘れずに指定して下さい。 # # Copyright (c) 2004 phonondrive # Copyright (c) 2003 Junichiro KITA # Distributed under the GPL # =begin ChangeLog 2004.11.09 phonondrive * version 1.0.1 Modified the keyword encoding part Change the default value for the number of keywords * version 1.0.0 Rewrote for the Amazon.co.jp associates program =end require 'uconv.so' def random_amazon_pickup_word(date) analyzer = @conf['random_amazon.analyzer'] analyzer = @conf['random_amazon.analyzer_path'] if analyzer == "user_defined" analyzer = "internal" if analyzer == "" if analyzer == "internal" m = self.methods url_regexp = %r<(((http[s]{0,1}|ftp)://[\(\)%#!/0-9a-zA-Z_$@.&+-,'"*=;?:~-]+)|([0-9a-zA-Z_.-]+@[\(\)%!0-9a-zA-Z_$.&+-,'"*-]+\.[\(\)%!0-9a-zA-Z_$.&+-,'"*-]+))> @diaries[date.strftime('%Y%m%d')].to_src. gsub(url_regexp, ''). scan(/(?:[亜-瑤]{2,}|[ァ-ヶー]{2,}|[0-9A-Za-z]{2,})/).sort.uniq.reject {|i| m.include?(i)} else require 'open3' inn, out, err = Open3.popen3("#{analyzer} | sort | uniq") inn.puts @diaries[date.strftime('%Y%m%d')].to_src inn.close m = self.methods r = out.read.map do |l| word = l.split[0] if /\s(名詞|未知語)/.match(l) and !/(\W|\d)/.match(word) and # 記号とか数字は要らない !/\A[あ-ん]{1,2}\z/.match(word) and # 2文字以下のひらがなも要らんでしょ !m.include?(word) # Pluginのメソッドは除外した方がいいかも word else nil end end.compact out.close err.close r end end def random_amazon_init @conf['random_amazon.n'] ||= 1 @conf['random_amazon.caption'] ||= 'もしかしたら関連するかもしれない書籍' @conf['random_amazon.popup'] ||= '本日のお題: $1' @conf['random_amazon.append'] ||= '' @conf['random_amazon.exception'] ||= '' @conf['random_amazon.associate_id'] ||= '' if @conf.secure @conf['random_amazon.analyzer'] = "internal" else @conf['random_amazon.analyzer'] ||= "internal" @conf['random_amazon.analyzer_path'] ||= "" end end if /(latest|day)/ === @mode and ! @conf.bot? and ! @conf.mobile_agent? add_body_leave_proc do |date| random_amazon_init exception = @conf['random_amazon.exception'].split words = random_amazon_pickup_word(date) - exception if words.empty? '' else r = [] @conf['random_amazon.n'].times do |i| r << words.delete_at(rand(words.size)) end append = @conf['random_amazon.append'].split rr = (r.compact.map {|i| CGI::escape(Uconv.euctou8(i))} + append).join('+') rrr = r.compact.map {|i| CGI::escapeHTML(i)}.join(' ') caption = @conf['random_amazon.caption'].gsub(/\$1/, rrr) popup = @conf['random_amazon.popup'].gsub(/\$1/, rrr) <<-HTML HTML end end end def saveconf_random_amazon if @mode == 'saveconf' then @conf['random_amazon.n'] = @cgi.params['random_amazon_n'][0].to_i @conf['random_amazon.caption'] = @cgi.params['random_amazon_caption'][0] @conf['random_amazon.popup'] = @cgi.params['random_amazon_popup'][0] @conf['random_amazon.append'] = @cgi.params['random_amazon_append'][0] @conf['random_amazon.exception'] = @cgi.params['random_amazon_exception'][0] @conf['random_amazon.associate_id'] = @cgi.params['random_amazon_associate_id'][0] if @conf.secure @conf['random_amazon.analyzer'] = "internal" else @conf['random_amazon.analyzer'] = @cgi.params['random_amazon_analyzer'][0] @conf['random_amazon.analyzer_path'] = @cgi.params['random_amazon_analyzer_path'][0] end end end add_conf_proc('RandomAmazon', '関連するかもしれない書籍検索 (Amazon.co.jp)') do saveconf_random_amazon random_amazon_init r = <<-HTML

キーワードの数

#{"

日記本文から抽出するキーワードの数

" unless @conf.mobile_agent?}

表示関連

#{"

Amazon へのリンクを示す文字列とリンクの上にマウスポインタを置いた時にポップアップする文字列を指定します.文字列中の $1 は抽出されたキーワードで置換されます.

" unless @conf.mobile_agent?}

リンク:

ポップアップ:

追加するキーワード

#{"

追加したいキーワードを指定します.複数指定する場合はキーワードをスペースで区切って指定してください.

" unless @conf.mobile_agent?} #{"

例)

-site:example.com
" unless @conf.mobile_agent?}

除外するキーワード

#{"

除外したいキーワードを指定します.複数指定する場合はキーワードをスペースで区切って指定してください.

" unless @conf.mobile_agent?} #{"

例)

a the
" unless @conf.mobile_agent?}

HTML unless @conf.secure r << <<-HTML

形態素解析器の利用

#{"

キーワードの抽出に形態素解析器を利用するかどうかを指定します.形態素解析器を使用しない場合は/([亜-瑤]{2,}|[ァ-ヶー]{2,}|[0-9A-Za-z]{2,})/という正規表現でキーワードを抽出しますが,あまり精度はよくありません.

" unless @conf.mobile_agent?} #{"

ChasenやMeCabが標準パスにインストールされていない場合は「場所を指定する」を選択し,下の「形態素解析器のパス」で形態素解析器を絶対パスで指定して下さい.

" unless @conf.mobile_agent?} #{"

ChasenやMeCab以外の形態素解析器を利用したい場合も同様に「場所を指定する」を選択し,下の「形態素解析器のパス」で形態素解析器を絶対パスで指定して下さい.最初のカラムに形態素が出力され,かつ同じ行にその形態素の品詞(「名詞」等)が出力されるような形態素解析器であれば利用可能です.

" unless @conf.mobile_agent?}

形態素解析器のパス

#{"

利用する形態素解析器を絶対パスで指定します.

" unless @conf.mobile_agent?} #{"

例)

/usr/local/bin/chasen
" unless @conf.mobile_agent?}

HTML end r << <<-HTML

Amazon アソシエイト ID

あなたの アソシエイト ID を入力してください。

アソシエイト ID:

HTML r end # vim: ts=3