Plagger::Plugin::Filter::ResolveRelativeLink - Resolve relative links in feed content


Plagger documentation Contained in the Plagger distribution.

Index


Code Index:

NAME

Top

Plagger::Plugin::Filter::ResolveRelativeLink - Resolve relative links in feed content

SYNOPSIS

Top

  - module: Filter::ResolveRelativeLink

DESCRIPTION

Top

Some feeds contain relative URIs in their content in <content:encoded> or <description> element. That's not a valid thing to do, but because RSS and content module specification doesn't clearly say about it, some feeds still do it.

This plugins tries to fix the relative links in feed content, using entry's permalink as a base URL.

AUTHOR

Top

Tatsuhiko Miyagawa

SEE ALSO

Top

Plagger, HTML::ResolveLink


Plagger documentation Contained in the Plagger distribution.

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

use HTML::ResolveLink;

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

sub filter {
    my($self, $context, $args) = @_;
    my $entry = $args->{entry};

    return unless defined $entry->body;

    my $base = $entry->permalink || $args->{feed}->link;
    unless ($base) {
        $context->log(warn => "No base link found");
        return;
    }

    my $resolver = HTML::ResolveLink->new(base => $base);
    my $html = $resolver->resolve($entry->body);

    if (my $count = $resolver->resolved_count) {
        $context->log(info => "Resolved $count link(s) in $base");
        $entry->body($html);
    }
}

1;

__END__