76 lines
2.0 KiB
Python
Executable File
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()
|