はてなダイアリー記法で出力するプラグイン

結局テキストファイルに出力するだけで満足したままになっていました。自動投稿されると自分的には、ちょっとウザイのでこれでいいという結論に達しました。フィルタとして複数エントリをはてな記法で記述された1エントリに変換するという実装方法も検討したのですが、はてブへの Publish と共用することを考えてこの形にしました。has_body_text オプションを指定すると description が記述されたエントリのみを出力します。

Rule でそういうのを制御できるように publish.feed と publish.entry をわけるとかした方がよかったのかな。エントリーにだけ Rule を適用するために必要なことがいまいちわかってません。はてブへの同期レシピにつけたして利用しているので Publish 前に Rule でエントリーを落とすわけにはいかないしなぁ。

package Plagger::Plugin::Publish::HatenaDiaryText;
use strict;
use base qw( Plagger::Plugin );

use Encode;

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

sub feed {
    my($self, $context, $args) = @_;
    
    open my $out, "|" . $self->conf->{command} or $context->error("Can't open pipe: $!");
    $context->log(info => "Publishing to " . $self->conf->{command});
    print $out "*[bookmark] 今日のブックマーク\n";
    for my $entry ($args->{feed}->entries) {
        if ((not $self->conf->{has_body_text}) or ($entry->body_text))
        {
            print $out "-[" . $self->convert($entry->permalink) . ":title=" . $self->convert($entry->title) . "]<p>";
            print $out $self->convert($entry->body_text) . "\n";
        }
    }
    close $out;
}

sub convert {
    my ($self, $str) = @_;
    utf8::decode($str) unless utf8::is_utf8($str);
    return encode($self->conf->{encoding} || 'utf8', $str);
}

1;

レシピ例

  - module: Publish::HatenaDiaryText
    config:
      command: /usr/bin/cat > my_bookmark.txt
      has_body_text: yes