From 5ca9945856c6dded70fcd696ee5ab678ba5a4c5a Mon Sep 17 00:00:00 2001 From: omicron Date: Thu, 13 Aug 2026 00:59:39 +0200 Subject: [PATCH] Add support for extra static file assets in templates --- omicron/ssg/output/__init__.py | 2 ++ omicron/ssg/output/file.py | 24 ++++++++++++++++ omicron/ssg/site.py | 16 ++++++++++- omicron/ssg/templates/plain/assets/style.css | 29 ++++++++++++++++++++ omicron/ssg/templates/plain/base.html | 3 +- 5 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 omicron/ssg/output/file.py create mode 100644 omicron/ssg/templates/plain/assets/style.css diff --git a/omicron/ssg/output/__init__.py b/omicron/ssg/output/__init__.py index df8f0f9..f8c332c 100644 --- a/omicron/ssg/output/__init__.py +++ b/omicron/ssg/output/__init__.py @@ -1,6 +1,7 @@ from omicron.ssg.output.output import Output from omicron.ssg.output.content import Content, ContentError from omicron.ssg.output.factory import create_content, is_content +from omicron.ssg.output.file import File from omicron.ssg.output.index import Index, discover_index from omicron.ssg.output.memory import Memory from omicron.ssg.output.tags import Tags, discover_tags @@ -11,6 +12,7 @@ __all__ = [ "ContentError", "create_content", "is_content", + "File", "Index", "discover_index", "Memory", diff --git a/omicron/ssg/output/file.py b/omicron/ssg/output/file.py new file mode 100644 index 0000000..763ca84 --- /dev/null +++ b/omicron/ssg/output/file.py @@ -0,0 +1,24 @@ +import logging +import shutil +from typing import TYPE_CHECKING +from omicron.ssg.output.output import Output +from pathlib import Path + +log = logging.getLogger(__name__) + +if TYPE_CHECKING: + from omicron.ssg.site import Site # for static checking with mypy +else: + Site = "omicron.ssg.site.Site" # for runtime checking with beartype + + +class File(Output): + def __init__(self, uri: str, source: Path): + super().__init__(uri) + self.source = source + + def write(self, site: Site) -> None: + dest = site.output_path / self.uri + dest.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(self.source, dest) + log.debug("Copied %s -> %s", self.source, dest) diff --git a/omicron/ssg/site.py b/omicron/ssg/site.py index 57f3a2c..54e0745 100644 --- a/omicron/ssg/site.py +++ b/omicron/ssg/site.py @@ -8,6 +8,7 @@ from omicron.ssg.output import ( ContentError, is_content, create_content, + File, Memory, discover_index, discover_tags, @@ -104,9 +105,22 @@ class Site: tags.sort(key=lambda x: x[1], reverse=True) self.tags_by_count = tags + def discover_assets(self) -> None: + assets_path = self.template_path / "assets" + if not assets_path.is_dir(): + return + for file in assets_path.rglob("*"): + if file.is_file(): + uri = "assets/" + file.relative_to(assets_path).as_posix() + asset = File(uri, file) + self.add_by_uri(asset) + self.other_outputs.append(asset) + log.debug("Discovered template asset %s", uri) + def discover(self) -> None: log.info("Discovering content...") - pygments = Memory("pygments.css", highlight_style()) + self.discover_assets() + pygments = Memory("assets/pygments.css", highlight_style()) self.other_outputs.append(pygments) self.add_by_uri(pygments) content_path = self.site_path / "content" diff --git a/omicron/ssg/templates/plain/assets/style.css b/omicron/ssg/templates/plain/assets/style.css new file mode 100644 index 0000000..5a179b1 --- /dev/null +++ b/omicron/ssg/templates/plain/assets/style.css @@ -0,0 +1,29 @@ +*, *::before, *::after { + box-sizing: border-box; +} + +html { + font-size: 62.5%; +} + +body { + font-size: 1.8rem; + font-family: sans-serif; + line-height: 1.6; + max-width: 65rem; + margin: 0 auto; + padding: 1rem; + color: #222; +} + +a { + color: #0066cc; +} + +pre { + overflow-x: auto; +} + +code { + font-size: 0.9em; +} diff --git a/omicron/ssg/templates/plain/base.html b/omicron/ssg/templates/plain/base.html index 336efee..e73da3f 100644 --- a/omicron/ssg/templates/plain/base.html +++ b/omicron/ssg/templates/plain/base.html @@ -4,7 +4,8 @@ {% block title %}{{ site.name }}{% endblock %} - + + {% block head %}{% endblock %}