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]