123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- # -*- coding: utf-8 -*-
- """
- Pelican Comment System
- ======================
- A Pelican plugin, which allows you to add comments to your articles.
- Author: Bernhard Scheirle
- """
- import logging
- import os
- logger = logging.getLogger(__name__)
- from itertools import chain
- from pelican import signals
- from pelican.utils import strftime
- from pelican.readers import MarkdownReader
- class Comment:
- def __init__(self, id, metadata, content):
- self.id = id
- self.content = content
- self.metadata = metadata
- self.replies = []
- def addReply(self, comment):
- self.replies.append(comment)
- def getReply(self, id):
- for reply in self.replies:
- if reply.id == id:
- return reply
- else:
- deepReply = reply.getReply(id)
- if deepReply != None:
- return deepReply
- return None
- def __lt__(self, other):
- return self.metadata['date'] < other.metadata['date']
- def sortReplies(self):
- for r in self.replies:
- r.sortReplies()
- self.replies = sorted(self.replies)
- def countReplies(self):
- amount = 0
- for r in self.replies:
- amount += r.countReplies()
- return amount + len(self.replies)
- def initialized(pelican):
- from pelican.settings import DEFAULT_CONFIG
- DEFAULT_CONFIG.setdefault('PELICAN_COMMENT_SYSTEM', False)
- DEFAULT_CONFIG.setdefault('PELICAN_COMMENT_SYSTEM_DIR' 'comments')
- if pelican:
- pelican.settings.setdefault('PELICAN_COMMENT_SYSTEM', False)
- pelican.settings.setdefault('PELICAN_COMMENT_SYSTEM_DIR', 'comments')
- def add_static_comments(gen, metadata):
- if gen.settings['PELICAN_COMMENT_SYSTEM'] != True:
- return
- metadata['comments_count'] = 0
- metadata['comments'] = []
- if not 'slug' in metadata:
- logger.warning("pelican_comment_system: cant't locate comments files without slug tag in the article")
- return
- reader = MarkdownReader(gen.settings)
- comments = []
- replies = []
- folder = os.path.join(gen.settings['PELICAN_COMMENT_SYSTEM_DIR'], metadata['slug'])
- if not os.path.isdir(folder):
- logger.debug("No comments found for: " + metadata['slug'])
- return
- for file in os.listdir(folder):
- name, extension = os.path.splitext(file)
- if extension[1:].lower() in reader.file_extensions:
- content, meta = reader.read(folder + "/" + file)
- meta['locale_date'] = strftime(meta['date'], gen.settings['DEFAULT_DATE_FORMAT'])
- com = Comment(name, meta, content)
- if 'replyto' in meta:
- replies.append( com )
- else:
- comments.append( com )
- #TODO: Fix this O(n²) loop
- for reply in replies:
- for comment in chain(comments, replies):
- if comment.id == reply.metadata['replyto']:
- comment.addReply(reply)
- count = 0
- for comment in comments:
- comment.sortReplies()
- count += comment.countReplies()
- comments = sorted(comments)
- metadata['comments_count'] = len(comments) + count
- metadata['comments'] = comments
- def register():
- signals.initialized.connect(initialized)
- signals.article_generator_context.connect(add_static_comments)
|