<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Notas al margen</title><description>Blog personal de José San Juan</description><link>https://josesj.com/</link><item><title>De Hugo a Astro: migrando el sitio</title><link>https://josesj.com/blog/migracion-hugo-astro/</link><guid isPermaLink="true">https://josesj.com/blog/migracion-hugo-astro/</guid><description>Por qué he migrado este blog de Hugo a Astro y qué ha cambiado en el proceso.</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Llevaba un tiempo con ganas de darle una vuelta a este sitio. El blog funcionaba bien con Hugo pero quería algo que me diera más flexibilidad para añadir funcionalidad sin salir del ecosistema JavaScript.&lt;/p&gt;
&lt;h2&gt;Por qué Hugo funcionaba bien&lt;/h2&gt;
&lt;p&gt;Hugo es una herramienta excelente. Compilación rápida, sin dependencias de Node, plantillas potentes y muchos temas disponibles. Para un blog sencillo es difícil superarlo.&lt;/p&gt;
&lt;p&gt;El problema no era Hugo en sí, sino que cada vez que quería añadir algo ligeramente más interactivo acababa peleando con las limitaciones del sistema de plantillas o añadiendo JavaScript a mano sin mucha estructura.&lt;/p&gt;
&lt;h2&gt;Por qué Astro&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://astro.build&quot;&gt;Astro&lt;/a&gt; tiene una propuesta interesante: genera HTML estático por defecto, pero permite usar componentes y lógica JavaScript durante la construcción. Es lo mejor de los dos mundos: la velocidad de un sitio estático con la flexibilidad de un framework.&lt;/p&gt;
&lt;p&gt;Lo que más me convenció:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Componentes &lt;code&gt;.astro&lt;/code&gt;&lt;/strong&gt; mezclan HTML, CSS y JavaScript en un solo archivo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content Collections&lt;/strong&gt; sistema para gestionar el contenido en Markdown.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integraciones&lt;/strong&gt; MDX, RSS, iconos con astro-icon...&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Output estático&lt;/strong&gt; el resultado final es HTML puro.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Qué ha cambiado en el sitio&lt;/h2&gt;
&lt;p&gt;Además de cambiar el motor, he aprovechado para rediseñar el sitio desde cero:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Diseño propio&lt;/strong&gt; en lugar de un tema.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fotolog&lt;/strong&gt; galería asimétrica con página de detalle para cada foto.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Soporte Mermaid&lt;/strong&gt; para diagramas en los posts, renderizado en el cliente.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Menú responsive&lt;/strong&gt; en móvil.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimización de imágenes&lt;/strong&gt; automática mediante un script con Sharp.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;La migración&lt;/h2&gt;
&lt;p&gt;No había mucho contenido que migrar, el blog estaba practicamente vacío, así que el proceso fue relativamente sencillo. Los posts en Markdown se adaptan sin cambios, solo algunos ajustes.&lt;/p&gt;
&lt;p&gt;Las URLs de los posts cambian de &lt;code&gt;/posts/nombre&lt;/code&gt; a &lt;code&gt;/blog/nombre&lt;/code&gt;. Para no romper los enlaces existentes, hay una redirección &lt;code&gt;301&lt;/code&gt; en &lt;code&gt;public/_redirects&lt;/code&gt; que Cloudflare Pages aplica automáticamente:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/posts/*  /blog/:splat  301
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El resultado es un sitio más rápido, más fácil de mantener. Hugo sigue siendo una herramienta fantástica pero para este sitio y, mis ganas de cacharrear, Astro encaja mejor con lo que quiero hacer.&lt;/p&gt;
</content:encoded></item><item><title>Activar el soporte de Mermaid en Hugo</title><link>https://josesj.com/blog/activar-mermaid-en-hugo/</link><guid isPermaLink="true">https://josesj.com/blog/activar-mermaid-en-hugo/</guid><description>Cómo integrar la librería Mermaid para crear diagramas a partir de texto en un sitio Hugo con el tema PaperMod.</description><pubDate>Sun, 07 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Mermaid es una librería de JavaScript que permite crear diagramas a partir de texto usando una sintaxis tipo Markdown. La ventaja principal es la simplicidad: en lugar de gestionar imágenes o herramientas visuales, escribes código que se transforma automáticamente en diagramas. Soporta flowcharts, secuencias, diagramas de Gantt, clases y entidad-relación.&lt;/p&gt;
&lt;p&gt;Es especialmente útil en documentación técnica, wikis y repositorios de código —Forgejo, GitHub, GitLab y Obsidian ya lo soportan de forma nativa— porque mantiene los diagramas sincronizados con el texto de forma ligera y versionable.&lt;/p&gt;
&lt;h2&gt;Paso 1: plantilla de renderizado&lt;/h2&gt;
&lt;p&gt;Crea el archivo &lt;code&gt;layouts/_default/_markup/render-codeblock-mermaid.html&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;pre class=&amp;quot;mermaid&amp;quot;&amp;gt;
  {{- .Inner | htmlEscape | safeHTML }}
&amp;lt;/pre&amp;gt;

{{ .Page.Store.Set &amp;quot;mermaidEnable&amp;quot; true }}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esto envuelve los bloques de código detectados en un &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; con la clase &lt;code&gt;mermaid&lt;/code&gt;. La variable &lt;code&gt;.Inner&lt;/code&gt; contiene el contenido del bloque; &lt;code&gt;htmlEscape&lt;/code&gt; evita la interpretación de caracteres HTML peligrosos y &lt;code&gt;safeHTML&lt;/code&gt; le indica a Hugo que inserte el contenido sin escapado adicional. Además, el Page Store marca si la página actual usa Mermaid.&lt;/p&gt;
&lt;h2&gt;Paso 2: cargar la librería solo cuando hace falta&lt;/h2&gt;
&lt;p&gt;Para no cargar Mermaid en todas las páginas, crea &lt;code&gt;layouts/partials/extended_head.html&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;{{ if .Store.Get &amp;quot;mermaidEnable&amp;quot; }}
&amp;lt;script type=&amp;quot;module&amp;quot;&amp;gt;
  import mermaid from &amp;quot;https://cdn.jsdelivr.net/npm/[email protected]/+esm&amp;quot;;
&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
  mermaid.initialize({
    startOnLoad: true,
  });
&amp;lt;/script&amp;gt;
{{ end }}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esto importa la librería desde jsDelivr CDN y la inicializa automáticamente al cargar la página.&lt;/p&gt;
&lt;h2&gt;Paso 3: usar Mermaid en el contenido&lt;/h2&gt;
&lt;p&gt;Ya puedes insertar bloques de código con el identificador de lenguaje &lt;code&gt;mermaid&lt;/code&gt; en cualquier página:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;```mermaid
graph TD;
  A--&amp;gt;B;
  A--&amp;gt;C;
  B--&amp;gt;D;
  C--&amp;gt;D;
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El resultado es un diagrama de flujo renderizado directamente en el navegador, sin imágenes externas ni dependencias de build:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
  A--&amp;gt;B;
  A--&amp;gt;C;
  B--&amp;gt;D;
  C--&amp;gt;D;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item></channel></rss>