wedding-site-backend/generate_site.py

107 lines
3.6 KiB
Python
Raw Permalink Normal View History

2024-02-10 13:08:00 +00:00
import markdown
import argparse
import logging
import os
import shutil
from pathlib import Path
class SiteGenerator():
def __init__(self, source_dir: Path, build_dir: Path):
self.source_dir = source_dir
self.build_dir = build_dir
self.templates = {}
self.index_name = "index.html"
self.pages_dir_name = "pages"
self.static_dir_name = "static"
self.image_dir_name = "images"
self.template_dir_name = "template"
def generate(self):
logging.info(f"Building sources from {self.source_dir} to {self.build_dir}")
self.clean_build_dir()
self.scan_source_dir()
def process_pages(self, path: Path):
for dir_entry in path.iterdir():
if dir_entry.is_file() and dir_entry.suffix == ".md":
with open(dir_entry, 'r') as f:
content = f.read()
output_content = self.process_page(content)
output_path = self.build_dir / Path(str(dir_entry.name) + ".html")
logging.info(f"Writing content to {output_path}")
with open(output_path, 'w') as f:
f.write(output_content)
def process_page(self, page_md: str):
html_content = markdown.markdown(page_md)
if "header" in self.templates:
html_content = self.templates["header"] + html_content
if "footer" in self.templates:
html_content += self.templates["footer"]
return html_content
def clean_build_dir(self):
if os.path.exists(self.build_dir):
os.rmdir(self.build_dir)
os.makedirs(self.build_dir)
def process_images(self, path: Path):
static_dir = self.build_dir / self.static_dir_name
images_dir = static_dir / self.image_dir_name
os.makedirs(images_dir)
for dir_entry in path.iterdir():
if dir_entry.is_file():
shutil.copy(dir_entry, images_dir)
def process_static_dir(self, path: Path):
static_dir = self.build_dir / self.static_dir_name
os.makedirs(static_dir)
for dir_entry in path.iterdir():
if dir_entry.is_file():
shutil.copy(dir_entry, static_dir / dir_entry.name)
elif dir_entry.is_dir():
if dir_entry.name == "images":
self.process_images(dir_entry)
else:
shutil.copytree(dir_entry, static_dir / dir_entry.name)
def scan_templates(self, path: Path):
for dir_entry in path.iterdir():
if dir_entry.is_file() and dir_entry.suffix == ".html":
with open(dir_entry, 'r') as f:
self.templates[dir_entry.stem] = f.read()
def scan_source_dir(self):
for dir_entry in self.source_dir.iterdir():
if dir_entry.is_dir():
if dir_entry.name == self.pages_dir_name:
self.process_pages(dir_entry)
elif dir_entry.name == self.static_dir_name:
self.process_static_dir(dir_entry)
elif dir_entry.name == self.template_dir_name:
self.scan_templates(dir_entry)
elif dir_entry.is_file():
if dir_entry.name == self.index_name:
shutil.copy(dir_entry, self.build_dir / dir_entry.name)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("source_dir")
parser.add_argument("--build_dir", default = os.getcwd() + "/build")
args = parser.parse_args()
generator = SiteGenerator(Path(args.source_dir), Path(args.build_dir))
generator.generate()