-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