Jun 102007
 

このサイトのデフォルトテーマをnonzeroに変更して、恥ずかしながらはじめて代替スタイルシートの存在を知りました。
nonzeroテーマの場合、Firefoxであれば表示->スタイルシートで代替スタイルシートに切り替えられるようになってます。色が変わるだけですが。

tDiaryはテーマとは言っても出力テンプレートが切り替わるわけではなく、cssだけの切替ですから、予めalternate stylesheetに全部書いてしまえないものかと軽く試してみました。
ちなみにrubyに関しては素人です。

まず、デフォルトのstylesheet指定は以下のようになってます。

<link rel="stylesheet" href="/tdiary/theme/base.css" type="text/css" media="all">
<link rel="stylesheet" href="/tdiary/theme/default/default.css" title="Default" type="text/css" media="all">

ここに続けて以下のような代替スタイルシート指定を羅列できればよいのではないかと考えるわけです。

<link rel="alternate stylesheet" href="/tdiary/theme/hoge/hoge.css" title="Hoge" type="text/css" media="all">

これを出力している箇所を追いかけるとplugin/00default.rbのようです。
こちらにインストール済みテーマをリストして出力するように、以下のようなコードを追加してみます。

--- plugin/00default.rb.default 2005-07-27 15:14:12.000000000 +0900
+++ plugin/00default.rb 2007-06-10 00:59:30.000000000 +0900
@@ -255,6 +255,14 @@
        <link rel="stylesheet" href="#{theme_url}/base.css" type="text/css" media="all">
        <link rel="stylesheet" href="#{css}" title="#{title}" type="text/css" media="all">
        CSS
+       Dir::glob( "#{::TDiary::PATH}/theme/*" ).sort.each do |dir|
+               theme = dir.sub( %r[.*/theme/], '')
+               next unless FileTest::file?( "#{dir}/#{theme}.css".untaint )
+               name = theme.split( /_/ ).collect{|s| s.capitalize}.join( ' ' )
+               <<-CSSALT
+               <link rel="alternate stylesheet" href="#{theme}" title="#{name}" type="text/css" media="all">
+               CSSALT
+       end
 end

 def robot_control

Dir::glob()でインストール済みテーマをリストする部分は、同ファイルの中で@conf_theme_listを作る処理があったのでそちらをパクってます。

で、実行してみたんですが、あえなく玉砕。

private method `chomp' called for # (NoMethodError)

(plugin/00default.rb):119:in `load_plugin'
/usr/share/tdiary/tdiary.rb:75:in `join'
/usr/share/tdiary/tdiary.rb:75:in `safe'
/usr/share/tdiary/tdiary.rb:657:in `eval_src'
/usr/share/tdiary/tdiary.rb:904:in `do_eval_rhtml'
/usr/share/tdiary/tdiary.rb:854:in `eval_rhtml'
/var/www/tdiary/index.rb:71

やはり付け焼刃ではダメですね。

■2007-06-11追記
tDiary-users Projectのサイトには、テーマ関連のプラグインが掲載されています。
http://tdiary-users.sourceforge.jp/cgi-bin/wiki.cgi?PluginList#l6
わざわざ本体改造しなくてもよかったみたいです。

■2007-06-13追記
前述のプラグインリストを探してもリンク切れでたどり着けなかったので、結局自分で再チャレンジしました。結論からいうと、以下のコードでうまくいきます。
ただ、ページ表示のときに代替スタイルシートも一気に読み込むようなので、インストール済みテーマが多いと表示時間が遅くなってしまいます。コンフィグで選択できるようにしないとダメかな。

def css_tag
	if @conf.theme and @conf.theme.length > 0 then
		css = "#{theme_url}/#{@conf.theme}/#{@conf.theme}.css"
		title = css
	else
		css = @css
	end
	title = CGI::escapeHTML( File::basename( css, '.css' ) )
	result = %Q[<meta http-equiv="content-style-type" content="text/css">\n]
	result << %Q[	<link rel="stylesheet" href="#{theme_url}/base.css" type="text/css" media="all">\n]
	result << %Q[	<link rel="stylesheet" href="#{css}" title="#{title}" type="text/css" media="all">\n]
	Dir::glob( "#{::TDiary::PATH}/theme/*" ).sort.each do |dir|
		theme = dir.sub( %r[.*/theme/], '')
		next unless FileTest::file?( "#{dir}/#{theme}.css".untaint )
		name = theme.split( /_/ ).collect{|s| s.capitalize}.join( ' ' )
		result << %Q[		<link rel="alternate stylesheet" href="#{theme_url}/#{theme}/#{theme}.css" title="#{name}" type="text/css" media="all">\n]
	end
	result
end

plugin/00default.rbを直接変更しなくても、plugin/99altcss.rbとでもして用意すればcss_tagメソッドが置き換わることがわかったのでそうしてます(環境はDebian etchです)。

 Posted by at 1:18 am  Tagged with:

Sorry, the comment form is closed at this time.