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
結構きれいに変換してくれます。パッチも参照してください。