class TDiaryUpdate < TDiaryAdmin def initialize( cgi, rhtml, conf ) @title = conf.to_native( cgi.params['title'][0] ) @body = conf.to_native( cgi.params['body'][0] ) @hide = cgi.params['hide'][0] == 'true' ? true : false super end protected def do_eval_rhtml( prefix ) super @plugin.instance_eval { update_proc } @diary.eval_rhtml({'date_format'=>''}, PATH) rescue nil; # この行を追加 anchor = @plugin.instance_eval( %Q[anchor "#{@diary.date.strftime('%Y%m%d')}"].untaint ) clear_cache( /(latest|#{@date.strftime( '%Y%m' )})/ ) raise ForceRedirect::new( "#{@conf.index}#{anchor}" ) end end
一行追加した。更新時の負荷増加なんて無問題でしょ。optが手抜きなのは気にしない方向で。
加えて、カテゴリを使った場合は update_procで category.rbによって section.bodyが評価されるので更にゴニョゴニョしないと「更新時に一度だけ実行」というわけにはいかない。
ここでハタと気付く。update_procでできるなら tdiary.rbをいじることないやん。category.rbの真似しよう。
コレ(↓)。category.rbのより簡単なのは、category.rbでは Pluginクラスとは違うクラス(のインスタンス)の中で評価するために bindingを受け渡したりしてるから。
add_update_proc{ diary = @diaries[@date.strftime('%Y%m%d')]; diary.each_section do |s| apply_plugin(s.subtitle_to_html); apply_plugin(s.body_to_html); end }
==
を
==
のように、プラグイン呼び出しを装って単なる文字列を埋め込むのがよろしかろう。
いやそれよりも整形済みテキストとして表示すれば。