up utils and global conf

This commit is contained in:
Tykayn 2024-11-15 15:56:11 +01:00 committed by tykayn
parent ed322fbad4
commit 9c72473913
17 changed files with 170 additions and 155 deletions

View File

@ -1,70 +0,0 @@
import os
import argparse
import re
import datetime
import shutil
def enlever_premier_tiret_ou_underscore(chaîne):
if chaîne.startswith('-') or chaîne.startswith('_'):
chaîne = chaîne[1:]
return chaîne
# Expression régulière pour extraire la date et le slug du nom de fichier org
regex = r"^(\d{4}(-?\d{2}){2}|\d{8})(-[a-zA-Z0-9_-]+)\.gmi$"
regex_orgroam = r"^(\d{14})_([a-zA-Z0-9_-]+)\.gmi$"
def find_year_and_slug(nom_de_fichier):
nom_de_fichier = nom_de_fichier.replace('..','.')
annee = ''
annee_presumed = nom_de_fichier[:4]
print(f"///////////////// /////////////////")
print(f"nom_de_fichier: {nom_de_fichier}")
if int(annee_presumed) >1970 and len(annee_presumed) == 4:
annee = str(annee_presumed)
print(f"année: {annee}")
match = re.match(regex_orgroam, nom_de_fichier)
if match:
date_str = match.group(1)
# annee = date_str[:4]
slug = match.group(2)
match = re.match(regex, nom_de_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 = nom_de_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('find_year_and_slug : ERREUR aucun slug trouvé')
return [None,annee,None]
print(f"str(date): {str(date)}")
print(f"slug: {slug}")
print(f"chemin: {annee}/{slug}/")
return [date_str, annee,slug]
def test_find_year_and_slug_short_date():
date_string, année, slug = find_year_and_slug("2024-10-12-machin_truc-chose.gmi")
assert slug == "machin_truc-chose"
assert année == "2024"
assert date_string == "2024-10-12"
def test_find_year_and_slug_orgroam_date():
date_string, année, slug = find_year_and_slug("20060925105123_tkblog_879_by-the-wall-intersubkey.gmi")
# assert slug == "by-the-wall-intersubkey"
assert année == "2006"
# assert date_string == "20060925"
test_find_year_and_slug_short_date()
test_find_year_and_slug_orgroam_date()

View File

@ -1,42 +0,0 @@
import re
import os
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
# Chemin absolu du dossier parent (pour sauver le fichier d'index)
dossier_parent = os.path.dirname(os.path.abspath(__file__))
nom = trouver_nom_article(dossier_parent+'/sources/cipherbliss_blog/contact.org')
print('nom ',nom)
nom = trouver_nom_article(dossier_parent+'/sources/cipherbliss_blog/lang_fr/20210927092238_cipherbliss_blog_238_des-sauvegardes-qui-durent-mille-ans.org')
print('nom ',nom)

View File

@ -1,9 +0,0 @@
* CipherBliss
[contact](contact.org)
* Articles
* en Fr
* en En
* Flux RSS
* Bisous

View File

@ -12,4 +12,4 @@ args = parser.parse_args()
print(configs_sites[args.blog_name]['DESCRIPTION']) print(configs_sites[args.blog_name]['DESCRIPTION'])
# print(configs_sites[f"{args.blog_name}"]['DESCRIPTION']) mylog(configs_sites[f"{args.blog_name}"]['DESCRIPTION'])

View File

@ -3,11 +3,14 @@
# script de déploiement pour syncroniser le site web statique et sa capsule gemini # script de déploiement pour syncroniser le site web statique et sa capsule gemini
# chemins sur le serveur : # chemins sur le serveur :
racine_sites_statiques="/poule/encrypted/www/" racine_sites_statiques="/poule/encrypted/www/"
images_inbox="/poule/encrypted/www/tykayn-inbox/blogs-output-pictures"
images_destination="/poule/encrypted/www/tykayn.fr/wp-content/uploads/i/"
# on part du principe que ce dépot est cloné sur le serveur pour simplifier la mise à jour # on part du principe que ce dépot est cloné sur le serveur pour simplifier la mise à jour
racine_depot_git="/poule/encrypted/www/orgmode-to-gemini-blog" racine_depot_git="/poule/encrypted/www/orgmode-to-gemini-blog"
# on copie les fichiers générés dans les dépots servis pour chaque nom de domaine # on copie les fichiers générés dans les dépots servis pour chaque nom de domaine
mv "$images_inbox/*" $images_destination
cp $racine_depot_git/templates/style_general.css $racine_sites_statiques/cipherbliss.com/ cp $racine_depot_git/templates/style_general.css $racine_sites_statiques/cipherbliss.com/
cp $racine_depot_git/html-websites/cipherbliss_blog/index.html $racine_sites_statiques/cipherbliss.com/ cp $racine_depot_git/html-websites/cipherbliss_blog/index.html $racine_sites_statiques/cipherbliss.com/
cp $racine_depot_git/html-websites/cipherbliss_blog/lang_fr/ $racine_sites_statiques/cipherbliss.com -r cp $racine_depot_git/html-websites/cipherbliss_blog/lang_fr/ $racine_sites_statiques/cipherbliss.com -r

130
utils.py
View File

@ -1,10 +1,138 @@
#!/bin/python3 #!/bin/python3
import os
import re import re
import shutil
from datetime import datetime
import website_config
from website_config import *
# this path should be customized # this path should be customized
org_roam_dir: str = '/home/tykayn/Nextcloud/textes/orgmode/org-roam/' 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-]+)' 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'<h1\s+(?:id|data-created)="[^"]*">(.*?)</h1>'
titre_niveau_2 = r'^\<h2.*?\>(.+)\<\/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): def get_id_of_roam_note_content(content):
@ -29,7 +157,7 @@ def find_first_level1_title(content):
def extract_body_content(html_content): def extract_body_content(html_content):
pattern = r'<body[^>]*?>(.*?)</body>' pattern = r'<body.*?>(.*?)</body>'
match = re.search(pattern, html_content, re.DOTALL) match = re.search(pattern, html_content, re.DOTALL)
if match: if match:
return match.group(1) return match.group(1)

View File

@ -2,25 +2,30 @@
# configuration pour générer les sites web de plusieurs dossiers # configuration pour générer les sites web de plusieurs dossiers
global_config = { global_config = {
"slug_with_year": True, "slug_with_year": True,
# "show_logs": False,
"show_logs": True,
"rebuild_files_filter": 2024, "rebuild_files_filter": 2024,
"source_files_extension": "org",
# controlled vocabulary to find tags automatically
"auto_tag_terms": ["illustration", "tuto", "nsfw", "bd", "récit", "science"]
} }
configs_sites = { configs_sites = {
"cipherbliss_blog": { "cipherbliss_blog": {
"DOSSIER_SOURCE":"cipherbliss_blog", "DOSSIER_SOURCE": "cipherbliss_blog",
"NDD_GEMINI": "source.cipherbliss.com", "NDD_GEMINI": "source.cipherbliss.com",
"BANNIERE_ENTETE":"", "BANNIERE_ENTETE": "",
"BLOG_TITLE":"Cipher Bliss", "BLOG_TITLE": "Cipher Bliss",
"BLOG_SUBTITLE":"Code, nouvelles technologies et entrepreneurariat par B. Lemoine", "BLOG_SUBTITLE": "Code, nouvelles technologies et entrepreneurariat par B. Lemoine",
"TITLE":"", "TITLE": "",
"AUTHOR":"Baptiste Lemoine", "AUTHOR": "Baptiste Lemoine",
"PAGE_TITLE":"", "PAGE_TITLE": "",
"LOCALE":"fr_FR", # la langue principale "LOCALE": "fr_FR", # la langue principale
"DESCRIPTION":"Code, nouvelles technologies et entrepreneurariat par B. Lemoine depuis 2014", "DESCRIPTION": "Code, nouvelles technologies et entrepreneurariat par B. Lemoine depuis 2014",
"NDD":"https://www.cipherbliss.com", "NDD": "https://www.cipherbliss.com",
"EMAIL":"contact@cipherbliss.com", "EMAIL": "contact@cipherbliss.com",
"SITE_ICON":"https://www.cipherbliss.com/wp-content/uploads/2016/12/rond.png", "SITE_ICON": "https://www.cipherbliss.com/wp-content/uploads/2016/12/rond.png",
"SITE_ICON_TYPE":"image/png", "SITE_ICON_TYPE": "image/png",
"NAVIGATION":""" "NAVIGATION": """
<nav> <nav>
<a href="/">Accueil</a> <a href="/">Accueil</a>
<a href="https://portfolio.cipherbliss.com">Portfolio</a> <a href="https://portfolio.cipherbliss.com">Portfolio</a>
@ -29,25 +34,25 @@ configs_sites = {
<a href="/ressources-de-café-vie-privée">Ressources</a> <a href="/ressources-de-café-vie-privée">Ressources</a>
</nav> </nav>
""", """,
"BANNIERE_ENTETE":"https://www.cipherbliss.com/wp-content/uploads/2016/11/bg.jpg", "BANNIERE_ENTETE": "https://www.cipherbliss.com/wp-content/uploads/2016/11/bg.jpg",
"BANNIERE_ENTETE_ALT":"Bannière du site", "BANNIERE_ENTETE_ALT": "Bannière du site",
}, },
"tykayn_blog": { "tykayn_blog": {
"DOSSIER_SOURCE":"tykayn_blog", "DOSSIER_SOURCE": "tykayn_blog",
"NDD_GEMINI": "source.tykayn.fr", "NDD_GEMINI": "source.tykayn.fr",
"BANNIERE_ENTETE":"", "BANNIERE_ENTETE": "",
"BLOG_TITLE":"Tykayn Blog", "BLOG_TITLE": "Tykayn Blog",
"BLOG_SUBTITLE":"Le vortex à chats - Illustrations, trucs en tout genre par Tykayn", "BLOG_SUBTITLE": "Le vortex à chats - Illustrations, trucs en tout genre par Tykayn",
"TITLE":"", "TITLE": "",
"AUTHOR":"Tykayn", "AUTHOR": "Tykayn",
"PAGE_TITLE":"Baptiste Lemoine", "PAGE_TITLE": "Baptiste Lemoine",
"LOCALE":"fr_FR", # la langue principale "LOCALE": "fr_FR", # la langue principale
"DESCRIPTION":"Illustrations, trucs en tout genre par Tykayn", "DESCRIPTION": "Illustrations, trucs en tout genre par Tykayn",
"NDD":"https://tykayn.fr", "NDD": "https://tykayn.fr",
"EMAIL":"contact@cipherbliss.com", "EMAIL": "contact@cipherbliss.com",
"SITE_ICON":"https://mastodon.cipherbliss.com/system/accounts/avatars/000/000/001/original/6388tykayn.gif", "SITE_ICON": "https://mastodon.cipherbliss.com/system/accounts/avatars/000/000/001/original/6388tykayn.gif",
"SITE_ICON_TYPE":"image/png", "SITE_ICON_TYPE": "image/png",
"NAVIGATION":""" "NAVIGATION": """
<nav> <nav>
<a href="/">Accueil</a> <a href="/">Accueil</a>
<a href="https://portfolio.cipherbliss.com">Portfolio</a> <a href="https://portfolio.cipherbliss.com">Portfolio</a>
@ -58,7 +63,7 @@ configs_sites = {
<a href="/contact">Contact</a> <a href="/contact">Contact</a>
</nav> </nav>
""", """,
"BANNIERE_ENTETE":"https://tykayn.fr/wp-content/themes/toivo-lite/images/header.jpg", "BANNIERE_ENTETE": "https://tykayn.fr/wp-content/themes/toivo-lite/images/header.jpg",
"BANNIERE_ENTETE_ALT":"Bannière du site", "BANNIERE_ENTETE_ALT": "Bannière du site",
}, },
} }