1
0
flewkey.com/scripts/template.py

114 lines
3.8 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import re
import markdown
from datetime import datetime
from email import utils
def remove_tags(text):
return re.sub(re.compile('<.*?>'), "", text)
def get_path(path, ext_in, ext_out):
path = path[len("pages"):]
if path[-len("index"+ext_in):] == "index"+ext_in:
return path[:-len("index"+ext_in)]
return path[:-len(ext_in)] + ext_out
def get_dir(path):
return "/".join(path.split("/")[1:-1])+"/"
def get_root(path):
root = ""
for i in range(len(path.split("/"))-2):
root += "../"
return root
licenses = {
"CC-BY": ["cc-by", "CC BY 4.0", "https://creativecommons.org/licenses/by/4.0/"]
}
def get_badge(license, root):
if license not in licenses:
return ""
data = licenses[license]
return "<a class=\"badge\" title=\""+data[1]+"\" href=\""+data[2]+"\"><img src=\""+root+"badges/"+data[0]+".png\" alt=\""+data[1]+"\"/></a>"
def read_template(template, meta_in):
if template[:10] != "meta: yes\n":
return [template, {"meta": "no"}]
data = template[:-1].split("\n\n") # Strip trailing newline
md = markdown.Markdown(extensions = ["meta"])
md.convert(data[0])
content = "\n\n".join(data[1:])
content = content.replace("{", "{{").replace("}", "}}")
meta = meta_in.copy()
meta.update(md.Meta)
return [content, MetaDict(meta)]
def escape_braces(s):
return s.replace("{","{{").replace("}","}}");
defaults = {
"base": "https://flewkey.com/",
"title": "Untitled",
"author": "flewkey",
"ext": ".html",
"head": ""
}
class MetaDict(dict):
def __missing__(self, key):
return defaults[key] if key in defaults else ""
def __getitem__(self, key):
value = dict.__getitem__(self, key)
if isinstance(value, list):
return "\n".join(value)
else:
return value
def template(content, path, ext, meta):
global base
meta = MetaDict(meta)
if meta["template"] == None:
return content.format_map(meta)
with open("templates/"+meta["template"]+ext, "r", encoding="utf-8") as file:
t_content = file.read()
t_info = read_template(t_content, meta)
if t_info[1]["meta"] != "no" and "template" in t_info[1]:
t_content = template(t_info[0], path, ext, t_info[1])
if "root" not in meta:
meta["root"] = get_root(path)
if "home" not in meta:
meta["home"] = "." if meta["root"] == "" else meta["root"]
if "full_path" not in meta:
meta["full_path"] = get_path(path, ext, meta["ext"])
if "full_dir" not in meta:
meta["full_dir"] = get_dir(path)
if "badge" not in meta and ext == ".html":
meta["badge"] = get_badge(meta["license"], meta["root"])
if "date" not in meta and "timestamp" in meta:
meta["date"] = datetime.fromtimestamp(int(meta["timestamp"])).isoformat().split("T")[0]
if "pub_date" not in meta and "timestamp" in meta:
meta["pub_date"] = utils.format_datetime(datetime.fromtimestamp(int(meta["timestamp"])))
if "blog_list_limit" in meta:
import gen_blog
import os
files = sorted(os.listdir("posts"), reverse=True)
meta["blog_list"] = gen_blog.gen_list(files, ext, limit=int(meta["blog_list_limit"]), mini=True)
if "music_list_limit" in meta:
import gen_music
import json
with open("music.json", "r", encoding="utf-8") as file:
music = json.loads(file.read())
meta["music_list"] = gen_music.gen_list(music, ext, limit=int(meta["music_list_limit"]), mini=True)
if "openring" in t_info[1] and t_info[1]["openring"] == "yes":
with open("temp/openring.html", "r", encoding="utf-8") as file:
meta["openring"] = file.read()
meta["head"] += "\n<link rel=\"canonical\" href=\""+meta["base"]+meta["full_path"]+"\"/>"
meta["content"] = content.format_map(meta)
if "description" not in meta and meta["ext"] == ".html":
meta["auto_description"] = remove_tags(meta["content"].split("</p>")[0]) # Disgusting!
if "description" in meta:
meta["auto_description"] = meta["description"]
return t_content.format_map(meta)