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/template.py
2024-05-26 14:53:09 +02:00

64 lines
No EOL
2 KiB
Python

from dataclasses import dataclass
from io import TextIOWrapper
from jinja2 import Environment, Template, FileSystemLoader, select_autoescape
from json import loads
from os.path import join
from article import Article, Page, Page
TEMPLATE_VERSIONS = [1]
@dataclass
class TemplateConfig:
version: int
name: str
articles_per_page: int
@staticmethod
def from_open_file(file: TextIOWrapper) -> "TemplateConfig":
content = file.read()
data = loads(content)
if data['version'] not in TEMPLATE_VERSIONS:
raise ValueError('Template version' + data['version'] + ' is not compatible. ' + # TODO right exception?
'Supported versions: ' + ', '.join(str(i) for i in TEMPLATE_VERSIONS))
return TemplateConfig(**data)
class TemplateEnvironment:
environment: Environment
config: TemplateConfig
site: Site
article_template: Template
index_template: Template
def __init__(self, template_directory: str, site: Site):
self.environment = Environment(
loader = FileSystemLoader(template_directory, followlinks=True),
autoescape = select_autoescape()
)
self.site = site
self.article_template = self.environment.get_template('article_template.html')
self.index_template = self.environment.get_template('index.html')
self.__load_config(template_directory)
def __load_config(self, template_directory: str):
fn = join(template_directory, 'template.json')
file = open(fn)
self.config = TemplateConfig.from_open_file(file)
file.close()
def process_article(self, article: Article) -> str:
return self.article_template.render(
site = self.site,
article = article
)
def process_index(self, page: Page, *articles: Article) -> str:
return self.index_template.render(
site = self.site,
page = page,
articles = articles
)