diff --git a/stsg/build.py b/stsg/build.py index fd78a11..1c16aa8 100644 --- a/stsg/build.py +++ b/stsg/build.py @@ -121,11 +121,11 @@ class LanguageDict(dict): LANGUAGES = LanguageDict() -def compile_cross_article_context(cross_article_context): - title = cross_article_context["title"] - url = cross_article_context["url"] +def add_html_link(c): + name = c["name"] + url = c["url"] - cross_article_context["link"] = f'{title}' + c["link"] = f'{name}' @@ -193,7 +193,7 @@ class ArticleTranslation: self.cross_article_context["title"] = self.context["title"] self.cross_article_context["article_url"] = self.article.url self.cross_article_context["url"] = self.url - compile_cross_article_context(self.cross_article_context) + add_html_link(self.cross_article_context) # get children self.context["children"] = [ @@ -272,6 +272,26 @@ class Article: context_shared: Dict[str, Any] cross_article_context: Dict[str, Any] + child_articles: List[Article] + article_translations_list: List[ArticleTranslation] + article_translations_map: Dict[str, ArticleTranslation] + + linked_articles: List[Article] + + @cached_property + def related_articles(self) -> List[Article]: + used_slugs = set() + related = [] + + for a in [*self.child_articles, *self.linked_articles]: + if a.slug in used_slugs: + continue + + used_slugs.add(a.slug) + related.append(a) + + return related + def __init__(self, directory: Path, article_path: Optional[List[str]] = None, is_root: bool = False, parent: Optional[Article] = None): self.directory = directory @@ -283,11 +303,13 @@ class Article: self.cross_article_context = CROSS_ARTICLE_CONTEXT[self.slug] = {} ARTICLE_LAKE[self.slug] = self + + self.linked_articles = [] # build the tree - self.child_articles: List[Article] = [] - self.article_translations_list: List[ArticleTranslation] = [] - self.article_translations_map: Dict[str, ArticleTranslation] = {} + self.child_articles = [] + self.article_translations_list = [] + self.article_translations_map = {} for c in self.directory.iterdir(): if c.name == "index.toml": @@ -328,29 +350,25 @@ class Article: self.context["slug"] = self.slug self.context["name"] = self.name self.context["url"] = self.url + add_html_link(self.context) self.context["date"] = self.modified_at.strftime(config.formatting.datetime_format) self.context["iso_date"] = self.modified_at.isoformat() self.context["author"] = self.author - self.cross_article_context.update(self.context_shared) - self.cross_article_context["title"] = self.context_shared["slug"] - self.cross_article_context["article_url"] = self.context_shared["url"] - compile_cross_article_context(self.cross_article_context) - # recursive context structures - translation_list = self.context["translations"] = [] - child_article_list = self.context["children"] = [] + self.context["translations"] = [t.context for t in self.self.article_translations_list] + self.context["children"] = [c.context for c in self.child_articles] + for lang, article in self.article_translations_map.items(): + self.context[lang] = article.context - for article_translation in self.article_translations_list: - self.context[article_translation.language_code] = article_translation.context - translation_list.append(article_translation.context) - - for child_article in self.child_articles: - child_article_list.append(child_article.context) - - # recursively build context for at in self.article_translations_list: at.__init_context__() + + # the __init_context__ functions of the translations needs to be called first + # because the linked articles will be set there + self.context["linked"] = [l.context for l in self.linked_articles] + self.context["related"] = [r.context for r in self.related_articles] + for a in self.child_articles: a.__init_context__() diff --git a/stsg/definitions.py b/stsg/definitions.py index d1e254f..3537aa8 100644 --- a/stsg/definitions.py +++ b/stsg/definitions.py @@ -1,4 +1,5 @@ -from typing import TypedDict +from __future__ import annotations +from typing import TypedDict, List class ArticleConfig(TypedDict): @@ -12,15 +13,27 @@ class ArticleContext(TypedDict): slug: str name: str url: str + link: str date: str iso_date: str author: str - + + translations: List[ArticleTranslationContext] + children: List[ArticleContext] + linked: List[ArticleContext] + related: List[ArticleContext] + class ArticleTranslationContext(TypedDict): slug: str name: str url: str + link: str date: str iso_date: str author: str + + translations: List[ArticleTranslationContext] + children: List[ArticleTranslationContext] + linked: List[ArticleTranslationContext] + related: List[ArticleTranslationContext]