hbox-docs/hooks/documentos.py

53 lines
2.2 KiB
Python

"""Documentos con fecha para la página de inicio («Documentos recientes»), 21-oct-2026.
Cada página .md con `date:` en su encabezado (AAAA-MM-DD) entra en `datos/documentos.json`
del sitio construido, del más nuevo al más viejo. Lo lee docs/inicio/inicio.js.
Las páginas que en el menú están bajo «Historia» (lo superado) no entran.
No toca ningún archivo de docs/: el JSON solo existe en site/.
"""
import datetime
import json
import logging
import os
import re
log = logging.getLogger("mkdocs.hooks.documentos")
_DOCS = []
_FECHA = re.compile(r"^\d{4}-\d{2}-\d{2}$")
# fecha al final del título: «… (21-oct-2026)», «… · 21-oct-2026», «… — 16 oct»
_COLA = re.compile(r"\s*[(·—–-]\s*\d{1,2}[-\s](?:ene|feb|mar|abr|may|jun|jul|ago|sep|oct|nov|dic)[a-z]*\.?(?:[-\s]\d{4})?\s*\)?\s*$", re.I)
# o un paréntesis final con fecha: «… (19-oct-2026, tarde)», «… (24-oct → 22-nov-2026)»
_PAREN = re.compile(r"\s*\([^()]*\d{1,2}[-\s](?:ene|feb|mar|abr|may|jun|jul|ago|sep|oct|nov|dic)[^()]*\)\s*$", re.I)
def on_pre_build(config, **kwargs):
_DOCS.clear()
def _fecha(valor):
if isinstance(valor, (datetime.date, datetime.datetime)):
return valor.isoformat()[:10]
texto = str(valor or "")[:10]
return texto if _FECHA.match(texto) else None
def on_page_markdown(markdown, page, config, files, **kwargs):
fecha = _fecha(page.meta.get("date"))
if not fecha:
return markdown
if any(getattr(a, "title", "") == "Historia" for a in (page.ancestors or [])):
return markdown
titulo = str(page.meta.get("title") or page.title or "").strip()
titulo = _COLA.sub("", _PAREN.sub("", titulo)).strip() or titulo
_DOCS.append({"titulo": titulo, "fecha": fecha, "url": "/" + page.url})
return markdown
def on_post_build(config, **kwargs):
docs = sorted(_DOCS, key=lambda d: (d["fecha"], d["titulo"]), reverse=True)
destino = os.path.join(config["site_dir"], "datos", "documentos.json")
os.makedirs(os.path.dirname(destino), exist_ok=True)
with open(destino, "w", encoding="utf-8") as f:
json.dump({"total": len(docs), "documentos": docs[:60]}, f, ensure_ascii=False, indent=1)
log.info("documentos.json: %d documentos con fecha", len(docs))