Date October 12, 2013
Tags pelican / plugin / rss
Share このエントリーをはてなブックマークに追加

この前wiki作ったまではよかったんですが、wiki記事への更新が全てRSSに流れてしまうのはよろしくないので、特定のカテゴリを除外したフィードを作成するプラグインを作ってみました。

とりあえずプラグインの作り方の基本はこちらを見てもらうとして、問題はPelicanがどうやってRSSフィードを作ってるかです。

ソースを読んでみると、pelican/generators.pyArticlesGeneratorの中でgenerate_feeds()というのが呼ばれているので、プラグインでこれを真似してやればいいんじゃないかなと思いました。

という訳で以下がそのソースです。Python初心者なので変なことしてるかもしれません。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from pelican import signals
from pelican.generators import Generator
from collections import defaultdict
from operator import attrgetter

def get_generators(generators):
    return MyFeedGenerator

def register():
    signals.get_generators.connect(get_generators)

class MyFeedGenerator(Generator):
    """Generate atom/rss feed except wiki articles"""

    def __init__(self, *args, **kwargs):
        super(MyFeedGenerator, self).__init__(*args, **kwargs)

    def generate_feeds(self, writer):
        """Generate the feeds from the current context, and output files."""

        if (self.settings.get('FEED_ALL_ATOM')
                or self.settings.get('FEED_ALL_RSS')):
            all_articles = list(self.context['articles'])
            for article in self.context['articles']:
                all_articles.extend(article.translations)
            all_articles.sort(key=attrgetter('date'), reverse=True)

            all_articles_but_wiki = [x for x in all_articles if x.category != 'wiki']

            if self.settings.get('FEED_ALL_ATOM'):
                writer.write_feed(all_articles_but_wiki, self.context,
                                  'path/to/feed')

    def generate_output(self, writer):
        self.generate_feeds(writer)

MyArticlesGeneratorgenerate_feeds内で指定したカテゴリ(ここでは'wiki')を除外した記事リストをwriterのwrite_feedに渡してます。そのgenerate_feedsgenerate_outputから呼ばれていて、generate_output自体はPelican本体から呼ばれています。

プラグインの登録はsignal.get_generators.connect()MyArticlesGeneratorを返す関数をセットしてあげればいいみたいです。


Comments

comments powered by Disqus