- Añadir hook useServiceWorker para gestionar SW y actualizaciones - Crear componente UpdateNotification para notificar actualizaciones - Mejorar registro del SW con updateViaCache: 'none' - Añadir verificación de actualizaciones al recuperar foco - Mejorar manifest.json con iconos adicionales - Añadir CACHE_VERSION en sw.js para control de actualizaciones Mejoras: - Detección automática de nuevas versiones del SW - Banner visual cuando hay actualización disponible - Botón para actualizar ahora o más tarde - Verificación periódica (cada hora) + al recuperar foco - Limpieza automática de caches antiguos Documentación: - VERIFICACION_PWA.md - Guía de verificación - TEST_PWA.md - Tests y checklist - RESUMEN_PWA_ACTUALIZACIONES.md - Resumen de mejoras
863 lines
27 KiB
Python
863 lines
27 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Script para añadir enlaces de referencia a TODOS los capítulos del manual
|
|
Basado en estructura de carpetas y relaciones lógicas
|
|
"""
|
|
|
|
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 completo de relaciones entre capítulos
|
|
RELACIONES_COMPLETAS: Dict[str, Dict[str, List[str]]] = {
|
|
# BLOQUE 0 - FUNDAMENTOS
|
|
"BLOQUE_00_FUNDAMENTOS_EMERGENCIAS.md": {
|
|
"relacionados": [
|
|
"../02_PROCEDIMIENTOS_BASICOS/1.1_constantes_vitales.md",
|
|
"../02_PROCEDIMIENTOS_BASICOS/1.2_abcde_operativo.md",
|
|
"../02_PROCEDIMIENTOS_BASICOS/1.4_triage_start.md",
|
|
],
|
|
},
|
|
|
|
# BLOQUE 1 - PROCEDIMIENTOS BÁSICOS
|
|
"1.1_constantes_vitales.md": {
|
|
"relacionados": [
|
|
"1.2_abcde_operativo.md",
|
|
"1.3_glasgow_operativo.md",
|
|
"../05_OXIGENOTERAPIA_Y_MATERIAL_SANITARIO/BLOQUE_03_10_MONITORIZACION_BASICA.md",
|
|
],
|
|
"continuacion": [
|
|
"1.2_abcde_operativo.md",
|
|
],
|
|
},
|
|
|
|
"1.2_abcde_operativo.md": {
|
|
"prerrequisitos": [
|
|
"1.1_constantes_vitales.md",
|
|
],
|
|
"relacionados": [
|
|
"1.3_glasgow_operativo.md",
|
|
"1.4_triage_start.md",
|
|
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_0_RECONOCIMIENTO_PCR.md",
|
|
],
|
|
"continuacion": [
|
|
"1.3_glasgow_operativo.md",
|
|
],
|
|
},
|
|
|
|
"1.3_glasgow_operativo.md": {
|
|
"prerrequisitos": [
|
|
"1.1_constantes_vitales.md",
|
|
"1.2_abcde_operativo.md",
|
|
],
|
|
"relacionados": [
|
|
"1.4_triage_start.md",
|
|
],
|
|
"continuacion": [
|
|
"1.4_triage_start.md",
|
|
],
|
|
},
|
|
|
|
"1.4_triage_start.md": {
|
|
"prerrequisitos": [
|
|
"1.1_constantes_vitales.md",
|
|
"1.2_abcde_operativo.md",
|
|
],
|
|
"relacionados": [
|
|
"../09_TRIAGE_MULTIPLES_VICTIMAS/BLOQUE_07_2_METODO_START.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_01_5_PULSIOXIMETRO.md": {
|
|
"prerrequisitos": [
|
|
"1.1_constantes_vitales.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_01_6_TENSIOMETRO.md",
|
|
"BLOQUE_01_7_GLUCOMETRO.md",
|
|
"../05_OXIGENOTERAPIA_Y_MATERIAL_SANITARIO/BLOQUE_03_10_MONITORIZACION_BASICA.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_01_6_TENSIOMETRO.md": {
|
|
"prerrequisitos": [
|
|
"1.1_constantes_vitales.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_01_5_PULSIOXIMETRO.md",
|
|
"BLOQUE_01_7_GLUCOMETRO.md",
|
|
"../05_OXIGENOTERAPIA_Y_MATERIAL_SANITARIO/BLOQUE_03_10_MONITORIZACION_BASICA.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_01_7_GLUCOMETRO.md": {
|
|
"prerrequisitos": [
|
|
"1.1_constantes_vitales.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_01_5_PULSIOXIMETRO.md",
|
|
"BLOQUE_01_6_TENSIOMETRO.md",
|
|
"../05_OXIGENOTERAPIA_Y_MATERIAL_SANITARIO/BLOQUE_03_11_GLUCOMETRO.md",
|
|
],
|
|
},
|
|
|
|
# BLOQUE 2 - INMOVILIZACIÓN
|
|
"BLOQUE_02_0_ANATOMIA_OPERATIVA.md": {
|
|
"relacionados": [
|
|
"BLOQUE_02_2_INMOVILIZACION_MANUAL.md",
|
|
"BLOQUE_02_3_COLLARIN_CERVICAL.md",
|
|
],
|
|
"continuacion": [
|
|
"BLOQUE_02_2_INMOVILIZACION_MANUAL.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_02_2_INMOVILIZACION_MANUAL.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_02_0_ANATOMIA_OPERATIVA.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_02_3_COLLARIN_CERVICAL.md",
|
|
"BLOQUE_02_5_TABLERO_ESPINAL.md",
|
|
"BLOQUE_02_6_COLCHON_VACIO.md",
|
|
],
|
|
"continuacion": [
|
|
"BLOQUE_02_3_COLLARIN_CERVICAL.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_02_4_CAMILLA_CUCHARA.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_02_2_INMOVILIZACION_MANUAL.md",
|
|
"BLOQUE_02_3_COLLARIN_CERVICAL.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_02_5_TABLERO_ESPINAL.md",
|
|
"BLOQUE_02_6_COLCHON_VACIO.md",
|
|
"BLOQUE_02_8_TRANSFERENCIAS_MOVILIZACION.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_02_6_COLCHON_VACIO.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_02_2_INMOVILIZACION_MANUAL.md",
|
|
"BLOQUE_02_3_COLLARIN_CERVICAL.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_02_5_TABLERO_ESPINAL.md",
|
|
"BLOQUE_02_4_CAMILLA_CUCHARA.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_02_7_EXTRICACION_MOVIMIENTOS_BLOQUE.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_02_2_INMOVILIZACION_MANUAL.md",
|
|
"BLOQUE_02_3_COLLARIN_CERVICAL.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_02_5_TABLERO_ESPINAL.md",
|
|
"BLOQUE_02_8_TRANSFERENCIAS_MOVILIZACION.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_02_8_TRANSFERENCIAS_MOVILIZACION.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_02_2_INMOVILIZACION_MANUAL.md",
|
|
"BLOQUE_02_3_COLLARIN_CERVICAL.md",
|
|
],
|
|
"relacionados": [
|
|
"../08_TRANSFERENCIA_Y_TRASLADO/BLOQUE_08_1_PREPARACION_TRASLADO.md",
|
|
"../08_TRANSFERENCIA_Y_TRASLADO/BLOQUE_08_2_GESTION_DURANTE_TRASLADO.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_02_9_ERRORES_CRITICOS.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_02_2_INMOVILIZACION_MANUAL.md",
|
|
"BLOQUE_02_3_COLLARIN_CERVICAL.md",
|
|
"BLOQUE_02_5_TABLERO_ESPINAL.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_02_2_INMOVILIZACION_MANUAL.md",
|
|
"BLOQUE_02_3_COLLARIN_CERVICAL.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_02_10_FERULAS.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_02_0_ANATOMIA_OPERATIVA.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_02_11_CINTURON_PELVICO.md",
|
|
"BLOQUE_02_12_FERULA_TRACCION.md",
|
|
],
|
|
},
|
|
|
|
# BLOQUE 3 - SOPORTE VITAL
|
|
"BLOQUE_04_2_RCP_PEDIATRIA.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_04_0_RECONOCIMIENTO_PCR.md",
|
|
"BLOQUE_04_1_RCP_ADULTOS.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_04_1_RCP_ADULTOS.md",
|
|
"BLOQUE_04_3_RCP_LACTANTES.md",
|
|
"BLOQUE_04_4_USO_DESA.md",
|
|
],
|
|
"transtelefonico": [
|
|
"../06_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_2_RCP_TRANSTELEFONICA_NINOS.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_04_3_RCP_LACTANTES.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_04_0_RECONOCIMIENTO_PCR.md",
|
|
"BLOQUE_04_1_RCP_ADULTOS.md",
|
|
"BLOQUE_04_2_RCP_PEDIATRIA.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_04_1_RCP_ADULTOS.md",
|
|
"BLOQUE_04_2_RCP_PEDIATRIA.md",
|
|
],
|
|
"transtelefonico": [
|
|
"../06_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_3_RCP_TRANSTELEFONICA_LACTANTES.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_04_4_USO_DESA.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_04_1_RCP_ADULTOS.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_04_1_RCP_ADULTOS.md",
|
|
"BLOQUE_04_5_VENTILACION_BVM.md",
|
|
],
|
|
"transtelefonico": [
|
|
"../06_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_4_DESA_GUIADO_TELEFONO.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_04_5_VENTILACION_BVM.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_04_1_RCP_ADULTOS.md",
|
|
"../05_OXIGENOTERAPIA_Y_MATERIAL_SANITARIO/BLOQUE_03_0_OXIGENOTERAPIA_FUNDAMENTOS.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_04_1_RCP_ADULTOS.md",
|
|
"BLOQUE_04_6_USO_CANULAS_OPA_NPA.md",
|
|
"../05_OXIGENOTERAPIA_Y_MATERIAL_SANITARIO/BLOQUE_03_3_BVM.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_04_6_USO_CANULAS_OPA_NPA.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_04_5_VENTILACION_BVM.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_04_5_VENTILACION_BVM.md",
|
|
"BLOQUE_04_7_ASPIRACION_SECRECIONES.md",
|
|
"../05_OXIGENOTERAPIA_Y_MATERIAL_SANITARIO/BLOQUE_03_23_CANULAS_ORO_NASOFARINGEAS.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_04_7_ASPIRACION_SECRECIONES.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_04_5_VENTILACION_BVM.md",
|
|
"BLOQUE_04_6_USO_CANULAS_OPA_NPA.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_04_5_VENTILACION_BVM.md",
|
|
"BLOQUE_04_6_USO_CANULAS_OPA_NPA.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_04_8_POSICIONES_SEGURIDAD_MOVILIZACION.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_04_0_RECONOCIMIENTO_PCR.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_04_1_RCP_ADULTOS.md",
|
|
"../04_MATERIAL_E_INMOVILIZACION/BLOQUE_02_2_INMOVILIZACION_MANUAL.md",
|
|
],
|
|
},
|
|
|
|
# BLOQUE 4 - OXIGENOTERAPIA
|
|
"BLOQUE_03_1_DISPOSITIVOS_OXIGENOTERAPIA.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_03_0_OXIGENOTERAPIA_FUNDAMENTOS.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_03_0_OXIGENOTERAPIA_FUNDAMENTOS.md",
|
|
"BLOQUE_03_3_BVM.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_03_2_ASPIRACION.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_03_0_OXIGENOTERAPIA_FUNDAMENTOS.md",
|
|
],
|
|
"relacionados": [
|
|
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_7_ASPIRACION_SECRECIONES.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_03_3_BVM.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_03_0_OXIGENOTERAPIA_FUNDAMENTOS.md",
|
|
"BLOQUE_03_1_DISPOSITIVOS_OXIGENOTERAPIA.md",
|
|
],
|
|
"relacionados": [
|
|
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_5_VENTILACION_BVM.md",
|
|
"BLOQUE_03_24_USO_CORRECTO_BVM_AMBU.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_03_4_CANULAS.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_03_0_OXIGENOTERAPIA_FUNDAMENTOS.md",
|
|
],
|
|
"relacionados": [
|
|
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_6_USO_CANULAS_OPA_NPA.md",
|
|
"BLOQUE_03_23_CANULAS_ORO_NASOFARINGEAS.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_03_6_CONTROL_HEMORRAGIAS.md": {
|
|
"prerrequisitos": [
|
|
"../02_PROCEDIMIENTOS_BASICOS/1.2_abcde_operativo.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_03_8_HERIDAS_VENDAJES.md",
|
|
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_1_RCP_ADULTOS.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_03_7_QUEMADURAS.md": {
|
|
"prerrequisitos": [
|
|
"../02_PROCEDIMIENTOS_BASICOS/1.2_abcde_operativo.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_03_6_CONTROL_HEMORRAGIAS.md",
|
|
"BLOQUE_03_8_HERIDAS_VENDAJES.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_03_8_HERIDAS_VENDAJES.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_03_6_CONTROL_HEMORRAGIAS.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_03_6_CONTROL_HEMORRAGIAS.md",
|
|
"BLOQUE_03_7_QUEMADURAS.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_03_10_MONITORIZACION_BASICA.md": {
|
|
"prerrequisitos": [
|
|
"../02_PROCEDIMIENTOS_BASICOS/1.1_constantes_vitales.md",
|
|
],
|
|
"relacionados": [
|
|
"../02_PROCEDIMIENTOS_BASICOS/BLOQUE_01_5_PULSIOXIMETRO.md",
|
|
"../02_PROCEDIMIENTOS_BASICOS/BLOQUE_01_6_TENSIOMETRO.md",
|
|
"BLOQUE_03_0_OXIGENOTERAPIA_FUNDAMENTOS.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_03_11_GLUCOMETRO.md": {
|
|
"prerrequisitos": [
|
|
"../02_PROCEDIMIENTOS_BASICOS/1.1_constantes_vitales.md",
|
|
],
|
|
"relacionados": [
|
|
"../02_PROCEDIMIENTOS_BASICOS/BLOQUE_01_7_GLUCOMETRO.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_03_22_DISPOSITIVOS_SUPRAGLOTICOS.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_03_3_BVM.md",
|
|
"BLOQUE_03_4_CANULAS.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_03_3_BVM.md",
|
|
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_5_VENTILACION_BVM.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_03_23_CANULAS_ORO_NASOFARINGEAS.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_03_4_CANULAS.md",
|
|
],
|
|
"relacionados": [
|
|
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_6_USO_CANULAS_OPA_NPA.md",
|
|
"BLOQUE_03_3_BVM.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_03_24_USO_CORRECTO_BVM_AMBU.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_03_3_BVM.md",
|
|
],
|
|
"relacionados": [
|
|
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_5_VENTILACION_BVM.md",
|
|
"BLOQUE_03_0_OXIGENOTERAPIA_FUNDAMENTOS.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_03_25_VENTILACION_MEDIOS_FORTUNA.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_03_3_BVM.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_03_24_USO_CORRECTO_BVM_AMBU.md",
|
|
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_5_VENTILACION_BVM.md",
|
|
],
|
|
},
|
|
|
|
# BLOQUE 5 - PROTOCOLOS TRANSTELEFÓNICOS
|
|
"BLOQUE_05_0_COMUNICACION_TRANSTELEFONICA_FUNDAMENTAL.md": {
|
|
"relacionados": [
|
|
"BLOQUE_05_1_RCP_TRANSTELEFONICA_ADULTOS.md",
|
|
"../08_TRANSFERENCIA_Y_TRASLADO/BLOQUE_08_3_COMUNICACION_PRE_HOSPITALARIA.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_05_1_RCP_TRANSTELEFONICA_ADULTOS.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_05_0_COMUNICACION_TRANSTELEFONICA_FUNDAMENTAL.md",
|
|
],
|
|
"relacionados": [
|
|
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_1_RCP_ADULTOS.md",
|
|
"BLOQUE_05_2_RCP_TRANSTELEFONICA_NINOS.md",
|
|
"BLOQUE_05_3_RCP_TRANSTELEFONICA_LACTANTES.md",
|
|
],
|
|
"continuacion": [
|
|
"BLOQUE_05_2_RCP_TRANSTELEFONICA_NINOS.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_05_2_RCP_TRANSTELEFONICA_NINOS.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_05_1_RCP_TRANSTELEFONICA_ADULTOS.md",
|
|
],
|
|
"relacionados": [
|
|
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_2_RCP_PEDIATRIA.md",
|
|
"BLOQUE_05_1_RCP_TRANSTELEFONICA_ADULTOS.md",
|
|
"BLOQUE_05_3_RCP_TRANSTELEFONICA_LACTANTES.md",
|
|
],
|
|
"continuacion": [
|
|
"BLOQUE_05_3_RCP_TRANSTELEFONICA_LACTANTES.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_05_3_RCP_TRANSTELEFONICA_LACTANTES.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_05_2_RCP_TRANSTELEFONICA_NINOS.md",
|
|
],
|
|
"relacionados": [
|
|
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_3_RCP_LACTANTES.md",
|
|
"BLOQUE_05_1_RCP_TRANSTELEFONICA_ADULTOS.md",
|
|
"BLOQUE_05_2_RCP_TRANSTELEFONICA_NINOS.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_05_4_DESA_GUIADO_TELEFONO.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_05_1_RCP_TRANSTELEFONICA_ADULTOS.md",
|
|
],
|
|
"relacionados": [
|
|
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_4_USO_DESA.md",
|
|
"BLOQUE_05_1_RCP_TRANSTELEFONICA_ADULTOS.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_05_6_SCA_TRANSTELEFONICO.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_05_0_COMUNICACION_TRANSTELEFONICA_FUNDAMENTAL.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_05_7_ICTUS_TRANSTELEFONICO.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_05_7_ICTUS_TRANSTELEFONICO.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_05_0_COMUNICACION_TRANSTELEFONICA_FUNDAMENTAL.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_05_6_SCA_TRANSTELEFONICO.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_05_9_OVACE_TRANSTELEFONICA.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_05_0_COMUNICACION_TRANSTELEFONICA_FUNDAMENTAL.md",
|
|
],
|
|
"relacionados": [
|
|
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_8_POSICIONES_SEGURIDAD_MOVILIZACION.md",
|
|
],
|
|
},
|
|
|
|
# BLOQUE 6 - FARMACOLOGÍA
|
|
"BLOQUE_06_2_ANALGESICOS_SEDANTES.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_06_0_PRINCIPIOS_ADMINISTRACION.md",
|
|
"BLOQUE_06_1_DEL_VIAL_A_LA_VENA.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_06_3_VASOACTIVOS_AMINAS.md",
|
|
"BLOQUE_06_5_FARMACOS_CARDIOLOGICOS.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_06_3_VASOACTIVOS_AMINAS.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_06_0_PRINCIPIOS_ADMINISTRACION.md",
|
|
"BLOQUE_06_1_DEL_VIAL_A_LA_VENA.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_06_2_ANALGESICOS_SEDANTES.md",
|
|
"BLOQUE_06_5_FARMACOS_CARDIOLOGICOS.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_06_4_ANTIARRITMICOS.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_06_0_PRINCIPIOS_ADMINISTRACION.md",
|
|
"BLOQUE_06_1_DEL_VIAL_A_LA_VENA.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_06_5_FARMACOS_CARDIOLOGICOS.md",
|
|
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_4_USO_DESA.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_06_5_FARMACOS_CARDIOLOGICOS.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_06_0_PRINCIPIOS_ADMINISTRACION.md",
|
|
"BLOQUE_06_1_DEL_VIAL_A_LA_VENA.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_06_3_VASOACTIVOS_AMINAS.md",
|
|
"BLOQUE_06_4_ANTIARRITMICOS.md",
|
|
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_1_RCP_ADULTOS.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_06_6_FARMACOS_RESPIRATORIOS.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_06_0_PRINCIPIOS_ADMINISTRACION.md",
|
|
"BLOQUE_06_1_DEL_VIAL_A_LA_VENA.md",
|
|
],
|
|
"relacionados": [
|
|
"../05_OXIGENOTERAPIA_Y_MATERIAL_SANITARIO/BLOQUE_03_0_OXIGENOTERAPIA_FUNDAMENTOS.md",
|
|
"../03_SOPORTE_VITAL_BASICO/BLOQUE_04_5_VENTILACION_BVM.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_06_7_FARMACOS_NEUROLOGICOS_METABOLICOS.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_06_0_PRINCIPIOS_ADMINISTRACION.md",
|
|
"BLOQUE_06_1_DEL_VIAL_A_LA_VENA.md",
|
|
],
|
|
"relacionados": [
|
|
"../02_PROCEDIMIENTOS_BASICOS/1.3_glasgow_operativo.md",
|
|
],
|
|
},
|
|
|
|
# BLOQUE 7 - TRIAGE
|
|
"BLOQUE_07_1_FUNDAMENTOS_TRIAGE.md": {
|
|
"prerrequisitos": [
|
|
"../02_PROCEDIMIENTOS_BASICOS/1.4_triage_start.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_07_2_METODO_START.md",
|
|
"BLOQUE_07_3_ETIQUETADO_ZONIFICACION.md",
|
|
],
|
|
"continuacion": [
|
|
"BLOQUE_07_2_METODO_START.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_07_2_METODO_START.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_07_1_FUNDAMENTOS_TRIAGE.md",
|
|
"../02_PROCEDIMIENTOS_BASICOS/1.4_triage_start.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_07_3_ETIQUETADO_ZONIFICACION.md",
|
|
"BLOQUE_07_4_ROLES_FUNCIONES_TES_TMV.md",
|
|
],
|
|
"continuacion": [
|
|
"BLOQUE_07_3_ETIQUETADO_ZONIFICACION.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_07_3_ETIQUETADO_ZONIFICACION.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_07_2_METODO_START.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_07_4_ROLES_FUNCIONES_TES_TMV.md",
|
|
"BLOQUE_07_5_RE_TRIAGE_EVACUACION.md",
|
|
],
|
|
"continuacion": [
|
|
"BLOQUE_07_4_ROLES_FUNCIONES_TES_TMV.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_07_4_ROLES_FUNCIONES_TES_TMV.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_07_3_ETIQUETADO_ZONIFICACION.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_07_5_RE_TRIAGE_EVACUACION.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_07_5_RE_TRIAGE_EVACUACION.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_07_4_ROLES_FUNCIONES_TES_TMV.md",
|
|
],
|
|
"relacionados": [
|
|
"../08_TRANSFERENCIA_Y_TRASLADO/BLOQUE_08_1_PREPARACION_TRASLADO.md",
|
|
],
|
|
},
|
|
|
|
# BLOQUE 8 - TRANSFERENCIA
|
|
"BLOQUE_08_2_GESTION_DURANTE_TRASLADO.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_08_0_FUNDAMENTOS_TRANSFERENCIA.md",
|
|
"BLOQUE_08_1_PREPARACION_TRASLADO.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_08_1_PREPARACION_TRASLADO.md",
|
|
"BLOQUE_08_3_COMUNICACION_PRE_HOSPITALARIA.md",
|
|
"BLOQUE_08_4_DOCUMENTACION_TRASLADO.md",
|
|
],
|
|
"continuacion": [
|
|
"BLOQUE_08_3_COMUNICACION_PRE_HOSPITALARIA.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_08_3_COMUNICACION_PRE_HOSPITALARIA.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_08_2_GESTION_DURANTE_TRASLADO.md",
|
|
],
|
|
"relacionados": [
|
|
"../06_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_0_COMUNICACION_TRANSTELEFONICA_FUNDAMENTAL.md",
|
|
"BLOQUE_08_4_DOCUMENTACION_TRASLADO.md",
|
|
],
|
|
"continuacion": [
|
|
"BLOQUE_08_4_DOCUMENTACION_TRASLADO.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_08_4_DOCUMENTACION_TRASLADO.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_08_3_COMUNICACION_PRE_HOSPITALARIA.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_08_5_TRANSFERENCIA_AL_HOSPITAL.md",
|
|
],
|
|
"continuacion": [
|
|
"BLOQUE_08_5_TRANSFERENCIA_AL_HOSPITAL.md",
|
|
],
|
|
},
|
|
|
|
"BLOQUE_08_5_TRANSFERENCIA_AL_HOSPITAL.md": {
|
|
"prerrequisitos": [
|
|
"BLOQUE_08_4_DOCUMENTACION_TRASLADO.md",
|
|
],
|
|
"relacionados": [
|
|
"BLOQUE_08_3_COMUNICACION_PRE_HOSPITALARIA.md",
|
|
],
|
|
},
|
|
}
|
|
|
|
|
|
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 obtener_nombre_legible(ruta: str) -> str:
|
|
"""Convierte ruta de archivo a nombre legible"""
|
|
nombre = Path(ruta).stem
|
|
# Reemplazar prefijos comunes
|
|
nombre = nombre.replace("BLOQUE_", "")
|
|
nombre = nombre.replace("_", " ")
|
|
# Capitalizar palabras
|
|
palabras = nombre.split()
|
|
nombre = " ".join(palabra.capitalize() for palabra in palabras)
|
|
return nombre
|
|
|
|
|
|
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 = obtener_nombre_legible(rel)
|
|
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 = obtener_nombre_legible(rel)
|
|
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
|
|
nombre = obtener_nombre_legible(rel)
|
|
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 = obtener_nombre_legible(rel)
|
|
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 = obtener_nombre_legible(rel)
|
|
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():
|
|
return False
|
|
|
|
contenido = archivo.read_text(encoding='utf-8')
|
|
|
|
# Verificar si ya tiene sección de enlaces
|
|
if "## 🔗 Enlaces recomendados" in contenido:
|
|
# Actualizar enlaces existentes si hay relaciones nuevas
|
|
return False
|
|
|
|
# Buscar el final del archivo
|
|
lineas = contenido.rstrip().split('\n')
|
|
|
|
# Buscar última línea con contenido
|
|
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
|
|
if ultima_linea_contenido >= 0:
|
|
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')
|
|
return True
|
|
|
|
|
|
def main():
|
|
"""Función principal"""
|
|
print("=" * 70)
|
|
print("🔗 AÑADIR ENLACES DE REFERENCIA A TODOS LOS CAPÍTULOS")
|
|
print("=" * 70)
|
|
print()
|
|
|
|
añadidos = 0
|
|
omitidos = 0
|
|
ya_tienen = 0
|
|
|
|
# Buscar todos los archivos .md del manual (excluyendo documentación)
|
|
archivos_manual = []
|
|
for subdir in MANUAL_DIR.rglob("*.md"):
|
|
if "_DOCUMENTACION_PROYECTO" not in str(subdir):
|
|
archivos_manual.append(subdir)
|
|
|
|
print(f"📋 Encontrados {len(archivos_manual)} archivos del manual")
|
|
print()
|
|
|
|
# Procesar cada archivo
|
|
for archivo in sorted(archivos_manual):
|
|
nombre_archivo = archivo.name
|
|
relaciones = RELACIONES_COMPLETAS.get(nombre_archivo, {})
|
|
|
|
# Si no tiene relaciones definidas, crear relaciones básicas
|
|
if not relaciones:
|
|
# Intentar crear relaciones básicas basadas en el bloque
|
|
relaciones = crear_relaciones_basicas(archivo)
|
|
|
|
if relaciones:
|
|
if añadir_enlaces_a_archivo(archivo, relaciones):
|
|
añadidos += 1
|
|
print(f"✅ {nombre_archivo}")
|
|
else:
|
|
ya_tienen += 1
|
|
else:
|
|
omitidos += 1
|
|
|
|
print()
|
|
print("=" * 70)
|
|
print(f"📊 RESUMEN: {añadidos} añadidos, {ya_tienen} ya tenían, {omitidos} sin relaciones")
|
|
print("=" * 70)
|
|
|
|
|
|
def crear_relaciones_basicas(archivo: Path) -> Dict[str, List[str]]:
|
|
"""Crea relaciones básicas basadas en la ubicación del archivo"""
|
|
relaciones = {}
|
|
directorio = archivo.parent
|
|
|
|
# Buscar archivos en el mismo directorio (relacionados)
|
|
archivos_mismo_dir = [f for f in directorio.glob("*.md") if f != archivo]
|
|
if archivos_mismo_dir:
|
|
relaciones["relacionados"] = [f.name for f in sorted(archivos_mismo_dir)[:5]]
|
|
|
|
return relaciones
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|