From 20753789c97a22214a7bb4cd3518a318664c0396 Mon Sep 17 00:00:00 2001 From: Tykayn Date: Tue, 15 Oct 2024 19:12:23 +0200 Subject: [PATCH] :zap: find characters script now admits aliases separated by ; --- README.md | 3 ++ _models/example_livre/livre.org | 4 ++ _models/example_livre/personnages.org | 3 ++ find_characters_in_book.py | 66 +++++++++++++++++++-------- up_infos.sh | 1 + update_book.sh | 17 +++++-- 6 files changed, 71 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 0b1ed8e..1d26e04 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,9 @@ Afin d'avoir une structure qui aura visuellement du sens pour l'autrice du livre Votre livre peut contenir des médias, nous vous invitons à les placer dans le dossier "assets". Le dossier "inspirations" est destiné à avoir des images, des médias, des documents divers, une bibliographie, c'est toujours utile de référencer ses inspirations pour clarifier ce que l'on aimerait raconter. ## Personnages + +Donnez des alias à vos personnages dans la ligne prévue à cet effet afin de comptabiliser leurs mentions dans le script find_characters_in_book.py + ## Intrigues Les intrigues sont des arcs narratifs qui peuvent se superposer dans votre histoire. Pour avoir cette vision des superpositions, le script `make_intrigues_to_csv.py` liste les entêtes et recherche si elles contiennent deux nombres séparés par un tiret. diff --git a/_models/example_livre/livre.org b/_models/example_livre/livre.org index ac24284..4ddfd98 100644 --- a/_models/example_livre/livre.org +++ b/_models/example_livre/livre.org @@ -21,14 +21,18 @@ ** Préface :title: ** Introduction :title: ** Chapitre 1 :title: +présentation de bob. *** Chapitre 1 - Partie 1 *** Chapitre 1 - Partie 2 *** Chapitre 1 - Partie 3 ** Chapitre 2 :title: +présentation de chuck norris. +présentation de bobette. *** Chapitre 2 - Partie 1 *** Chapitre 2 - Partie 2 *** Chapitre 2 - Partie 3 ** Chapitre 3 :title: +bob et bobette sont bien plus stylés que le roux. *** Chapitre 3 - Partie 1 *** Chapitre 3 - Partie 2 *** Chapitre 3 - Partie 3 diff --git a/_models/example_livre/personnages.org b/_models/example_livre/personnages.org index da083fc..68edf21 100644 --- a/_models/example_livre/personnages.org +++ b/_models/example_livre/personnages.org @@ -10,15 +10,18 @@ - objectifs: - conflits: - évolution: +- alias: Bob l'éponge, SpongeBob ** chuck norris - nom: - personnalité: - objectifs: - conflits: - évolution: +- alias: le roux; celui dont on ne doit pas prononcer le nom ** bobette - nom: - personnalité: - objectifs: - conflits: - évolution: +- alias: diff --git a/find_characters_in_book.py b/find_characters_in_book.py index 5ec7d2c..37c4962 100644 --- a/find_characters_in_book.py +++ b/find_characters_in_book.py @@ -4,38 +4,68 @@ # les personnages que l'on recherche dans le livre ne sont pas mentionnés dans la ligne d'entête; mais dans les lignes entre deux entêtes, dans les corps de texte import csv import re +import argparse +import os + +# Ajouter un argument pour le chemin du dossier contenant le fichier livre.org +parser = argparse.ArgumentParser(description='Rechercher les occurrences de personnages dans un fichier Org-mode.') +parser.add_argument('dossier', nargs='?', help='Le chemin du dossier contenant le fichier livre.org. Si aucun dossier n\'est spécifié, le dossier courant sera utilisé.', default=os.getcwd()) +args = parser.parse_args() + +# Concaténer le chemin du dossier et le nom du fichier livre.org +fichier_livre = f"{args.dossier}/livre.org" # Remplacer par les chemins vers les fichiers Org-mode -fichier_personnages = 'personnages.org' -fichier_livre = 'livre.org' +fichier_personnages = f"{args.dossier}personnages.org" -# Expressions régulières pour extraire les noms des personnages et les titres des chapitres +# Expressions régulières pour extraire les noms des personnages, les alias et les titres des chapitres regex_personnage = r"\*\* (.*)" +regex_alias = r"\s*- alias:\s*(.*?)\s*$" regex_chapitre = r'\*\* (.+)' # Dictionnaire pour stocker les occurrences de personnages dans chaque chapitre occurrences_personnages = {} +alias_separator=";" -# Ouvrir le fichier personnages.org et extraire les noms des personnages -with open(fichier_personnages, 'r', encoding='utf-8') as fichier_personnages: - personnages = [re.sub( "\*\* ","",ligne.strip()) for ligne in fichier_personnages if re.match(regex_personnage, ligne)] +def extract_character_info(character_line): + match = re.search(regex_personnage, character_line) + if match: + character = match.group(1) + aliases = [] -print('personnages: ', personnages) + # Extraire les alias du caractère + match_alias = re.search(regex_alias, character_line) + if match_alias: + aliases = [alias.strip() for alias in match_alias.group(1).split(alias_separator)] + + return character, aliases + + return None, [] + +# Ouvrir le fichier personnages.org et extraire les noms des personnages et leurs alias def contains_any_of_these_words(line: str, words: list[str]) -> bool: for word in words: if word in line: return True return False +with open(fichier_personnages, 'r', encoding='utf-8') as fichier_personnages: + personnages = {} + for ligne in fichier_personnages: + character, aliases = extract_character_info(ligne) + if character: + personnages[character] = aliases + +print('personnages: ', personnages.keys()) # Ouvrir le fichier livre.org et le fichier CSV -with open(fichier_livre, 'r', encoding='utf-8') as livre, open('occurrences_personnages.csv', 'w', newline='', encoding='utf-8') as fichier_csv: +with open(fichier_livre, 'r', encoding='utf-8') as livre, open(f"{args.dossier}/occurrences_personnages.csv", 'w', newline='', encoding='utf-8') as fichier_csv: content = livre.read() csv_writer = csv.writer(fichier_csv) # Écrire les en-têtes dans le fichier CSV - csv_writer.writerow(['Chapitre'] + personnages) - occurrences_chapitre = {personnage: 0 for personnage in personnages} + csv_writer.writerow(['Chapitre'] + list(personnages.keys())) + occurrences_chapitre = {personnage: 0 for personnage in personnages.keys()} chapitre = '(chapitre not found)' # Parcourir chaque ligne du fichier livre.org @@ -47,17 +77,17 @@ with open(fichier_livre, 'r', encoding='utf-8') as livre, open('occurrences_pers chapitre = re.sub( ":title:", "", chapitre) print(chapitre) # Initialiser le dictionnaire d'occurrences pour chaque chapitre - occurrences_chapitre = {personnage: 0 for personnage in personnages} + occurrences_chapitre = {personnage: 0 for personnage in personnages.keys()} - # Parcourir chaque personnage et rechercher son nom dans la ligne - for personnage in personnages: - - if personnage in ligne: - occurrences_chapitre[personnage] += 1 - print(chapitre,' - ',personnage,' : ', ligne) + # Parcourir chaque personnage et rechercher son nom ou ses alias dans la ligne + for personnage, aliases in personnages.items(): + if personnage.lower() in ligne.lower() or any(alias.lower() in ligne.lower() for alias in aliases): + occurrences_chapitre[personnage] += 1 + print(chapitre,' - ',personnage,' : ', ligne) # Ajouter les occurrences du chapitre au dictionnaire global occurrences_personnages[chapitre] = occurrences_chapitre # Écrire les occurrences des personnages dans le fichier CSV for chapitre, occurrences in occurrences_personnages.items(): - csv_writer.writerow([chapitre] + [occurrences[personnage] for personnage in personnages]) + csv_writer.writerow([chapitre] + [occurrences[personnage] for personnage in personnages.keys()]) + diff --git a/up_infos.sh b/up_infos.sh index 539f1fe..81d84bc 100755 --- a/up_infos.sh +++ b/up_infos.sh @@ -5,3 +5,4 @@ python3 find_characters_in_book.py python3 stats_chapitres.py python3 make_intrigues_to_csv.py python3 gantt_parser.py +python3 follow_progress.py diff --git a/update_book.sh b/update_book.sh index faf6d92..dbc21b9 100755 --- a/update_book.sh +++ b/update_book.sh @@ -8,20 +8,27 @@ echo "mise à jour du dossier $1 sans modifier les contenus Org" dossier=$1 -cp Makefile "$dossier/" if ! [ -d $dossier ]; then - echo "le dossier $dossier n'existe pas, oh noes!" + echo "le dossier $dossier n'existe pas, oh noes! ajoutez le en argument à ce script: \n bash update_ebook.sh /$USER/Nextcloud/textes/livre_bidule" else + # on supprime les scripts existants + rm "$dossier/*.py" + rm "$dossier/*.sh" + rm "$dossier/*.css" + + # on met les nouvelles versions + cp Makefile "$dossier/" cp *.py "$dossier/" cp *.sh "$dossier/" cp *.css "$dossier/" cp README.md "$dossier/" cp LICENSE "$dossier/" + if ! [ -d $dossier/.git ]; then - cd $dossier - git init + cd $dossier + git init fi fi -echo "dossier $dossier mis à jour" \ No newline at end of file +echo "dossier $dossier mis à jour"