From d019884dbe0dd9ae1693c672cf556a329f379888 Mon Sep 17 00:00:00 2001 From: Hazel Noack Date: Fri, 16 May 2025 15:01:09 +0200 Subject: [PATCH] implemented data structure for cross article context --- src/articles/ku.md | 4 +-- stsg/build.py | 68 ++++++++++++++++++++++++++++++++++++---------- 2 files changed, 56 insertions(+), 16 deletions(-) diff --git a/src/articles/ku.md b/src/articles/ku.md index 3bea299..4c843fc 100644 --- a/src/articles/ku.md +++ b/src/articles/ku.md @@ -1,6 +1,6 @@ # Navê Gotarê -[{article_title:example}]({article_url:example}) +[{{example.title}}]({{example.url}}) Ev gotar, mînakek placeholder ya bi zimanê Kurdî ye. Nivîs, weşan û rûpelên nûçe di vê belgeyê de têne pêşniyar kirin. Ev metn ji bo testkirina layout an jî demo-yê hatiye çêkirin û çend bingehên cihanî yên naveroka gotarê nîşan dide. @@ -35,4 +35,4 @@ Kodê li ser vê koda simplesa gotinê ye û dikare weşana nûçe an demo-yê p # Encama Gotarê Di encama gotarê de, hûn dikarin her çend beşên bingehîn yên nûçe, daxuyanî û şirove yên navekî bifikirin. -Bê guman, ev placeholder bi awayek qelew li ser çalakiya te ya malper, blog an jî her sedema dijîtal tê de karîger e. \ No newline at end of file +Bê guman, ev placeholder bi awayek qelew li ser çalakiya te ya malper, blog an jî her sedema dijîtal tê de karîger e. diff --git a/stsg/build.py b/stsg/build.py index b97d6c2..ec29008 100644 --- a/stsg/build.py +++ b/stsg/build.py @@ -4,7 +4,7 @@ import shutil from pathlib import Path import os import markdown -from typing import Optional, Union, Dict, Generator, List, DefaultDict, Any +from typing import Optional, Union, Dict, Generator, List, DefaultDict, Any, TypedDict, Set from bs4 import BeautifulSoup from collections import defaultdict import toml @@ -131,6 +131,15 @@ class LanguageDict(dict): LANGUAGES = LanguageDict() +class CrossArticleContext(TypedDict): + slug: str + title: str # from article is the same as slug + url: str + article_url: str # from article it is the same as url, from article_taanslation it links to the article + date: str + iso_date: str + + class ArticleTranslation: def __init__(self, file: Path, article: Article): self.file = file @@ -143,26 +152,37 @@ class ArticleTranslation: self.location_in_tree = [self.language_code, *self.article.location_in_tree] self.url = "/" + "/".join(self.location_in_tree) self.dist_path = Path(config.setup.dist_directory, *self.location_in_tree) + self.cross_article_context = TRANSLATED_CROSS_ARTICLE_CONTEXT[self.language_code][self.article.slug] = {} + self.priority = LANGUAGES[self.language_code]["priority"] self.real_language_code = LANGUAGES[self.language_code]["code"] - + + self.html_content = self.file.read_text() + if self.file.suffix == ".md": + self.html_content = markdown.markdown(self.html_content) + def __init_context__(self): self.context["meta"] = self.article.context_shared self.context["url"] = self.url self.context["language"] = LANGUAGES[self.language_code] self.context["article_url"] = self.article.url + self.context["title"] = get_first_header_content(self.html_content, fallback=LANGUAGES[self.language_code]["native_name"]) - html_content = self.file.read_text() - if self.file.suffix == ".md": - html_content = markdown.markdown(html_content) - - self.context["title"] = get_first_header_content(html_content, fallback=LANGUAGES[self.language_code]["native_name"]) - self.context["content"] = html_content - self.context["preview"] = get_preview_text(html_string=html_content) + self.cross_article_context.update(self.article.context_shared) + self.cross_article_context["title"] = self.context["title"] + self.cross_article_context["article_url"] = self.article.url + self.cross_article_context["url"] = self.url # get children - self.context["children"] = [c.article_translations_map[self.language_code].context for c in self.article.child_articles if self.language_code in c.article_translations_map] + self.context["children"] = [ + c.article_translations_map[self.language_code].context for c in self.article.child_articles + if self.language_code in c.article_translations_map + ] + + def __init_content_context__(self): + self.context["content"] = self.html_content + self.context["preview"] = get_preview_text(html_string=self.html_content) def build(self): self.dist_path.mkdir(parents=True, exist_ok=True) @@ -189,6 +209,7 @@ class Article: if self.slug in ARTICLE_LAKE: logger.error("two articles have the same name at %s and %r", ARTICLE_LAKE[self.slug].directory, self.directory) exit(1) + self.cross_article_context = CROSS_ARTICLE_CONTEXT[self.slug] = {} ARTICLE_LAKE[self.slug] = self self.location_in_tree: List[str] = location_in_tree or [] @@ -231,6 +252,11 @@ class Article: self.context.update(self.context_shared) + 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"] + + # recursive context structures translation_list = self.context["translations"] = [] child_article_list = self.context["children"] = [] @@ -248,9 +274,15 @@ class Article: for a in self.child_articles: a.__init_context__() + def __init_content_context__(self): + for at in self.article_translations_list: + at.__init_content_context__() + for a in self.child_articles: + a.__init_content_context__() + def build(self): self.dist_path.mkdir(parents=True, exist_ok=True) - + with Path(self.dist_path, "index.html").open("w") as f: f.write(TEMPLATE["article"].render(self.context)) @@ -263,24 +295,32 @@ class Article: # GLOBALS logger = logging.getLogger("stsg.build") +CROSS_ARTICLE_CONTEXT: Dict[str, CrossArticleContext] = {} +TRANSLATED_CROSS_ARTICLE_CONTEXT: Dict[str, Dict[str, CrossArticleContext]] = defaultdict(dict) ARTICLE_LAKE: Dict[str, Article] = {} ARTICLE_REFERENCE_VALUES: DefaultDict[str, Dict[str, str]] = defaultdict(dict) + def build(): - logger.info("starting build process...") + logger.info("starting build process...") logger.info("copying static folder...") shutil.copytree(Path(config.setup.source_directory, "static"), Path(config.setup.dist_directory, "static"), dirs_exist_ok=True) logger.info("building page tree...") tree = Article(directory=Path(config.setup.source_directory, "articles"), is_root=True) - + logger.info("compiling tree context...") tree.__init_context__() + tree.__init_content_context__() import json with Path("context.json").open("w") as f: json.dump(tree.context, f, indent=4) + with Path("cross_article_context.json").open("w") as f: + json.dump(CROSS_ARTICLE_CONTEXT, f, indent=4) + with Path("t_cross_article_context.json").open("w") as f: + json.dump(TRANSLATED_CROSS_ARTICLE_CONTEXT, f, indent=4) logger.info("dumping page tree...") - tree.build() \ No newline at end of file + tree.build()