verdandi/modules/newsfeed.py

99 lines
2.5 KiB
Python

#!/usr/bin/env python2
import os
import markdown
from dateutil import parser
from verdandi.mixins.templatemixin import TemplateMixin
from verdandi.mixins.menuitemmixin import MenuItemMixin
from verdandi.mixins.assetsmixin import AssetsMixin
from verdandi.constants import CONTENT_DIRECTORY, MARKDOWN_EXTENSIONS
class NewsFeed(MenuItemMixin, TemplateMixin, AssetsMixin):
title = "News feed title"
template = "newsfeed.html"
feed_template = "newsfeed.rss"
feed_url = "feed.rss"
news_item_directory = "news"
news_feed_id = "news"
markdown_extensions = MARKDOWN_EXTENSIONS
content_directory = CONTENT_DIRECTORY
items = []
def process_message(self, message):
other_messages = super(NewsFeed, self).process_message(message)
if message != None and message['type'] == 'news_feed_item':
if message['feed_id'] == self.news_feed_id:
self.items += [message['item']]
return other_messages
def get_context(self):
context = super(NewsFeed,self).get_context()
context['page_title'] = self.title
context['feed_url'] = self.feed_url
markdown_converter = markdown.Markdown(extensions = self.markdown_extensions)
rendered_items = []
for item in self.items:
item['content'] = markdown_converter.convert(item['content'])
item['url'] = self.url
rendered_items += [item]
item_directory = os.path.join(self.content_directory, self.news_item_directory)
for news_file in os.listdir(item_directory):
_, ext = os.path.splitext(news_file)
if ext == '.md':
item = {}
full_path = os.path.join(item_directory, news_file)
item = self.read_news_item_file(full_path)
item['content'] = markdown_converter.convert(item['content'])
rendered_items += [item]
rendered_items = sorted(rendered_items, key=lambda item: item['creation_time'], reverse=True)
context['items'] = rendered_items
return context
def read_news_item_file(self, path):
item_file = open(path, 'r')
result = {}
first_line = item_file.readline()
second_line = item_file.readline()
third_line = item_file.readline().strip()
while third_line == '':
third_line = item_file.readline().strip()
result['title'] = third_line
result['content'] = item_file.read().decode('utf-8')
result['creation_time'] = parser.parse(first_line)
result['edit_time'] = parser.parse(second_line)
item_file.close()
return result
def render_files(self, context, output_directory, jinja_env):
self.render_to_file(self.feed_template, self.feed_url, context, output_directory, jinja_env)
super(NewsFeed, self).render_files(context, output_directory, jinja_env)