2024-11-02 18:30:04 +01:00
import os
2024-11-04 00:13:58 +01:00
import argparse
2024-11-05 01:14:45 +01:00
import re
import datetime
2024-11-05 23:06:54 +01:00
import shutil
2024-11-04 00:13:58 +01:00
# génère l'index gemini et html des articles rangés par langue
# Définition des arguments de la ligne de commande
parser = argparse . ArgumentParser ( description = " Générer un site Web à partir de fichiers HTML. " )
parser . add_argument ( " source " , help = " Le chemin vers le dossier contenant les fichiers HTML. " )
parser . add_argument ( " title " , default = " Mon site Web " , help = " Le titre du site Web. " )
args = parser . parse_args ( )
2024-11-02 18:30:04 +01:00
# Variables personnalisables
2024-11-05 11:17:52 +01:00
DOSSIER_SOURCE = ' sources/ ' + args . source # Nom du dossier contenant les fichiers Markdown
2024-11-04 00:13:58 +01:00
FICHIER_INDEX = ' index_ ' + args . source # Nom du fichier d'index à générer
TITRE_INDEX = f " # { args . title } - Articles "
source_files_extension = " org "
2024-11-05 01:14:45 +01:00
# Expression régulière pour extraire la date et le slug du nom de fichier org
2024-11-06 00:19:50 +01:00
regex = r " ^( \ d {4} (-? \ d {2} ) {2} | \ d {8} )(-[a-zA-Z0-9_-]+) \ .gmi$ "
regex_orgroam = r " ^( \ d {14} )_([a-zA-Z0-9_-]+) \ .gmi$ "
2024-11-04 00:13:58 +01:00
2024-11-05 01:14:45 +01:00
def find_year_and_slug ( fichier ) :
fichier = fichier . replace ( ' .. ' , ' . ' )
print ( f " find in { fichier } ------------- " )
2024-11-06 00:19:50 +01:00
match = re . match ( regex_orgroam , fichier )
if match :
date_str = match . group ( 1 )
annee = date_str [ : 4 ]
slug = match . group ( 2 )
2024-11-05 01:14:45 +01:00
match = re . match ( regex , fichier )
if match :
date_str = match . group ( 1 )
# Convertir la date en objet datetime
if " - " in date_str :
date = datetime . datetime . strptime ( date_str , " % Y- % m- %d " )
else :
date = datetime . datetime . strptime ( date_str , " % Y % m %d % H % M % S " )
date_string_replaced = str ( date ) . replace ( ' 00:00:00 ' , ' ' )
slug = fichier . replace ( ' .gmi ' , ' ' )
slug = slug . replace ( date_string_replaced , ' ' )
slug = enlever_premier_tiret_ou_underscore ( slug )
annee = str ( date . year ) . replace ( ' 00:00:00 ' , ' ' )
2024-11-06 00:19:50 +01:00
else :
print ( ' ERREUR aucun slug trouvé ' )
return [ None , None , None ]
2024-11-05 01:14:45 +01:00
2024-11-06 00:19:50 +01:00
print ( f " ///////////////// ///////////////// " )
print ( f " Fichier: { fichier } " )
print ( f " année: { annee } " )
print ( f " str(date): { str ( date ) } " )
print ( f " slug: { slug } " )
print ( f " chemin: { annee } / { slug } / " )
return [ date_str , annee , slug ]
2024-11-05 11:17:52 +01:00
2024-11-05 01:14:45 +01:00
def enlever_premier_tiret_ou_underscore ( chaîne ) :
if chaîne . startswith ( ' - ' ) or chaîne . startswith ( ' _ ' ) :
chaîne = chaîne [ 1 : ]
return chaîne
2024-11-05 11:17:52 +01:00
2024-11-05 23:06:54 +01:00
2024-11-05 11:17:52 +01:00
# création des dossiers intermédiaires s'il y en a
# déplace le fichier dans le dossier spécifié
def create_path_folders_and_move_file ( path , file ) :
os . makedirs ( os . path . dirname ( path ) , exist_ok = True )
2024-11-05 23:06:54 +01:00
2024-11-05 11:17:52 +01:00
shutil . move ( file , path )
2024-11-04 00:13:58 +01:00
def get_files_list_of_folder ( folder_path ) :
# Vérifie si le dossier existe
if not os . path . exists ( folder_path ) :
print ( f " Erreur : Le dossier ' { dossier_md } ' n ' existe pas. " )
return
print ( ' source ' , folder_path )
# Liste les fichiers articles, trie par nom décroissant
try :
fichiers_md = sorted ( [ f . replace ( source_files_extension , ' .gmi ' ) for f in os . listdir ( folder_path ) if f . endswith ( source_files_extension ) ] , reverse = True )
print ( ' fichiers trouvés: ' , len ( fichiers_md ) )
return fichiers_md
except OSError as e :
print ( f " Erreur lors de la lecture du dossier : { e } " )
return
2024-11-05 01:14:45 +01:00
# transformer le nom du fichier orgmode en une création de dossier de l'année, et un sous dossier du nom du slug dans le nom de fichier, contenant un seul fichier d'index afin de faire de l'url rewrite en dur.
# le nom de fichier org commence par une date YYYY-MM-DD ou bien YYYYMMDDHHmmss, est suivie d'un slug, et finit par l'extension .org
2024-11-04 00:13:58 +01:00
2024-11-05 01:14:45 +01:00
# Titre pour le fichier d'index
2024-11-02 18:30:04 +01:00
2024-11-05 11:17:52 +01:00
def empty_folder_content ( path ) :
# parcours tous les fichiers et sous-dossiers du dossier
for filename in os . listdir ( path ) :
file_path = os . path . join ( path , filename )
# supprime le fichier ou le sous-dossier
if os . path . isfile ( file_path ) :
os . remove ( file_path )
else :
shutil . rmtree ( file_path )
def generer_index ( dossier_source , fichier_index , titre_index ) :
2024-11-02 18:30:04 +01:00
# Chemin absolu du dossier parent (pour sauver le fichier d'index)
dossier_parent = os . path . dirname ( os . path . abspath ( __file__ ) )
2024-11-05 23:06:54 +01:00
empty_folder_content ( dossier_parent + ' /html-websites/ ' + args . source + ' / ' )
empty_folder_content ( dossier_parent + ' /gemini-capsules/ ' + args . source + ' / ' )
2024-11-02 18:30:04 +01:00
# Chemin complet du dossier contenant les Markdown
2024-11-05 11:17:52 +01:00
chemin_dossier_source = os . path . join ( dossier_parent , dossier_source )
2024-11-02 18:30:04 +01:00
2024-11-05 11:17:52 +01:00
files_static = get_files_list_of_folder ( chemin_dossier_source + ' / ' )
files_fr = get_files_list_of_folder ( chemin_dossier_source + ' /lang_fr ' )
files_en = get_files_list_of_folder ( chemin_dossier_source + ' /lang_en ' )
2024-11-02 18:30:04 +01:00
# Chemin complet pour le fichier d'index
2024-11-04 00:13:58 +01:00
chemin_fichier_index_gemini = os . path . join ( dossier_parent , fichier_index + ' .gmi ' )
2024-11-05 23:06:54 +01:00
chemin_fichier_index_html = os . path . join ( dossier_parent , ' / ' + fichier_index + ' .html ' )
2024-11-02 18:30:04 +01:00
2024-11-05 23:06:54 +01:00
print ( ' \n index html: ' , chemin_fichier_index_html )
2024-11-02 18:30:04 +01:00
# Génère le contenu du fichier d'index
2024-11-04 00:13:58 +01:00
contenu_index_gmi = f " { titre_index } \n { ' - ' * len ( titre_index ) } \n \n "
contenu_index_html = f " { titre_index } \n { ' - ' * len ( titre_index ) } \n \n "
contenu_index_gmi + = " \n # Navigation \n ------------------------- \n "
2024-11-04 14:14:28 +01:00
contenu_index_html + = " <h1>Navigation</h1> "
2024-11-04 00:13:58 +01:00
for fichier in files_static :
contenu_index_gmi + = f " => { fichier } \n "
link_html = fichier . replace ( ' ..gmi ' , ' .html ' )
contenu_index_html + = f " <br><a href=/ { link_html } > { link_html } </a> "
2024-11-05 23:06:54 +01:00
# ne préciser la langue français que si on a des articles en Anglais
if len ( files_en ) :
contenu_index_gmi + = " \n # Articles en Français \n ------------------------- \n "
contenu_index_html + = " <h1>Articles en Français</h1> "
2024-11-04 11:00:41 +01:00
lang_folder = " lang_fr/ "
2024-11-04 00:13:58 +01:00
for fichier in files_fr :
2024-11-05 01:14:45 +01:00
date_string , année , slug = find_year_and_slug ( fichier )
2024-11-05 23:06:54 +01:00
new_folder = f " { année } / { slug } "
new_folder_path_this_article = os . path . join ( dossier_parent , ' html-websites/ ' + args . source + ' / ' + new_folder + ' / ' )
2024-11-04 00:13:58 +01:00
contenu_index_gmi + = f " => { fichier } \n "
link_html = fichier . replace ( ' ..gmi ' , ' .html ' )
2024-11-05 23:06:54 +01:00
chemin_fichier_this_article = chemin_dossier_source + ' /lang_fr/converted/ ' + link_html
# contenu_index_html += f"<br><a href=/{lang_folder}/{link_html}>{link_html}</a>"
2024-11-05 11:17:52 +01:00
contenu_index_html + = f " <br><a href=/ { année } / { slug } > { année } { slug . replace ( ' - ' , ' ' ) } </a> "
2024-11-05 23:06:54 +01:00
# déplacer l'article html généré dans son dossier de slug
print ( f " on créée le dossier : { new_folder_path_this_article } , et on y copie le fichier { chemin_fichier_this_article } en le renommant index.html " )
' html-websites/ ' + args . source + ' / ' + new_folder
print ( f " mkdir { new_folder_path_this_article } -p " )
print ( f " mv { chemin_fichier_this_article } { new_folder_path_this_article } " )
os . makedirs ( os . path . dirname ( new_folder_path_this_article ) , exist_ok = True )
# déplacer le fichier html dans le dossier slug, et le renommer en index.html ensuite pour ne pas modifier l'index du blog
shutil . move ( chemin_fichier_this_article , new_folder_path_this_article + ' index.html ' )
# os.remove(new_folder_path_this_article+'/index.html')
# shutil.move(new_folder_path_this_article+'/'+link_html , new_folder_path_this_article+'/index.html' )
2024-11-04 00:13:58 +01:00
2024-11-05 11:17:52 +01:00
# contenu_index_gmi += "\n# Articles in English\n-------------------------\n"
# contenu_index_html += "<h1>Articles in English</h1>"
2024-11-05 23:06:54 +01:00
lang_folder = " lang_en/ "
2024-11-05 11:17:52 +01:00
# for fichier in files_en:
# contenu_index_gmi += f"=> {fichier}\n"
# link_html = fichier.replace('..gmi','.html')
# contenu_index_html += f"<br><a href=/{lang_folder}{link_html}>{link_html}</a>"
2024-11-02 18:30:04 +01:00
# Écrit le contenu dans le fichier d'index
try :
2024-11-05 23:06:54 +01:00
# with open(chemin_fichier_index_gemini, 'w', encoding='utf-8') as file:
# file.write(contenu_index_gmi)
# print(f"Fichier d'index '{chemin_fichier_index_gemini}' généré avec succès.")
# os.remove('gemini-capsules/'+args.source+'/index.gmi')
# shutil.move(chemin_fichier_index_gemini, 'gemini-capsules/'+args.source+'/index.gmi')
print ( ' chemin_fichier_index_html ' , dossier_parent + chemin_fichier_index_html )
print ( ' ' )
with open ( dossier_parent + chemin_fichier_index_html , ' w ' , encoding = ' utf-8 ' ) as file :
2024-11-04 00:13:58 +01:00
file . write ( ' <html><head><title> ' + args . title + ' </title></head><body> ' + contenu_index_html + ' </article></body></html> ' )
print ( f " Fichier d ' index ' { chemin_fichier_index_html } ' généré avec succès. " )
2024-11-05 23:06:54 +01:00
# os.remove(dossier_parent+'/html-websites/'+args.source+'/index.html')
destination_html = dossier_parent + ' /html-websites/ ' + args . source + ' / '
shutil . move ( dossier_parent + chemin_fichier_index_html , destination_html )
shutil . move ( destination_html + chemin_fichier_index_html , destination_html + ' index.html ' )
print ( f " Déplacé dans ' { ' html-websites/ ' + args . source } ' . " )
2024-11-02 18:30:04 +01:00
except OSError as e :
print ( f " Erreur lors de l ' écriture du fichier d ' index : { e } " )
if __name__ == " __main__ " :
2024-11-05 11:17:52 +01:00
generer_index ( DOSSIER_SOURCE , FICHIER_INDEX , TITRE_INDEX )