概要: エントリに日付がセットされてない場合、無理やりくっつけるプラグイン。
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 全体のキャッシュの設定に影響される。
動作としては、
- Plagger::Entry->date に Plagger::Date がセットされてない
- キャッシュから前のデータを読み込み
- Plagger::Entry->body を使って更新されているかチェック
- 更新されていなかったら前のデータ(Plagger::Date オブジェクト)をセット
- 更新されていたら Plagger::Date->now をセット
と言う感じ。
とにかく無理やり日付をくっつけてるだけなので、 日付が取れなかった場合の最終手段として使うのがいいかも。
ちなみにこれ、Filter::EntryFullText でどうしても日付が取れなかったのをなんとかするために作ったので、 あんまり細かいことは考えてない。
まあ、とりあえず最終手段としてはそれなりかな、と。
#FIXME