142 lines
4.6 KiB
Python
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
|