mirror of
https://forge.chapril.org/tykayn/orgmode-to-gemini-blog
synced 2025-06-20 09:04:42 +02:00
151 lines
5 KiB
Python
151 lines
5 KiB
Python
#!/usr/bin/env python3
|
|
# Création de nouvel article de blog
|
|
# Exemple de commande :
|
|
# python new_article.py [blog_dir] [lang] "article_title"
|
|
import os
|
|
from datetime import datetime
|
|
import argparse
|
|
|
|
# Configuration des arguments de la ligne de commande
|
|
parser = argparse.ArgumentParser(description="Générer un nouvel article en mode orgmode.")
|
|
parser.add_argument("--title", nargs="?", help="Le titre de l'article.")
|
|
parser.add_argument("--lang", nargs="?", default="fr", help="La langue de l'article (par défaut : fr pour Français ou en pour English).")
|
|
parser.add_argument("--blog_dir", nargs="?", default=None, help="Le nom du dossier de blog (sous source/). Si non spécifié, une liste de dossiers disponibles sera proposée.")
|
|
parser.add_argument("--year_prefix_in_slug", nargs="?", default=True, help="Ajouter l'année au début du slug.")
|
|
|
|
args = parser.parse_args()
|
|
|
|
# Définition du dossier de base pour les blogs
|
|
base_blog_dir = "sources/"
|
|
year_prefix_in_slug = args.year_prefix_in_slug
|
|
|
|
# Si aucun dossier de blog n'est spécifié, proposer une sélection
|
|
if args.blog_dir is None:
|
|
available_dirs = [d for d in os.listdir(base_blog_dir) if os.path.isdir(os.path.join(base_blog_dir, d))]
|
|
if not available_dirs:
|
|
print("Aucun dossier de blog trouvé sous", base_blog_dir)
|
|
exit(1)
|
|
|
|
print("Sélectionnez un dossier de blog :")
|
|
for i, dir_name in enumerate(available_dirs, start=1):
|
|
print(f"{i}. {dir_name}")
|
|
|
|
choice = input("Entrez le numéro de votre choix : ")
|
|
try:
|
|
choice = int(choice)
|
|
if choice < 1 or choice > len(available_dirs):
|
|
raise ValueError
|
|
args.blog_dir = available_dirs[choice - 1]
|
|
except ValueError:
|
|
print("Choix invalide. Annulation.")
|
|
exit(1)
|
|
if args.title is None or not len(args.title):
|
|
args.title = input("Entrez le titre de votre nouvel article: ")
|
|
|
|
if args.title is None:
|
|
print("Vous n'avez pas choisi de titre d'article")
|
|
exit(1)
|
|
# Vérification de l'existence du dossier de blog
|
|
blog_path = os.path.join(base_blog_dir, args.blog_dir)
|
|
if not os.path.exists(blog_path):
|
|
print(f"Le dossier de blog '{args.blog_dir}' n'existe pas sous '{base_blog_dir}'.")
|
|
create_dir = input("Créer le dossier? (o/n) : ")
|
|
if create_dir.lower() == 'o':
|
|
os.makedirs(blog_path)
|
|
print(f"Dossier '{args.blog_dir}' créé sous '{base_blog_dir}'.")
|
|
else:
|
|
print("Annulation de la création de l'article.")
|
|
exit(1)
|
|
|
|
|
|
# Génération du nom de fichier org avec la date et le slug
|
|
now = datetime.now()
|
|
# date_string = now.strftime("%Y-%m-%d")
|
|
date_string = now.strftime("%Y%m%d%H%M%S")
|
|
date_string_full = now.strftime("%Y-%m-%d %H:%M:%S")
|
|
# date_string_full = now.strftime("%Y%m%d%H%M%S")
|
|
slug = ''
|
|
if args.title:
|
|
slug = args.title.lower().replace(" ", "-")
|
|
slug = slug.replace("--", "-")
|
|
slug = slug.replace("--", "-")
|
|
|
|
if year_prefix_in_slug:
|
|
schema_slug = f"{now.year}/{slug}"
|
|
else:
|
|
schema_slug = slug
|
|
|
|
file_abs_path = os.path.abspath(os.path.dirname(__file__))
|
|
|
|
if args.lang == 'fr' or args.lang == 'en':
|
|
filename = f"{file_abs_path}/sources/{args.blog_dir}/lang_{args.lang}/{date_string}__{slug}.org"
|
|
else:
|
|
print('langue invalide, disponible: fr ou en seulement')
|
|
exit(1)
|
|
|
|
import uuid
|
|
|
|
def create_uuid_property():
|
|
uuid_value = uuid.uuid4()
|
|
return uuid_value
|
|
|
|
def make_article(config):
|
|
"""
|
|
Crée le contenu d'un nouvel article avec les propriétés spécifiées.
|
|
|
|
Args:
|
|
config (dict): Dictionnaire contenant les paramètres de l'article:
|
|
- uuid (str): Identifiant unique de l'article
|
|
- slug (str): Slug de l'URL de l'article
|
|
- title (str): Titre de l'article
|
|
- date_string_full (str): Date complète au format YYYY-MM-DD HH:MM:SS
|
|
- date_string (str): Date au format YYYYMMDDHHMMSS
|
|
- schema_slug (str): Slug avec ou sans préfixe année selon la config
|
|
- blog_dir (str): Dossier du blog
|
|
|
|
Returns:
|
|
str: Contenu formaté de l'article avec les propriétés et métadonnées
|
|
"""
|
|
|
|
|
|
return f""":PROPERTIES:
|
|
:ID: {config.get('uuid')}
|
|
:END:
|
|
|
|
#+title: {config.get('title')}
|
|
#+post_ID:
|
|
#+post_slug: {config.get('slug')}
|
|
|
|
|
|
#+post_url: https://www.ciperbliss.com/{config.get('schema_slug')}
|
|
#+post_title: {config.get('title')}
|
|
#+post_tags:
|
|
#+post_series:
|
|
#+post_type: post
|
|
#+post_status: publish
|
|
#+post_picture:
|
|
#+post_date_published: <{config.get('date_string_full')}>
|
|
#+post_date_modified: <{config.get('date_string_full')}>
|
|
#+post_index_page_roam_id: {config.get('uuid')}
|
|
#+BLOG: {config.get('blog_dir')}
|
|
|
|
* {config.get('title')}
|
|
|
|
|
|
"""
|
|
|
|
# Écriture du fichier org
|
|
with open(filename, "w") as f:
|
|
uuid = create_uuid_property()
|
|
config={
|
|
'uuid': uuid,
|
|
'slug': slug,
|
|
'title': args.title,
|
|
'date_string_full': date_string_full,
|
|
'date_string': date_string,
|
|
'schema_slug': schema_slug,
|
|
'blog_dir': args.blog_dir,
|
|
}
|
|
f.write(make_article(config))
|
|
|
|
print(f"Le fichier '{filename}' a été créé avec succès.")
|