feat: added a nice overview card site

This commit is contained in:
2025-04-14 15:45:06 +02:00
parent ee26af8b35
commit 432f16ba08
5 changed files with 160 additions and 44 deletions

View File

@@ -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'<ul><a href="{self.relative_url}"><bold>{self.flag} {self.native_name}</bold></a></ul>'
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 "<content/>"
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 "<a href=\"{article_href}\"> {article_language_flag} {article_language_name} </a>"
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:

View File

@@ -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