# 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