#!/usr/bin/env python import sys from flask import Flask, render_template, request from flask_flatpages import FlatPages 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) permalinks = {} blogposts = [] tags = set() # Find all pages for page in pages: if page.meta.get('permalink', None): # Special page page.meta['url'] = page.meta['permalink'] else: # Blog post blogposts.append(page) tags.update(page.meta.get('tags', [])) # Setup permalink parts = page.path.split('-') page.meta['url'] = '/blog/{}/{}/{}/'.format(parts[0], parts[1], '-'.join(parts[3:])) # Find and format post publication date date = arrow.get('-'.join(parts[0:3])) page.meta['date'] = date page.meta['datestr'] = date.format('D MMM YYYY') permalinks[page.meta['url']] = page blogposts = sorted(blogposts, key=lambda p: p.meta['date'], reverse=True) @app.route("/") @app.route("/") def permalink(path=''): page = permalinks['/'+path] template = 'blog_post.html' if page in blogposts else 'page.html' return render_template(template, page=page) @app.route("/blog/") @app.route("/blog//") def blog_listing(tag=None): posts = blogposts if tag: posts = [post for post in posts if tag in post.meta.get('tags', [])] return render_template('blog_listing.html', posts=posts, tags=tags, title=tag) if __name__ == "__main__": if len(sys.argv) > 1 and sys.argv[1] == "build": from flask_frozen import Freezer from glob import iglob from shutil import move, rmtree freezer = Freezer(app) freezer.freeze() for f in iglob('build/static/*'): move(f, 'build/'+f[len('build/static/'):]) rmtree('build/static/') else: @app.route("/media/") @app.route("/src/") @app.route("/favicon.ico") def static_file(path): return app.send_static_file(request.path[1:]) app.run()