ParamManagerScripts/backend/script_groups/EmailCrono/utils/markdown_handler.py

142 lines
4.6 KiB
Python

# utils/markdown_handler.py
import os
import re
from datetime import datetime
from models.mensaje_email import MensajeEmail
def cargar_cronologia_existente(archivo):
"""
Carga mensajes existentes desde un archivo de cronología en formato markdown.
Formato esperado:
+ hash
### Subject
- fecha
Contenido...
### Adjuntos (opcional)
- [[archivo1]]
---
"""
mensajes = []
if not os.path.exists(archivo):
print(f"Archivo de cronología no existe: {archivo}")
return mensajes
print(f"Cargando cronología existente desde: {archivo}")
with open(archivo, "r", encoding="utf-8") as f:
contenido = f.read()
# Saltar el índice inicial si existe (hasta el primer ---\n\n)
if contenido.startswith("# Índice de Mensajes"):
partes = contenido.split("---\n\n", 1)
if len(partes) > 1:
contenido = partes[1]
else:
print("Archivo solo contiene índice, no hay mensajes")
return mensajes
# Dividir por separadores de mensaje
bloques = contenido.split("---\n\n")
print(f"Encontrados {len(bloques)} bloques para procesar")
for i, bloque in enumerate(bloques):
if not bloque.strip():
continue
try:
# Buscar el patrón: + hash, ### subject, - fecha, contenido
lineas = bloque.strip().split("\n")
# Encontrar hash
hash_msg = None
subject = None
fecha = None
contenido_inicio = 0
for j, linea in enumerate(lineas):
if linea.startswith("+ ") and not hash_msg:
hash_msg = linea[2:].strip()
elif linea.startswith("### ") and not subject:
subject = linea[4:].strip()
elif linea.startswith("- ") and not fecha:
try:
fecha_str = linea[2:].strip()
fecha = datetime.strptime(fecha_str, "%d-%m-%Y")
contenido_inicio = j + 1
break
except ValueError:
continue
if not hash_msg or not fecha:
print(f"Bloque {i+1}: No se pudo extraer hash o fecha, saltando")
continue
# Extraer contenido y adjuntos
contenido_lineas = lineas[contenido_inicio:]
adjuntos = []
# Buscar sección de adjuntos
contenido_texto = []
en_adjuntos = False
for linea in contenido_lineas:
if linea.strip() == "### Adjuntos":
en_adjuntos = True
continue
if en_adjuntos:
if linea.startswith("- [[") and linea.endswith("]]"):
adjunto = linea[4:-2] # Remover - [[ y ]]
adjuntos.append(adjunto)
else:
contenido_texto.append(linea)
# Unir contenido sin líneas vacías al final
contenido_final = "\n".join(contenido_texto).strip()
# Crear el mensaje sin especificar remitente ya que no está en el formato actual
# El remitente se extraerá del contenido si es posible
remitente = "Remitente Desconocido" # valor por defecto
# Intentar extraer remitente del contenido
for linea in contenido_final.split("\n")[
:5
]: # revisar solo las primeras líneas
if "From:" in linea or "De:" in linea or "Da:" in linea:
remitente = linea.strip()
break
mensaje = MensajeEmail(
remitente=remitente,
fecha=fecha,
contenido=contenido_final,
subject=subject,
adjuntos=adjuntos,
)
# Verificar que el hash coincida para validar
if mensaje.hash == hash_msg:
mensajes.append(mensaje)
print(f"✓ Mensaje cargado: {subject} - {fecha.strftime('%d-%m-%Y')}")
else:
print(f"⚠ Hash no coincide para mensaje {subject}, regenerando...")
# Si el hash no coincide, usar el hash original del archivo
mensaje.hash = hash_msg
mensajes.append(mensaje)
except Exception as e:
print(f"Error procesando bloque {i+1}: {str(e)}")
print(f"Contenido del bloque: {bloque[:200]}...")
continue
print(
f"Carga completada: {len(mensajes)} mensajes cargados desde cronología existente"
)
return mensajes