]> git.donarmstrong.com Git - neurodebian.git/blobdiff - sphinx/sphinxext/feed/__init__.py
Merge branch '3rd-party-pristine'
[neurodebian.git] / sphinx / sphinxext / feed / __init__.py
index ff4fee1e942a1277827d8ea23a7c96bd040593dc..35faeb49d9cdc0bbb3dea442f6b647d02cfbb271 100644 (file)
@@ -1,7 +1,9 @@
+# -*- coding: utf-8 -*-
 from fsdict import FSDict
 import feedgenerator
 from urllib import quote_plus
 import os.path
+import re
 import directives
 
 #global
@@ -29,8 +31,14 @@ def setup(app):
     app.add_config_value('feed_title', '', 'html')
     app.add_config_value('feed_base_url', '', 'html')
     app.add_config_value('feed_description', '', 'html')
-    app.add_config_value('feed_filename', 'rss.xml', 'html')
-    
+    app.add_config_value('feed_title', '', 'html')
+    app.add_config_value('feed_subtitle', '', 'html')
+    app.add_config_value('feed_author_name', '', 'html')
+    app.add_config_value('feed_author_email', '', 'html')
+    app.add_config_value('feed_categories', [], 'html')
+    app.add_config_value('feed_variants',
+                         {'all': {'filename': 'rss.xml', 'categories': None}},
+                         'html')
     app.connect('html-page-context', create_feed_item)
     app.connect('build-finished', emit_feed)
     app.connect('builder-inited', create_feed_container)
@@ -48,6 +56,11 @@ def create_feed_container(app):
     app.builder.env.feed_url = app.config.feed_base_url + '/' + \
         app.config.feed_filename
 
+def inject_feed_url(app, pagename, templatename, ctx, doctree):
+    #We like to provide our templates with a way to link to the rss output file
+    ctx['rss_link'] = app.builder.env.feed_url #app.config.feed_base_url + '/' + app.config.feed_filename
+    
+
 def create_feed_item(app, pagename, templatename, ctx, doctree):
     """
     Here we have access to nice HTML fragments to use in, say, an RSS feed.
@@ -75,16 +88,30 @@ def create_feed_item(app, pagename, templatename, ctx, doctree):
     #     unique_id=None, enclosure=None, categories=(), item_copyright=None,
     #     ttl=None,
     link = app.config.feed_base_url + '/' + ctx['current_page_name'] + ctx['file_suffix']
+    # bring main body of the feed item into shape
+    body = ctx.get('body')
+    # remove all header links (they make ugly characters in feed readers)
+    body = re.sub('\<a class\="headerlink".*\>.</a\>', '', body)
+
     item = {
       'title': ctx.get('title'),
       'link': link,
       'unique_id': link,
-      'description': absolutify(ctx.get('body'), link),
-      'pubdate': pub_date
+      'description': absolutify(body, link),
+      'pubdate': pub_date,
+      'categories': ()
     }
+    if 'tags' in metadata:
+        item['categories'] = metadata['tags'].split(",")
     if 'author' in metadata:
-        item['author'] = metadata['author']
-    feed_entries[nice_name(pagename, pub_date)] = item
+        item['author_name'] = metadata['author']
+    else:
+        item['author_name'] = app.config.feed_author_name
+    if 'author_email' in metadata:
+        item['author_email'] = metadata['author_email']
+    else:
+        item['author_email'] = app.config.feed_author_email
+    feed_entries[nice_name(pagename, pub_date)] = item    
     
     #Now, useful variables to keep in context
     ctx['rss_link'] = app.builder.env.feed_url 
@@ -111,25 +138,41 @@ def emit_feed(app, exc):
 
     feed_dict = {
       'title': title,
+      'subtitle': app.config.feed_subtitle,
       'link': app.config.feed_base_url,
       'feed_url': app.config.feed_base_url,
-      'description': app.config.feed_description
+      'description': app.config.feed_description,
+      'categories': app.config.feed_categories,
+      'author_name': app.config.feed_author_name,
+      'author_email': app.config.feed_author_email
     }
     if app.config.language:
         feed_dict['language'] = app.config.language
     if app.config.copyright:
         feed_dict['feed_copyright'] = app.config.copyright
-    feed = feedgenerator.Rss201rev2Feed(**feed_dict)
-    app.builder.env.feed_feed = feed
+    # sort items
     ordered_keys = feed_entries.keys()
     ordered_keys.sort(reverse=True)
-    for key in ordered_keys:
-        feed.add_item(**feed_entries[key])     
-    outfilename = os.path.join(app.builder.outdir,
-      app.config.feed_filename)
-    fp = open(outfilename, 'w')
-    feed.write(fp, 'utf-8')
-    fp.close()
+    # loop over all feed variants
+    for feedvar in app.config.feed_variants:
+        feedvar_settings = app.config.feed_variants[feedvar]
+        feed = feedgenerator.Rss201rev2Feed(**feed_dict)
+        app.builder.env.feed_feed = feed
+        for key in ordered_keys:
+            item = feed_entries[key]
+            # only take the ones that should be in this feed
+            if feedvar_settings['tag'] is None \
+                    or feedvar_settings['tag'] in item['categories']:
+                feed.add_item(**feed_entries[key])
+        outfilename = os.path.join(app.builder.outdir,
+          feedvar_settings['filename'])
+        # make sure the directory exists
+        feed_dir = os.path.dirname(outfilename)
+        if feed_dir and not os.path.exists(feed_dir):
+            os.makedirs(os.path.dirname(outfilename))
+        fp = open(outfilename, 'w')
+        feed.write(fp, 'utf-8')
+        fp.close()
 
 def nice_name(docname, date):
     """