この前wiki作ったまではよかったんですが、wiki記事への更新が全てRSSに流れてしまうのはよろしくないので、特定のカテゴリを除外したフィードを作成するプラグインを作ってみました。
とりあえずプラグインの作り方の基本はこちらを見てもらうとして、問題はPelicanがどうやってRSSフィードを作ってるかです。
ソースを読んでみると、pelican/generators.pyのArticlesGenerator
の中で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)
|
MyArticlesGenerator
はgenerate_feeds
内で指定したカテゴリ(ここでは'wiki')を除外した記事リストをwriterのwrite_feed
に渡してます。そのgenerate_feeds
はgenerate_output
から呼ばれていて、generate_output
自体はPelican本体から呼ばれています。
プラグインの登録はsignal.get_generators.connect()
にMyArticlesGenerator
を返す関数をセットしてあげればいいみたいです。
Comments
comments powered by Disqus