livedoor Reader で EntryFullText

Plagger Conference #1 に行ってきたけど、ノートPCもテトリスDSも無いので家で一人Hackathonした。
Perl難しい!とか思いつつやってたら結局Greasemonkeyスクリプトになってしまった。Plagger関係ないし、中途半端で全く役に立たないネタスクリプトに。ほとんどの場合、p -> o や v の方が便利です。


livedoor Reader with EntryFullText
e でアクティブになってる記事を取得して表示します。
CNETでしか確認していません。他はほとんどうまく行きそうにないので怖くて試してません。
feed の URL が必要なんだけど、それを取得するAPIとか見つけられなかった。なので discover したり rel="self" 見たりひどい実装になってます。

http://plagger.org/trac/browser/trunk/plagger/assets/plugins/Filter-EntryFullText
にあるYAMLファイルを元にしています。handle, handle_force, extract, extract_capture しか理解できません。Greasemonkeyの方では extract_after_hook にも対応したんだけど、PerlからJavascriptに変換しないといけないのであきらめました。


YAMLデータの抽出に作ったスクリプト。Perl書きなれてないので見苦しいとは思いますが置いときます。

#!/usr/bin/perl

use strict;
use warnings;
use File::Basename;
use JSON;
use YAML;

my %rules;
my %keys = map { $_ => 1 }
    my @keys = qw( handle extract extract_capture );

while (</path/to/plagger/assets/plugins/Filter-EntryFullText/*.yaml>) {
    my $rule = YAML::LoadFile($_);
    $rule->{handle} ||= $rule->{handle_force};
    next if @keys != grep { $rule->{$_} } @keys;
    $rule->{handle}  =~ s/(?<!\\)\./[\\s\\S]/g;
    $rule->{extract} =~ s/(?<!\\)\./[\\s\\S]/g;
    $rule->{extract} =~ s/(?<!\\r\?)\\n/(?:\\r?\\n)/g;
    $rule->{extract} = &to_gm_string($rule->{extract});
    $rule->{extract_capture} = [split /\s+/, $rule->{extract_capture}];
    map { delete $rule->{$_} } grep { !$keys{$_} } keys %$rule;
    $rules{basename $_, '.yaml'} = $rule;
}

my $json = objToJson(\%rules);
$json =~ s/\\(?=\\u[\da-f]{4})//g;

open my $fh, '>', 'rules.json' or die;
print $fh $json;


sub to_gm_string {
    my $string = shift;
    utf8::decode($string);
    join '', map { $_ < 0x100 ? chr : sprintf '\u%x', $_ } unpack 'U*', $string;
}