llm_ticket3/utils/clean_html.py
2025-04-04 11:04:29 +02:00

135 lines
5.5 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Fonctions utilitaires pour nettoyer le HTML et formater les dates.
Version consolidée : intègre la fonctionnalité de base avec des améliorations
pour le traitement des messages transférés.
"""
import re
from datetime import datetime
def clean_html(html_content):
"""
Nettoie le contenu HTML pour le Markdown.
Supprime les balises, les bas de page, les messages automatiques et les sections vides.
"""
if not html_content:
return ""
# Traitement spécifique pour les messages transférés
if "\\-------- Message transféré --------" in html_content:
# Essayer d'extraire le contenu principal entre "Bonjour" et le disclaimer
match = re.search(r'Bonjour.*?(?=\n\s*_+Ce message)', html_content, re.DOTALL)
if match:
html_content = match.group(0).strip()
else:
# Si ce pattern ne fonctionne pas, essayer une approche plus générale
match = re.search(r'Copie à :.*?\n\s*\n(.*?)(?=\n\s*_+|\Z)', html_content, re.DOTALL)
if match:
html_content = match.group(1).strip()
# Transformer les balises h1 en titres Markdown
html_content = re.sub(r'<h1>(.*?)</h1>', r'### \1', html_content)
# Transformer les listes à puces
html_content = re.sub(r'<ul>(.*?)</ul>', r'\1', html_content, flags=re.DOTALL)
html_content = re.sub(r'<li><b>(.*?)</b></li>', r'- **\1**\n', html_content)
html_content = re.sub(r'<li>(.*?)</li>', r'- \1\n', html_content)
# Supprimer les balises simples
html_content = re.sub(r'<br\s*/?>|<p>|</p>|<div>|</div>', '\n', html_content)
# Supprimer les bas de page et messages automatiques du support
html_content = re.sub(r'Droit à la déconnexion :.*?(?=\n\n|\Z)', '', html_content, flags=re.DOTALL)
html_content = re.sub(r'\*\s*\*\s*\*.*?(?=\n\n|\Z)', '', html_content, flags=re.DOTALL)
html_content = re.sub(r'Ce message électronique et tous les fichiers.*?(?=\n\n|\Z)', '', html_content, flags=re.DOTALL)
html_content = re.sub(r'Afin d\'assurer une meilleure traçabilité.*?(?=\n\n|\Z)', '', html_content, flags=re.DOTALL)
html_content = re.sub(r'_Confidentialité :.*?(?=\n\n|\Z)', '', html_content, flags=re.DOTALL)
html_content = re.sub(r'Support technique.*?(?=\n\n|\Z)', '', html_content, flags=re.DOTALL)
# Suppression de l'image signature CBAO et autres images
html_content = re.sub(r'!\[CBAO - développeur de rentabilité.*?(?=\n\n|\Z)', '', html_content, flags=re.DOTALL)
html_content = re.sub(r'!\[.*?\]\(/web/image/.*?\)', '', html_content)
html_content = re.sub(r'!\[cid:.*?\]\(/web/image/.*?\)', '', html_content)
# Supprimer les balises HTML restantes
html_content = re.sub(r'<.*?>', '', html_content)
# Remplacer les entités HTML courantes
html_content = html_content.replace('&nbsp;', ' ')
html_content = html_content.replace('&lt;', '<')
html_content = html_content.replace('&gt;', '>')
html_content = html_content.replace('&amp;', '&')
html_content = html_content.replace('&quot;', '"')
# Supprimer les lignes avec uniquement des **
html_content = re.sub(r'^\s*\*\*\s*\*\*\s*$', '', html_content, flags=re.MULTILINE)
html_content = re.sub(r'^\s*\*\*\s*$', '', html_content, flags=re.MULTILINE)
# Supprimer le \--- à la fin des messages
html_content = re.sub(r'\\---\s*$', '', html_content)
# Supprimer les crochets isolés
html_content = re.sub(r'\[\s*$', '', html_content)
# Supprimer les lignes vides multiples
html_content = re.sub(r'\n\s*\n', '\n\n', html_content)
# Nettoyer au début et à la fin
html_content = html_content.strip()
# Supprimer les sections vides (comme "*Contenu vide*")
if not html_content or html_content.lower() == "*contenu vide*":
return "*Contenu vide*"
return html_content
def format_date(date_str):
"""
Formate une date ISO en format lisible.
"""
if not date_str:
return ""
try:
dt = datetime.fromisoformat(date_str.replace('Z', '+00:00'))
return dt.strftime("%d/%m/%Y %H:%M:%S")
except (ValueError, TypeError):
return date_str
if __name__ == "__main__":
# Test simple
html = """<p>Bonjour,</p>
<p>Voici un message avec <b>du HTML</b> et une signature.</p>
<p>Cordialement,</p>
<p>John Doe</p>
<p>Support technique</p>
<p>Afin d'assurer une meilleure traçabilité et vous garantir une prise en charge optimale,
nous vous invitons à envoyer vos demandes d'assistance technique à support@exemple.fr</p>
<p>![CBAO - développeur de rentabilité - www.exemple.fr](data:image/png;base64,ABC123)</p>
"""
cleaned = clean_html(html)
print("HTML nettoyé :\n", cleaned)
# Test avec un message transféré
forwarded = """\\-------- Message transféré -------- Sujet : | Test message
---|---
Date : | Mon, 30 Mar 2020 11:18:20 +0200
De : | [test@example.com](mailto:test@example.com)
Pour : | John Doe [](mailto:john@example.com)
Copie à : | [other@example.com](mailto:other@example.com)
Bonjour John,
Voici un message de test.
Cordialement,
Test User
__________________________________________________________________ Ce message et toutes les pièces jointes sont confidentiels et établis à l'intention exclusive de ses destinataires. __________________________________________________________________"""
cleaned_forwarded = clean_html(forwarded)
print("\nMessage transféré nettoyé :\n", cleaned_forwarded)