From 34915b0d7b28fa7855540f576858e38d8f398ab0 Mon Sep 17 00:00:00 2001 From: jmsgrogan Date: Sat, 10 Feb 2024 13:08:00 +0000 Subject: [PATCH] Initial conversion script --- .gitignore | 5 +++ generate_site.py | 106 +++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 2 + 3 files changed, 113 insertions(+) create mode 100644 .gitignore create mode 100644 generate_site.py create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cfe8779 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/build +__pycache__ +*.pyc +.venv + diff --git a/generate_site.py b/generate_site.py new file mode 100644 index 0000000..14fe075 --- /dev/null +++ b/generate_site.py @@ -0,0 +1,106 @@ +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() + + + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..dddfeed --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +django +markdown