48 lines
1.7 KiB
Python
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():]
|