tDiary のチラリズム日記 (揮発性日記) プラグインを作ってみたい (2)
先日の日記の続き。 ちゃんと日記に書いておいたおかげで、どこまで進んでいたのかを思い出した。 いろいろと試行錯誤しながら、何とか形になるところまでは進んだ。
短い解答
とりあえず目的を達成するだけなら tdiary.conf の適当な位置に以下のように書けば OK 。
eval( <<MODIFY_CLASS, TOPLEVEL_BINDING ) module TDiary module DiaryBase def visible? (@show != false) and (@date >= Time.now - (60 * 60 * 24 * 4)) end end end MODIFY_CLASS
「4」を任意の数字に置き換えることで、 n 日前の日記の表示が可能になる。 でも、 visible? メソッドを強制的に上書きしているので、あまり柔軟性はない。
tDiary 本体を拡張する案
やっぱり Filter を拡張するのが筋がよさそうに思えてきたので、その方向で考えてみた。 コメントフィルタ (comment_filter) とリファラフィルタ (referer_filter) のみの Filter に、日記用のフィルタ (diary_filter) を追加した。 そして、表示/非表示を判定する diary.visible? を呼び出している箇所を、 diary_filter に置き換えている。
Index: tdiary.rb =================================================================== --- tdiary.rb (リビジョン 3380) +++ tdiary.rb (作業コピー) @@ -324,6 +324,10 @@ true end + def diary_filter( diary ) + true + end + def debug( msg, level = DEBUG_SPAM ) return if @debug_mode == DEBUG_NONE return if @debug_mode == DEBUG_SPAM and level == DEBUG_FULL @@ -1266,6 +1270,13 @@ end true end + + def diary_filter( diary ) + all_filters.each do |filter| + return false unless filter.diary_filter( diary ) + end + diary.visible? + end end # @@ -1663,7 +1674,7 @@ dirty = DIRTY_NONE @diaries.keys.sort.reverse_each do |key| @diary = @diaries[key] - break if @diary.visible? + break if diary_fliter(@diary) end if @diary then @diary.add_referer( @cgi.referer ) @@ -1688,7 +1699,7 @@ def each_day @diaries.keys.sort.each do |date| diary = @diaries[date] - next unless diary.visible? + next unless diary_filter(diary) yield diary end end @@ -1738,7 +1749,7 @@ rescue ArgumentError, NameError raise TDiaryError, 'bad date' end - @diary = nil if @diary and not @diary.visible? + @diary = nil if @diary and not diary_filter(@diary) end def last_modified @@ -1928,7 +1939,7 @@ unless @diary then @diaries.keys.sort.reverse_each do |d| diary = @diaries[d] - if diary.visible? + if diary_filter(diary) @diary = diary break end @@ -1992,7 +2003,7 @@ @diaries.keys.sort.reverse_each do |date| next if date > start diary = @diaries[date] - next unless diary.visible? + next unless diary_filter(diary) yield diary idx += 1 break if idx >= limit
次に、揮発性フィルタとして、 misc/plugin/volatile.rb を新しく作成する。 今は 4 日間で固定だけど、フィルタにしておけばプラグインで変更できるようにするのも簡単になる。
module TDiary::Filter class VolatileFilter < Filter def diary_filter( diary ) diary.date >= Time.now - (60 * 60 * 24 * 4) end end end
日記の設定画面を開き、「スパムフィルター選択」で「volatile.rb」を有効にすれば n 日前の日記が非表示になる。 フィルターを無効にすれば、また表示されるようになる。
これでどうだろ?