mirror of
https://forge.chapril.org/tykayn/orgmode-to-gemini-blog
synced 2025-06-20 09:04:42 +02:00
117 lines
4.9 KiB
Python
Executable file
117 lines
4.9 KiB
Python
Executable file
import os
|
|
import json
|
|
from datetime import datetime
|
|
import argparse
|
|
from utils import get_blog_template_conf
|
|
from website_config import configs_sites
|
|
|
|
# Configuration des arguments de la ligne de commande
|
|
parser = argparse.ArgumentParser(description="Générer un flux Atom des articles.")
|
|
parser.add_argument("blog", help="Le nom du dossier de blog.")
|
|
args = parser.parse_args()
|
|
|
|
template_content = get_blog_template_conf(args.blog)
|
|
website_ndd = template_content['NDD']
|
|
|
|
# Charger les données du fichier articles_info.json
|
|
json_file = f'sources/{args.blog}/build/articles_info.json'
|
|
with open(json_file, 'r', encoding='utf-8') as f:
|
|
articles_info = json.load(f)
|
|
|
|
# Trier les articles par date décroissante
|
|
sorted_articles = sorted(articles_info.values(), key=lambda x: x['date'], reverse=True)
|
|
|
|
# Vérifier s'il y a des articles avant de générer le flux
|
|
if not sorted_articles:
|
|
print("Aucun article trouvé. Le flux Atom ne sera pas généré.")
|
|
exit(0)
|
|
|
|
# Convert the date string to a valid ISO format
|
|
def convert_to_iso(date_str):
|
|
"""
|
|
Convertit une chaîne de date en format ISO 8601.
|
|
Gère les formats:
|
|
- YYYYMMDDHHMMSS
|
|
- YYYYMMDDTHHMMSS
|
|
- YYYY-MM-DD
|
|
|
|
Retourne: YYYY-MM-DDTHH:MM:SS
|
|
"""
|
|
try:
|
|
# Nettoyer la chaîne d'entrée
|
|
date_str = date_str.strip()
|
|
|
|
# Supprimer tous les 'T' existants
|
|
date_str = date_str.replace('T', '')
|
|
|
|
# Si la date contient des tirets, la convertir au format attendu
|
|
if '-' in date_str:
|
|
try:
|
|
parsed_date = datetime.strptime(date_str, '%Y-%m-%d')
|
|
return parsed_date.strftime('%Y-%m-%dT00:00:00')
|
|
except ValueError:
|
|
print(f"Format de date invalide: {date_str}")
|
|
return datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
|
|
|
|
# S'assurer que la chaîne a la bonne longueur
|
|
if len(date_str) < 14:
|
|
date_str = date_str.ljust(14, '0')
|
|
elif len(date_str) > 14:
|
|
date_str = date_str[:14]
|
|
|
|
# Extraire les composants de la date
|
|
year = date_str[:4]
|
|
month = date_str[4:6]
|
|
day = date_str[6:8]
|
|
hour = date_str[8:10]
|
|
minute = date_str[10:12]
|
|
second = date_str[12:14]
|
|
|
|
# Vérifier que tous les composants sont des nombres
|
|
components = [year, month, day, hour, minute, second]
|
|
if not all(c.isdigit() for c in components):
|
|
print(f"Date invalide détectée: {date_str}, utilisation de la date actuelle")
|
|
return datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
|
|
|
|
# Construire la chaîne ISO
|
|
return f"{year}-{month}-{day}T{hour}:{minute}:{second}"
|
|
|
|
except Exception as e:
|
|
print(f"Erreur lors de la conversion de la date {date_str}: {e}")
|
|
# En cas d'erreur, retourner la date actuelle
|
|
return datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
|
|
|
|
# Génération du flux Atom
|
|
with open(f"html-websites/{args.blog}/feed/index.xml", "w", encoding="utf-8") as f:
|
|
f.write('<?xml version="1.0" encoding="UTF-8"?>\n')
|
|
f.write('<feed xmlns="http://www.w3.org/2005/Atom">\n')
|
|
f.write(f' <title>Flux Atom des articles de {args.blog}</title>\n')
|
|
f.write(f' <link href="{website_ndd}/feed"/>\n')
|
|
f.write(f' <updated>{datetime.fromisoformat(convert_to_iso(sorted_articles[0]["date"])).strftime("%Y-%m-%dT%H:%M:%S+00:00")}</updated>\n')
|
|
f.write(' <id>tag:' + website_ndd + ',2023:/feed</id>\n')
|
|
f.write(' <author>\n')
|
|
f.write(f' <name>{configs_sites[args.blog]["AUTHOR"]}</name>\n')
|
|
f.write(f' <email>{configs_sites[args.blog]["EMAIL"]}</email>\n')
|
|
f.write(' </author>\n')
|
|
f.write(f' <link rel="self" href="{website_ndd}/feed"/>\n')
|
|
|
|
print(f"Génération du flux Atom pour {len(sorted_articles)} articles")
|
|
# Boucle des articles
|
|
for article in sorted_articles:
|
|
f.write(' <entry>\n')
|
|
f.write(f' <id>tag:{website_ndd},2023:{article["slug"]}</id>\n')
|
|
f.write(f' <title>{article["title"]}</title>\n')
|
|
f.write(f' <link href="{website_ndd}/{article["slug"]}"/>\n')
|
|
f.write(' <content type="html"><![CDATA[\n')
|
|
f.write(f' {article["html_content"]}\n')
|
|
f.write(' ]]></content>\n')
|
|
f.write(f' <summary>{article.get("extract", "")}</summary>\n')
|
|
f.write(f' <published>{datetime.fromisoformat(convert_to_iso(article["date"])).strftime("%Y-%m-%dT%H:%M:%S+00:00")}</published>\n')
|
|
f.write(f' <updated>{datetime.fromisoformat(convert_to_iso(article["date"])).strftime("%Y-%m-%dT%H:%M:%S+00:00")}</updated>\n')
|
|
f.write(' <author>\n')
|
|
f.write(f' <name>{configs_sites[args.blog]["AUTHOR"]}</name>\n')
|
|
f.write(f' <email>{configs_sites[args.blog]["EMAIL"]}</email>\n')
|
|
f.write(' </author>\n')
|
|
f.write(' </entry>\n')
|
|
|
|
f.write('</feed>')
|