<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Sveltia | Dr. Goulu</title><link>https://drgoulu.com/tag/sveltia/</link><atom:link href="https://drgoulu.com/tag/sveltia/index.xml" rel="self" type="application/rss+xml"/><description>Sveltia</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>fr-FR</language><lastBuildDate>Mon, 24 Aug 2026 00:00:00 +0000</lastBuildDate><image><url>https://drgoulu.com/media/icon_hu_6a307aa565546716.png</url><title>Sveltia</title><link>https://drgoulu.com/tag/sveltia/</link></image><item><title>Migration : de Wordpress à Hugo</title><link>https://drgoulu.com/2026/08/24/migration/</link><pubDate>Mon, 24 Aug 2026 00:00:00 +0000</pubDate><guid>https://drgoulu.com/2026/08/24/migration/</guid><description>&lt;p&gt;Après plusieurs années de quasi abandon, j&amp;rsquo;ai décidé de faire revivre ce site pour plusieurs raisons :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;il tombait en loques et c&amp;rsquo;était dommage&lt;/li&gt;
&lt;li&gt;je veux y transférer une bonne partie de l&amp;rsquo;énorme contenu que j&amp;rsquo;ai publié
ces dernières années.&lt;/li&gt;
&lt;li&gt;j&amp;rsquo;ai du temps à perdre, et des IA pour m&amp;rsquo;aider. Les deux se sont révélés indispensables.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="les-problèmes-de-wordpress"&gt;Les problèmes de WordPress&lt;/h2&gt;
&lt;p&gt;Depuis 2010 ce blog était propulsé par WordPress, qui est devenu un monstre, notamment à cause de la foison de plugins que j&amp;rsquo;utilisais. Il devenait de plus en plus difficile de gérer les versions, les conflits entre plugins, les mises à jour, et les failles de sécurité, sans compter les bugs de certains, qui ont notamment causé la perte de nombreuses images.&lt;/p&gt;
&lt;p&gt;Pourtant, devant l&amp;rsquo;ampleur de la tâche, j&amp;rsquo;étais assez réticent à changer de solution. J&amp;rsquo;ai commencé par copier le site en local sous
, ce qui me permettait de farfouiller dans les fichiers sans passer par FTP, et surtout de ne pas abîmer le site en production. J&amp;rsquo;ai ainsi pu remettre à jour certains plugins indispensables, notamment&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
qui a été accepté comme
(même si la bannière dit qu&amp;rsquo;il est obsolète&amp;hellip;)&lt;/li&gt;
&lt;li&gt;
pour gérer les milliers de liens vers Wikipédia de drgoulu.com&lt;/li&gt;
&lt;li&gt;
qui était abandonné&lt;/li&gt;
&lt;li&gt;et le thème
qui à l&amp;rsquo;air de l&amp;rsquo;être car mes &amp;ldquo;Pull Requests&amp;rdquo; qui le rendent compatible avec les dernières versions de WP sont ignorées&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mais même avec tout ça, j&amp;rsquo;étais encore insatisfait, et attiré par la curiosité : comment faire un blog moderne en 2026 ?&lt;/p&gt;
&lt;h2 id="les-sites-statiques"&gt;Les sites &amp;ldquo;statiques&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;La tendance actuelle, est clairement aux
: le site est considéré comme un projet informatique qui est &amp;ldquo;compilé&amp;rdquo; en pages HTML fixes, &amp;ldquo;comme dans le temps&amp;rdquo;. Plus de base de données, plus de PHP, plus de failles de sécurité potentielles, et en plus la navigation devient hyper rapide, comme vous vous en apercevez en parcourant ce site&amp;hellip;&lt;/p&gt;
&lt;h3 id="le-choix--hugo"&gt;Le choix : Hugo&lt;/h3&gt;
&lt;p&gt;Je suis assez rapidement tombé sur
, mais par acquit de conscience j&amp;rsquo;ai aussi essayé
qui m&amp;rsquo;a bien tenté pour son orientation scientifique basée sur Python, Jupyter, etc. mais il est surtout utilisé dans le monde académique, et moins pour les blogs généralistes comme le mien.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai aussi examiné
, dont la technologie a l&amp;rsquo;air plus moderne encore, peut-être trop&amp;hellip;&lt;/p&gt;
&lt;p&gt;Après avoir demandé un
, j&amp;rsquo;ai choisi Hugo dans sa mouture
, à la fois complète et facile à démarrer.&lt;/p&gt;
&lt;h3 id="les-outils--github-vscode-"&gt;Les outils : Git(Hub), VSCode, &amp;hellip;&lt;/h3&gt;
&lt;p&gt;Pour créer un site, on tape dans un shell :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Requires Node.js&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g hugoblox
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugoblox create site&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;et on remplit les champs, et on obtient un dossier de projet avec tout ce qu&amp;rsquo;il faut dedans.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est tout.&lt;/p&gt;
&lt;p&gt;Il n&amp;rsquo;y a plus qu&amp;rsquo;à écrire des articles en
, un format de texte enrichi autrefois réservé à de simples fichiers readme.md qui devient très à la mode avec les IA.&lt;/p&gt;
&lt;p&gt;A ce moment, il devient très naturel de gérer toutes les modifications apportées au site dans un dépôt git pour être sur de NE PLUS JAMAIS RIEN PERDRE.&lt;/p&gt;
&lt;p&gt;Un petit site peut d&amp;rsquo;ailleurs être très facilement être &lt;a href="https://gohugo.io/host-and-deploy/host-on-github-pages/" target="_blank" rel="noopener"&gt;buildé et publié automatiquement sur GitHub pages&lt;/a&gt; à chaque push sur GitHub, mais dans le cas de drgoulu.com le build dépassait les 10 minutes autorisées (ce qui est étonnant&amp;hellip;) et de toutes façons je voulais le publier chez mon hébergeur (infomaniak)&lt;/p&gt;
&lt;p&gt;Donc j&amp;rsquo;ai plutôt choisi de n&amp;rsquo;utiliser GitHub que comme repo du projet source (et images&amp;hellip;) et de lancer les build en local pousser uniquement le dossier &amp;ldquo;public&amp;rdquo; avec les pages HTML générées chez Infomaniak, avec un &amp;ldquo;hook&amp;rdquo; qui les met au bon endroit :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ----------------------------------------------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ~/git_depot/drgoulu.git/hooks/post-receive&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Hook post-receive : Déploiement direct des fichiers statiques compilés&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ----------------------------------------------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. Définir le dossier de destination (le dossier web de votre sous-domaine Hugo)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TARGET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/home/clients/VOTRE_ID_CLIENT/web&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. Définir l&amp;#39;emplacement du dépôt Git distant actuel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GIT_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/home/clients/VOTRE_ID_CLIENT/git_depot/drgoulu.git&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. Extraire les fichiers poussés directement dans le dossier Web&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;📦 Déploiement des fichiers sur Infomaniak...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git --work-tree&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$TARGET&lt;/span&gt; --git-dir&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$GIT_DIR&lt;/span&gt; checkout -f
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;✅ Site Hugo mis à jour avec succès !&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="markdown"&gt;Markdown&lt;/h3&gt;
&lt;p&gt;Markdown est l&amp;rsquo;inconvénient majeur des générateurs de sites statiques , et probablement ce qui limite encore Hugo et ses copains par rapport à WordPress : il n&amp;rsquo;est pas
. Même si
rend le texte plus visuel que du HTML, on ne voit pas le résultat final.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;approche standard est d&amp;rsquo;utiliser des plugins de VSCode qui lancent un serveur local et affichent des prévisualisations de la page qu&amp;rsquo;on édite à chaque &amp;ldquo;save&amp;rdquo; de celle-ci&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
, qui est tout neuf et pas très convaincant pour l&amp;rsquo;instant&lt;/li&gt;
&lt;li&gt;
plus abouti actuellement me semble t&amp;rsquo;il, mais pas encore top.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sinon, il existe bien des choses comme
, un éditeur et gestionnaire de site Hugo en ligne via GitHub, que j&amp;rsquo;utilise pour écrire ces lignes parce qu&amp;rsquo;il est gratuit pendant 20 jours, mais assez cher ensuite, ce qui fait que je ne vais pas le garder, hélas.&lt;/p&gt;
&lt;p&gt;Et il fait un rendu un peu intermédiaire, certaines choses étant wysiwyg et d&amp;rsquo;autres pas. Voici par exemple un extrait du présent article tel que je le vois dans Cloudcannon:&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt=""
srcset="https://drgoulu.com/posts/2026/images/cloudcannon_hu_1371da069e4eaee6.webp 320w, https://drgoulu.com/posts/2026/images/cloudcannon_hu_7439e62f1489304.webp 480w, https://drgoulu.com/posts/2026/images/cloudcannon_hu_bf247c3aa553de5d.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://drgoulu.com/posts/2026/images/cloudcannon_hu_1371da069e4eaee6.webp"
width="760"
height="598"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="les-shortcodes"&gt;Les Shortcodes&lt;/h3&gt;
&lt;p&gt;La difficulté tient aux &amp;ldquo;shortcodes&amp;rdquo; qui permettent d&amp;rsquo;étendre Markdown pour afficher du code formaté, des videos YouTube etc.&lt;/p&gt;
&lt;p&gt;Hugo en
permet d&amp;rsquo;en définir très facilement en
, mais ensuite il faut passer par la compilation du projet Hugo pour obtenir un rendu correct&lt;/p&gt;
&lt;h3 id="sveltia"&gt;Sveltia&lt;/h3&gt;
&lt;p&gt;C&amp;rsquo;est en cherchant une solution à ceci que je suis tombé sur sveltia-cms. Comme l&amp;rsquo;indique son nom, l&amp;rsquo;ambition de ce projet open source est de réaliser un &amp;ldquo;content management system&amp;rdquo; complet, mais l&amp;rsquo;éditeur de markdown me et semblait proche de ce dont j&amp;rsquo;avais besoin.&lt;/p&gt;
&lt;p&gt;Après quelques échanges avec son auteur principal, j&amp;rsquo;ai constaté que nous objectifs étaient assez différents, donc je me suis résolu à maintenir mon propre fork de sveltia que j&amp;rsquo;ai complété notamment avec :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une prévisualisation dynamique en local&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="la-migration"&gt;LA MIGRATION&lt;/h2&gt;
&lt;h3 id="ia--indispensable-assistant"&gt;IA = Indispensable Assistant&lt;/h3&gt;
&lt;p&gt;Franchement, sans l&amp;rsquo;IA (Gemini) intégrée dans Antigravity (l&amp;rsquo;IDE que j&amp;rsquo;utilise de préférence à VSCode), j&amp;rsquo;aurais abandonné.&lt;/p&gt;
&lt;p&gt;Elle a permis de faire des dizaines de recherche/remplace qui m&amp;rsquo;auraient pris de heures à la main ou à écrire les regex en quelques minutes.&lt;/p&gt;
&lt;p&gt;Le plus incroyable s&amp;rsquo;est produit lorsque je lui ai demandé de retrouver des images qui avaient disparu car je les avais &amp;ldquo;hotlinké&amp;rdquo; sans m&amp;rsquo;en rendre compte, et que le site d&amp;rsquo;origine avait bien entendu changé ou disparu. L&amp;rsquo;IA a pensé &amp;ldquo;toute seule&amp;rdquo; à les chercher sur la Wayback Machine qui conserve les anciennes versions de pratiquement tout internet ! Et les a toutes retrouvées, téléchargées dans le site Hugo, et insérées proprement dans les articles. Wow. En quelques minutes !&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;dans
.md, transforme en latex les deux équations sur la fonction slerp qui sont écrites en texte, en t&amp;rsquo;appuyant sur la wayback machine&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;a transformé ça :&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt=""
srcset="https://drgoulu.com/posts/2026/images/avant_hu_80d72836f89c6fc0.webp 320w, https://drgoulu.com/posts/2026/images/avant_hu_c0d2e37e01a9490f.webp 480w, https://drgoulu.com/posts/2026/images/avant_hu_f920f8e4c717a6c6.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://drgoulu.com/posts/2026/images/avant_hu_80d72836f89c6fc0.webp"
width="760"
height="189"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;en ça :&lt;/p&gt;
$$\text{slerp}(v_0, v_1, t) = \frac{\text{sin_over_x}((1-t)a)}{\text{sin_over_x}(a)} (1-t) v_0 + \frac{\text{sin_over_x}(ta)}{\text{sin_over_x}(a)} t v_1$$&lt;p&gt;et&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;reformate le contenu de tous les shortcodes highlight en reproduisant celui trouvé dans la wayback machine&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;a transformé ça :&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt=""
srcset="https://drgoulu.com/posts/2026/images/avant-code_hu_45aa47d34503429.webp 320w, https://drgoulu.com/posts/2026/images/avant-code_hu_9b0499f3bc365de8.webp 480w, https://drgoulu.com/posts/2026/images/avant-code_hu_926a63115ac253c3.webp 644w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://drgoulu.com/posts/2026/images/avant-code_hu_45aa47d34503429.webp"
width="644"
height="592"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;en ça :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;81&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw_input&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;(mauvais exemple car le code est sur une seule ligne&amp;hellip;)&lt;/p&gt;
&lt;h2 id="commentaires-disqus"&gt;Commentaires Disqus&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;intégration des commentaires historiques du blog repose sur
. Lors de la migration vers Hugo Blox / Tailwind CSS, un problème d&amp;rsquo;incompatibilité est apparu :&lt;/p&gt;
&lt;h3 id="incompatibilité-oklch-et-disqus-embedjs"&gt;Incompatibilité OKLCH et Disqus &lt;code&gt;embed.js&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Le script d&amp;rsquo;intégration de Disqus (&lt;code&gt;embed.js&lt;/code&gt;) analyse automatiquement l&amp;rsquo;environnement de la page (&lt;code&gt;getComputedStyle&lt;/code&gt;) pour adapter les couleurs du fil de discussion (mode clair/sombre, couleur des liens).&lt;/p&gt;
&lt;p&gt;Or, Tailwind CSS et Hugo Blox utilisent désormais le format de couleur moderne &lt;code&gt;oklch(...)&lt;/code&gt;. Le parseur interne de Disqus (&lt;code&gt;parseColor&lt;/code&gt;), n&amp;rsquo;étant pas compatible avec &lt;code&gt;oklch&lt;/code&gt;, échouait avec l&amp;rsquo;erreur :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Uncaught Error: parseColor received unparseable color: oklch(...)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="solution-mise-en-place"&gt;Solution mise en place&lt;/h3&gt;
&lt;p&gt;Pour isoler Disqus des styles &lt;code&gt;oklch&lt;/code&gt; globaux, des règles CSS explicites ont été ajoutées dans &lt;code&gt;assets/css/custom.css&lt;/code&gt; afin de forcer des formats de couleurs traditionnels (Hex / RGB) sur le conteneur &lt;code&gt;#disqus_thread&lt;/code&gt;, son texte d&amp;rsquo;arrière-plan et ses liens internes (&lt;code&gt;#disqus_thread a&lt;/code&gt;), pour les thèmes clair et sombre :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;/* Forcer des couleurs standards (Hex/RGB) pour Disqus */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;disqus_thread&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;disqus_thread&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#111827&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;disqus_thread&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#ffffff&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;disqus_thread&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;disqus_thread&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;link&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;disqus_thread&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;visited&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;disqus_thread&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;hover&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;disqus_thread&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;active&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dsq-brlink&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dsq-brlink&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#2563eb&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dark&lt;/span&gt; &lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;disqus_thread&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dark&lt;/span&gt; &lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;disqus_thread&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#f8fafc&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dark&lt;/span&gt; &lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;disqus_thread&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#0f172a&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dark&lt;/span&gt; &lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;disqus_thread&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dark&lt;/span&gt; &lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;disqus_thread&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;link&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dark&lt;/span&gt; &lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;disqus_thread&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;visited&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dark&lt;/span&gt; &lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;disqus_thread&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;hover&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dark&lt;/span&gt; &lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;disqus_thread&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;active&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dark&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dsq-brlink&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dark&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dsq-brlink&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#60a5fa&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="références"&gt;Références:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
, article de blog duquel j&amp;rsquo;ai copié l&amp;rsquo;image d&amp;rsquo;entête&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>