add series

This commit is contained in:
Tykayn 2025-05-13 11:29:20 +02:00 committed by tykayn
parent 630ff2da42
commit 3fea367e9a
11 changed files with 185 additions and 123 deletions

View file

@ -113,16 +113,19 @@ Ensuite, on peut tester la viabilité des liens donnés avec check_links.py:
```shell ```shell
py check_links.py cipherbliss_blog py check_links.py cipherbliss_blog
``` ```
# Tests
Lancer les tests avec
```shell
py test_utils.py
```
# Roadmap # Roadmap
- réécriture des liens internes - réécriture des liens internes
- conversion des liens avec nom de domaine si relatifs - conversion des liens avec nom de domaine si relatifs
- détection des ID org-roam pour réécrire les liens html lors de la génération de site web et capsule gemini. - détection des ID org-roam pour réécrire les liens html lors de la génération de site web et capsule gemini.
- réécriture des url des images vers le dossier courant - réécriture des url des images vers le dossier courant
- gestion des séries d'articles avec un tag orgmode #+serie, ce qui crée des indexes de séries et précise les autres posts de la série en fin d'article - gestion des séries d'articles dans la config de site `website_config.py`, ce qui crée des indexes de séries et précise les autres posts de la série en fin d'article.
- page pour un tag listant les articles, trier par date décroissante
- les gains de performance pour ne pas régénérer les pages déjà faites alors qu'elles n'ont pas été modifiée, et un rendu statique un peu plus joli
- mettre un lien vers le fichier Org d'origine en fin d'article, disponible sur une forge en ligne si on l'a mis en config du site web. - mettre un lien vers le fichier Org d'origine en fin d'article, disponible sur une forge en ligne si on l'a mis en config du site web.
- vérifier que les pages non articles sont bien générées - vérifier que les pages non articles sont bien générées
- documenter les scripts - documenter les scripts
@ -134,6 +137,9 @@ py check_links.py cipherbliss_blog
## Fait ## Fait
- les gains de performance pour ne pas régénérer les pages déjà faites alors qu'elles n'ont pas été modifiée, et un rendu statique un peu plus joli
- page pour un tag listant les articles, trier par date décroissante
- en fin d'article, mettre le texte incitant au soutien de l'auteur - en fin d'article, mettre le texte incitant au soutien de l'auteur
- faire la conversion en page gemini dans `linking_articles_prev_next.py` - faire la conversion en page gemini dans `linking_articles_prev_next.py`
- liste de N derniers articles développés sur l'accueil, 10 par défaut - liste de N derniers articles développés sur l'accueil, 10 par défaut

View file

@ -477,6 +477,11 @@ if pandoc_runs_counter > 0 or run_gemini or force_html_regen:
# else: # else:
# #print("Aucun article n'a été converti, la page d'index n'est pas régénérée") # #print("Aucun article n'a été converti, la page d'index n'est pas régénérée")
# Ajouter le compteur de temps d'exécution
print(f"\033[92mTemps d'exécution: {time.time() - start_time:.2f} secondes\033[0m")
def generate_article_pages(json_file, template_file, output_dir): def generate_article_pages(json_file, template_file, output_dir):
""" """
@ -499,7 +504,15 @@ def generate_article_pages(json_file, template_file, output_dir):
print(f"articles count: {len(articles_info.values())}") print(f"articles count: {len(articles_info.values())}")
# Générer les pages pour chaque article # Générer les pages pour chaque article
for article in articles_info.values(): for article in articles_info.values():
print('----------------------- article', article['title']) # print('----------------------- article', article['title'])
# Récupérer le nom de la série si l'article appartient à une série
template_content['SERIE'] = None
found_serie = get_series_name(article['slug'], args.blog)
if found_serie:
template_content['SERIE'] = website_config[args.blog]['SERIES'][found_serie]
if article['first_picture_url']: if article['first_picture_url']:
template_content['OG_IMAGE'] = article['first_picture_url'] template_content['OG_IMAGE'] = article['first_picture_url']
@ -520,22 +533,22 @@ def generate_article_pages(json_file, template_file, output_dir):
slug_to_use = article['slug'] slug_to_use = article['slug']
# Construire le chemin de sortie html en fonction du slug avec l'année # Construire le chemin de sortie html en fonction du slug avec l'année
output_subdir = os.path.join(output_dir, slug_to_use) output_subdir = os.path.join(output_dir, slug_to_use)
print(f"output_subdir: {output_subdir}") # print(f"output_subdir: {output_subdir}")
os.makedirs(output_subdir, exist_ok=True) os.makedirs(output_subdir, exist_ok=True)
output_file = os.path.join(output_subdir ,"index.html") output_file = os.path.join(output_subdir ,"index.html")
print(f"output_file: {output_file}") # print(f"output_file: {output_file}")
# Écrire le fichier de sortie en HTML pour un article # Écrire le fichier de sortie en HTML pour un article
with open(output_file, 'w', encoding='utf-8') as f: with open(output_file, 'w', encoding='utf-8') as f:
f.write(output_html) f.write(output_html)
print(f"Génération de la page gemini pour {article['title']}")
if 'gemini_content' in article and len(article['gemini_content']) > 0: if 'gemini_content' in article and len(article['gemini_content']) > 0:
print(f"Génération de la page gemini pour {article['title']}")
# Construire le chemin de sortie gmi en fonction du slug avec l'année # Construire le chemin de sortie gmi en fonction du slug avec l'année
save_gemini_file(args.blog, article, articles_info, template_content) save_gemini_file(args.blog, article, articles_info, template_content)
counter_gemini += 1 counter_gemini += 1
else: # else:
print(f"----------- on ne génère pas le gemini pour {article['slug']}") # print(f"----------- on ne génère pas le gemini pour {article['slug']}")
print(f"\033[94m Nombre d'articles gemini générés : {counter_gemini}\033[0m") print(f"\033[94m Nombre d'articles gemini générés : {counter_gemini}\033[0m")
return return

View file

@ -34,22 +34,20 @@ pour l'information scientifique) avec Etienne Klein et la
#+begin_quote #+begin_quote
Faire de la science ça ne veut pas dire qu'on ne peut pas se tromper. Faire de la science ça ne veut pas dire qu'on ne peut pas se tromper.
Tous les scientifiques se trompent Tous les scientifiques se trompent régulièrement. L'intérêt de la science consiste à
régulièrement.L'intérêt de la science consiste à
faire examiner nos connaissances avec une méthode précise, afin de faire examiner nos connaissances avec une méthode précise, afin de
savoir comment on se trompe.Combien de personnes savoir comment on se trompe.
Combien de personnes
ayant fait des déclarations qui se sont montrées erronées sont venues ayant fait des déclarations qui se sont montrées erronées sont venues
ensuite dire qu'elles se sont trompées?Il est ensuite dire qu'elles se sont trompées? Il est
primordial de savoir reconnaître que l'on se trompe quand c'est le cas primordial de savoir reconnaître que l'on se trompe quand c'est le cas
pour faire avancer la connaissance.Faire de la pour faire avancer la connaissance. Faire de la science, cultiver son esprit critique, c'est penser contre son propre cerveau.
science, cultiver son esprit critique, c'est penser contre son propre
cerveau."C'est pas une guéguerre entre les "C'est pas une guéguerre entre les scientifiques et la population, les scientifiques sont
scientifiques et la population,les scientifiques sont déjà eux-même incultes en science.Si je vais voir un physicien du CEA où je travaille, et que je lui demande "c'est quoi une cellule souche? c'est quoi un OGM? c'est quoi la 5G?" il y a très peu de chances que j'obtienne une bonne réponse.
déjà eux-même incultes en science.Si je vais voir un
physicien du CEA où je travaille, et que je lui demande "c'est quoi une La compétence dans un domaine ne signifie pas la compétence dans toute la
cellule souche? c'est quoi un OGM? c'est quoi la 5G?" il y a très peu de
chances que j'obtienne une bonne réponse.La
compétence dans un domaine ne signifie pas la compétence dans toute la
science.Comment font alors les gens qui n'ont pas la science.Comment font alors les gens qui n'ont pas la
moindre formation scientifique pour faire le tri dans toutes les moindre formation scientifique pour faire le tri dans toutes les
informations qui leur sont proposées?Par des jeux informations qui leur sont proposées?Par des jeux
@ -62,11 +60,12 @@ l'histoire des idées?on peut tout à fait être
militant et ne pas du tout savoir comment défendre avec des arguments ce militant et ne pas du tout savoir comment défendre avec des arguments ce
que l'on revendique.C'est très grave, parce que ça que l'on revendique.C'est très grave, parce que ça
veut dire qu'on peut défendre tout et surtout n'importe quoi sans ne veut dire qu'on peut défendre tout et surtout n'importe quoi sans ne
rien y comprendre.Quand on est jeune on a beaucoup de rien y comprendre.
temps pour apprendre, mais heureusement après
aussi.Encore faut il souhaiter davantage la recherche Quand on est jeune on a beaucoup de temps pour apprendre, mais heureusement après
de la vérité que de suivre aveuglément un aussi. Encore faut il souhaiter davantage la recherche de la vérité que de suivre aveuglément un groupe.
groupeparadoxalement,la
Paradoxalement,la
propagation de la pensée critique - dans ce qu'elle est réellement, à propagation de la pensée critique - dans ce qu'elle est réellement, à
savoir, exercer sa réflexion contre nos propres biais cognitifs- savoir, exercer sa réflexion contre nos propres biais cognitifs-
nécessite que l'on restaure des figures d'autorité nécessite que l'on restaure des figures d'autorité
@ -84,10 +83,6 @@ décisions relatives aux choix de vie de la cité.
#+end_quote #+end_quote
La conférence était assez courte, et le live tooting La conférence était assez courte, et le live tooting
est un exercice qui consiste à rapporter les idées en même temps que la est un exercice qui consiste à rapporter les idées en même temps que la
conférence se fait. J'ai donc écrit ce qui suit après la fin de la conférence se fait. J'ai donc écrit ce qui suit après la fin de la
@ -102,18 +97,17 @@ employeur et à ses annonceurs. Ces contraintes broient toute idée qui
passe par de tels médias pour les transformer en spectacle affriolant. passe par de tels médias pour les transformer en spectacle affriolant.
C'est très différent de ce à quoi tend la recherche de la vérité et du C'est très différent de ce à quoi tend la recherche de la vérité et du
fonctionnement du monde empirique.Il faut absolument fonctionnement du monde empirique. Il faut absolument
cesser de croire que si quelqu'un est convaincant il détient la vérité cesser de croire que si quelqu'un est convaincant il détient la vérité
absolue et qu'il ne se trompe jamais.Il faut absolue et qu'il ne se trompe jamais. Il faut absolument cesser de croire que toutes les opinions se valent, que tout peut être remis en question n'importe comment (le relativisme absolu), et que vous devez adopter n'importe quelle info sans devoir faire vous
absolument cesser de croire que toutes les opinions se valent, que tout même à un moment le tri.
peut être remis en question n'importe comment (le relativisme absolu),
et que vous devez adopter n'importe quelle info sans devoir faire vous Ça n'a jamais été une bonne idée et ça ne le sera jamais.
même à un moment le tri.ça n'a jamais été une bonne
idée et ça ne le sera jamais.Au contraire, surtout si Au contraire, surtout si quelqu'un est incapable de reconnaître quand il se trompe, ou qu'il
quelqu'un est incapable de reconnaître quand il se trompe, ou qu'il ignore quelque chose, c'est très mauvais signe quant à la fiabilité de ses communications et à son approche du monde réel.
ignore quelque chose, c'est très mauvais signe quant à la fiabilité de
ses communications et à son approche du monde L'indépendance des médias manque cruellement au
réel.L'indépendance des médias manque cruellement au
panorama de la communication scientifique, c'est le résultat d'un jeu de panorama de la communication scientifique, c'est le résultat d'un jeu de
pouvoirs qui privilégie la continuité d'une vision féodale de pouvoirs qui privilégie la continuité d'une vision féodale de
l'information. Une vision que l'on peut aujourd'hui changer en l'information. Une vision que l'on peut aujourd'hui changer en

View file

@ -25,8 +25,7 @@
:END: :END:
Bonjour monde! Depuis la dernière fois avec Bonjour monde! Depuis la dernière fois avec
[[https://framadate-api.cipherbliss.com/#/ciphering][la page des [[https://framadate-api.cipherbliss.com/#/ciphering][la page des Ciphers]] j'ai eu une semaine assez occupée.
Ciphers]] j'ai eu une semaine assez occupée.
@ -47,14 +46,10 @@ On a causé d'actions pro libre dans l'éducation, moi en tant que parent
d'élève, et Adrien (aka Neox, gérant du serveur XMPP du Chapril) en tant d'élève, et Adrien (aka Neox, gérant du serveur XMPP du Chapril) en tant
qu'élève du supérieur dans une fac d'informatique. qu'élève du supérieur dans une fac d'informatique.
Le podcast audio sera bientôt disponible et sa transcription a été faite Le podcast audio sera bientôt disponible et sa transcription a été faite
par Marie Odile, comme pour toutes les émissions de Libre à vous. par Marie Odile, comme pour toutes les émissions de Libre à vous.
On a aussi fait des photos On a aussi fait des photos
@ -121,9 +116,7 @@ Le but du jeu étant de faire ceci:
- mettre les fichiers audio et vidéos dans un dossier en vue de les - mettre les fichiers audio et vidéos dans un dossier en vue de les
transcrire. transcrire.
- lancer un script. - lancer un script.
- et hop, c'est bon - et hop, c'est bon
@ -218,9 +211,7 @@ sources d'agendas en ligne.
Donc vouala, pas mal de trucs et j'avance doucement sur mes lectures. Donc vouala, pas mal de trucs et j'avance doucement sur mes lectures.
Coucou "science et pseudo science du 1er trimestre 2021", ainsi qu'un Coucou "science et pseudo science du 1er trimestre 2021", ainsi qu'un
autre sur Ada Lovelace, "La beauté des nombres"). autre sur Ada Lovelace, "La beauté des nombres".
à bientôt les cocos. à bientôt les cocos.

View file

@ -26,39 +26,25 @@
Comment se préparer aux changements de gouvernance Comment se préparer aux changements de gouvernance
dans ses projets, ou juste éviter de tout perdre le jour où une seule dans ses projets, ou juste éviter de tout perdre le jour où une seule
personne dans notre équipe se fait écraser par un bus personne dans notre équipe se fait écraser par un bus
?ça ne vous aura pas échappé, nous sommes tous ? ça ne vous aura pas échappé, nous sommes tous mortels, sauf Chuck Norris.
mortels (sauf Chuck Norris). Du coup il est important de se poser
quelques questions sur notre avenir, surtout dans une période de Du coup il est important de se poser quelques questions sur notre avenir, surtout dans une période de pandémie où la mort frappe plus souvent d'habituellement.Vos projets sont ils durables? Vous survivront ils si vous cessez de vous en occuper?
pandémie où la mort frappe plus souvent
d'habituellement.Vos projets sont ils durables? Vous Votre famille survivra-t-elle si vous passez sous un bus? Votre association ou votre entreprise peut elle fonctionner si une seule personne fait un burnout?
survivront ils si vous cessez de vous en Avez vous des copies hors ligne de données cruciales qui vous permettraient de vous relever d'un ransomware ? Qui détient les clés de données qui pourraient être vitales à vos proches?
occuper?Votre famille survivra-t-elle si vous passez
sous un bus?Votre association ou votre entreprise Quand on ne se pose pas ces questions et quelles direction on veut adopter, on tend forcément à utiliser des choses qui nous sont imposées plus ou moins subtilement, ou
peut elle fonctionner si une seule personne fait un burn
out?Avez vous des copies hors ligne de données
cruciales qui vous permettraient de vous relever d'un ransomware
?Qui détient les clés de données qui pourraient être
vitales à vos proches?Quand on ne se pose pas ces
questions et quelles direction on veut adopter, on tend forcément à
utiliser des choses qui nous sont imposées plus ou moins subtilement, ou
juste [suivre ce qui nous promet de maximiser notre profit économique en juste [suivre ce qui nous promet de maximiser notre profit économique en
ne visant que cette seule ne visant que cette seule mesure](https://ploum.net/largent-doit-il-etre-notre-seul-objectif/), quand bien même on se tire une balle dans le pied sur ce plan. Mais sans aller jusqu'a parler de décès, il arrive que la gouvernance de trucs dont on s'occupe doive
mesure](https://ploum.net/largent-doit-il-etre-notre-seul-objectif/), changer.
quand bien même on se tire une balle dans le pied sur ce
plan.Mais sans aller jusqu'a parler de décès, il Les membres d'une équipe vont et viennent, les entreprises et associations naissent et meurent, les amitiés se lient et se délient avec plus ou moins de fracas, une faille de sécurité survient, on se prend un ransomware ou on se fait racketter par un
arrive que la gouvernance de trucs dont on s'occupe doive logiciel privateur qui retient en otage nos clients, et de ce simple état de fait, pour toutes ces raisons, il est parfois impossible de poursuivre des oeuvres collectives.
changer.Les membres d'une équipe vont et viennent,
les entreprises et associations naissent et meurent, les amitiés se Il est bien entendu évident qu'il faut savoir où l'on met les pieds quand on s'allie
lient et se délient avec plus ou moins de fracas, une faille de sécurité avec des personnes ou que l'on ajoute un intermédiaire technique à son flux de travail, ce n'est jamais une décision facile et elle est forcément lourde de conséquences.
survient, on se prend un ransomware ou on se fait racketter par un
logiciel privateur qui retient en otage nos clients, et de ce simple Adopter des logiciels qui respectent vos libertés est essentiel si vous voulez
état de fait, pour toutes ces raisons, il est parfois impossible de
poursuivre des oeuvres collectives.Il est bien
entendu évident qu'il faut savoir où l'on met les pieds quand on s'allie
avec des personnes ou que l'on ajoute un intermédiaire technique à son
flux de travail, ce n'est jamais une décision facile et elle est
forcément lourde de conséquences.Adopter des
logiciels qui respectent vos libertés est essentiel si vous voulez
pouvoir rester maître du jeu sur le long terme, et plus largement, pouvoir rester maître du jeu sur le long terme, et plus largement,
contribuer à améliorer un bien commun plutôt qu'enrichir une bulle contribuer à améliorer un bien commun plutôt qu'enrichir une bulle
spéculative ultralibérale qui piétine ses utilisateurs - ou plutôt sa spéculative ultralibérale qui piétine ses utilisateurs - ou plutôt sa
@ -71,13 +57,15 @@ n'est pas
quand bien même ils seraient libres.Si la gouvernance quand bien même ils seraient libres.Si la gouvernance
de vos organisations ou des outils que vous utilisez est trop floue ou de vos organisations ou des outils que vous utilisez est trop floue ou
si tout le monde n'a que faire du long terme, ce sera un enfer de les si tout le monde n'a que faire du long terme, ce sera un enfer de les
faire perdurer.Un bon début pour assurer la pérénité faire perdurer.
de ce que vous utilisez consiste à:1 ) recenser les
outils que vous utilisez.2 ) définir qui sont les Un bon début pour assurer la pérénité consiste à:
personnes ayant accès aux outils.3 ) partager les - recenser les outils que vous utilisez.
accès de sorte qu'au moins 2 personnes aient accès à la gestion des - définir qui sont les personnes ayant accès aux outils.
outils cruciaux de votre groupe.4 ) définir des - partager les accès de sorte qu'au moins 2 personnes aient accès à la gestion des outils cruciaux de votre groupe.
procédures de passation.Sans ces informations, vos - définir des procédures de passation.
Sans ces informations, vos
projets se casseront la gueule plus ou moins vite, et encore plus vite projets se casseront la gueule plus ou moins vite, et encore plus vite
si vous n'avez aucun backup.Il n'y a pas beaucoup si vous n'avez aucun backup.Il n'y a pas beaucoup
plus de détails à noter pour chacune des étapes, en gros ça consiste à plus de détails à noter pour chacune des étapes, en gros ça consiste à
@ -85,7 +73,9 @@ faire un tableau, entrer différents comptes comme gérant un outil, ou
partager une boîte mail ayant accès à des outils, et apprendre à se partager une boîte mail ayant accès à des outils, et apprendre à se
servir de coffres forts numériques.Voilà de quoi servir de coffres forts numériques.Voilà de quoi
occuper votre asso ou votre entreprise pendant un bout de temps, have occuper votre asso ou votre entreprise pendant un bout de temps, have
fun, good luck!Liens:Dead man fun, good luck!
switch. https://www.deadmansswitch.net/bus factor
https://en.wikipedia.org/wiki/Bus_factor ** Liens:
- Dead manswitch. https://www.deadmansswitch.net/
- Bus factor https://en.wikipedia.org/wiki/Bus_factor

View file

@ -8,7 +8,7 @@
#+post_slug: video-du-premier-chatons-camp-2021 #+post_slug: video-du-premier-chatons-camp-2021
#+post_url: https://www.ciperbliss.com/2021/video-du-premier-chatons-camp-2021 #+post_url: https://www.ciperbliss.com/2021/video-du-premier-chatons-camp-2021
#+post_title: Vidéo du premier CHATONS Camp 2021 #+post_title: Vidéo du premier CHATONS Camp 2021
#+post_tags: #+post_tags: chatons, vidéo
#+post_type: post #+post_type: post
#+post_mime_types: #+post_mime_types:
#+post_guid: undefined #+post_guid: undefined

View file

@ -8,7 +8,7 @@
#+post_slug: organisation-de-taches-orgmode #+post_slug: organisation-de-taches-orgmode
#+post_url: https://www.ciperbliss.com/2024/organisation-de-taches-orgmode #+post_url: https://www.ciperbliss.com/2024/organisation-de-taches-orgmode
#+post_title: Organisation de tâches orgmode #+post_title: Organisation de tâches orgmode
#+post_tags: orgmode #+post_tags: orgmode, gestion de projet
#+post_type: post #+post_type: post
#+post_mime_types: #+post_mime_types:
#+post_guid: undefined #+post_guid: undefined

View file

@ -65,6 +65,20 @@
</div> </div>
</article> </article>
{% if template_content['SERIE'] %}
<div class="article-serie">
<h2>Série d'articles: {{ template_content['SERIE']['title'] }}</h2>
<ul>
{% for a in template_content['SERIE']['articles'] %}
{% if a is not article.slug %}
<li><a href="{{ a }}">{{ articles_info[a]['title'] }}</a></li>
{% else %}
<li class="article-serie-current">{{ article.title }}</li>
{% endif %}
{% endfor %}
</ul>
</div>
{% endif %}
<hr /> <hr />
<div class="article-navigation"> <div class="article-navigation">
{% if article.previous %} {% if article.previous %}

View file

@ -1,7 +1,17 @@
import pytest import pytest
from utils.utils import slugify_title, find_year_and_slug_on_filename from utils.utils import slugify_title, find_year_and_slug_on_filename, get_series_name
def find_serie_name_in_series():
"""Test que la fonction get_series_name retourne le nom de la série si l'article appartient à une série"""
found_serie = get_series_name("des-sauvegardes-qui-durent-mille-ans", "cipherbliss_blog")
assert found_serie == "workflows"
def do_not_find_serie_name_in_series():
"""Test que la fonction get_series_name retourne None si l'article n'appartient à aucune série"""
found_serie = get_series_name("des-sauvegardes-qui-durent-mille-ans", "tykayn_blog")
assert found_serie is None
def test_parse_file_slug_from_filename(): def test_parse_file_slug_from_filename():
"""Test que slugify conserve les accents francophones""" """Test que slugify conserve les accents francophones"""
title = "20250125140244__dépasser-la-spécialisation.org" title = "20250125140244__dépasser-la-spécialisation.org"
@ -10,6 +20,7 @@ def test_parse_file_slug_from_filename():
assert slug == expected, f"Expected '{expected}' but got '{slug}'" assert slug == expected, f"Expected '{expected}' but got '{slug}'"
def test_slug_without_accents(): def test_slug_without_accents():
"""Test le bon slug"""
title = "20111201T070237__dotclear-commenter-sans-tre-oblig-de-preview.org" title = "20111201T070237__dotclear-commenter-sans-tre-oblig-de-preview.org"
expected = "dotclear-commenter-sans-tre-oblig-de-preview" expected = "dotclear-commenter-sans-tre-oblig-de-preview"
date_str, annee, slug = find_year_and_slug_on_filename(title) date_str, annee, slug = find_year_and_slug_on_filename(title)

View file

@ -683,3 +683,17 @@ Navigation:
os.makedirs(f"gemini-capsules/{blog_name}/{article['annee']}", exist_ok=True) os.makedirs(f"gemini-capsules/{blog_name}/{article['annee']}", exist_ok=True)
with open(f"gemini-capsules/{blog_name}/{article['annee']}/{slug}.gmi", "w", encoding="utf-8") as f: with open(f"gemini-capsules/{blog_name}/{article['annee']}/{slug}.gmi", "w", encoding="utf-8") as f:
f.write(gemini_content) f.write(gemini_content)
def get_series_name(article_slug, blog_name):
"""
Retourne le nom de la série d'un article s'il en fait partie.
:param article: Dictionnaire contenant les informations de l'article
:return: Le nom de la série ou None si l'article n'appartient à aucune série
"""
if blog_name in website_config:
for s in website_config[blog_name]['SERIES']:
if article_slug in website_config['SERIES'][blog_name][s]['articles']:
return s
return None

View file

@ -1,31 +1,8 @@
#!/usr/bin/python3 #!/usr/bin/python3
# configuration pour générer les sites web de plusieurs dossiers # configuration pour générer les sites web de plusieurs dossiers
global_config = {
"slug_with_year": True,
# "show_logs": False,
"show_logs": True,
"lang_default": "fr",
"automatic_tagging_enabled": True,
"automatic_tagging_org_files": True,
"rebuild_files_filter": 2024,
"posts_per_page": 10,
"source_files_extension": "org",
"excluded_tags": ['PROPERTIES', 'CREATED', 'ID', 'END','CUSTOM_ID','CLASS'],
# controlled vocabulary to find tags automatically
"auto_tag_terms": ["illustration", "tuto", "NSFW", "BD", "récit", "science",
"wtf", "yaoi", "yuri", "sondage", "entreprise", "AI", "photos",
"cosplay", "festival", "fanzine", "manif", "logiciel", "inktober",
"kotlife", "féminisme", "fantasme", "art", "sociologie", "couple", "masturbation",
"boobs", "sortirDesFossiles", "électrique", "maison", "GTD", "chat", "PIM","mastoart",
"openstreetmap", "sauvegarde", "mastodon", "voyages", "aber","atelier cocci","vidéos",
"wanda","bouffe","anniversaire","conventions","Japan Expo","3.0","cours","! Q","dessin","mariage",
"réutilisation","sketch","road trip","kot","vélo","Bruxelles","Dieppe"]
}
configs_sites = { "other_blog" : {
configs_sites = {
"other_blog" : {
"DOSSIER_SOURCE": "helia_blog", "DOSSIER_SOURCE": "helia_blog",
"NDD_GEMINI": "social.cipherbliss.com", "NDD_GEMINI": "social.cipherbliss.com",
"BANNIERE_ENTETE": "", "BANNIERE_ENTETE": "",
@ -87,6 +64,35 @@ Si vous aimez ce que nous faisons à Cipher Bliss, vous pouvez nous soutenir de
""", """,
"BANNIERE_ENTETE": "https://www.cipherbliss.com/wp-content/uploads/2016/11/bg.jpg", "BANNIERE_ENTETE": "https://www.cipherbliss.com/wp-content/uploads/2016/11/bg.jpg",
"BANNIERE_ENTETE_ALT": "Bannière du site", "BANNIERE_ENTETE_ALT": "Bannière du site",
"SERIES": {
"workflows": {
"title": "Workflows",
"articles": [
"choix-doutil-pour-la-gestion-de-projets",
"lister-tous-ses-dossiers-photos-avec-nodejs",
"organiser-ses-fichiers-avec-des-tags-avec-filetags",
"comment-jai-quitte-facebook-et-google",
]
},
"backups": {
"title": "Backups et pérennité",
"articles": [
"2021/bus-factor",
"2021/plan-darchivage-et-de-backup",
"2021/des-sauvegardes-qui-durent-mille-ans",
"2025/critères-de-qualité-de-votre-plan-de-sauvegarde",
]
},
"elles-font-le-libre": {
"title": "Elles font le libre",
"articles": [
"2024/teaser-des-interviews-elles-font-le-libre",
"2024/elles-font-le-libre-julie-de-letabli-numerique"
"2024/julia-de-l'ign-elles-font-le-libre-sotmfr-2024",
"2024/julie-de-la-fabrique-des-mobilités-elles-font-le-libre",
]
}
}
}, },
"tykayn_blog": { "tykayn_blog": {
"SOURCE": "https://forge.chapril.org/tykayn/orgmode-to-gemini-blog/src/branch/main/sources/tykayn_blog", "SOURCE": "https://forge.chapril.org/tykayn/orgmode-to-gemini-blog/src/branch/main/sources/tykayn_blog",
@ -265,6 +271,29 @@ default_config = {
"WEBSITE_GENERATOR_DESCRIPTION": f"Site généré avec le générateur de site web pour Gemini par Tykayn \n=> {forge_source} Code source, licence AGPLv3+", "WEBSITE_GENERATOR_DESCRIPTION": f"Site généré avec le générateur de site web pour Gemini par Tykayn \n=> {forge_source} Code source, licence AGPLv3+",
"SOUTIEN": "Si vous aimez ce que nous faisons, soutenez nous et partagez nos écrits. Vous pouvez nous faire un don sur <a href='https://liberapay.com/cipherbliss'>liberapay.com/cipherbliss</a>." "SOUTIEN": "Si vous aimez ce que nous faisons, soutenez nous et partagez nos écrits. Vous pouvez nous faire un don sur <a href='https://liberapay.com/cipherbliss'>liberapay.com/cipherbliss</a>."
} }
global_config = {
"slug_with_year": True,
# "show_logs": False,
"show_logs": True,
"lang_default": "fr",
"automatic_tagging_enabled": True,
"automatic_tagging_org_files": True,
"rebuild_files_filter": 2024,
"posts_per_page": 10,
"source_files_extension": "org",
"excluded_tags": ['PROPERTIES', 'CREATED', 'ID', 'END','CUSTOM_ID','CLASS'],
# controlled vocabulary to find tags automatically
"auto_tag_terms": [
"illustration", "tuto", "NSFW", "BD", "récit", "science",
"wtf", "yaoi", "yuri", "sondage", "entreprise", "AI", "photos",
"cosplay", "festival", "fanzine", "manif", "logiciel", "inktober",
"kotlife", "féminisme", "fantasme", "art", "sociologie", "couple", "masturbation",
"boobs", "sortirDesFossiles", "électrique", "maison", "GTD", "chat", "PIM","mastoart",
"openstreetmap", "sauvegarde", "mastodon", "voyages", "aber","atelier cocci","vidéos",
"wanda","bouffe","anniversaire","conventions","Japan Expo","3.0","cours","! Q","dessin","mariage",
"réutilisation","sketch","road trip","kot","vélo","Bruxelles","Dieppe"]
}
def fill_missing_config(site_config): def fill_missing_config(site_config):
""" """