Procházet zdrojové kódy

[pelican_comment_system] Adds an feed which contains all comments of all articles

Bernhard Scheirle před 10 roky
rodič
revize
ceccd86bf5
1 změnil soubory, kde provedl 41 přidání a 6 odebrání
  1. 41 6
      pelican_comment_system/pelican_comment_system.py

+ 41 - 6
pelican_comment_system/pelican_comment_system.py

@@ -23,6 +23,8 @@ from . comment import Comment
 from . import avatars
 
 
+_all_comments = []
+
 def setdefault(pelican, settings):
     from pelican.settings import DEFAULT_CONFIG
     for key, value in settings:
@@ -45,6 +47,7 @@ def pelican_initialized(pelican):
         ('PELICAN_COMMENT_SYSTEM_IDENTICON_SIZE', 72),
         ('PELICAN_COMMENT_SYSTEM_AUTHORS', {}),
         ('PELICAN_COMMENT_SYSTEM_FEED', os.path.join('feeds', 'comment.%s.atom.xml')),
+        ('PELICAN_COMMENT_SYSTEM_FEED_ALL', os.path.join('feeds', 'comments.all.atom.xml')),
         ('COMMENT_URL', '#comment-{slug}')
     ]
 
@@ -84,10 +87,27 @@ def warn_on_slug_collision(items):
     for slug, itemList in slugs.items():
         len_ = len(itemList)
         if len_ > 1:
-            logger.warning('There are %s comments with the same slug: %s' %
-                           (len_, slug))
+            logger.warning('There are %s comments with the same slug: %s', len_, slug)
             for x in itemList:
-                logger.warning('    %s' % x.source_path)
+                logger.warning('    %s', x.source_path)
+
+
+def write_feed_all(gen, writer):
+    if gen.settings['PELICAN_COMMENT_SYSTEM'] is not True:
+        return
+    if gen.settings['PELICAN_COMMENT_SYSTEM_FEED_ALL'] is None:
+        return
+
+    context = copy.copy(gen.context)
+    context['SITENAME'] += " - All Comments"
+    context['SITESUBTITLE'] = ""
+    path = gen.settings['PELICAN_COMMENT_SYSTEM_FEED_ALL']
+
+    global _all_comments
+    _all_comments = sorted(_all_comments)
+    _all_comments.reverse()
+    writer = Writer(gen.output_path, settings=gen.settings)
+    writer.write_feed(_all_comments, context, path)
 
 
 def write_feed(gen, items, context, slug):
@@ -104,6 +124,8 @@ def add_static_comments(gen, content):
     if gen.settings['PELICAN_COMMENT_SYSTEM'] is not True:
         return
 
+    global _all_comments
+
     content.comments_count = 0
     content.comments = []
 
@@ -120,7 +142,7 @@ def add_static_comments(gen, content):
     )
 
     if not os.path.isdir(folder):
-        logger.debug("No comments found for: " + content.slug)
+        logger.debug("No comments found for: %s", content.slug)
         write_feed(gen, [], context, content.slug)
         return
 
@@ -135,14 +157,18 @@ def add_static_comments(gen, content):
                 base_path=folder, path=file,
                 content_class=Comment, context=context)
 
+            _all_comments.append(com)
+
             if hasattr(com, 'replyto'):
                 replies.append(com)
             else:
                 comments.append(com)
 
-    warn_on_slug_collision(comments + replies)
+    feed_items = sorted(comments + replies)
+    feed_items.reverse()
+    warn_on_slug_collision(feed_items)
 
-    write_feed(gen, comments + replies, context, content.slug)
+    write_feed(gen, feed_items, context, content.slug)
 
     # TODO: Fix this O(n²) loop
     for reply in replies:
@@ -165,8 +191,17 @@ def writeIdenticonsToDisk(gen, writer):
     avatars.generateAndSaveMissingAvatars()
 
 
+def pelican_finalized(pelican):
+    if pelican.settings['PELICAN_COMMENT_SYSTEM'] is not True:
+        return
+    global _all_comments
+    print('Processed %s comment(s)' % len(_all_comments))
+
+
 def register():
     signals.initialized.connect(pelican_initialized)
     signals.article_generator_init.connect(initialize)
     signals.article_generator_write_article.connect(add_static_comments)
     signals.article_writer_finalized.connect(writeIdenticonsToDisk)
+    signals.article_writer_finalized.connect(write_feed_all)
+    signals.finalized.connect(pelican_finalized)