From 432f16ba080558a8ab8240174d1f27533acec819 Mon Sep 17 00:00:00 2001 From: Lars Noack Date: Mon, 14 Apr 2025 15:45:06 +0200 Subject: [PATCH] feat: added a nice overview card site --- src/_templates/article.html | 40 +++++++++++ src/_templates/overview.html | 38 ++++++++++ src/_templates/overview_card.html | 8 +++ stsg/build.py | 113 +++++++++++++++++++----------- stsg/config.py | 5 +- 5 files changed, 160 insertions(+), 44 deletions(-) create mode 100644 src/_templates/article.html create mode 100644 src/_templates/overview.html create mode 100644 src/_templates/overview_card.html diff --git a/src/_templates/article.html b/src/_templates/article.html new file mode 100644 index 0000000..7dc13de --- /dev/null +++ b/src/_templates/article.html @@ -0,0 +1,40 @@ + + + + + + STSG + + + + + + + +
+
+ Go Back +
+
+ {article_content} +
+
+ + + + + diff --git a/src/_templates/overview.html b/src/_templates/overview.html new file mode 100644 index 0000000..70ab3de --- /dev/null +++ b/src/_templates/overview.html @@ -0,0 +1,38 @@ + + + + + + STSG + + + + + + +
+
+
+ {overview_cards} +
+
+
+ + + + + diff --git a/src/_templates/overview_card.html b/src/_templates/overview_card.html new file mode 100644 index 0000000..31b942b --- /dev/null +++ b/src/_templates/overview_card.html @@ -0,0 +1,8 @@ +
+ +
+

{article_language_flag} {article_language_name}

+

{article_preview}

+
+
+
\ No newline at end of file diff --git a/stsg/build.py b/stsg/build.py index 0ebd7d3..119e704 100644 --- a/stsg/build.py +++ b/stsg/build.py @@ -4,9 +4,9 @@ import shutil from pathlib import Path import os import markdown -from typing import Optional, Union, Dict, Generator +from typing import Optional, Union, Dict, Generator, List -from .config import SOURCE_DIRECTORY, DIST_DIRECTORY, LANGUAGE_INFORMATION +from .config import SOURCE_DIRECTORY, DIST_DIRECTORY, LANGUAGE_INFORMATION, ARTICLE_PREVIEW_LENGTH logger = logging.getLogger("stsg.build") @@ -92,32 +92,9 @@ def copy_static(path: CustomPath): -class Article(CustomPath): - def __init__(self, path: CustomPath): - super().__init__(path.path) - - def get_content(self) -> str: - if self.name.endswith(".md"): - return markdown.markdown(self.read_text()) - - return self.read_text() - - @property - def article_directory(self) -> Path: - return self.dist_path.parent / self.stem - - class CustomLanguageCode: - def __init__(self, file: CustomPath): - self.file = file - - @property - def language_code(self) -> str: - return self.file.stem - - @property - def relative_url(self) -> str: - return "/" + str(self) + def __init__(self, language_code: str): + self.language_code = language_code def __repr__(self) -> str: return f"{self.language_code}" @@ -141,44 +118,98 @@ class CustomLanguageCode: def native_name(self) -> str: return self._get_additional_data()["native_name"] - @property - def html_code(self) -> str: - return f'' +class Article(CustomPath): + def __init__(self, path: CustomPath): + super().__init__(path.path) + + def get_content(self) -> str: + if self.name.endswith(".md"): + return markdown.markdown(self.read_text()) + + return self.read_text() + + @property + def article_directory(self) -> Path: + return self.dist_path.parent / self.stem + + @property + def language_code(self) -> CustomLanguageCode: + return CustomLanguageCode(self.stem) + + def get_article_keys(self) -> Dict[str, str]: + article_content = self.get_content() + + return { + "article_content": article_content, + "article_preview": article_content[:ARTICLE_PREVIEW_LENGTH], + "article_href": "/" + str(self.path.parent / self.stem), + "article_language_name": self.language_code.native_name, + "article_language_code": self.language_code.language_code, + "article_language_flag": self.language_code.flag, + } class Template: def __init__(self, root: CustomPath): self.root = root - self.articles = [] + self.articles: List[Article] = [] def copy(self): return Template(root=self.root) def _replace_keywords(self, text: str, **placeholder_values: str) -> str: for key, value in placeholder_values.items(): - text = text.replace(f"<{key}/>", value) - text = text.replace(f"<{key} />", value) + text = text.replace("{" + key + "}", value) return text - @property - def article_template(self) -> str: + def get_article_template(self) -> str: article = self.root.get_child("article.html", force_file=True) - return article.source_path.read_text() if article else "" + return article.source_path.read_text() if article else "{article_content}" - def convert_article(self, path: Article): + def build_article(self, path: Article): logger.info("converting %s", path) article_text = self._replace_keywords( - self.article_template, - content = path.get_content(), + self.get_article_template(), + **path.get_article_keys(), ) path.article_directory.mkdir(parents=True, exist_ok=True) with Path(path.article_directory, "index.html").open("w") as f: f.write(article_text) + self.articles.append(path) + + def get_overview_card_template(self) -> str: + overview_card = self.root.get_child("overview_card.html", force_file=True) + return overview_card.source_path.read_text() if overview_card else " {article_language_flag} {article_language_name} " + + def get_overview_template(self) -> str: + overview = self.root.get_child("overview.html", force_file=True) + return overview.source_path.read_text() if overview else "{overview_cards}" + + def build_overview(self, root: CustomPath): + if not len(self.articles): + return + + overview_card_template = self.get_overview_card_template() + + overview_cards = "\n".join(self._replace_keywords( + overview_card_template, + **a.get_article_keys(), + ) for a in self.articles) + + overview_text = self._replace_keywords( + self.get_overview_template(), + overview_cards = overview_cards, + ) + + with Path(root.dist_path, "index.html").open("w") as f: + f.write(overview_text) + + def walk_directory(root: CustomPath, template: Optional[Template] = None): template_dir = root.get_child("_templates", force_directory=True) @@ -194,13 +225,13 @@ def walk_directory(root: CustomPath, template: Optional[Template] = None): continue if current_path.source_path.is_file(): - template.convert_article(Article(current_path)) + template.build_article(Article(current_path)) continue if current_path.source_path.is_dir(): walk_directory(current_path, template=template.copy()) - + template.build_overview(root=root) static_dir = root.get_child("static", force_directory=True) if static_dir: diff --git a/stsg/config.py b/stsg/config.py index eaf9bfb..94c5611 100644 --- a/stsg/config.py +++ b/stsg/config.py @@ -1,11 +1,10 @@ SOURCE_DIRECTORY = "src" DIST_DIRECTORY = "dist" -# relative to SOURCE_DIRECTORY / DIST_DIRECTORY -STATIC_DIRECTORY = "static" +# config template stuff +ARTICLE_PREVIEW_LENGTH = 200 # FOR DEVELOPMENT - CODE_DIRECTORY = "stsg" # LANGUAGE INFORMATION