カラクリスタ

『輝かしい青春』なんて失かったヒトのブログ

Plagger::Plugin::Filter::ForceDate

概要: エントリに日付がセットされてない場合、無理やりくっつけるプラグイン。


Plagger::Entry->dateにPlagger::Dateオブジェクトがなんらかの理由でセットされなかった場合、 更新されているかチェックして無理やりPlagger::Dateオブジェクトをセットするプラグインを作った。

package Plagger::Plugin::Filter::ForceDate;
use strict;
use warnings;
use Plagger::CacheProxy;
use Plagger::Date;
use base qw( Plagger::Plugin );
sub register {
    my ( $self, $c ) = @_;
    $c->register_hook(
        $self,
        'update.entry.fixup' => $self->can('update'),
    );
}
sub init {
    my $self = shift;
    $self->SUPER::init( @_ );
    $self->{'cache'} = Plagger::CacheProxy->new( $self, Plagger->context->cache );
}
sub update {
    my ( $self, $c, $args ) = @_;
    return if ( ref $args->{'entry'}->date );
    my $entry = $args->{'entry'};
    my $cache = $self->{'cache'};
    my $data = $cache->get( $entry->permalink );
    if ( defined $data ) {
        if ( $data->{'body'} eq $entry->body ) {
            $entry->date( $data->{'date'} );
            return;
        }
        else {
            $entry->date( Plagger::Date->now );
        }
    }
    else {
        $entry->date( Plagger::Date->now );
    }
    $cache->set(
        $entry->permalink => {
            body => $entry->body,
            date => $entry->date,
        },
    );
}
1;
__END__

ライセンスはPerlと同等で。

使い方は単に読み込むだけ。configとかはない。

更新をチェックするのにPlaggerのキャッシュ機構をそのまんま使っているので、 Plagger全体のキャッシュの設定に影響される。

動作としては、

  1. Plagger::Entry->dateにPlagger::Dateがセットされてない
  2. キャッシュから前のデータを読み込み
  3. Plagger::Entry->bodyを使って更新されているかチェック
  4. 更新されていなかったら前のデータ(Plagger::Dateオブジェクト)をセット
  5. 更新されていたらPlagger::Date->nowをセット

と言う感じ。

とにかく無理やり日付をくっつけてるだけなので、 日付が取れなかった場合の最終手段として使うのがいいかも。

ちなみにこれ、Filter::EntryFullTextでどうしても日付が取れなかったのをなんとかするために作ったので、 あんまり細かいことは考えてない。

まあ、とりあえず最終手段としてはそれなりかな、と。