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): ALCANCE (vs. CSV histórico de marzo 2026):
- Cubre las 5 secciones estándar: comentario, articulo, eucaristia, multimedia, effa. - Cubre las 5 secciones estándar: comentario, articulo, eucaristia, multimedia, effa.
- NO cubre granularidad fina del CSV histórico: - Sub-clasifica por posición dentro de "Evangelio y comentarios al Evangelio":
· `comentario_editorial` (subgrupo de comentario) · pos 1 → `lectura` (cita del evangelio)
· `lectura` (lecturas bíblicas dentro de eucaristía) · pos 2 → `comentario_editorial`
· `otro` (catch-all) · pos 3+ → `comentario`
· `noticia` (subgrupo) (regla del editor, confirmada contra el CSV histórico)
→ Estos quedan agrupados como `comentario` o `eucaristia` según su encabezado padre. - NO cubre todavía:
- NO cubre encabezados de fiestas especiales ("Domingo de Resurrección", "Navidad", · `lectura` dentro de eucaristía (lecturas bíblicas — el viejo las separa, aquí van todas a `eucaristia`)
"Vigilia Pascual", etc.) — quedan como sin sección y se ignoran. · `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 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 SECTION_PATTERNS y SECTION_LABELS con reglas adicionales. El CSV histórico
@@ -59,6 +61,10 @@ CAT_PROPUESTA = {
'effa': 'effa', '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) HREF_RX = re.compile(r'href=["\']([^"\']+)["\']', re.I)
WP_SLUG_RX = re.compile(r'(?:^|/)fea/([a-z0-9\-]+)/?(?:[?#]|$)', 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) K2_ITEM_RX = re.compile(r'/item/(\d+)-[^/"]+\.html', re.I)
@@ -217,12 +223,21 @@ def main():
sections = extract_sections(content) sections = extract_sections(content)
for slug, urls in sections.items(): for slug, urls in sections.items():
label = SECTION_LABELS[slug] label = SECTION_LABELS[slug]
cat = CAT_PROPUESTA[slug] default_cat = CAT_PROPUESTA[slug]
# Filtrar a posts resueltos manteniendo orden
resolved = []
for url in urls: for url in urls:
pid = url_to_post_id(url, slug_to_id, k2_to_id) pid = url_to_post_id(url, slug_to_id, k2_to_id)
if pid is None: if pid is None:
n_unresolved += 1 n_unresolved += 1
continue 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 n_resolved += 1
needed_titles.add(pid) needed_titles.add(pid)
rows_out.append({ rows_out.append({