This repository has been archived on 2025-01-08. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
blog-software/compiler.py
2024-05-23 16:16:02 +02:00

52 lines
No EOL
1.9 KiB
Python

from json import loads
from os import walk
from os.path import isdir, join, exists
from shutil import copytree
from typing import Dict
from article import Article, Site
from template import TemplateEnvironment
def compile(work_directory: str, template_directory: str=None, target_directory: str=None, force: bool=False):
if not isdir(work_directory):
raise FileNotFoundError("One or more of the directories you specified do not exist")
if template_directory is None:
template_directory = join(work_directory, 'template')
if not isdir(template_directory):
raise FileNotFoundError("Template doesn't exist. Add one to your project or specify one with -t")
if target_directory is None:
target_directory = join(work_directory, 'generated_out')
if exists(target_directory) and not force:
raise FileExistsError(target_directory + " already exists. Delete it, specify a different one with -o, or pass the -f flag to merge")
copytree(join(template_directory, 'static'), join(target_directory, 'static'), dirs_exist_ok=True)
copytree(join(work_directory, 'posts'), join(target_directory, 'post'), dirs_exist_ok=True)
file = open(join(work_directory, 'config.json'))
site = Site.from_open_file(file)
file.close()
template = TemplateEnvironment(template_directory, site)
articles = []
for root, dirs, files in walk(join(target_directory, 'post')):
for fn in files:
if fn.endswith('.html'):
file = open(join(root, fn), 'r+')
article = Article.from_open_file(file)
content = template.process_article(article)
file.seek(0)
file.write(content)
file.close()
articles += [article]
content = template.process_index(*articles)
file = open(join(target_directory, 'index.html'), 'w')
file.write(content)
file.close()