script(cats): sub-clasifica evangelio por posición (lectura/editorial/comentario)

Regla del editor confirmada contra CSV histórico: dentro de "Evangelio y
comentarios al Evangelio" el orden es siempre:
  pos 1 → lectura del evangelio
  pos 2 → comentario editorial
  pos 3+ → comentarios

Mejora diff contra CSV marzo 2026: 8.655 → 9.286 mismas cats
(de 1.599 a 968 divergencias, -631 resueltas).

Residual mayoritario son posts que ya no aparecen en las cartas
actuales (links eliminados, k2 ids sin mapping) o granularidad fina
no implementada (lectura dentro de eucaristía, secciones especiales).

Refs #42.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-25 15:43:28 -04:00
parent 89fcd10a5d
commit 64672857fd
+24 -9
View File
@@ -8,14 +8,16 @@ Output: post_id, post_title, categoria_propuesta, seccion_original, carta_id, ca
ALCANCE (vs. CSV histórico de marzo 2026):
- Cubre las 5 secciones estándar: comentario, articulo, eucaristia, multimedia, effa.
- NO cubre granularidad fina del CSV histórico:
· `comentario_editorial` (subgrupo de comentario)
· `lectura` (lecturas bíblicas dentro de eucaristía)
· `otro` (catch-all)
· `noticia` (subgrupo)
→ Estos quedan agrupados como `comentario` o `eucaristia` según su encabezado padre.
- NO cubre encabezados de fiestas especiales ("Domingo de Resurrección", "Navidad",
"Vigilia Pascual", etc.) — quedan como sin sección y se ignoran.
- Sub-clasifica por posición dentro de "Evangelio y comentarios al Evangelio":
· pos 1 → `lectura` (cita del evangelio)
· pos 2 → `comentario_editorial`
· pos 3+ → `comentario`
(regla del editor, confirmada contra el CSV histórico)
- NO cubre todavía:
· `lectura` dentro de eucaristía (lecturas bíblicas — el viejo las separa, aquí van todas a `eucaristia`)
· `otro` (catch-all del catch-all)
· `noticia` (subgrupo poco usado, 12 filas en el viejo)
· Encabezados de fiestas especiales ("Domingo de Resurrección", "Navidad", "Vigilia Pascual", etc.)
Para regenerar el CSV con cobertura completa habría que ampliar el mapping en
SECTION_PATTERNS y SECTION_LABELS con reglas adicionales. El CSV histórico
@@ -59,6 +61,10 @@ CAT_PROPUESTA = {
'effa': 'effa',
}
# Sub-clasificación posicional dentro de la sección "Evangelio y comentarios al Evangelio".
# El editor SIEMPRE coloca: 1º lectura del evangelio, 2º comentario editorial, 3º+ comentarios.
SUBCAT_EVANGELIO_BY_POS = ['lectura', 'comentario_editorial'] # resto = 'comentario'
HREF_RX = re.compile(r'href=["\']([^"\']+)["\']', re.I)
WP_SLUG_RX = re.compile(r'(?:^|/)fea/([a-z0-9\-]+)/?(?:[?#]|$)', re.I)
K2_ITEM_RX = re.compile(r'/item/(\d+)-[^/"]+\.html', re.I)
@@ -217,12 +223,21 @@ def main():
sections = extract_sections(content)
for slug, urls in sections.items():
label = SECTION_LABELS[slug]
cat = CAT_PROPUESTA[slug]
default_cat = CAT_PROPUESTA[slug]
# Filtrar a posts resueltos manteniendo orden
resolved = []
for url in urls:
pid = url_to_post_id(url, slug_to_id, k2_to_id)
if pid is None:
n_unresolved += 1
continue
resolved.append(pid)
for pos, pid in enumerate(resolved):
# Sub-clasificación posicional para evangelio
if slug == 'comentario' and pos < len(SUBCAT_EVANGELIO_BY_POS):
cat = SUBCAT_EVANGELIO_BY_POS[pos]
else:
cat = default_cat
n_resolved += 1
needed_titles.add(pid)
rows_out.append({