Last active
December 17, 2015 22:39
-
-
Save uhnomoli/5683380 to your computer and use it in GitHub Desktop.
Adds category support to mynt.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/mynt/core.py b/mynt/core.py | |
index 0cab910..d7d6778 100644 | |
--- a/mynt/core.py | |
+++ b/mynt/core.py | |
@@ -38,6 +38,8 @@ class Mynt(object): | |
'archives_url': '/', | |
'assets_url': '/assets/', | |
'base_url': '/', | |
+ 'category_layout': None, | |
+ 'categories_url': '/', | |
'date_format': '%A, %B %d, %Y', | |
'domain': None, | |
'include': [], | |
@@ -56,6 +58,7 @@ class Mynt(object): | |
_renderer = None | |
archives = OrderedDict() | |
+ categories = OrderedDict() | |
config = {} | |
pages = [] | |
posts = [] | |
@@ -96,6 +99,11 @@ class Mynt(object): | |
return format.format(self.config['archives_url'], year) | |
+ def _get_category_url(self, name): | |
+ format = self._get_url_format(self.config['categories_url'].endswith('/')) | |
+ | |
+ return format.format(self.config['categories_url'], self._slugify(name)) | |
+ | |
def _get_opts(self, args): | |
opts = {} | |
@@ -264,10 +272,10 @@ class Mynt(object): | |
self.config['assets_url'] = absurl(self.config['assets_url'], '') | |
self.config['base_url'] = absurl(self.opts.get('base_url', self.config['base_url']), '') | |
- for setting in ('archives_url', 'posts_url', 'tags_url'): | |
+ for setting in ('archives_url', 'categories_url', 'posts_url', 'tags_url'): | |
self.config[setting] = absurl(self.config[setting]) | |
- for setting in ('archives_url', 'assets_url', 'base_url', 'posts_url', 'tags_url'): | |
+ for setting in ('archives_url', 'assets_url', 'base_url', 'categories_url', 'posts_url', 'tags_url'): | |
if re.search(r'(?:^\.{2}/|/\.{2}$|/\.{2}/)', self.config[setting]): | |
raise ConfigException('Invalid config setting.', 'setting: {0}'.format(setting), 'path traversal is not allowed') | |
@@ -295,6 +303,7 @@ class Mynt(object): | |
try: | |
data = { | |
+ 'categories': [], | |
'content': content, | |
'date': post.date.strftime(self.config['date_format']).decode('utf-8'), | |
'excerpt': excerpt, | |
@@ -306,6 +315,7 @@ class Mynt(object): | |
raise PageException('Invalid post slug.', 'src: {0}'.format(post.path)) | |
data.update(post.frontmatter) | |
+ data['categories'].sort(key = unicode.lower) | |
data['tags'].sort(key = unicode.lower) | |
self.posts.append(data) | |
@@ -315,6 +325,12 @@ class Mynt(object): | |
self.tags[tag] = [] | |
self.tags[tag].append(data) | |
+ | |
+ for category in data['categories']: | |
+ if category not in self.categories: | |
+ self.categories[category] = [] | |
+ | |
+ self.categories[category].append(data) | |
def _process(self): | |
self._parse() | |
@@ -332,6 +348,7 @@ class Mynt(object): | |
logger.debug('.. sorting tags') | |
+ categories = [] | |
tags = [] | |
for name, posts in self.tags: | |
@@ -360,6 +377,33 @@ class Mynt(object): | |
for tag in tags: | |
self.tags[tag['name']] = tag | |
+ | |
+ for name, posts in self.categories: | |
+ posts.sort(key = lambda post: post['timestamp'], reverse = True) | |
+ | |
+ try: | |
+ categories.append({ | |
+ 'archives': self._archive(posts), | |
+ 'count': len(posts), | |
+ 'name': name, | |
+ 'posts': posts, | |
+ 'url': self._get_category_url(name) | |
+ }) | |
+ except PageException: | |
+ message = ['category: {0}'.format(name)] | |
+ | |
+ for post in posts: | |
+ message.append('post: {0}'.format(post.get('title', post['url']))) | |
+ | |
+ raise PageException('Invalid category slug.', *message) | |
+ | |
+ categories.sort(key = lambda category: category['name'].lower()) | |
+ categories.sort(key = lambda category: category['count'], reverse = True) | |
+ | |
+ self.categories.clear() | |
+ | |
+ for category in categories: | |
+ self.categories[category['name']] = category | |
else: | |
logger.debug('.. no posts found') | |
@@ -370,6 +414,7 @@ class Mynt(object): | |
self.renderer.register({ | |
'archives': self.archives, | |
+ 'categories': self.categories, | |
'posts': self.posts, | |
'tags': self.tags | |
}) | |
@@ -407,6 +452,15 @@ class Mynt(object): | |
self._pygmentize(self.renderer.render(self.config['tag_layout'], {'tag': data})) | |
)) | |
+ if self.config['category_layout'] and self.categories: | |
+ logger.debug('.. categories') | |
+ | |
+ for name, data in self.categories: | |
+ self.pages.append(Page( | |
+ self._get_path(data['url']), | |
+ self._pygmentize(self.renderer.render(self.config['category_layout'], {'category': data})) | |
+ )) | |
+ | |
if self.config['archive_layout'] and self.archives: | |
logger.debug('.. archives') | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment