diff --git a/.github/workflows/pr_checker_build.yml b/.github/workflows/pr_checker_build.yml index 2029f9277b..5de69d39d2 100644 --- a/.github/workflows/pr_checker_build.yml +++ b/.github/workflows/pr_checker_build.yml @@ -30,9 +30,18 @@ jobs: if: ${{ github.repository_owner == 'geotribu' }} steps: + - name: Install French locale + id: locale-fr + shell: bash + run: | + sudo locale-gen fr_FR.UTF-8 + sudo update-locale LANG=fr_FR.UTF-8 + - name: Get source code uses: actions/checkout@v4 + + - name: Set up Python uses: actions/setup-python@v5 with: diff --git a/content/articles/.pages b/content/articles/.pages index 6c7e6e64c5..803c32857b 100644 --- a/content/articles/.pages +++ b/content/articles/.pages @@ -1,6 +1,7 @@ title: "📖 Articles" nav: + - "Derniers articles": index.md - "2024" - "2023" - "2022" diff --git a/content/articles/index.md b/content/articles/index.md new file mode 100644 index 0000000000..c4f4f21ee8 --- /dev/null +++ b/content/articles/index.md @@ -0,0 +1,13 @@ +--- +title: "Liste des derniers articles parus" +template: custom_templates/index_articles.html +# theme customizations +hide: + - footer + - navigation + - toc +search: + exclude: true +--- + + diff --git a/content/theme/custom_templates/index_articles.html b/content/theme/custom_templates/index_articles.html new file mode 100644 index 0000000000..4e195afafd --- /dev/null +++ b/content/theme/custom_templates/index_articles.html @@ -0,0 +1,74 @@ +{% extends "base.html" %} + +{% block styles %} +{{ super() }} + + +{% endblock %} + + +{% block tabs %} +{{ super() }} + + +
+
+
+
+

Geotribu

+
+
+ Bannière Geotribu +
+
+

Site collaboratif sur la géomatique libre et ouverte.

+
+
+
+
+ + +
+
+ {% if config.extra.latest %}{% for contenu in config.extra.latest.articles %} +
+
+
+ +

{{ contenu.title | default('Titre') }}

+
+ + {% if contenu.subtitle %}

{{ contenu.subtitle | default('Sous-titre') }}

{% + endif + %} + {% for tag in contenu.tags %} + {{ tag }}{{ ", " if not loop.last else + "" }} + {% endfor %} +
{{ "Publié le {}".format(contenu.date_txt_long) | + default('vendredi 9 août 1985') }} par {{ contenu.authors | default('Prénom NOM') | join(", ") }}
+

{{ contenu.description | default('Description') }}

+ Lire cet article... +
+ +
+
+ {% endfor %}{% endif %} + +
+
+ + +{% endblock %} diff --git a/scripts/050_mkdocs_populate_latest.py b/scripts/050_mkdocs_populate_latest.py index bf5003c26b..f3230f31ca 100644 --- a/scripts/050_mkdocs_populate_latest.py +++ b/scripts/050_mkdocs_populate_latest.py @@ -12,6 +12,7 @@ # 3rd party import yaml +from babel.dates import format_date from mkdocs.structure.pages import Page from mkdocs.utils import yaml_load from mkdocs.utils.meta import get_data @@ -83,15 +84,26 @@ def get_latest_content( page_meta = get_data(source)[1] + date_txt_long = format_date( + date=page_meta.get("date"), format="long", locale="fr_FR" + ) + page_rel = str(content.relative_to("content/"))[:-3] if page_meta.get("image") is None or page_meta.get("image") == "": social_card_url = f"{social_card_image_base}{page_rel}.png" output_contents_list.append( - get_data(source)[1] | {"url_rel": page_rel} | {"image": social_card_url} + get_data(source)[1] + | {"url_rel": page_rel} + | {"image": social_card_url} + | {"date_txt_long": date_txt_long} ) else: - output_contents_list.append(get_data(source)[1] | {"url_rel": page_rel}) + output_contents_list.append( + get_data(source)[1] + | {"url_rel": page_rel} + | {"date_txt_long": date_txt_long} + ) return output_contents_list diff --git a/scripts/mkdocs_populate_latest.py b/scripts/mkdocs_populate_latest.py new file mode 100644 index 0000000000..4a3cf9b499 --- /dev/null +++ b/scripts/mkdocs_populate_latest.py @@ -0,0 +1,117 @@ +#! python3 # noqa: E265 + +"""Script permettant de lister les derniers contenus avec leurs propriétés + dans un fichier YAML. Utilisé pour la page d'accueil et les pages + d'index des derniers contenus publiés. +""" + +# ############################################################################ +# ########## Libraries ############# +# ################################## + +# standard library +import locale +import logging +from datetime import datetime +from pathlib import Path +from typing import Literal +from zoneinfo import ZoneInfo + +# 3rd party +import yaml +from mkdocs.structure.pages import Page +from mkdocs.utils.meta import get_data + +# ########################################################################### +# ########## Global ################ +# ################################## + +# journalisation +logger = logging.getLogger("mkdocs") + +# gestion des dates +config_tz = ZoneInfo("Europe/Paris") +locale.setlocale(locale.LC_TIME, "fr_FR.UTF-8") + +# ########################################################################### +# ########## Functions ############# +# ################################## + + +def format_datetime(in_datetime_string: str, out_format: str = "long") -> str: + """Formatte un datetime au format textuel standard (isocalendar) en version textuelle. + Proche du fonctionnement de 'babel.format_date'. + + :param str in_datetime_string: chaîne de caractères en entrée. Doit être au format ISO. + :param str out_format: format de sortie, defaults to "long" + + :return str: chaîne de caractères formatée + """ + dt = datetime.fromisoformat(in_datetime_string).replace(tzinfo=config_tz) + if out_format == "long": + return dt.strftime("%A %d %B %Y") + + +def get_latest_content( + content_type: Literal["articles", "rdp"], count: int = 10 +) -> list[dict]: + """Liste les X (défini par 'count') derniers contenus d'un certain type + en retournant les métadonnées de chaque contenu, ainsi que quelques + attributs personnalisés. + + :param Literal["articles", "rdp"] content_type: type de contenu à lister + :param int count: nombre de contenus à lister, defaults to 10 + + :return list[dict]: liste des contenus avec leurs attributs + """ + output_contents_list: list[Page] = [] + + if content_type == "articles": + glob_pattern = "202*/202*.md" + elif content_type == "rdp": + glob_pattern = "202*/rdp_202*.md" + + for content in sorted( + Path(f"content/{content_type}/").glob(glob_pattern), reverse=True + )[:count]: + with content.open(encoding="utf-8-sig", errors="strict") as f: + source = f.read() + # markdown, meta = get_data(source) + + # ajout attributs personnalisés + output_contents_list.append( + # ajout URL relative + get_data(source)[1] + | {"url_rel": str(content.relative_to("content/"))[:-3]} + # ajoute la date au format textuel + | { + "date_txt_full": format_datetime( + in_datetime_string=get_data(source)[1].get("date"), + out_format="long", + ) + } + ) + + return output_contents_list + + +# ########################################################################### +# ########## Main ################## +# ################################## + +output_dict = {"latest": {"articles": [], "rdp": []}} +# print(get_latest_content(content_type="articles")) +for k in output_dict.get("latest"): + output_dict["latest"][k] = get_latest_content(content_type=k) + +# écrit le fichier final +with Path("config/extra_latest.yml").open("w", encoding="UTF-8") as out_file: + yaml.safe_dump( + output_dict, + out_file, + allow_unicode=True, + default_flow_style=False, + encoding="UTF8", + # indent=4, + sort_keys=True, + )