構ってくれないからもう知らない
なんて駄々こねられてもですね……
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レスポンスヘッダに流す方が正しい筈なのでそこらへんどうにかなるかなと思ったけど、プラグインからは弄れない様になっているみたいだ。中を弄るのはちょっと敷居が高いなぁ……