2025-02-19 16:24:20 +01:00
#!/bin/python3
2025-02-19 16:29:20 +01:00
# trouver les articles précédents et suivants
2025-02-19 16:24:20 +01:00
from utils import *
from website_config import configs_sites
import os
import json
import re
2025-02-19 16:29:20 +01:00
import argparse
2025-02-19 22:39:11 +01:00
import pypandoc
from jinja2 import Environment , FileSystemLoader
2025-02-19 16:29:20 +01:00
# Configurer argparse pour prendre le blog en argument
parser = argparse . ArgumentParser ( description = ' Générer une liste des derniers articles de blog. ' )
parser . add_argument ( ' blog ' , type = str , help = ' Nom du dossier du blog à traiter ' , default = ' tykayn_blog ' )
args = parser . parse_args ( )
2025-02-19 22:39:11 +01:00
limit_articles_on_index = 10
2025-02-19 16:24:20 +01:00
# Fonction pour extraire le basename d'un fichier
def get_basename ( file_name ) :
return os . path . splitext ( file_name ) [ 0 ]
# Chemin du dossier contenant les fichiers orgmode
2025-02-19 16:29:20 +01:00
directory = f ' sources/ { args . blog } /lang_fr '
destination_json = f ' sources/ { args . blog } /build '
2025-02-19 22:39:11 +01:00
destination_html = f ' html-websites/ { args . blog } / '
2025-02-19 16:24:20 +01:00
# Dictionnaire pour stocker les informations des fichiers
files_dict = { }
# Parcourir les fichiers du dossier
for file_name in os . listdir ( directory ) :
if file_name . endswith ( ' .org ' ) :
file_path = os . path . join ( directory , file_name )
with open ( file_path , " r " , encoding = " utf-8 " ) as f :
content = f . read ( )
basename = get_basename ( file_name )
date_str , annee , slug = find_year_and_slug_on_filename ( basename )
tags = extract_tags_from_file ( file_path , global_config [ ' excluded_tags ' ] )
2025-02-19 22:39:11 +01:00
2025-02-19 16:24:20 +01:00
# Convertir les tags en liste si c'est un set
if isinstance ( tags , set ) :
tags = list ( tags )
boom = basename . split ( ' __ ' )
title = find_first_level1_title ( content )
2025-02-19 22:39:11 +01:00
# Convertir le contenu Org en HTML
html_content = pypandoc . convert_text ( content , ' html ' , format = ' org ' )
2025-02-19 16:24:20 +01:00
files_dict [ f " { annee } / { slug } " ] = {
' path ' : file_path ,
' basename ' : basename ,
' slug ' : slug ,
' slug_with_year ' : f " { annee } / { slug } " ,
' date ' : boom [ 0 ] ,
2025-02-19 23:10:28 +01:00
' date_formattee ' : datetime . strptime ( date_str , ' % Y % m %d % H % M % S ' ) . strftime ( ' %d % B % Y à % H: % M: % S ' ) if len ( date_str ) == 14 else datetime . strptime ( date_str , ' % Y % m %d T % H % M % S ' ) . strftime ( ' %d % B % Y à % H: % M: % S ' ) ,
# 'date_formattee': datetime.strptime(date_str, '%Y%m%d%H%M%S').strftime('%d %B %Y à %H:%M:%S'),
2025-02-19 16:24:20 +01:00
' annee ' : annee ,
' tags ' : tags , # Assurez-vous que c'est une liste
' title ' : title ,
' next ' : None ,
2025-02-19 22:39:11 +01:00
' previous ' : None ,
' org_content ' : content , # Contenu Org original
' html_content ' : html_content # Contenu HTML converti
2025-02-19 16:24:20 +01:00
}
# Trier les basenames par ordre décroissant
sorted_basenames = sorted ( files_dict . keys ( ) , reverse = True )
# Ajouter les noms des articles suivant et précédent
for i in range ( len ( sorted_basenames ) ) :
basename = sorted_basenames [ i ]
2025-02-19 23:10:28 +01:00
print ( ' basename ' , basename )
2025-02-19 16:24:20 +01:00
if i > 0 :
files_dict [ basename ] [ ' previous ' ] = sorted_basenames [ i - 1 ]
if i < len ( sorted_basenames ) - 1 :
2025-02-19 23:10:28 +01:00
2025-02-19 16:24:20 +01:00
files_dict [ basename ] [ ' next ' ] = sorted_basenames [ i + 1 ]
2025-02-19 16:29:20 +01:00
with open ( destination_json + ' /articles_info.json ' , ' w ' , encoding = ' utf-8 ' ) as json_file :
2025-02-19 16:24:20 +01:00
files_dict_serialized = json . dumps ( files_dict , ensure_ascii = False , indent = 4 )
json_file . write ( files_dict_serialized )
2025-02-19 22:39:11 +01:00
print ( f " Nombre d ' articles trouvés : { len ( sorted_basenames ) } " )
count_articles_updated = 0
for basename , info in files_dict . items ( ) :
date_str = info [ ' date ' ]
if date_str > ' 20240101 ' :
count_articles_updated + = 1
print ( f " Nombre d ' articles mis à jour après le 01 01 2024 : { count_articles_updated } " )
def generate_blog_index ( json_file , template_file , output_file ) :
"""
Génère la page d ' index du blog à partir des informations JSON et d ' un template Jinja2 .
: param json_file : Chemin du fichier JSON contenant les informations des articles .
: param template_file : Chemin du fichier template Jinja2 .
: param output_file : Chemin du fichier HTML de sortie .
"""
# Charger les données JSON
with open ( json_file , ' r ' , encoding = ' utf-8 ' ) as f :
articles_info = json . load ( f )
# Trier les articles par date (ou par slug) et prendre les 10 derniers
sorted_articles = sorted ( articles_info . values ( ) , key = lambda x : x [ ' date ' ] , reverse = True ) [ : 10 ]
# Configurer Jinja2
env = Environment ( loader = FileSystemLoader ( ' . ' ) )
template = env . get_template ( template_file )
# Rendre le template avec les données
output_html = template . render (
template_content = configs_sites [ args . blog ] ,
articles = sorted_articles [ : global_config [ ' posts_per_page ' ] ] ,
2025-02-19 22:52:44 +01:00
articles_others = sorted_articles [ 10 : ]
2025-02-19 22:39:11 +01:00
)
# Écrire le fichier de sortie
with open ( output_file , ' w ' , encoding = ' utf-8 ' ) as f :
f . write ( output_html )
print ( f " Page d ' index générée dans { output_file } " )
# Appel de la fonction pour générer la page d'index
2025-02-19 23:10:28 +01:00
generate_blog_index ( destination_json + ' /articles_info.json ' , ' templates/html/index.html.jinja ' , destination_html + ' /index.html ' )
def generate_article_pages ( json_file , template_file , output_dir ) :
"""
Génère les pages HTML pour chaque article à partir des informations JSON et d ' un template Jinja2.
: param json_file : Chemin du fichier JSON contenant les informations des articles .
: param template_file : Chemin du fichier template Jinja2 .
: param output_dir : Répertoire de sortie pour les fichiers HTML .
"""
# Charger les données JSON
with open ( json_file , ' r ' , encoding = ' utf-8 ' ) as f :
articles_info = json . load ( f )
# Configurer Jinja2
env = Environment ( loader = FileSystemLoader ( ' . ' ) )
template = env . get_template ( template_file )
# Générer les pages pour chaque article
for article in articles_info . values ( ) :
output_html = template . render (
template_content = configs_sites [ args . blog ] ,
article = article
)
# Construire le chemin de sortie en fonction du slug avec l'année
output_subdir = os . path . join ( output_dir , article [ ' slug_with_year ' ] )
os . makedirs ( output_subdir , exist_ok = True )
output_file = os . path . join ( output_subdir , " index.html " )
# print(output_file)
# Écrire le fichier de sortie
with open ( output_file , ' w ' , encoding = ' utf-8 ' ) as f :
f . write ( output_html )
# print(f"Page générée pour l'article {article['title']} dans {output_file}")
# Appel de la fonction pour générer les pages des articles
generate_article_pages ( destination_json + ' /articles_info.json ' , ' templates/html/article.html.jinja ' , destination_html )