thomasloven.com/sitebuilder.py

79 lines
2.2 KiB
Python
Executable File

#!/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("/<path:path>")
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/<string:tag>/")
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/<path:path>")
@app.route("/src/<path:path>")
@app.route("/favicon.ico")
def static_file(path):
return app.send_static_file(request.path[1:])
app.run()