tDiary のチラリズム日記 (揮発性日記) プラグインを作ってみたい (2)
2008-12-14
先日の日記の続き。 ちゃんと日記に書いておいたおかげで、どこまで進んでいたのかを思い出した。 いろいろと試行錯誤しながら、何とか形になるところまでは進んだ。
短い解答
とりあえず目的を達成するだけなら 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 日前の日記が非表示になる。 フィルターを無効にすれば、また表示されるようになる。
これでどうだろ?