hbox-docs/hooks/frontmatter.py

48 lines
1.7 KiB
Python

"""Repara el encabezado YAML (front matter) de las páginas que llegan con dos puntos sin comillas.
Ejemplo real (19-oct): `author: Helgen Technologies (auditoría: Claude; revisión: Leo)`.
YAML no acepta ese valor, MkDocs ignora todo el encabezado y lo pinta como texto al principio
de la página. Aquí, solo si el encabezado no se puede leer, se ponen entre comillas los valores
que tienen «: » y se vuelve a intentar. El archivo en disco no se toca (muchas de estas páginas
llegan por scripts/sync-docs.sh); lo correcto es arreglar el original en el repo Drogheda.
"""
import logging
import re
import yaml
log = logging.getLogger("mkdocs.hooks.frontmatter")
_FM = re.compile(r"\A(---[ \t]*\n)(.*?\n)(---[ \t]*\n)", re.S)
_LINEA = re.compile(r"^([A-Za-z0-9_\-]+):[ \t]+(.+?)[ \t]*$")
def _lee(texto):
try:
datos = yaml.safe_load(texto)
return isinstance(datos, dict)
except yaml.YAMLError:
return False
def on_page_read_source(page, config, **kwargs):
try:
with open(page.file.abs_src_path, encoding="utf-8-sig") as f:
fuente = f.read()
except OSError:
return None
m = _FM.match(fuente)
if not m or _lee(m.group(2)):
return None
lineas = []
for linea in m.group(2).split("\n"):
r = _LINEA.match(linea)
if r and ": " in r.group(2) and r.group(2)[0] not in "\"'[{|>":
valor = r.group(2).replace("\\", "\\\\").replace('"', '\\"')
linea = f'{r.group(1)}: "{valor}"'
lineas.append(linea)
nuevo = "\n".join(lineas)
if not _lee(nuevo):
return None
log.info("Encabezado YAML reparado (dos puntos sin comillas): %s", page.file.src_uri)
return m.group(1) + nuevo + m.group(3) + fuente[m.end():]