import os import argparse import re import datetime import shutil import re # from enrich_html import static_page_path # génère l'index gemini et html des articles rangés par langue 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() # Variables personnalisables DOSSIER_SOURCE = 'sources/'+args.source # Nom du dossier contenant les fichiers Markdown FICHIER_INDEX = 'index_'+args.source # Nom du fichier d'index à générer # TITRE_INDEX = f" # {args.title} - Articles" TITRE_INDEX = f"" source_files_extension="org" # Expression régulière pour extraire la date et le slug du nom de fichier org regex = r"^(\d{14})(-[a-zA-Z0-9_-]+)\.gmi$" regex_orgroam = r"^(\d{14})_([a-zA-Z0-9_-]+)\.gmi$" use_article_file_for_name=False website_name = args.source def trouver_nom_article(fichier_org): print('fichier_org, ',fichier_org) with open(fichier_org, 'r') as file: lignes = file.readlines() # Expressions régulières pour trouver les titres de niveau 1 et 2 titre_niveau_1 = r'^\*+ (.+)$' titre_niveau_2 = r'^\*\*+ (.+)$' nom_article = None # Itérer sur les lignes du fichier for ligne in lignes: # Rechercher un titre de niveau 1 titre_niveau_1_match = re.match(titre_niveau_1, ligne) if titre_niveau_1_match: titre_niveau_1_texte = titre_niveau_1_match.group(1) if titre_niveau_1_texte.lower() != "article": nom_article = titre_niveau_1_texte break else: # Si le premier titre de niveau 1 est "Article", rechercher le premier titre de niveau 2 titre_niveau_2_match = re.match(titre_niveau_2, ligne) if titre_niveau_2_match: nom_article = titre_niveau_2_match.group(1) break print(f"Nom de l'article : {nom_article}") return nom_article def find_year_and_slug(fichier): fichier = fichier.replace('..','.') # print(f" ------------ build_indexes: find in {fichier} -------------") slug = fichier.replace('.gmi','') annee = '2024' date_str= '2024-00-00' date= '2024-00-00' match = re.match(regex_orgroam, fichier) if match: date_str = match.group(1) annee = date_str[:4] slug = match.group(2) 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','') # else: # print('ERREUR aucun slug trouvé') # print(f" ------------ build_indexes: ") # print(f" ------------ build_indexes: Fichier: {fichier}") # print(f" ------------ build_indexes: année: {annee}") # print(f" ------------ build_indexes: str(date): {str(date)}") # print(f" ------------ build_indexes: slug: {slug}") # print(f" ------------ build_indexes: chemin: {annee}/{slug}/") return [date_str, annee, slug] def enlever_premier_tiret_ou_underscore(chaîne): if chaîne.startswith('-') or chaîne.startswith('_'): chaîne = chaîne[1:] return chaîne # 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) shutil.move(file, path) def get_files_list_of_folder(folder_path): # Vérifie si le dossier existe if not os.path.exists(folder_path): print(f" ------------ build_indexes: 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" ------------ build_indexes: Erreur lors de la lecture du dossier : {e}") return # 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 # Titre pour le fichier d'index 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): # Chemin absolu du dossier parent (pour sauver le fichier d'index) dossier_parent = os.path.dirname(os.path.abspath(__file__)) empty_folder_content(dossier_parent+'/html-websites/'+args.source+'/') empty_folder_content(dossier_parent+'/gemini-capsules/'+args.source+'/') # Chemin complet du dossier contenant les Markdown chemin_dossier_source = os.path.join(dossier_parent, dossier_source) 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') # Chemin complet pour le fichier d'index chemin_fichier_index_gemini = os.path.join(dossier_parent, fichier_index+'.gmi') chemin_fichier_index_html = os.path.join(dossier_parent, '/'+fichier_index+'.html') print('\n index html: ', chemin_fichier_index_html) # Génère le contenu du fichier d'index 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" contenu_index_html += "