at posts/single.html

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 日前の日記が非表示になる。 フィルターを無効にすれば、また表示されるようになる。

これでどうだろ?

関連する日記