2024-05-23 16:16:02 +02:00
|
|
|
from json import loads
|
2024-05-24 18:17:39 +02:00
|
|
|
from os import walk, mkdir
|
2024-05-21 17:43:53 +02:00
|
|
|
from os.path import isdir, join, exists
|
2024-05-19 10:26:52 +02:00
|
|
|
from shutil import copytree
|
2024-05-23 16:16:02 +02:00
|
|
|
from typing import Dict
|
|
|
|
|
|
|
|
from article import Article, Site
|
|
|
|
from template import TemplateEnvironment
|
2024-05-19 10:26:52 +02:00
|
|
|
|
2024-05-21 17:43:53 +02:00
|
|
|
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")
|
|
|
|
|
2024-05-19 10:26:52 +02:00
|
|
|
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)
|
2024-05-24 18:17:39 +02:00
|
|
|
try:
|
|
|
|
mkdir(join(target_directory, 'index'))
|
|
|
|
except FileExistsError:
|
|
|
|
pass
|
2024-05-19 10:26:52 +02:00
|
|
|
|
2024-05-22 14:42:05 +02:00
|
|
|
file = open(join(work_directory, 'config.json'))
|
2024-05-23 16:16:02 +02:00
|
|
|
site = Site.from_open_file(file)
|
2024-05-22 14:42:05 +02:00
|
|
|
file.close()
|
|
|
|
|
2024-05-23 16:16:02 +02:00
|
|
|
template = TemplateEnvironment(template_directory, site)
|
|
|
|
articles = []
|
|
|
|
|
2024-05-19 10:26:52 +02:00
|
|
|
for root, dirs, files in walk(join(target_directory, 'post')):
|
|
|
|
for fn in files:
|
|
|
|
if fn.endswith('.html'):
|
|
|
|
file = open(join(root, fn), 'r+')
|
|
|
|
|
2024-05-23 16:16:02 +02:00
|
|
|
article = Article.from_open_file(file)
|
|
|
|
content = template.process_article(article)
|
2024-05-19 10:26:52 +02:00
|
|
|
|
|
|
|
file.seek(0)
|
|
|
|
file.write(content)
|
|
|
|
file.close()
|
|
|
|
|
2024-05-23 16:16:02 +02:00
|
|
|
articles += [article]
|
2024-05-19 10:26:52 +02:00
|
|
|
|
2024-05-24 18:17:39 +02:00
|
|
|
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[:10] # TODO make this customizable
|
|
|
|
content = template.process_index(*articles_on_page)
|
|
|
|
|
|
|
|
file = open(fn, 'w')
|
|
|
|
file.write(content)
|
|
|
|
file.close()
|
|
|
|
|
|
|
|
articles = articles[10:]
|
|
|
|
page += 1
|