/ 最近 .rdf 追記 編集 設定 本棚

脳log[20070413] amazon.rb $Revision: 1.62 $ のオプション関連がちょっと変。



2007年04月13日 (金)

[tDiary] amazon.rb $Revision: 1.62 $ のオプション関連がちょっと変。

 @conf['amazon.nodefault'] がどこからも参照されてないよ

画像が見つからないときにテキストリンクを表示する(true)か noimage画像を表示する(false)かの設定。

 画像の代替テキストが真っ白

class="amazon"の時に画像の横に表示されるテキストと、画像の代替テキストなど(alt, title)は区別して、altや titleは常に設定されるようにして欲しい。

この辺のことです。

	if with_image and @conf['amazon.hidename'] || pos != 'amazon' then
		label = ''
	elsif not label
		label = %Q|#{amazon_title( item )}#{author}|
	end

両方とも自分でなんとかしてみる。

def amazon_image( item )
	image = {}
	begin
		size = case @conf['amazon.imgsize']
		when 0; 'Large'
		when 2; 'Small'
		else;   'Medium'
		end
		image[:src] = item.elements.to_a( "#{size}Image/URL" )[0].text
		image[:height] = item.elements.to_a( "#{size}Image/Height" )[0].text
		image[:width] = item.elements.to_a( "#{size}Image/Width" )[0].text
	rescue
		image[:src] = image[:height] = image[:width] = nil
	end
	image
end

def amazon_default_image
	image = {}
	base = @conf['amazon.default_image_base'] || 'http://www.tdiary.org/images/amazondefaults/'
	case @conf['amazon.imgsize']
	when 0
		image[:src] = "#{base}large.png"
		image[:height] = 500
		image[:width] = 380
	when 2
		image[:src] = "#{base}small.png"
		image[:height] = 75
		image[:width] = 57
	else
		image[:src] = "#{base}medium.png"
		image[:height] = 160
		image[:width] = 122
	end
	image
end

def amazon_to_html( item, with_image = true, label = nil, pos = 'amazon' )
	with_image = false if @mode == 'categoryview'

	author = amazon_author( item )
	author = "(#{author})" unless author.empty?

	label = %Q|#{amazon_title( item )}#{author}| unless label

	if with_image
		image = amazon_image( item )
		image = amazon_default_image if not image[:src] and not @conf['amazon.nodefault']
		if image[:src] then
			img = <<-HTML
			<img class="#{h pos}" src="#{h image[:src]}"
			height="#{h image[:height]}" width="#{h image[:width]}"
			alt="#{h label}" title="#{h label}">
			HTML
			img.gsub!( /\t/, '' )
			label = '' if @conf['amazon.hidename'] || pos != 'amazon'
		else
			img = ''
		end
	end

	url = amazon_url( item )
	%Q|<a href="#{h url}">#{img}#{h label}</a>|
end

動いているようだ。labelという変数に二つの役割が与えられているのが微かに気になるが。

 (おまけ) エラーメッセージの表示部分

def amazon_get( asin, with_image = true, label = nil, pos = 'amazon' )
	……(省略)……
		rescue Timeout::Error
			asin
		rescue NoMethodError
			if item == nil then
				message = doc.elements.to_a( 'Items/Request/Errors/Error/Message' )[0].text
				"#{label ? label : asin}<!--#{h @conf.to_native( message, 'utf-8' )}-->"
			else
				"#{label ? label : asin}<!--#{h $!}\n#{h $@.join( ' / ' )}-->"
			end
		end

labelは他の場所で HTMLエスケープ前の文字列として扱われているのでエスケープするのがよい。asinだって中身が英数字に違いなかろうがなんだろうがエスケープすればいい。

コメント(<!---->)の中身は h(ERB::Util.html_escape) する必要はなく .gsub(/--+/, '-') した方が良い、とまで言うとパラノイア・原理主義者っぽい気がするのは何故? コメントに起因する不具合に遭ったことがないから?