12 KiB
Executable file
12 KiB
Executable file
📸 Sistema de Medios Visuales - Documentación Técnica
Fecha: 2025-12-23
Objetivo: Explicar cómo funciona el sistema actual y proponer mejoras
🔍 CÓMO FUNCIONA ACTUALMENTE
1. Estructura de Archivos
public/
├── assets/
│ └── infografias/
│ ├── bloque-0-fundamentos/
│ │ ├── ALGORITMO OPERATIVO DEL TES.svg
│ │ ├── diagrama_seleccion_dispositivo_oxigenoterapia.png
│ │ └── ...
│ ├── bloque-2-inmovilizacion/
│ │ ├── colocacion_collarin_paso_1_preparacion.png
│ │ ├── seleccion_talla_collarin_cervical.png
│ │ └── ...
│ └── bloque-3-material-sanitario/
│ ├── canulas_guedel_nasofaringea.png
│ └── ...
└── manual/
└── BLOQUE_X/
└── BLOQUE_XX_X_NOMBRE.md
2. Referencias en Markdown
Formato actual:
![Descripción de la imagen]/assets/infografias/bloque-X-nombre/imagen.png <!-- PLACEHOLDER: No requiere creación -->)
Ejemplo real:
![Cánulas de Guedel y nasofaríngea]/assets/infografias/bloque-3-material-sanitario/canulas_guedel_nasofaringea.png)
3. Proceso de Renderizado
- ManualViewer.tsx carga el archivo
.mddesdepublic/manual/ - MarkdownViewer.tsx procesa el Markdown con
react-markdown - Componente
imgpersonalizado (líneas 240-273):- Normaliza rutas relativas/absolutas
- Convierte rutas relativas a absolutas desde
/public/ - Añade estilos (rounded, border, shadow)
- Implementa
loading="lazy"para carga diferida - Maneja errores con
onError
4. Flujo Completo
Usuario → ManualViewer → Carga .md → MarkdownViewer → ReactMarkdown
↓
Procesa 
↓
Componente img personalizado
↓
Normaliza ruta
↓
Renderiza <img src="/assets/...">
↓
Navegador carga imagen
📊 ESTADO ACTUAL
✅ Lo que funciona bien:
- Rutas absolutas:
/assets/infografias/...funcionan correctamente - Lazy loading: Imágenes se cargan bajo demanda
- Manejo de errores: Imágenes rotas se ocultan automáticamente
- Estilos consistentes: Todas las imágenes tienen el mismo estilo
- Organización: Imágenes organizadas por bloques temáticos
⚠️ Limitaciones actuales:
- Rutas manuales: Hay que escribir la ruta completa en cada
.md - Sin validación: No se verifica que la imagen exista antes de referenciarla
- Sin optimización: No hay generación de thumbnails o múltiples tamaños
- Sin metadatos: No hay información sobre dimensiones, descripción, etc.
- Dependencia de estructura: Si cambia la estructura de carpetas, hay que actualizar todas las referencias
🚀 PROPUESTAS DE MEJORA
Opción 1: Sistema de Referencias con Alias (Recomendado)
Idea: Crear un sistema de alias para referencias más cortas y mantenibles.
Implementación:
- Crear archivo de mapeo:
src/data/image-aliases.ts
export const imageAliases: Record<string, string> = {
'collarin-seleccion': '/assets/infografias/bloque-2-inmovilizacion/seleccion_talla_collarin_cervical.png',
'collarin-paso-1': '/assets/infografias/bloque-2-inmovilizacion/colocacion_collarin_paso_1_preparacion.png',
'abcde-algoritmo': '/assets/infografias/bloque-0-fundamentos/ALGORITMO OPERATIVO DEL TES.svg',
// ... más alias
};
- Modificar MarkdownViewer para resolver alias:
img: ({ node, src, alt, ...props }: any) => {
let imageSrc = src || '';
// Resolver alias si existe
if (imageAliases[imageSrc]) {
imageSrc = imageAliases[imageSrc];
}
// ... resto de normalización
}
- Uso en Markdown:


Ventajas:
- ✅ Referencias más cortas y legibles
- ✅ Fácil de mantener (cambiar ruta en un solo lugar)
- ✅ Validación centralizada
- ✅ Sin cambios en estructura de archivos
Desventajas:
- ⚠️ Requiere crear y mantener el archivo de alias
- ⚠️ Dos lugares donde buscar (alias vs ruta directa)
Opción 2: Sistema de Metadatos en Frontmatter
Idea: Usar frontmatter YAML en los archivos .md para definir imágenes.
Implementación:
- Frontmatter en
.md:
---
images:
- id: collarin-seleccion
path: /assets/infografias/bloque-2-inmovilizacion/seleccion_talla_collarin_cervical.png
alt: Selección de talla de collarín cervical
caption: Guía visual para seleccionar la talla correcta
- id: collarin-paso-1
path: /assets/infografias/bloque-2-inmovilizacion/colocacion_collarin_paso_1_preparacion.png
alt: Paso 1: Preparación
---
- Uso en Markdown:
![collarin-seleccion]
![collarin-paso-1]
- Procesar en MarkdownViewer:
// Extraer frontmatter con remark-frontmatter
// Resolver referencias a imágenes desde frontmatter
Ventajas:
- ✅ Metadatos junto al contenido
- ✅ Descripciones y captions centralizados
- ✅ Validación al parsear frontmatter
Desventajas:
- ⚠️ Requiere procesar frontmatter
- ⚠️ Más complejo de implementar
- ⚠️ Cambia el formato de los archivos
.md
Opción 3: Componente de Imagen Personalizado con Auto-detección
Idea: Detectar automáticamente imágenes relacionadas por nombre de archivo.
Implementación:
- Crear función de auto-detección:
const findImageByPattern = (chapterId: string, imageName: string): string | null => {
// Buscar en estructura conocida
const patterns = [
`/assets/infografias/bloque-${chapterId}/${imageName}`,
`/assets/infografias/${imageName}`,
// ... más patrones
];
// Intentar cargar y verificar existencia
return patterns.find(p => imageExists(p)) || null;
};
- Uso en Markdown:
![collarin-seleccion] <!-- Busca automáticamente -->
![colocacion-collarin-paso-1] <!-- Auto-detecta -->
Ventajas:
- ✅ Referencias muy cortas
- ✅ Auto-detección inteligente
- ✅ Menos mantenimiento
Desventajas:
- ⚠️ Puede ser lento (verificar existencia de archivos)
- ⚠️ Menos explícito (puede confundir)
- ⚠️ Requiere convenciones de nombres estrictas
Opción 4: Sistema Híbrido (Recomendado para Escalabilidad)
Idea: Combinar alias + auto-detección + validación.
Implementación:
- Archivo de configuración:
src/data/image-registry.ts
export interface ImageMetadata {
id: string;
path: string;
alt: string;
caption?: string;
block: string;
chapter?: string;
tags?: string[];
}
export const imageRegistry: Record<string, ImageMetadata> = {
'collarin-seleccion': {
id: 'collarin-seleccion',
path: '/assets/infografias/bloque-2-inmovilizacion/seleccion_talla_collarin_cervical.png',
alt: 'Selección de talla de collarín cervical',
caption: 'Guía visual para seleccionar la talla correcta según anatomía del paciente',
block: 'bloque-2-inmovilizacion',
tags: ['collarin', 'inmovilizacion', 'seleccion']
},
// ... más imágenes
};
// Función helper para buscar por tags o bloque
export const findImagesByBlock = (block: string): ImageMetadata[] => {
return Object.values(imageRegistry).filter(img => img.block === block);
};
- Componente mejorado en MarkdownViewer:
img: ({ node, src, alt, ...props }: any) => {
let imageSrc = src || '';
let imageAlt = alt || '';
let imageCaption = '';
// 1. Intentar resolver desde registry
if (imageRegistry[imageSrc]) {
const metadata = imageRegistry[imageSrc];
imageSrc = metadata.path;
imageAlt = metadata.alt;
imageCaption = metadata.caption || '';
}
// 2. Si no, normalizar ruta directa
else {
// ... normalización actual
}
return (
<figure className="my-6">
<img
className="rounded-lg max-w-full h-auto border border-border shadow-sm"
src={imageSrc}
alt={imageAlt}
loading="lazy"
{...props}
/>
{imageCaption && (
<figcaption className="text-sm text-muted-foreground mt-2 text-center italic">
{imageCaption}
</figcaption>
)}
</figure>
);
}
- Uso en Markdown:
<!-- Por alias -->
![collarin-seleccion]
<!-- Por ruta directa (sigue funcionando) -->
![Descripción]/assets/infografias/bloque-2-inmovilizacion/imagen.png)
Ventajas:
- ✅ Compatible con sistema actual
- ✅ Metadatos centralizados
- ✅ Búsqueda por tags/bloque
- ✅ Captions automáticos
- ✅ Validación centralizada
- ✅ Escalable
Desventajas:
- ⚠️ Requiere crear y mantener registry
- ⚠️ Más código inicial
🎯 RECOMENDACIÓN
Fase 1: Mejoras Inmediatas (Sin cambios grandes)
-
Mejorar componente
imgactual:- Añadir
<figure>y<figcaption>para captions - Mejorar manejo de errores (mostrar placeholder)
- Añadir opción de lightbox/modal para ampliar
- Añadir
-
Script de validación:
- Crear script que verifique que todas las referencias en
.mdapuntan a archivos existentes - Ejecutar en CI/CD o pre-commit
- Crear script que verifique que todas las referencias en
Fase 2: Sistema de Registry (Escalable)
- Crear
image-registry.tscon todas las imágenes organizadas - Implementar resolución de alias en MarkdownViewer
- Migrar progresivamente referencias a alias
- Añadir funcionalidades:
- Búsqueda de imágenes por tags
- Galería de imágenes por bloque
- Validación automática
📝 EJEMPLO DE MIGRACIÓN
Antes:
![Selección de talla de collarín cervical]/assets/infografias/bloque-2-inmovilizacion/seleccion_talla_collarin_cervical.png)
Después (con registry):
![collarin-seleccion]
O con caption:
![collarin-seleccion]
<!-- Se renderiza automáticamente con caption desde registry -->
🔧 IMPLEMENTACIÓN PRÁCTICA
Paso 1: Crear Registry Básico
// src/data/image-registry.ts
export const imageRegistry = {
// Bloque 2: Inmovilización
'collarin-seleccion': {
path: '/assets/infografias/bloque-2-inmovilizacion/seleccion_talla_collarin_cervical.png',
alt: 'Selección de talla de collarín cervical',
block: 'bloque-2-inmovilizacion'
},
'collarin-paso-1': {
path: '/assets/infografias/bloque-2-inmovilizacion/colocacion_collarin_paso_1_preparacion.png',
alt: 'Paso 1: Preparación para colocación de collarín',
block: 'bloque-2-inmovilizacion'
},
// ... más imágenes
};
Paso 2: Actualizar MarkdownViewer
Añadir resolución de alias antes de normalizar rutas.
Paso 3: Migrar Referencias
Ir actualizando los .md para usar alias en lugar de rutas completas.
✅ VENTAJAS DEL SISTEMA PROPUESTO
- Mantenibilidad: Cambiar ruta en un solo lugar
- Validación: Verificar que todas las imágenes existen
- Metadatos: Descripciones, captions, tags centralizados
- Búsqueda: Encontrar imágenes por tags o bloque
- Compatibilidad: Sigue funcionando con rutas directas
- Escalabilidad: Fácil añadir nuevas imágenes
Última actualización: 2025-12-23