pelican_comment_system.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. # -*- coding: utf-8 -*-
  2. import logging
  3. import os
  4. logger = logging.getLogger(__name__)
  5. from itertools import chain
  6. from pelican import signals
  7. from pelican.utils import strftime
  8. from pelican.readers import MarkdownReader
  9. class Comment:
  10. def __init__(self, id, metadata, content):
  11. self.id = id
  12. self.content = content
  13. self.metadata = metadata
  14. self.replies = []
  15. def addReply(self, comment):
  16. self.replies.append(comment)
  17. def getReply(self, id):
  18. for reply in self.replies:
  19. if reply.id == id:
  20. return reply
  21. else:
  22. deepReply = reply.getReply(id)
  23. if deepReply != None:
  24. return deepReply
  25. return None
  26. def __lt__(self, other):
  27. return self.metadata['date'] < other.metadata['date']
  28. def sort(self):
  29. for r in self.replies:
  30. r.sort()
  31. self.replies = sorted(self.replies)
  32. def countReplies(self):
  33. amount = 0
  34. for r in self.replies:
  35. amount += r.countReplies()
  36. return amount + len(self.replies)
  37. def initialized(pelican):
  38. from pelican.settings import DEFAULT_CONFIG
  39. DEFAULT_CONFIG.setdefault('PELICAN_COMMENT_SYSTEM', False)
  40. DEFAULT_CONFIG.setdefault('PELICAN_COMMENT_SYSTEM_DIR' 'comments')
  41. if pelican:
  42. pelican.settings.setdefault('PELICAN_COMMENT_SYSTEM', False)
  43. pelican.settings.setdefault('PELICAN_COMMENT_SYSTEM_DIR', 'comments')
  44. def add_static_comments(gen, metadata):
  45. if gen.settings['PELICAN_COMMENT_SYSTEM'] != True:
  46. return
  47. metadata['comments_count'] = 0
  48. metadata['comments'] = []
  49. if not 'slug' in metadata:
  50. logger.warning("pelican_comment_system: cant't locate comments files without slug tag in the article")
  51. return
  52. reader = MarkdownReader(gen.settings)
  53. comments = []
  54. replies = []
  55. folder = os.path.join(gen.settings['PELICAN_COMMENT_SYSTEM_DIR'], metadata['slug'])
  56. if not os.path.isdir(folder):
  57. logger.debug("No comments found for: " + metadata['slug'])
  58. return
  59. for file in os.listdir(folder):
  60. name, extension = os.path.splitext(file)
  61. if extension[1:].lower() in reader.file_extensions:
  62. content, meta = reader.read(folder + "/" + file)
  63. meta['locale_date'] = strftime(meta['date'], gen.settings['DEFAULT_DATE_FORMAT'])
  64. com = Comment(name, meta, content)
  65. if 'replyto' in meta:
  66. replies.append( com )
  67. else:
  68. comments.append( com )
  69. for reply in replies:
  70. for comment in chain(comments, replies):
  71. if comment.id == reply.metadata['replyto']:
  72. comment.addReply(reply)
  73. count = 0
  74. for comment in comments:
  75. comment.sort()
  76. count += comment.countReplies()
  77. comments = sorted(comments)
  78. metadata['comments_count'] = len(comments) + count
  79. metadata['comments'] = comments
  80. def register():
  81. signals.initialized.connect(initialized)
  82. signals.article_generator_context.connect(add_static_comments)