Filter::FormatText

先日作成したEntry速読用FilterのFilter::BodyTextSubstrですが、HTML::FormatTextなるものを見つけたので作り直しました。


RSSFeedのDescriptionや、EntryFullTextで取り出した本文をPlainTextに変換します。Filter::BodyTextSubstrとの違いは、

  • 本文をPlaggerCoreの$entry->body_textからHTML::FormatTextで変換したtextに変更
  • デフォルトではSubstrしない

となります。

 package Plagger::Plugin::Filter::FormatText;

use HTML::TreeBuilder;
use HTML::FormatText;
use Encode;

use strict;
use warnings;
use base qw( Plagger::Plugin );

our $VERSION = 0.01;

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

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

my $left = $cfg->{left_margin} || 0;
my $right = $cfg->{right_margin} || 72;
my $tree = HTML::TreeBuilder->new()->parse($entry->body);
my $formatter = HTML::FormatText->new(
leftmargin => $left,
rightmargin => $right,
);
my $body = $formatter->format($tree);
my $len = length($body);

my $start = $cfg->{start} || 0;
my $end = $cfg->{length} || $len;

if ($cfg->{start} || $cfg->{length}) {
my $more = '';
$more = ' ...' if $len > $end;
$body = substr($body, $start, $end) . $more;
}
$entry->body('<pre>'.$body.'</pre>');

$context->log(info => "format $entry->{link}") if $entry->{link};
}

1;

使用方法は以下の通り

 - module: Filter::FormatText
config:
start: 0
length: 400
left_margin: 0
right_margin: 72

オプションは

  • start : 切り出しの開始位置(default:0)
  • length : 切り出し長さ(default:本文長さ)
  • left_margin : 段落開始時のスペース(default:0)
  • right_margin : 一行の長さ(default:72)

で、全て任意です。また、right_marginはマルチバイトでうまく動かないようです。たとえば、lengthを400に指定するとBodyTextSubstrっぽく本文を切り詰めることが出来ます。

フォーマット例は以下の様になります。http://plagger.org/

 Plagger: DIY RSS/Atom aggregation
=================================

Plagger is a pluggable RSS/Atom feed aggregator written in Perl. Everything is
implemented as a small plugin and you can mash them up together using Plagger
core API and plugin hooks. You can think of Plagger as a blosxom or qpsmtpd for
RSS aggregator.


Shortcuts
---------

* Plagger Blog

* Quickstart

* Cookbook & Hacks

* ChangeLog

* FAQ

* Development Mailing List

結構きれいに変換してくれます。パッチも参照してください。