Mermaid es una librería de JavaScript que permite crear diagramas a partir de texto usando una sintaxis tipo Markdown. Su idea principal es que, en lugar de arrastrar y soltar elementos visuales o pelearte con imágenes, escribes un bloque de código con una sintaxis sencilla, y Mermaid lo transforma automáticamente en el diagrama correspondiente. Tiene soporte para multitud de diagramas: flujo, secuencia, Gantt, clases, ER…

Se usa mucho en documentación técnica, wikis y repositorios de código (Forgejo, GitHub, GitLab o Obsidian ya la soportan) porque facilita mantener diagramas sincronizados con el texto, de forma ligera y versionable.

Aunque Hugo, de entrada no tiene soporte para Mermaid, es muy fácil añadirlo:

Paso 1:

Lo primero es crear una plantilla de renderizado personalizada creando el fichero layouts/_default/_markup/render-codeblock-mermaid.html y añadiendo:

<pre class="mermaid">
  {{- .Inner | htmlEscape | safeHTML }}
</pre>

{{ .Page.Store.Set "mermaidEnable" true }}

Esto hace que cuando se detecte un bloque de código se envuelva en un <pre> con la clase mermaid. .Inner es el contenido real del bloque de código en Markdown. htmlEscape evita que se interpreten caracteres peligrosos como HTML y safeHTML indica a Hugo que ese contenido puede insertarse tal cual, sin más escapes. Además se marca en el Page Store que esta página usa Mermaid.

Paso 2:

Ya tenemos resuelta una parte, ahora hay que hacer que se cargue la librería de Mermaid sólo en las páginas que lo necesitan. Para ello creamos el fichero layouts/partials/extended_head.html con lo siguiente:

{{ if .Store.Get "mermaidEnable" }}
<script type="module">
  import mermaid from "https://cdn.jsdelivr.net/npm/[email protected]/+esm";
</script>
<script>
  mermaid.initialize({
    startOnLoad: true,
  });
</script>
{{ end }}

Esto importará la librería desde el CDN de jsDelivr y la inicializará automáticamente cuando se cargue la página.

Paso 3:

Ahora ya puedes insertar un bloque de código con el lenguaje mermaid en cualquier página de Hugo:

graph TD;
A-->B;
A-->C;
B-->D;
C-->D;
graph TD;
    A-->B;
    A-->C;
    B-->D;
    C-->D;