find characters script now admits aliases separated by ;

This commit is contained in:
Tykayn 2024-10-15 19:12:23 +02:00 committed by tykayn
parent d76e23bb65
commit 20753789c9
6 changed files with 71 additions and 23 deletions

View File

@ -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". 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. 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 ## 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 ## Intrigues
Les intrigues sont des arcs narratifs qui peuvent se superposer dans votre histoire. 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. 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.

View File

@ -21,14 +21,18 @@
** Préface :title: ** Préface :title:
** Introduction :title: ** Introduction :title:
** Chapitre 1 :title: ** Chapitre 1 :title:
présentation de bob.
*** Chapitre 1 - Partie 1 *** Chapitre 1 - Partie 1
*** Chapitre 1 - Partie 2 *** Chapitre 1 - Partie 2
*** Chapitre 1 - Partie 3 *** Chapitre 1 - Partie 3
** Chapitre 2 :title: ** Chapitre 2 :title:
présentation de chuck norris.
présentation de bobette.
*** Chapitre 2 - Partie 1 *** Chapitre 2 - Partie 1
*** Chapitre 2 - Partie 2 *** Chapitre 2 - Partie 2
*** Chapitre 2 - Partie 3 *** Chapitre 2 - Partie 3
** Chapitre 3 :title: ** Chapitre 3 :title:
bob et bobette sont bien plus stylés que le roux.
*** Chapitre 3 - Partie 1 *** Chapitre 3 - Partie 1
*** Chapitre 3 - Partie 2 *** Chapitre 3 - Partie 2
*** Chapitre 3 - Partie 3 *** Chapitre 3 - Partie 3

View File

@ -10,15 +10,18 @@
- objectifs: - objectifs:
- conflits: - conflits:
- évolution: - évolution:
- alias: Bob l'éponge, SpongeBob
** chuck norris ** chuck norris
- nom: - nom:
- personnalité: - personnalité:
- objectifs: - objectifs:
- conflits: - conflits:
- évolution: - évolution:
- alias: le roux; celui dont on ne doit pas prononcer le nom
** bobette ** bobette
- nom: - nom:
- personnalité: - personnalité:
- objectifs: - objectifs:
- conflits: - conflits:
- évolution: - évolution:
- alias:

View File

@ -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 # 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 csv
import re 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 # Remplacer par les chemins vers les fichiers Org-mode
fichier_personnages = 'personnages.org' fichier_personnages = f"{args.dossier}personnages.org"
fichier_livre = 'livre.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_personnage = r"\*\* (.*)"
regex_alias = r"\s*- alias:\s*(.*?)\s*$"
regex_chapitre = r'\*\* (.+)' regex_chapitre = r'\*\* (.+)'
# Dictionnaire pour stocker les occurrences de personnages dans chaque chapitre # Dictionnaire pour stocker les occurrences de personnages dans chaque chapitre
occurrences_personnages = {} occurrences_personnages = {}
alias_separator=";"
# Ouvrir le fichier personnages.org et extraire les noms des personnages def extract_character_info(character_line):
with open(fichier_personnages, 'r', encoding='utf-8') as fichier_personnages: match = re.search(regex_personnage, character_line)
personnages = [re.sub( "\*\* ","",ligne.strip()) for ligne in fichier_personnages if re.match(regex_personnage, ligne)] 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: def contains_any_of_these_words(line: str, words: list[str]) -> bool:
for word in words: for word in words:
if word in line: if word in line:
return True return True
return False 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 # 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() content = livre.read()
csv_writer = csv.writer(fichier_csv) csv_writer = csv.writer(fichier_csv)
# Écrire les en-têtes dans le fichier CSV # Écrire les en-têtes dans le fichier CSV
csv_writer.writerow(['Chapitre'] + personnages) csv_writer.writerow(['Chapitre'] + list(personnages.keys()))
occurrences_chapitre = {personnage: 0 for personnage in personnages} occurrences_chapitre = {personnage: 0 for personnage in personnages.keys()}
chapitre = '(chapitre not found)' chapitre = '(chapitre not found)'
# Parcourir chaque ligne du fichier livre.org # 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) chapitre = re.sub( ":title:", "", chapitre)
print(chapitre) print(chapitre)
# Initialiser le dictionnaire d'occurrences pour chaque 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 # Parcourir chaque personnage et rechercher son nom ou ses alias dans la ligne
for personnage in personnages: for personnage, aliases in personnages.items():
if personnage.lower() in ligne.lower() or any(alias.lower() in ligne.lower() for alias in aliases):
if personnage in ligne: occurrences_chapitre[personnage] += 1
occurrences_chapitre[personnage] += 1 print(chapitre,' - ',personnage,' : ', ligne)
print(chapitre,' - ',personnage,' : ', ligne)
# Ajouter les occurrences du chapitre au dictionnaire global # Ajouter les occurrences du chapitre au dictionnaire global
occurrences_personnages[chapitre] = occurrences_chapitre occurrences_personnages[chapitre] = occurrences_chapitre
# Écrire les occurrences des personnages dans le fichier CSV # Écrire les occurrences des personnages dans le fichier CSV
for chapitre, occurrences in occurrences_personnages.items(): 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()])

View File

@ -5,3 +5,4 @@ python3 find_characters_in_book.py
python3 stats_chapitres.py python3 stats_chapitres.py
python3 make_intrigues_to_csv.py python3 make_intrigues_to_csv.py
python3 gantt_parser.py python3 gantt_parser.py
python3 follow_progress.py

View File

@ -8,18 +8,25 @@ echo "mise à jour du dossier $1 sans modifier les contenus Org"
dossier=$1 dossier=$1
cp Makefile "$dossier/"
if ! [ -d $dossier ]; then 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 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 *.py "$dossier/"
cp *.sh "$dossier/" cp *.sh "$dossier/"
cp *.css "$dossier/" cp *.css "$dossier/"
cp README.md "$dossier/" cp README.md "$dossier/"
cp LICENSE "$dossier/" cp LICENSE "$dossier/"
if ! [ -d $dossier/.git ]; then if ! [ -d $dossier/.git ]; then
cd $dossier cd $dossier
git init git init
fi fi
fi fi