book_generator/format_typo.py
2025-01-19 16:11:23 +01:00

87 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# corrige un fichier livre.org afin de supprimer les erreurs de typographie courantes:
# phrases sans majuscules
# plus de deux sauts de ligne consécutifs
# espaces manquants autour de certaines ponctuations.
import re
# Ouvrir le fichier livre.org en mode lecture
with open('livre.org', 'r') as f:
contenu = f.read()
def corriger_typo(contenu):
# Corriger les majuscules au début des phrases
contenu = re.sub(r'(^|\.\s+|\n\s*)([a-z])', lambda x: x.group(1) + x.group(2).upper(), contenu)
# Supprimer les sauts de ligne multiples
contenu = re.sub(r'\n{3,}', '\n\n', contenu)
# Ajouter des espaces autour de la ponctuation
contenu = re.sub(r'([.,;:!?])([^\s])', r'\1 \2', contenu)
# Corriger les entêtes orgmode (remplacer ": " par ":")
contenu = re.sub(r"^(#\+[A-Z_]+): ", r"\1:", contenu, flags=re.MULTILINE)
# Corriger les espaces manquants autour de certaines ponctuations
contenu = re.sub(r"([.,;:!?])( )?", r"\1 ", contenu)
contenu = re.sub(r"( )([.,;:!?])", r" \2", contenu)
# replace demiquatratin by full quadratin
contenu = contenu.replace('', '')
contenu = contenu.replace(' ?', chr(160)+"?")
contenu = contenu.replace(' !', chr(160)+"!")
contenu = contenu.replace(' »', chr(160)+"»")
contenu = contenu.replace('« ', "«"+chr(160))
contenu = contenu.replace('ya', "y a")
return contenu
def comparer_textes(texte_original, texte_corrige):
# Compare les deux textes et retourne le nombre de différences
nb_sauts = len(re.findall(r'\n{3,}', texte_original)) - len(re.findall(r'\n{3,}', texte_corrige))
nb_entetes = len(re.findall(r"^#\+[A-Z_]+: ", texte_original)) - len(re.findall(r"^#\+[A-Z_]+: ", texte_corrige))
nb_espaces = len(re.findall(r"([.,;:!?])( )?", texte_original)) - len(re.findall(r"([.,;:!?])( )?", texte_corrige))
nb_espaces += len(re.findall(r"( )([.,;:!?])", texte_original)) - len(re.findall(r"( )([.,;:!?])", texte_corrige))
nb_maj = sum(1 for m in re.finditer(r"^([a-z])", contenu)) - sum(1 for m in re.finditer(r"^([a-z])", contenu_corrige))
if nb_maj > 0:
print(f" Ajout de majuscules aux débuts de phrases : {nb_maj} modification(s)")
# Afficher le rapport des modifications
print("\nRapport des modifications :")
print(f"- Sauts de ligne supprimés : {nb_sauts}")
print(f"- Entêtes corrigées : {nb_entetes}")
print(f"- Espacements corrigés : {nb_espaces}")
print(f"Total des modifications : {nb_sauts + nb_entetes + nb_espaces}\n")
return nb_maj, nb_sauts, nb_entetes, nb_espaces
def sauvegarder_si_modifie(contenu_corrige, nb_maj, nb_sauts, nb_espaces):
# Faire un rapport des modifications apportées
if nb_maj == 0 and nb_sauts == 0 and nb_espaces == 0:
print("🎉 Pas de modifications à apporter !")
# Ne sauvegarder que s'il y a des modifications
if nb_maj > 0 or nb_sauts > 0 or nb_espaces > 0:
print("💾 Sauvegarde des modifications...")
with open('livre.org', 'w') as f:
f.write(contenu_corrige)
else:
print("Aucune modification à sauvegarder")
def corriger_typo_entete(contenu):
"""Corrige les entêtes orgmode en remplaçant ': ' par ':' uniquement dans les lignes d'entête."""
lignes = contenu.split('\n')
lignes_corrigees = []
for ligne in lignes:
if ligne.startswith('#+'): # Ne traite que les lignes d'entête
ligne = re.sub(r"^(#\+[A-Z_]+): ", r"\1:", ligne)
lignes_corrigees.append(ligne)
return '\n'.join(lignes_corrigees)
if __name__ == "__main__":
contenu_corrige = corriger_typo(contenu)
contenu_corrige = corriger_typo_entete(contenu_corrige)
nb_maj, nb_sauts, nb_entetes, nb_espaces = comparer_textes(contenu, contenu_corrige)
sauvegarder_si_modifie(contenu_corrige, nb_maj, nb_sauts, nb_espaces)