Hatena::Groupfragments

甘くておいしいおイモだよー このページをアンテナに追加 RSSフィード

2006-11-01

Filter::ForcePermalink 21:00 Filter::ForcePermalink - 甘くておいしいおイモだよー を含むブックマーク はてなブックマーク - Filter::ForcePermalink - 甘くておいしいおイモだよー

【追記(11/14 13:28)】このエントリの最新版は Filter::ForcePermalink - SweetPotato::Plagger - Plaggerグループに移動しました。以後,こちらのエントリは更新しません。

「強制的にPermalinkを指定するFilterが欲しい」とか言ったら「自分で作れ」とか言われそうだけど - 甘くておいしいおイモだよー - 断片部の続き。

家に帰ってさくっと作った。Filter::ForcePermalinkと命名。Permalinkを持たない各Entryに対して,FeedLink#EntryDigestのような形式のPermalinkを設定する。既にPermalinkを持っているEntryに対しては何もしない。

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

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;

利用方法はこんな感じ。特にconfigとかもなし。

  - module: Subscription::Config
    config:
      feed:
        - url: http://www.hogehoge.com/
  - module: CustomFeed::Config
  - module: Filter::ForcePermalink

上記の場合,CustomFeed::ConfigによってPermalinkを設定されなかったEntryに対して,http://www.hogehoge.com/#c7a0b4ec2e3e6d8e9effc5d1696f1728のようなPermalinkが割り当てられる。