codigo0/scripts/anadir_enlaces_referencia.py
planetazuzu 1c083118e3 feat: añadir enlaces de referencia entre capítulos del manual
- Añadir secciones de enlaces recomendados en 8 capítulos clave
- Crear guía de enlaces de referencia (GUIA_ENLACES_REFERENCIA.md)
- Crear script para añadir enlaces automáticamente
- Organizar enlaces por categorías: prerrequisitos, relacionados, aplicación práctica, continuación

Capítulos actualizados:
- BLOQUE_02_3_COLLARIN_CERVICAL.md (10 enlaces)
- BLOQUE_04_1_RCP_ADULTOS.md (8 enlaces)
- BLOQUE_03_0_OXIGENOTERAPIA_FUNDAMENTOS.md (7 enlaces)
- BLOQUE_06_1_DEL_VIAL_A_LA_VENA.md (7 enlaces)
- BLOQUE_02_2_INMOVILIZACION_MANUAL.md (7 enlaces)
- BLOQUE_02_5_TABLERO_ESPINAL.md (7 enlaces)
- BLOQUE_06_0_PRINCIPIOS_ADMINISTRACION.md (8 enlaces)
- BLOQUE_04_0_RECONOCIMIENTO_PCR.md (4 enlaces)

Total: ~40 enlaces añadidos entre capítulos relacionados
2025-12-19 21:24:06 +01:00

238 lines
8 KiB
Python

#!/usr/bin/env python3
"""
Script para añadir enlaces de referencia entre capítulos del manual
Basado en manual-index.ts y relaciones lógicas entre capítulos
"""
import os
import re
from pathlib import Path
from typing import Dict, List, Tuple, Optional
BASE_DIR = Path(__file__).parent.parent
MANUAL_DIR = BASE_DIR / "MANUAL_TES_DIGITAL"
# Mapeo de relaciones entre capítulos
RELACIONES: Dict[str, Dict[str, List[str]]] = {
# Bloque 2 - Inmovilización
"BLOQUE_02_3_COLLARIN_CERVICAL.md": {
"prerrequisitos": [
"BLOQUE_02_0_ANATOMIA_OPERATIVA.md",
"BLOQUE_02_2_INMOVILIZACION_MANUAL.md",
],
"relacionados": [
"BLOQUE_02_5_TABLERO_ESPINAL.md",
"BLOQUE_02_6_COLCHON_VACIO.md",
"BLOQUE_02_4_CAMILLA_CUCHARA.md",
"BLOQUE_02_7_EXTRICACION_MOVIMIENTOS_BLOQUE.md",
],
"aplicacion": [
"../02_PROCEDIMIENTOS_BASICOS/1.2_abcde_operativo.md",
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_1_RCP_ADULTOS.md",
],
"continuacion": [
"BLOQUE_02_8_TRANSFERENCIAS_MOVILIZACION.md",
],
},
# Bloque 4 - RCP
"BLOQUE_04_1_RCP_ADULTOS.md": {
"prerrequisitos": [
"BLOQUE_04_0_RECONOCIMIENTO_PCR.md",
"../02_PROCEDIMIENTOS_BASICOS/1.2_abcde_operativo.md",
],
"relacionados": [
"BLOQUE_04_2_RCP_PEDIATRIA.md",
"BLOQUE_04_3_RCP_LACTANTES.md",
"BLOQUE_04_4_USO_DESA.md",
"BLOQUE_04_5_VENTILACION_BVM.md",
],
"transtelefonico": [
"../06_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_1_RCP_TRANSTELEFONICA_ADULTOS.md",
],
},
# Bloque 3 - Oxigenoterapia
"BLOQUE_03_0_OXIGENOTERAPIA_FUNDAMENTOS.md": {
"prerrequisitos": [
"../02_PROCEDIMIENTOS_BASICOS/1.1_constantes_vitales.md",
"../02_PROCEDIMIENTOS_BASICOS/1.2_abcde_operativo.md",
],
"relacionados": [
"BLOQUE_03_1_DISPOSITIVOS_OXIGENOTERAPIA.md",
"BLOQUE_03_3_BVM.md",
"BLOQUE_03_10_MONITORIZACION_BASICA.md",
],
"aplicacion": [
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_1_RCP_ADULTOS.md",
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_5_VENTILACION_BVM.md",
],
},
# Bloque 6 - Farmacología
"BLOQUE_06_1_DEL_VIAL_A_LA_VENA.md": {
"prerrequisitos": [
"BLOQUE_06_0_PRINCIPIOS_ADMINISTRACION.md",
],
"relacionados": [
"BLOQUE_06_2_ANALGESICOS_SEDANTES.md",
"BLOQUE_06_3_VASOACTIVOS_AMINAS.md",
"BLOQUE_06_5_FARMACOS_CARDIOLOGICOS.md",
],
"aplicacion": [
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_1_RCP_ADULTOS.md",
],
},
}
# Mapeo de nombres de archivo a rutas completas
def encontrar_archivo(nombre: str, directorio_actual: Path) -> Optional[str]:
"""Encuentra la ruta relativa de un archivo desde el directorio actual"""
# Buscar en el mismo directorio
archivo_local = directorio_actual / nombre
if archivo_local.exists():
return f"./{nombre}"
# Buscar en subdirectorios del manual
for subdir in MANUAL_DIR.rglob("*"):
if subdir.is_dir():
archivo = subdir / nombre
if archivo.exists():
# Calcular ruta relativa
rel_path = os.path.relpath(archivo, directorio_actual)
return rel_path.replace("\\", "/")
return None
def generar_seccion_enlaces(archivo: Path, relaciones: Dict[str, List[str]]) -> str:
"""Genera la sección de enlaces en formato Markdown"""
directorio_actual = archivo.parent
seccion = "\n---\n\n## 🔗 Enlaces recomendados / Guía de referencia\n\n"
# Prerrequisitos
if relaciones.get("prerrequisitos"):
seccion += "### Prerrequisitos\n\n"
for rel in relaciones["prerrequisitos"]:
ruta = encontrar_archivo(rel, directorio_actual) or rel
nombre = rel.replace(".md", "").replace("BLOQUE_", "").replace("_", " ")
seccion += f"- [{nombre}]({ruta})\n"
seccion += "\n"
# Relacionados
if relaciones.get("relacionados"):
seccion += "### Capítulos relacionados\n\n"
for rel in relaciones["relacionados"]:
ruta = encontrar_archivo(rel, directorio_actual) or rel
nombre = rel.replace(".md", "").replace("BLOQUE_", "").replace("_", " ")
seccion += f"- [{nombre}]({ruta})\n"
seccion += "\n"
# Aplicación práctica
if relaciones.get("aplicacion"):
seccion += "### Aplicación práctica\n\n"
for rel in relaciones["aplicacion"]:
ruta = rel # Ya es ruta relativa
nombre = Path(rel).stem.replace("BLOQUE_", "").replace("_", " ")
seccion += f"- [{nombre}]({ruta})\n"
seccion += "\n"
# Continuación
if relaciones.get("continuacion"):
seccion += "### Continuación\n\n"
for rel in relaciones["continuacion"]:
ruta = encontrar_archivo(rel, directorio_actual) or rel
nombre = rel.replace(".md", "").replace("BLOQUE_", "").replace("_", " ")
seccion += f"- [{nombre}]({ruta})\n"
seccion += "\n"
# Protocolos transtelefónicos
if relaciones.get("transtelefonico"):
seccion += "### Protocolos transtelefónicos\n\n"
for rel in relaciones["transtelefonico"]:
ruta = rel
nombre = Path(rel).stem.replace("BLOQUE_", "").replace("_", " ")
seccion += f"- [{nombre}]({ruta})\n"
seccion += "\n"
return seccion.rstrip() + "\n"
def añadir_enlaces_a_archivo(archivo: Path, relaciones: Dict[str, List[str]]) -> bool:
"""Añade enlaces de referencia a un archivo Markdown"""
if not archivo.exists():
print(f"❌ Archivo no encontrado: {archivo}")
return False
contenido = archivo.read_text(encoding='utf-8')
# Verificar si ya tiene sección de enlaces
if "## 🔗 Enlaces recomendados" in contenido:
print(f"⏭️ Ya tiene enlaces: {archivo.name}")
return False
# Buscar el final del archivo (última línea con contenido)
lineas = contenido.rstrip().split('\n')
# Buscar última línea con contenido antes de líneas vacías finales
ultima_linea_contenido = len(lineas) - 1
while ultima_linea_contenido >= 0 and not lineas[ultima_linea_contenido].strip():
ultima_linea_contenido -= 1
# Generar sección de enlaces
seccion_enlaces = generar_seccion_enlaces(archivo, relaciones)
# Insertar antes de la última línea (o al final si no hay separador)
if ultima_linea_contenido >= 0:
# Insertar después de la última línea con contenido
lineas.insert(ultima_linea_contenido + 1, seccion_enlaces)
else:
lineas.append(seccion_enlaces)
nuevo_contenido = '\n'.join(lineas)
# Guardar
archivo.write_text(nuevo_contenido, encoding='utf-8')
print(f"✅ Enlaces añadidos: {archivo.name}")
return True
def main():
"""Función principal"""
print("=" * 70)
print("🔗 AÑADIR ENLACES DE REFERENCIA ENTRE CAPÍTULOS")
print("=" * 70)
print()
añadidos = 0
omitidos = 0
# Procesar cada archivo con relaciones definidas
for nombre_archivo, relaciones in RELACIONES.items():
# Buscar archivo en el manual
archivo = None
for subdir in MANUAL_DIR.rglob(nombre_archivo):
if subdir.is_file():
archivo = subdir
break
if not archivo:
print(f"⚠️ Archivo no encontrado: {nombre_archivo}")
omitidos += 1
continue
if añadir_enlaces_a_archivo(archivo, relaciones):
añadidos += 1
else:
omitidos += 1
print()
print("=" * 70)
print(f"📊 RESUMEN: {añadidos} añadidos, {omitidos} omitidos")
print("=" * 70)
if __name__ == "__main__":
main()