EFT::Mailmanの修正

参加しているMLもPlaggerで管理できたらいいんじゃないかと思い、CF::Mailmanを使用してみました。Filter::ReverseとFilter::BreakEntriesToFeedsを使用すれば、普通にメール配信されたものとほぼ同等です。はてブやDeliciousにブックマークすることも簡単なので結構便利なのではないかと思います。

動作には問題ありませんでしたが、EFTで日付を拾ってないっぽい。EFTと対象URLで確認したところ、日本語サイトでは日付もローカライズされていました。

IRCで対応方法を相談してみてなんとか解決しましたので、とりあえずメモしておきます。


問題点としては

  1. 日本語サイト英語サイトで、フォーマットが違う
  2. extract_date_formatに日本語で曜日指定できるのか?

と言う点になります。

とりあえず 1.についてはIRCにてmiyagawaさんからEFT::nikkansports.yamlにフォーマット違いの対応方法があることを聞き、チャレンジして見ました。

結果としては2.の曜日指定が漢字で出来無そうだったので、extract_date_formatでの対応はあきらめて、extract_after_hookで無理やり対応して見ました。extract_after_hookの正規表現には日本語を混ぜることが出来無そうだったので、かなり怪しい正規表現になってます。

後は、Filter::Reverseではなく、Filter::DateSortが欲しいかも。

assets/plugins/Filter-EntryFullText/mailman.yamlへのパッチ

  # upgrade mailman feeds
author: youpy
handle: .+/pipermail/.+?/\d{4}-\w+/\d+\.html
-extract: <!--beginarticle-->(.*?)<!--endarticle-->
-extract_capture: body
+extract: <I>(.*?)</I>.*<!--beginarticle-->(.*?)<!--endarticle-->
+extract_capture: date body
+extract_after_hook: |
+ # For Japanese
+ if ($data->{date} =~ m!(\d{4})\w+\s+(\d{1,2})\w+\s+(\d{1,2})\w+\s\(\w\)\s(\d{2}:\d{2}:\d{2})!) {
+ $data->{date} = "$1/$2/$3 $4 JST";
+ }

config.yamlには以下の様に指定

 plugins:
- module: CustomFeed::Mailman
- module: Subscription::Config
config:
feed:
- http://arch.bluegate.org/pipermail/subversion-jp/
- module: Filter::EntryFullText
- module: Filter::Rule
rule:
module: Deduped
- module: Filter::Reverse
- module: Filter::BreakEntriesToFeeds
- module: Publish::Gmail