at posts/single.html

tDiary のチラリズム日記 (揮発性日記) プラグインを作ってみたい

きっかけは Twitter の freedomcat さんのつぶやきから。

やっぱり4日分で日記が消えてくDiaryMakerに戻し、必要だと思われる方にはreblogなりなんなりして残してもらうのがわたしはラクかもーとか思ったり。

最近の n 日だけ表示できるプラグインがあれば解決かな? 名前は揮発性日記かなぁと思っていたら、チラリズム日記というネーミングが気に入ったのでそっちで。 結論からいうと、2時間くらい tDiary と格闘したけど、まだできていない。

ちなみに、これができるとマイミクのみに見せる日記も実現できるかもと思ったのが興味を持った理由。

フィルタ

最初は tDiary のフィルタ機能を使ってできるかも?と思って調べてみた。 tdiary.rb の TDiary::Filter::Filter には、 comment_filter と referer_filter しか用意されていなかった。 diary_filter は無いのね。

プラグイン

次に考えたのは、 add_header_proc の中で非表示にすること。 tDiaryプラグインの作り方をみながらお勉強。

add_header_proc do
  @diaries.each do |date, diary|
    if diary.date < Time.now - (60 * 60 * 24 * 4)
      diary.show(false)
    end
  end
end

でもこれもうまくいかない。

プラグインは tdiary.rb の TDiary::TDiaryBase#do_eval_rhtml で実行されているみたいだけど、どうやらプラグインが実行されるときには、すでに本文がレンダリングされている模様。 diary の show (もしくは visible?) をチェックしているのは、もっと前の段階みたい。

def do_eval_rhtml( prefix )
   # load plugin files
   load_plugins
   # load and apply rhtmls
   if cache_enable?( prefix ) then
      # rhtml を展開するコードが続く
   end

   # apply plugins
   r = @plugin.eval_src( r.untaint, @conf.secure ) if @plugin

プラグインのロード時に日記を削除

do_eval_rhtml の最初に load_plugins しているので、ロード時に日記を削除してみる。

if @mode =~ /^(latest|month|day|conf|nyear)$/
  @diaries.each do |date, diary|
    if diary.date < Time.now - (60 * 60 * 24 * 4)
      @diaries.delete(date)
    end
  end
end

これで最新日記には表示されなくなったんだけど、日表示でエラーが発生する。 tb-show.rb は tDiary 本体を拡張しているので、なかなか手を加えるのは難しそう。

undefined method `each_visible_trackback' for nil:NilClass (NoMethodError)

(plugin/tb-show.rb):146:in `trackbacks_of_today_long'

io をハックする? ← いまここ

日記の表示/非表示の判断は TDiaryView やそのサブクラス (TDiaryLatest, TDiaryDayなど) の initialize メソッドで実施されている。

@diary = nil if @diary and not @diary.visible?

なので、 IO から日記 (@diaries, @diary) を取得するところに手を加えて、 n 日経過していたら非表示にするほうがいいのかなぁ。

tDiary の内部を見るのは久しぶりだけど、いつも処理の順番が分からなくなっちゃう。 いつかちゃんと調べたいな…。

関連する日記