SweetPotato::Plagger このページをアンテナに追加 RSSフィード

2006-11-14

[] Filter::ForcePermalink 02:49  Filter::ForcePermalink - SweetPotato::Plagger を含むブックマーク はてなブックマーク -  Filter::ForcePermalink - SweetPotato::Plagger  Filter::ForcePermalink - SweetPotato::Plagger のブックマークコメント

Permalinkを持たない各Entryに対して,FeedLink#EntryDigestのような形式のPermalinkを設定する。既にPermalinkを持っているEntryに対しては何もしない。

これにより,例えば,CustomFeed::Configによって切り出されたが本来はURLを持たないようなエントリに対して擬似的なURLを与えることができる。これはRule::Dedupedを使用する際に役に立つ。Rule::Dedupedは重複チェックのキーがエントリのURL(日付が存在する場合はURLと日付の連接)になっており,URLが指定されていなければ重複チェックが正しく行われないからだ。

EntryDigestの算出にはPlagger::Entry->digestを使用しているが,これはEntryのタイトルと内容に依存しているため,いずれかが変われば設定されるPermalinkも変わる。Rule::Dedupedを利用する分には問題はない。

Plagger/Plugin/Filter/ForcePermalink.pm

package Plagger::Plugin::Filter::ForcePermalink;
use strict;
use base qw( Plagger::Plugin );

use URI;

sub register {
    my ($self, $context) = @_;
    $context->register_hook(
        $self,
        'update.entry.fixup' => \&filter,
    );
}

sub filter {
    my ($self, $context, $args) = @_;

    if($args->{entry}->permalink) {
        Plagger->context->log(debug => "Entry " . $args->{entry}->title . " already has permalink. Skipped");
        return;
    }

    my $permalink = URI->new($args->{feed}->link);
    $permalink->fragment($args->{entry}->digest);
    $args->{entry}->permalink($permalink);
}

1;