Skip to content

Instantly share code, notes, and snippets.

@uhnomoli
Last active December 17, 2015 22:39
Show Gist options
  • Save uhnomoli/5683380 to your computer and use it in GitHub Desktop.
Save uhnomoli/5683380 to your computer and use it in GitHub Desktop.
Adds category support to mynt.
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