#!/usr/bin/env python import sys from os.path import basename from glob import glob from flask import Flask, render_template, send_from_directory from flask_flatpages import FlatPages from flask_frozen import Freezer import arrow DEBUG = True FLATPAGES_AUTO_RELOAD = DEBUG FLATPAGES_EXTENSION = '.md' FLATPAGES_ROOT = 'pages' FLATPAGES_MARKDOWN_EXTENSIONS = ['codehilite', 'extra'] app = Flask(__name__) app.config.from_object(__name__) pages = FlatPages(app) freezer = Freezer(app) permalinks = {} blogposts = [] tags = set() for page in pages: parts = page.path.split('-') if page.meta.get('permalink', None): page.meta['url'] = page.meta['permalink'] else: page.meta['url'] = '/blog/{}/{}/{}/'.format(parts[0], parts[1], '-'.join(parts[3:])) date = arrow.get('-'.join(parts[0:3])) page.meta['date'] = date page.meta['datestr'] = date.format('D MMM YYYY') blogposts.append(page) tags.update(page.meta.get('tags', [])) permalinks[page.meta['url']] = page blogposts = sorted(blogposts, key=lambda p: p.meta['date'], reverse=True) # Static files @app.route("/src/") def scripts(path): return send_from_directory('src', path) @app.route("/media/") def media(path): return send_from_directory('media', path) @app.route("/favicon.ico") def favicon(): return send_from_directory('src', 'favicon.ico') @app.route("/") def index(): return "Hello World!" @app.route("/") def permalink(path): page = permalinks['/'+path] if path.startswith('blog/'): return render_template('post.html', page=page) return render_template('page.html', page=page) @app.route("/blog/") def blog_default(): return render_template('blog.html', posts=blogposts, tags=tags) @app.route("/blog//") def tag(tag): posts = [post for post in blogposts if tag in post.meta.get('tags', [])] return render_template('blog.html', posts=posts, title=tag, tags=tags) if __name__ == "__main__": if len(sys.argv) > 1 and sys.argv[1] == "build": freezer.freeze() else: app.run()