WIP: template merging (paths)

This commit is contained in:
Daniel Fichtinger 2025-07-02 14:39:27 -04:00
parent 0e3e9d243d
commit a4717eed4c
3 changed files with 48 additions and 20 deletions

View file

@ -89,7 +89,9 @@ class ZonaBuilder:
reverse=True, reverse=True,
) )
templater = Templater( templater = Templater(
template_dir=self.layout.templates, post_list=post_list root=self.layout.root,
template_dir=self.layout.templates,
post_list=post_list,
) )
self.item_map = { self.item_map = {
item.source.resolve(): item for item in self.items item.source.resolve(): item for item in self.items

View file

@ -9,7 +9,7 @@ import yaml
class Layout: class Layout:
root: Path root: Path
content: Path content: Path
templates: Path templates: Path | None
output: Path output: Path
@classmethod @classmethod
@ -24,10 +24,9 @@ class Layout:
) )
if validate: if validate:
if not layout.content.is_dir(): if not layout.content.is_dir():
raise FileNotFoundError("Missing required content directory!") raise FileNotFoundError(
if not layout.templates.is_dir(): "Missing required content directory!"
# use the included defaults )
layout.templates = util.get_resource_dir("templates")
return layout return layout

View file

@ -1,39 +1,66 @@
from dataclasses import dataclass
from pathlib import Path from pathlib import Path
from typing import Literal from typing import Literal
from jinja2 import Environment, FileSystemLoader, select_autoescape from jinja2 import Environment, FileSystemLoader, select_autoescape
from jinja2.environment import Template
from zona.models import Item from zona.models import Item
from zona.markdown import md_to_html from zona.markdown import md_to_html
from zona import util
def get_header(template_dir: Path) -> str | None: def get_header(root: Path) -> str | None:
md_header = template_dir / "header.md" md_header = root / "header.md"
html_header = template_dir / "header.html" html_header = root / "header.html"
if md_header.exists(): if md_header.exists():
return md_to_html(md_header.read_text(), None) return md_to_html(md_header.read_text(), None)
elif html_header.exists(): elif html_header.exists():
return html_header.read_text() return html_header.read_text()
def get_footer(template_dir: Path) -> str | None: def get_footer(root: Path) -> str | None:
md_footer = template_dir / "footer.md" md_footer = root / "footer.md"
html_footer = template_dir / "footer.html" html_footer = root / "footer.html"
if md_footer.exists(): if md_footer.exists():
return md_to_html(md_footer.read_text(), None) return md_to_html(md_footer.read_text(), None)
elif html_footer.exists(): elif html_footer.exists():
return html_footer.read_text() return html_footer.read_text()
class TemplateEnv:
def __init__(self, user_dir: Path | None):
default_path = util.get_resource_dir("templates")
self.default: Environment = Environment(
loader=FileSystemLoader(default_path),
autoescape=select_autoescape(["html", "xml"]),
)
self.user: Environment | None = (
Environment(
loader=FileSystemLoader(user_dir),
autoescape=select_autoescape(["html", "xml"]),
)
if user_dir
else None
)
def get_template(self, name: str) -> Template:
for env in (
[self.user, self.default] if self.user else [self.default]
):
if name in env.list_templates():
return env.get_template(name)
raise FileNotFoundError(f"Template {name} could not be found!")
# TODO: add next/prev post button logic to posts # TODO: add next/prev post button logic to posts
# TODO: add a recent posts element that can be included elsewhere? # TODO: add a recent posts element that can be included elsewhere?
class Templater: class Templater:
def __init__(self, template_dir: Path, post_list: list[Item]): def __init__(
self.env: Environment = Environment( self, root: Path, template_dir: Path | None, post_list: list[Item]
loader=FileSystemLoader(template_dir), ):
autoescape=select_autoescape(["html", "xml"]), self.env: TemplateEnv = TemplateEnv(template_dir)
) self.root: Path = root
self.template_dir: Path = template_dir self.header: str | None = get_header(self.root)
self.header: str | None = get_header(template_dir) self.footer: str | None = get_footer(self.root)
self.footer: str | None = get_footer(template_dir)
self.post_list: list[Item] = post_list self.post_list: list[Item] = post_list
def render_item(self, item: Item, content: str) -> str: def render_item(self, item: Item, content: str) -> str: