#!/bin/python3
import os
import re
import shutil
from datetime import datetime
import website_config
from website_config import *
# this path should be customized
org_roam_dir: str = '/home/tykayn/Nextcloud/textes/orgmode/org-roam/'
# Trouver l'identifiant OrgROAM
pattern_roam_id_search = r':ID:(?:\s+)?([a-zA-Z0-9-]+)'
# 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$"
# Recherche de date de création du fichier org-roam dans un article gemini
regex_orgroam = r"^(\d{14})_([a-zA-Z0-9_-]+)\.gmi$"
# show_logs=True
show_logs = global_config["show_logs"]
def mylog(*content):
"""Fonction qui imprime tous les arguments passés selon le niveau de debug souhaité."""
if show_logs:
print(content)
def trouver_nom_article(fichier_org, blog_name, format="html"):
mylog('fichier_org, ', fichier_org)
with open(fichier_org, 'r') as file:
lignes = file.readlines()
nom_article = ''
mylog('trouver_nom_article format', format)
# Expressions régulières pour trouver les titres de niveau 1 et 2
if format == 'html':
titre_niveau_1 = r'
(.*?)
'
titre_niveau_2 = r'^\(.+)\<\/h2\>$'
else:
titre_niveau_1 = r'^\*+ (.+)$'
titre_niveau_2 = r'^\*\*+ (.+)$'
# 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" and titre_niveau_1_texte.lower() != "liens":
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
mylog(f"Nom de l'article : {nom_article}")
return nom_article.replace(blog_name + '_', '').replace('_', ' ')
def find_year_and_slug(fichier):
fichier = fichier.replace('..', '.')
mylog(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.strptime(date_str, "%Y-%m-%d")
else:
date = 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é')
mylog(f" ------------ build_indexes: ")
mylog(f" ------------ build_indexes: Fichier: {fichier}")
mylog(f" ------------ build_indexes: année: {annee}")
mylog(f" ------------ build_indexes: str(date): {str(date)}")
mylog(f" ------------ build_indexes: slug: {slug}")
mylog(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 '{folder_path}' n'existe pas.")
return
mylog('----------- get_files_list_of_folder: folder_path : ', folder_path)
# Liste les fichiers articles, trie par nom décroissant
try:
fichiers_md = sorted(
[f.replace('.' + website_config['source_files_extension'], '.gmi') for f in os.listdir(folder_path) if
f.endswith(website_config['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
def get_id_of_roam_note_content(content):
match = re.search(pattern_roam_id_search, content)
if match:
return match.group(1)
return None
def find_first_level1_title(content):
pattern = r'^\* (.+)$'
match = re.search(pattern, content, re.MULTILINE)
if match:
if match.group(1) != 'Article':
return match.group(1)
else:
pattern = r'^\*\* (.+)$'
match = re.search(pattern, content, re.MULTILINE)
if match:
return match.group(1)
return None
def extract_body_content(html_content):
pattern = r'(.*?)