⚡ find characters script now admits aliases separated by ;
This commit is contained in:
parent
d76e23bb65
commit
20753789c9
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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()])
|
||||
|
||||
|
@ -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
|
||||
|
@ -8,18 +8,25 @@ 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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user