Integración y Uso de Diagramas Mermaid en Hugo

Aprende a crear e integrar diagramas Mermaid en tus posts de Hugo para visualizaciones efectivas.

Imagen de Integración y Uso de Diagramas Mermaid en Hugo

🎨 Integración y Uso de Diagramas Mermaid en Hugo

Los diagramas Mermaid te permiten crear una amplia variedad de visualizaciones complejas (diagramas de flujo, secuencia, Gantt, etc.) directamente desde texto, de manera similar a Markdown. En este sitio, el soporte para Mermaid ya está configurado y listo para que lo uses en tus posts.

🚀 Cómo Usar Mermaid

Para crear un diagrama Mermaid en cualquier post, simplemente usa un bloque de código estándar de Markdown con el lenguaje especificado como mermaid:

MARKDOWN
```mermaid
graph TD
    A[Inicio] --> B{Decisión}
    B -->|Sí| C[Acción 1]
    B -->|No| D[Acción 2]
    C --> E[Fin]
    D --> E
```

Hugo y el script de Mermaid se encargarán de renderizar este bloque de texto como un diagrama SVG interactivo.

📊 Tipos de Diagramas Disponibles (Ejemplos)

Mermaid soporta una gran cantidad de tipos de diagramas. Aquí algunos ejemplos:

1. Diagramas de Flujo (Flowchart)

Ideal para representar procesos, algoritmos o flujos de trabajo.

Ejemplo Básico:

    graph TD
    A[Inicio] --> B{¿Condición?}
    B -- Texto Sí --> C[Proceso C]
    B -- Texto No --> D[Proceso D]
    C --> E[Fin]
    D --> E
  

Ejemplo Más Complejo (Tomado de pruebas del sitio):

    flowchart TD
    A[Usuario visita página] --> B{¿Contiene código?}
    B -->|Sí| C[Hugo procesa syntax highlighting]
    B -->|No| D[Renderizado normal]
    C --> E[¿Es Mermaid?]
    E -->|Sí| F[Cargar script Mermaid]
    E -->|No| G[Mostrar código resaltado]
    F --> H[Renderizar diagrama]
    G --> I[Mostrar botón copiar]
    H --> J[Página lista]
    I --> J
    D --> J
  

2. Diagramas de Secuencia (Sequence Diagram)

Muestra cómo los objetos interactúan entre sí a lo largo del tiempo.

Ejemplo Básico:

    sequenceDiagram
    participant U as Usuario
    participant S as Servidor
    U->>S: Solicitud de autenticación
    S-->>U: Respuesta de autenticación (Token JWT)
  

Ejemplo Más Detallado (Tomado de pruebas del sitio):

    sequenceDiagram
    participant Usuario
    participant Hugo
    participant Navegador
    participant Mermaid
    
    Usuario->>Hugo: Solicita página
    Hugo->>Hugo: Procesa Markdown (incluyendo bloques Mermaid)
    Hugo->>Navegador: Envía HTML (con bloques Mermaid como <pre class="mermaid">)
    Navegador->>Mermaid: Script de Mermaid detecta y procesa los bloques
    Mermaid->>Navegador: Renderiza los diagramas como SVG
    Navegador->>Usuario: Muestra página completa con diagramas
  

3. Diagramas de Clases (Class Diagram)

Para modelar la estructura de un sistema orientada a objetos.

    classDiagram
    class Animal {
        +String nombre
        +int edad
        +hacerSonido()
    }
    class Perro {
        +String raza
        +ladrar()
    }
    class Gato {
        +String colorPelaje
        +maullar()
    }
    Animal <|-- Perro
    Animal <|-- Gato
    Usuario "1" -- "*" Animal : tieneMascota
  

4. Diagramas de Entidad-Relación (Entity Relationship Diagram)

Para modelar bases de datos.

    erDiagram
    CLIENTE ||--o{ PEDIDO : realiza
    PEDIDO ||--|{ LINEA_PEDIDO : contiene
    PRODUCTO ||--|{ LINEA_PEDIDO : referenciadoEn
    CLIENTE {
        string id_cliente PK
        string nombre
        string email
    }
    PEDIDO {
        string id_pedido PK
        date fecha
        string id_cliente FK
    }
    LINEA_PEDIDO {
        string id_linea PK
        string id_pedido FK
        string id_producto FK
        int cantidad
    }
    PRODUCTO {
        string id_producto PK
        string descripcion
        float precio
    }
  

5. Diagramas de Gantt (Gantt Chart)

Para planificación de proyectos y visualización de cronogramas.

    gantt
    dateFormat  YYYY-MM-DD
    title Cronograma del Proyecto X
    excludes    weekends

    section Planificación
    Definir Alcance     :a1, 2024-07-01, 7d
    Investigación       :a2, after a1, 5d
    Diseño Mockups      :a3, after a2, 10d

    section Desarrollo
    Desarrollo Frontend :crit, b1, after a3, 20d
    Desarrollo Backend  :crit, b2, after a3, 25d
    Integración         :crit, b3, after b1 b2, 7d

    section Pruebas
    Pruebas Unitarias   :c1, after b3, 5d
    Pruebas Integrales  :c2, after c1, 5d
    UAT                 :c3, after c2, 7d

    section Despliegue
    Preparar Entorno    :d1, after c3, 3d
    Despliegue          :d2, after d1, 2d
  

6. Diagramas de Estado (State Diagram)

Para describir el comportamiento de un sistema a través de sus estados y transiciones.

    stateDiagram-v2
    [*] --> Inactivo
    Inactivo --> Activo : iniciarProceso()
    Activo --> Procesando : eventoDetectado()
    Procesando --> EnEspera : pausar()
    EnEspera --> Procesando : reanudar()
    Procesando --> Completado : finalizarExitoso()
    Procesando --> Fallido : errorDetectado()
    Activo --> Inactivo : detenerProceso()
    Completado --> [*]
    Fallido --> [*]
    EnEspera --> Inactivo : cancelar()
  

Para muchos más tipos de diagramas (Pie, Git, User Journey, Mindmap, etc.), consulta la documentación oficial de Mermaid.

🎨 Personalización y Estilos

Mermaid permite cierta personalización directamente en el código del diagrama, como definir estilos para nodos específicos:

    graph TD
    A[Nodo Normal] --> B[Nodo Destacado]
    C[Otro Nodo Normal] --> D{Decisión Importante}
    
    style A fill:#f9f,stroke:#333,stroke-width:2px
    style B fill:#ccf,stroke:#333,stroke-width:4px,font-weight:bold
    classDef importante fill:#ff9,stroke:#555,stroke-width:3px,color:black
    class D importante
  

También puedes usar directivas de tema o inicialización para aplicar configuraciones globales si el script de carga lo permite.

🔧 Configuración Técnica (Cómo está implementado en este sitio)

El soporte para Mermaid en este sitio Hugo se ha implementado mediante:

  1. Render Hook para Bloques de Código: Un archivo como layouts/_default/_markup/render-codeblock-mermaid.html (o una lógica similar dentro de un render-codeblock.html más general) se encarga de detectar los bloques de código con lenguaje mermaid. En lugar de pasarlos a Chroma para resaltado de sintaxis, los envuelve en una etiqueta <pre class="mermaid"> (o similar) para que el script de Mermaid los pueda encontrar y procesar.

    Ejemplo de render-codeblock-mermaid.html:

    HTML
    <pre class="mermaid">
      {{- .Inner | safeHTML -}}
    </pre>
    {{- .Page.Store.Set "hasMermaid" true -}} 

    El .Page.Store.Set "hasMermaid" true es una forma de marcar que la página actual contiene al menos un diagrama Mermaid.

  2. Script de Carga de Mermaid: En la plantilla base del sitio (generalmente layouts/_default/baseof.html), se incluye el script de Mermaid. Este script se carga condicionalmente solo si la página actual tiene diagramas Mermaid (usando la variable hasMermaid que se estableció en el render hook).

    Ejemplo al final del <body> en baseof.html:

    HTML
    {{ if .Store.Get "hasMermaid" }}
      <script type="module">
        import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs';
        mermaid.initialize({ startOnLoad: true });
      </script>
    {{ end }}

    Esto utiliza la versión ESM de Mermaid desde un CDN (jsDelivr es una opción popular).

💡 Consejos y Mejores Prácticas

  1. Mantén los Diagramas Simples: Evita crear diagramas excesivamente complejos que se vuelvan difíciles de leer y entender en una pantalla.
  2. Usa Etiquetas Descriptivas: Nombres claros y concisos para nodos, actores y conexiones mejoran la comprensión.
  3. Aprovecha los Estilos con Moderación: Usa colores y estilos para destacar elementos importantes, pero no sobrecargues visualmente el diagrama.
  4. Documenta Diagramas Complejos: Si un diagrama es intrínsecamente complejo, considera acompañarlo con una explicación en texto.
  5. Revisa la Sintaxis: Mermaid tiene su propia sintaxis. Consulta la documentación oficial si algo no se renderiza como esperas.
  6. Prueba en Diferentes Navegadores/Dispositivos: Asegúrate de que tus diagramas se vean bien en los principales navegadores y en dispositivos móviles.

🔗 Enlaces Útiles

Con Mermaid integrado en Hugo, tienes una herramienta poderosa para enriquecer tu contenido con visualizaciones claras y efectivas.