Pelican plugin to create tiny single-page feeds
git clone https://github.com/m-col/pelican-microfeed
Files | Refs | Readme

-rw-r--r-- microfeed.py


      1 # -*- coding: utf-8 -*-
      2 """
      3 microfeed - Pelican plugin
      4 ==========================
      5 
      6 microfeeds allows for the creation of pages that each act as a feed of content separate
      7 to the main articles. The how and what:
      8 
      9  - Write articles under a category that will be used to make a microfeed.
     10  - Create the config setting MICROFEEDS as a list of these categories.
     11  - Articles in these categories are extracted early in generation so they are excluded
     12    from any article lists used in templates.
     13  - A *microfeed* object is exposed to page templates via which articles can be accessed
     14    as microfeed.*category* or microfeed[*category*] (these are equivalent).
     15  - Each microfeed will also generate an ATOM/RSS feed as usual if you have set
     16    CATEGORY_FEED_ATOM or CATEGORY_FEED_RSS.
     17 
     18 """
     19 
     20 
     21 from functools import partial
     22 
     23 from pelican import signals
     24 
     25 
     26 class Microfeed:
     27     categories = ()
     28     articles = {}
     29 
     30     def setup_dict(self):
     31         """
     32         Sets microfeed.articles to contain a key for each category, each holding an
     33         empty list.
     34         """
     35         for cat in self.categories:
     36             self.articles[cat] = []
     37 
     38 microfeed = Microfeed()
     39 
     40 
     41 def get_categories(pelican):
     42     """
     43     Collect the list of categories that the user wants to turn into microfeeds.
     44     """
     45     categories = pelican.settings.get('MICROFEEDS', None)
     46     if categories and type(categories) in (list, set, tuple):
     47         microfeed.categories = categories
     48         microfeed.setup_dict()
     49 
     50 def collect_microfeed_articles(article_generator):
     51     """
     52     Collect the microfeed articles from the article generator and move them to the
     53     microfeed object for later use.
     54     """
     55     if microfeed.categories:
     56         microfeed.setup_dict()
     57         normal_articles = []
     58         for article in article_generator.articles:
     59             if article.category in microfeed.categories:
     60                 microfeed.articles[article.category].append(article)
     61             else:
     62                 normal_articles.append(article)
     63         article_generator.articles = normal_articles
     64 
     65 def add_microfeed_to_context(page_generator):
     66     """
     67     Expose the microfeed object to the page generator's context for use in page
     68     templates'
     69     """
     70     for cat in microfeed.categories:
     71         setattr(microfeed, cat, microfeed.articles[cat])
     72     page_generator.context['microfeed'] = microfeed
     73 
     74 def gen_microfeed_feed(article_generator, writer):
     75     """
     76     Optionally generate an ATOM/RSS feed for each microfeed.
     77     """
     78     for cat_name in microfeed.categories:
     79         cat = microfeed.articles[cat_name][0].category
     80 
     81         if article_generator.settings.get('CATEGORY_FEED_ATOM'):
     82             writer.write_feed(
     83                 microfeed.articles[cat.name],
     84                 article_generator.context,
     85                 article_generator.settings['CATEGORY_FEED_ATOM'].format(slug=cat.slug),
     86                 article_generator.settings.get(
     87                     'CATEGORY_FEED_ATOM_URL',
     88                     article_generator.settings['CATEGORY_FEED_ATOM']
     89                 ).format(slug=cat.slug),
     90                 feed_title=cat.name
     91             )
     92 
     93         if article_generator.settings.get('CATEGORY_FEED_RSS'):
     94             writer.write_feed(
     95                 microfeed.articles[cat.name],
     96                 article_generator.context,
     97                 article_generator.settings['CATEGORY_FEED_RSS'].format(slug=cat.slug),
     98                 article_generator.settings.get(
     99                     'CATEGORY_FEED_RSS_URL',
    100                     article_generator.settings['CATEGORY_FEED_RSS']
    101                 ).format(slug=cat.slug),
    102                 feed_title=cat.name,
    103                 feed_type='rss'
    104             )
    105     if article_generator.settings.get('GENERATE_MICROFEED_POSTS', False):
    106         write = partial(
    107             writer.write_file,
    108             relative_urls=article_generator.settings['RELATIVE_URLS'],
    109         )
    110         for cat_name in microfeed.categories:
    111             article_generator.articles = microfeed.articles[cat_name]
    112             article_generator.generate_articles(write)
    113 
    114 def register():
    115     signals.initialized.connect(get_categories)
    116     signals.article_generator_pretaxonomy.connect(collect_microfeed_articles)
    117     signals.page_generator_finalized.connect(add_microfeed_to_context)
    118     signals.article_writer_finalized.connect(gen_microfeed_feed)
    119