This repository has been archived on 2025-01-08. You can view files and clone it, but cannot push or open issues or pull requests.
blog-software/compiler.py
2024-05-25 19:05:16 +02:00

71 lines
No EOL
2.5 KiB
Python

from json import loads
from os import walk, mkdir
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, 'articles'), join(target_directory, 'article'), dirs_exist_ok=True)
try:
mkdir(join(target_directory, 'index'))
except FileExistsError:
pass
file = open(join(work_directory, 'config.json'))
site = Site.from_open_file(file)
file.close()
template = TemplateEnvironment(template_directory, site)
articles_per_page = template.config.articles_per_page
articles = []
for root, dirs, files in walk(join(target_directory, 'article')):
for fn in files:
if fn.endswith('.html'):
file = open(join(root, fn), 'r+')
id = fn.split('.')[0]
article = Article.from_open_file(id, file)
content = template.process_article(article)
file.seek(0)
file.write(content)
file.close()
articles += [article]
page = 1
while len(articles) > 0:
if page == 1:
fn = join(target_directory, 'index.html')
else:
fn = join(target_directory, 'index', f'page{page}.html')
articles_on_page = articles[:articles_per_page] # TODO make this customizable
content = template.process_index(*articles_on_page)
file = open(fn, 'w')
file.write(content)
file.close()
articles = articles[articles_per_page:]
page += 1