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

2007-07-21

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

Filter::AbsolutizeEntryLinkのアイコン版。エントリのアイコンURLが相対URLならば,それをエントリのURLでもって絶対化する。

Plagger/Plugin/Filter/AbsolutizeEntryIcon.pm

package Plagger::Plugin::Filter::AbsolutizeEntryIcon;
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) = @_;
    return unless $args->{entry}->icon
               && $args->{entry}->icon->{url}
               && $args->{entry}->icon->{url} !~ m!^https?://!;
    $args->{entry}->icon({url => URI->new_abs($args->{entry}->icon->{url}, $args->{entry}->link)});
}

1;

関連

トラックバック - http://plagger.g.hatena.ne.jp/SweetPotato/20070721

2007-07-01

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

フィード内のエントリを並べ替えるFilter。

Plagger/Plugin/Filter/SortEntries.pm

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

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

sub update {
    my ($self, $context, $args) = @_;
    return unless defined $self->conf->{expression};
    my @entries = sort { eval $self->conf->{expression} } $args->{feed}->entries;
    $args->{feed}->{entries} = \@entries;
}

1;

行儀が悪いにも程がある。

config.yaml

この例では日付が古い順に整列する。

  # ...
  - module: Filter::SortEntries
    config:
      expression: |
        use Plagger::Date;
        Plagger::Date->compare($a->date, $b->date);

nyarla-netnyarla-net2007/07/01 10:27自分も同じ名前で似たようなプラグイン作ってます。中身が微妙に違いますが。
http://nyarla.net/blog/plagger24

SweetPotatoSweetPotato2007/07/01 10:47しまった!車輪の再生産になっちゃうかもしれない!
nyarla-netさんは比較にcmpを使ってらっしゃいますが,これは日付(date)での整列も可能ですか?

nyarla-netnyarla-net2007/07/01 12:57多分できないかと。
僕の作ったプラグインの場合、指定されたプロパティを単純に比較しているだけなので、そのあたり込み入ったことが出来ないと思います。

まあSweetPotatoさんのか僕のかどちらかをベースにしてくっつけてしまえば良いと思いますが。

トラックバック - http://plagger.g.hatena.ne.jp/SweetPotato/20070701

2007-02-21

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

scraperを作る時に,スクレイプ対象のページに相対リンクしか含まれていない時がよくある。そんな時はいつもextract_after_hookで,

extract_after_hook: |
  use URI;
  $data->{link} = URI->new_abs($data->{link}, $args->{feed}->url)->as_string;

ということをやって相対リンクを絶対化するんだけど,scraperを作る度にこのコードを書くのは,たった2行ではあるが面倒だし,同じコードが複数のファイルに書かれているのはどうも気持ち悪い。

Filter::AbsolutizeEntryLinkは,この作業を行うためのFilterである。フィードのリンクを基準URLとして,エントリの相対リンクを絶対化する。既にエントリのリンクが絶対的である場合には,そのリンクに対しては何もしない。

Plagger/Plugin/Filter/AbsolutizeEntryLink.pm

package Plagger::Plugin::Filter::AbsolutizeEntryLink;
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) = @_;

    return if $args->{entry}->link =~ m!^https?://!;

    $args->{entry}->link(URI->new_abs($args->{entry}->link, $args->{feed}->link)->as_string);
}

1;

Filter::EntryFullTextなどを併用する際の注意

Filter::EntryFullTextなど,エントリのリンクに指定されたURLの内容を取得するFilterを併用する場合は,必ずFilter::AbsolutizeEntryLinkを最初に適用すること。つまり,

plugins:
  # ...
  - module: Filter::AbsolutizeEntryLink
  - module: Filter::EntryFullText

はOKだが,

plugins:
  # ...
  - module: Filter::EntryFullText
  - module: Filter::AbsolutizeEntryLink

はNGである。

トラックバック - http://plagger.g.hatena.ne.jp/SweetPotato/20070221

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;