79 lines
2.3 KiB
Python
79 lines
2.3 KiB
Python
|
#!/usr/bin/env python
|
||
|
|
||
|
import argparse
|
||
|
import copy
|
||
|
import os
|
||
|
import pathlib
|
||
|
import shutil
|
||
|
|
||
|
import bs4
|
||
|
import markdown
|
||
|
|
||
|
|
||
|
def main():
|
||
|
parser = argparse.ArgumentParser()
|
||
|
parser.add_argument("src", help="source directory", nargs="?", default="./src")
|
||
|
parser.add_argument("out", help="output directory", nargs="?", default="./out")
|
||
|
args = parser.parse_args()
|
||
|
|
||
|
src = pathlib.Path(args.src).absolute()
|
||
|
out = pathlib.Path(args.out).absolute()
|
||
|
|
||
|
md = markdown.Markdown(extensions=["attr_list", "meta"])
|
||
|
|
||
|
# Clean the output directory
|
||
|
if out.exists():
|
||
|
print("Removing ", out)
|
||
|
shutil.rmtree(out)
|
||
|
|
||
|
# Load the template
|
||
|
template = bs4.BeautifulSoup(
|
||
|
(src / ".template.html").read_text(encoding="utf8"),
|
||
|
features="html.parser")
|
||
|
|
||
|
# cd to src so os.walk(.) returns paths relative to src
|
||
|
os.chdir(src)
|
||
|
for dirpath, dirnames, filenames in os.walk("."):
|
||
|
for filename in filenames:
|
||
|
if filename[0] == ".":
|
||
|
continue # Skip dotfiles
|
||
|
|
||
|
# Future-proofing
|
||
|
if not filename.endswith(".html") and not filename.endswith(".md"):
|
||
|
raise Exception("Support for this filetype is not yet supported:", filename)
|
||
|
|
||
|
path = src / dirpath / filename
|
||
|
dest = out / dirpath / filename
|
||
|
os.makedirs(dest.parent, exist_ok=True)
|
||
|
|
||
|
content = path.read_text(encoding="utf8")
|
||
|
meta = {}
|
||
|
|
||
|
# Preprocess markdown into html
|
||
|
if dest.name.endswith(".md"):
|
||
|
print("Converting", path)
|
||
|
dest = dest.with_suffix(".html")
|
||
|
content = md.convert(content)
|
||
|
meta = md.Meta
|
||
|
|
||
|
# Inject content into the template
|
||
|
page_content = bs4.BeautifulSoup(content, features="html.parser")
|
||
|
page = copy.copy(template)
|
||
|
article = page.new_tag("article")
|
||
|
article.append(page_content)
|
||
|
page.article.replace_with(article)
|
||
|
|
||
|
# Apply metadata to the template
|
||
|
if meta_title := meta.get("title"):
|
||
|
title = "".join(meta_title)
|
||
|
page.title.string = title
|
||
|
page.header.h1.string = title
|
||
|
|
||
|
# Write the destination file
|
||
|
print("Writing ", dest)
|
||
|
dest.write_text(str(page))
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|