2024-10-15 23:53:54 +02:00
###
2024-09-06 11:47:54 +02:00
# prend le fichier personnages.org, détermine les noms des personnages selon les entêtes orgmode, et va ensuite lire le fichier livre.org et parcourir ses entêtes qui sont les chapitres du livre.
# générer un fichier csv qui listera les chapitres et les personnages en colonnes, pour compter 1 à chaque chapitre lorsque le nom du personnage est retrouvé dedans
# 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
2024-10-15 23:53:54 +02:00
###
2024-09-06 11:47:54 +02:00
import csv
import re
2024-10-15 19:12:23 +02:00
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 "
2024-09-06 11:47:54 +02:00
# Remplacer par les chemins vers les fichiers Org-mode
2024-10-15 23:53:54 +02:00
fichier_personnages = f " { args . dossier } /personnages.org "
2024-09-06 11:47:54 +02:00
2024-10-15 19:12:23 +02:00
# Expressions régulières pour extraire les noms des personnages, les alias et les titres des chapitres
2024-09-06 11:47:54 +02:00
regex_personnage = r " \ * \ * (.*) "
2024-10-15 19:12:23 +02:00
regex_alias = r " \ s*- alias: \ s*(.*?) \ s*$ "
2024-09-06 11:47:54 +02:00
regex_chapitre = r ' \ * \ * (.+) '
# Dictionnaire pour stocker les occurrences de personnages dans chaque chapitre
occurrences_personnages = { }
2024-10-15 19:12:23 +02:00
alias_separator = " ; "
2024-09-06 11:47:54 +02:00
2024-10-15 19:12:23 +02:00
def extract_character_info ( character_line ) :
match = re . search ( regex_personnage , character_line )
if match :
character = match . group ( 1 )
aliases = [ ]
# 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 ) ]
2024-10-15 23:53:54 +02:00
print ( " aliases " , aliases )
2024-10-15 19:12:23 +02:00
return character , aliases
2024-09-06 11:47:54 +02:00
2024-10-15 19:12:23 +02:00
return None , [ ]
# Ouvrir le fichier personnages.org et extraire les noms des personnages et leurs alias
2024-09-06 11:47:54 +02:00
def contains_any_of_these_words ( line : str , words : list [ str ] ) - > bool :
for word in words :
if word in line :
return True
return False
2024-10-15 19:12:23 +02:00
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 ( ) )
2024-09-06 11:47:54 +02:00
# Ouvrir le fichier livre.org et le fichier CSV
2024-10-15 19:12:23 +02:00
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 :
2024-09-06 11:47:54 +02:00
content = livre . read ( )
csv_writer = csv . writer ( fichier_csv )
# Écrire les en-têtes dans le fichier CSV
2024-10-15 19:12:23 +02:00
csv_writer . writerow ( [ ' Chapitre ' ] + list ( personnages . keys ( ) ) )
occurrences_chapitre = { personnage : 0 for personnage in personnages . keys ( ) }
2024-09-06 11:47:54 +02:00
chapitre = ' (chapitre not found) '
# Parcourir chaque ligne du fichier livre.org
for ligne in content . strip ( ) . split ( " \n " ) :
# Rechercher le titre du chapitre
match_chapitre = re . search ( regex_chapitre , ligne )
if match_chapitre :
chapitre = match_chapitre . group ( 1 )
chapitre = re . sub ( " :title: " , " " , chapitre )
print ( chapitre )
# Initialiser le dictionnaire d'occurrences pour chaque chapitre
2024-10-15 19:12:23 +02:00
occurrences_chapitre = { personnage : 0 for personnage in personnages . keys ( ) }
2024-09-06 11:47:54 +02:00
2024-10-15 19:12:23 +02:00
# 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
2024-10-15 23:53:54 +02:00
# print(personnage, ':', alias, ' : ', ligne)
# print(chapitre,' - ',personnage,' : ', ligne)
2024-09-06 11:47:54 +02:00
# 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 ( ) :
2024-10-15 19:12:23 +02:00
csv_writer . writerow ( [ chapitre ] + [ occurrences [ personnage ] for personnage in personnages . keys ( ) ] )