2003-01-30

> [ブラウザ] Safariに動揺、“爆弾”を投げたOpera

構ってくれないからもう知らないなんて駄々こねられてもですね……

> [tDiary] altstyleプラグイン

themeディレクトリ内のすべてのテーマを対象にすると、テーマ集が全部入っている場合にとんでもないことになるので、そのあたりは工夫した方がいいかも。@optionsを使うとか。

[Asumi日記より引用]

この問題は認識していたんですが、放り込んだだけで動くプラグインが欲しかったので。

ただ、やはりフル版をそのまま入れている人もいるだろうし、その場合に何も対策せずに放り込んでとんでもない事になるのは避けたい。逆に、インストールしてあるテーマが少ない場合は、わざわざリストを手書きせずともインストールされているものをそのまま出力して欲しい(特に僕が)。

そんなこんなでテーマ選択プラグインを見つける。人の考える事なんて似たようなもんだなぁと思いつつ、FileTestを使わずDirと正規表現だけでインストールされているテーマを調べるアイデアをパクり、Rubyの勉強も進めつつ全体的に書き直してみる。

def css_tag
	installed_themes = []
	selectable_themes = []
	preferred_theme = @conf.theme
	r = %Q[<meta http-equiv="Content-Style-Type" content="text/css">¥n]
	#installed_themesを設定
	Dir["theme/*/*.css"].each do |path|
		%r<theme/([^/]+)/¥1¥.css$> =~ path
		if $1
			installed_themes.push($1)
		end
	end
	##Cookieやクエリでpreferred_themeを上書きするコード(予定)。
	#selectable_themesを設定
	if @options['altstyle.autolist']
		selectable_themes = installed_themes
	elsif @options['altstyle.list']
		@options['altstyle.list'].each do |theme|
			if installed_themes.member?(theme)
				selectable_themes.push(theme)
			end
		end
	end
	unless selectable_themes.member?(preferred_theme)
		selectable_themes.push(preferred_theme)
	end
	selectable_themes = selectable_themes.sort
	#link要素を書き出し
	selectable_themes.each do |theme|
		r << %Q[¥t<link¥s]
		r << %Q[rel="#{theme==preferred_theme ? "" : "alternate "}stylesheet"¥s]
		r << %Q[title="#{theme.split(/_/).collect{|s| s.capitalize}.join(' ')}"¥s]
		r << %Q[href="theme/#{theme}/#{theme}.css"¥s]
		r << %Q[type="text/css" media="all">¥n]
	end
	r
end

見りゃ解ると思うけど一応オプションの説明を。altstyle.autolistはリストを自動生成するかどうかのbool。altstyle.listはスタイルの名前……表示されるやつではなく、ファイル名に使うやつ……の配列。まず、@conf.themeのものは問答無用で優先スタイルとして吐く。autolistがtrueの時はインストールされているテーマをそのまま代替スタイルとして吐き、autolistがnilなりfalseなりで尚且つlistがある時(配列以外である時の事は想定していない)はインストールされていれば代替スタイルとして吐く。

tDiary本体の問題なのか、theme_urlとテーマ選択フォームとの整合性がとれていないような気がする。と言ってもテーマをよそのサーバに置いている時なんか、テーマリスト生成時にHEADで確認する訳にもいかんだろうし……しょうがないんでURLは決め打ち。meta http-equivで出力するような内容はHTTPレスポンスヘッダに流す方が正しい筈なのでそこらへんどうにかなるかなと思ったけど、プラグインからは弄れない様になっているみたいだ。中を弄るのはちょっと敷居が高いなぁ……