disqus_static.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  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, Paginator
  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 = Paginator(disqus.threads.list,
  21. forum=generator.settings['DISQUS_SITENAME'])
  22. thread_dict = {} # disqus thread id => title
  23. for thread in threads:
  24. thread_dict[thread['id']] = thread['title']
  25. posts = Paginator(disqus.posts.list, forum=generator.settings['DISQUS_SITENAME'])
  26. post_dict = {} # title => [post1, post2, ...]
  27. for post in posts:
  28. if post['thread'] not in thread_dict.keys():
  29. continue
  30. if thread_dict[post['thread']] not in post_dict.keys():
  31. post_dict[thread_dict[post['thread']]] = []
  32. post_dict[thread_dict[post['thread']]].append(post)
  33. for article in generator.articles:
  34. if article.title in post_dict:
  35. article.disqus_comments = post_dict[article.title]
  36. def register():
  37. signals.initialized.connect(initialized)
  38. signals.article_generator_finalized.connect(disqus_static)