# -*- coding: utf-8 -*- """ Disqus static comment plugin for Pelican ==================================== This plugin adds a disqus_comments property to all articles. Comments are fetched at generation time using disqus API. """ from __future__ import unicode_literals from disqusapi import DisqusAPI, Paginator from pelican import signals def initialized(pelican): from pelican.settings import DEFAULT_CONFIG DEFAULT_CONFIG.setdefault('DISQUS_SECRET_KEY', '') DEFAULT_CONFIG.setdefault('DISQUS_PUBLIC_KEY', '') if pelican: pelican.settings.setdefault('DISQUS_SECRET_KEY', '') pelican.settings.setdefault('DISQUS_PUBLIC_KEY', '') def disqus_static(generator): disqus = DisqusAPI(generator.settings['DISQUS_SECRET_KEY'], generator.settings['DISQUS_PUBLIC_KEY']) # first retrieve the threads threads = Paginator(disqus.threads.list, forum=generator.settings['DISQUS_SITENAME']) # build a {thread_id: title} dict thread_dict = {} for thread in threads: thread_dict[thread['id']] = thread['title'] # now retrieve the posts posts = Paginator(disqus.posts.list, forum=generator.settings['DISQUS_SITENAME']) # build a {post_id: [child_post1, child_post2, ...]} dict child_dict = {} for post in posts: if post['id'] not in child_dict.keys(): child_dict[post['id']] = [] if post['parent'] is not None: if str(post['parent']) not in child_dict.keys(): child_dict[str(post['parent'])] = [] child_dict[str(post['parent'])].append(post) # build a {title: [post1, post2, ...]} dict post_dict = {} for post in posts: build_post_dict(post_dict, child_dict, thread_dict, post) for article in generator.articles: if article.title in post_dict: article.disqus_comments = post_dict[article.title] article.disqus_comment_count = sum([ postcounter(post) for post in post_dict[article.title]]) def postcounter(node): return 1 + sum([postcounter(n) for n in node['children']]) def build_post_dict(post_dict, child_dict, thread_dict, post): if post['thread'] not in thread_dict.keys(): return # invalid thread, should never happen build_child_dict(child_dict, post) if post['parent'] is not None: return # this is a child post, don't want to display it here if thread_dict[post['thread']] not in post_dict.keys(): post_dict[thread_dict[post['thread']]] = [] post_dict[thread_dict[post['thread']]].append(post) def build_child_dict(child_dict, post): post['children'] = child_dict[post['id']] for child in child_dict[post['id']]: build_child_dict(child_dict, child) def register(): signals.initialized.connect(initialized) signals.article_generator_finalized.connect(disqus_static)