79 lines
2.2 KiB
Python
Executable File
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()
|