94 lines
4.2 KiB
Python
94 lines
4.2 KiB
Python
|
|
# 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
|
|
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 = f"{args.dossier}personnages.org"
|
|
|
|
# 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=";"
|
|
|
|
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)]
|
|
|
|
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(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'] + list(personnages.keys()))
|
|
occurrences_chapitre = {personnage: 0 for personnage in personnages.keys()}
|
|
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
|
|
occurrences_chapitre = {personnage: 0 for personnage in personnages.keys()}
|
|
|
|
# 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.keys()])
|
|
|