disqus_static.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. # -*- coding: utf-8 -*-
  2. """
  3. Disqus static comment plugin for Pelican
  4. ====================================
  5. This plugin adds a disqus_comments property to all articles.
  6. Comments are fetched at generation time using disqus API.
  7. """
  8. from disqusapi import DisqusAPI
  9. from pelican import signals
  10. def initialized(pelican):
  11. from pelican.settings import _DEFAULT_CONFIG
  12. _DEFAULT_CONFIG.setdefault('DISQUS_SECRET_KEY', '')
  13. _DEFAULT_CONFIG.setdefault('DISQUS_PUBLIC_KEY', '')
  14. if pelican:
  15. pelican.settings.setdefault('DISQUS_SECRET_KEY', '')
  16. pelican.settings.setdefault('DISQUS_PUBLIC_KEY', '')
  17. def disqus_static(generator):
  18. disqus = DisqusAPI(generator.settings['DISQUS_SECRET_KEY'],
  19. generator.settings['DISQUS_PUBLIC_KEY'])
  20. threads = disqus.threads.list(forum=generator.settings['DISQUS_SITENAME'])
  21. thread_dict = {} # disqus thread id => title
  22. for thread in threads:
  23. thread_dict[thread['id']] = thread['title']
  24. posts = disqus.posts.list(forum=generator.settings['DISQUS_SITENAME'])
  25. post_dict = {} # title => [post1, post2, ...]
  26. for post in posts:
  27. if post['thread'] not in thread_dict.keys():
  28. continue
  29. if thread_dict[post['thread']] not in post_dict.keys():
  30. post_dict[thread_dict[post['thread']]] = []
  31. post_dict[thread_dict[post['thread']]].append(post)
  32. for article in generator.articles:
  33. if article.title in post_dict:
  34. article.disqus_comments = post_dict[article.title]
  35. def register():
  36. signals.initialized.connect(initialized)
  37. signals.article_generator_finalized.connect(disqus_static)