この前書いた希望を完全に満たすものがなかったので書いた。骨格に「append-css.rb」を利用した。
テーマ別に修正が行えるのと同時にappend-css.rbのように全てのテーマにも修正が行える。
ソースは以下の通り。コピーして misc/plugin/ ディレクトリに user_css2.rb として EUC で保存するとよい。
# user_css2.rb: lastupdate:2005-04-04
#
# Append CSS fragment via Preferences Page.
#
# @conf['user_css2..css'] = '全てのテーマに適用するCSS断片'
# @conf['user_css2.<theme>.css'] = 'テーマ「<theme>」に適用するCSS断片'
# @cgi.params['user_css2.theme'] = 'CSS追加の対象となるテーマ名'
# @cgi.params['user_css2.css'] = '追加するCSS断片'
add_header_proc do
css_base = @conf["user_css2..css"];
css_theme = @conf["user_css2.#{@conf.theme}.css"];
if((css_base && !css_base.empty?) || (css_theme && !css_theme.empty?))
<<-HTML
<style type="text/css"><!--
#{css_base.gsub(/\x0d\x0a|\x0a|\x0d/, "\n\t\t") if css_base}
#{css_theme.gsub(/\x0d\x0a|\x0a|\x0d/, "\n\t\t") if css_theme}
--></style>
HTML
else
''
end
end
# デフォルトの言語リソース
unless @resource_loaded then
def user_css2_label
'テーマの微調整'
end
def user_css2_desc
<<-HTML
<h3>CSS断片</h3>
<p>下から選んだテーマに、スタイルシートを追加設定する場合、以下にCSSの断片を入力してください。</p>
HTML
end
def user_css2_label2
'このテーマを修正する'
end
end
add_conf_proc( 'user_css2', user_css2_label ) do
if @mode == 'saveconf' then
if(@cgi.params['user_css2.css'].empty? || @cgi.params['user_css2.css'][0].empty?)
@conf.delete("user_css2.#{@cgi.params['user_css2.theme'][0]}.css");
else
@conf["user_css2.#{@cgi.params['user_css2.theme'][0]}.css"] = @cgi.params['user_css2.css'][0];
end
end
unless(@conf_theme_list) # plugin/00default.rb からのコピー
@conf_theme_list = []
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( ' ' )
@conf_theme_list << [theme,name]
end
end
theme = (@cgi.params['user_css2.theme'][0] or @conf.theme);
theme_hash = Hash[* @conf.options.map{|thm,css| (thm =~ /^user_css2\.(.+)\.css$/) ? [$1, $1.split(/_/).collect{|s| s.capitalize}.join(' ')+' (deleted)'] : nil}.compact.flatten ].update( Hash[* @conf_theme_list.flatten] );
theme_hash[''] = '* All Theme *';
<<-HTML
#{user_css2_desc}
<select name="user_css2.theme">
#{theme_hash.keys.sort.map{|t| %(<option value="#{CGI::escapeHTML(t)}"#{' selected' if t == theme}>#{CGI::escapeHTML(theme_hash[t])}</option>)}.join}
</select>
<input type="submit" value="#{user_css2_label2}" />
<p><textarea name="user_css2.css" cols="70" rows="15">#{CGI::escapeHTML( @conf["user_css2.#{theme}.css"].to_s )}</textarea></p>
HTML
end