thomasloven.com/sitebuilder.py

76 lines
2.0 KiB
Python
Executable File

#!/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'
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/<path:path>")
def scripts(path):
return send_from_directory('src', path)
@app.route("/media/<path:path>")
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("/<path:path>")
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/<string:tag>/")
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()