75 lines
2.5 KiB
Python
75 lines
2.5 KiB
Python
# models/pagina_html.py
|
|
import os
|
|
import re
|
|
import hashlib
|
|
from pathlib import Path
|
|
|
|
|
|
class PaginaHTML:
|
|
def __init__(self, ruta_archivo, titulo=None, contenido=None, imagenes=None):
|
|
self.ruta_archivo = ruta_archivo
|
|
self.nombre_archivo = Path(ruta_archivo).name
|
|
self.titulo = titulo or self._extraer_titulo_de_ruta()
|
|
self.contenido = contenido or ""
|
|
self.hash = self._generar_hash()
|
|
self.imagenes = imagenes or [] # Lista de imágenes asociadas a esta página
|
|
|
|
def _extraer_titulo_de_ruta(self):
|
|
"""Extrae el título a partir del nombre del archivo."""
|
|
nombre = Path(self.ruta_archivo).stem
|
|
# Limpia el nombre: reemplaza guiones y underscores por espacios
|
|
nombre = re.sub(r"[_-]", " ", nombre)
|
|
# Capitaliza cada palabra
|
|
nombre = " ".join(word.capitalize() for word in nombre.split())
|
|
return nombre
|
|
|
|
def _generar_hash(self):
|
|
"""Genera un hash único para la página."""
|
|
elementos_hash = [
|
|
self.nombre_archivo,
|
|
self.titulo,
|
|
(
|
|
self.contenido[:500] if self.contenido else ""
|
|
), # Usar solo los primeros 500 caracteres
|
|
]
|
|
|
|
texto_hash = "|".join(elementos_hash)
|
|
return hashlib.md5(texto_hash.encode()).hexdigest()
|
|
|
|
def to_markdown(self):
|
|
"""Convierte la página a formato Markdown."""
|
|
# Hash como comentario al principio
|
|
hash_line = f"<!-- {self.hash} -->\n\n"
|
|
|
|
# Título como encabezado
|
|
titulo_line = f"## {self.titulo}\n\n"
|
|
|
|
# Nombre del archivo original como referencia
|
|
origen_line = f"*Origen: {self.nombre_archivo}*\n\n"
|
|
|
|
# Contenido
|
|
md = f"{hash_line}{titulo_line}{origen_line}"
|
|
|
|
# Limpiar cualquier artefacto de asteriscos extra antes de agregar el contenido
|
|
contenido_limpio = re.sub(r"(\*{3,}|\-{3,}|_{3,})", "---", self.contenido)
|
|
md += contenido_limpio + "\n\n"
|
|
|
|
# Ya no se agregan imágenes al final - se asume que están en el contenido
|
|
|
|
md += "---\n\n"
|
|
|
|
return md
|
|
|
|
def get_index_entry(self):
|
|
"""Genera una entrada para el índice."""
|
|
# Formatear el título para el enlace de Markdown
|
|
slug = re.sub(r"[^\w\s-]", "", self.titulo.lower())
|
|
slug = re.sub(r"\s+", "-", slug)
|
|
|
|
return f"- [{self.titulo}](#{slug})"
|
|
|
|
def add_imagen(self, imagen):
|
|
"""Añade una referencia a una imagen asociada a esta página."""
|
|
if imagen not in self.imagenes:
|
|
self.imagenes.append(imagen)
|