<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Markdown on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/markdown/</link><description>Recent content in Markdown on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Mon, 29 Nov 2021 08:00:00 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/markdown/index.xml" rel="self" type="application/rss+xml"/><item><title>J'ai enfin migré de Wordpress vers Hugo - partie 2</title><link>https://blog.zwindler.fr/2021/11/29/jai-enfin-migre-de-wordpress-a-hugo-partie-2/</link><pubDate>Mon, 29 Nov 2021 08:00:00 +0000</pubDate><guid>https://blog.zwindler.fr/2021/11/29/jai-enfin-migre-de-wordpress-a-hugo-partie-2/</guid><description>&lt;img src="https://blog.zwindler.fr/2021/11/wordpress-to-hugo.webp" alt="Featured image of post J'ai enfin migré de Wordpress vers Hugo - partie 2" /&gt;&lt;p&gt;Cette article fait partie d&amp;rsquo;une suite d&amp;rsquo;articles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2021/11/22/jai-enfin-migre-de-wordpress-a-hugo-partie-1/" &gt;J&amp;rsquo;ai enfin migré de Wordpress vers Hugo - partie 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2021/11/29/jai-enfin-migre-de-wordpress-a-hugo-partie-2/" &gt;J&amp;rsquo;ai enfin migré de Wordpress vers Hugo - partie 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="extraire-les-données-de-wordpress"&gt;Extraire les données de WordPress
&lt;/h2&gt;&lt;p&gt;Normalement &lt;a class="link" href="https://blog.zwindler.fr/2021/11/22/jai-enfin-migre-de-wordpress-a-hugo-partie-1/" &gt;si vous avez lu la première partie&lt;/a&gt;, vous savez qu&amp;rsquo;on a un Hugo fonctionnel (mais vide). Et que dans mon cas, l&amp;rsquo;objectif était de migrer 12 ans d&amp;rsquo;historique (350 articles tout de même) de Wordpress vers notre Hugo.&lt;/p&gt;
&lt;p&gt;Vous vous en doutez, le but n&amp;rsquo;est pas de reprendre les articles uns par uns (sauf si vous n&amp;rsquo;en avez qu&amp;rsquo;une dizaine, ça doit se faire) mais bien de trouver une méthode pour exporter le contenu existant en markdown pour repartir comme si de rien n&amp;rsquo;était.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://gohugo.io/tools/migrations/#wordpress" target="_blank" rel="noopener"
&gt;La documentation officielle de Hugo donne plusieurs pistes&lt;/a&gt; pour migrer depuis Wordpress et c&amp;rsquo;est la première que j&amp;rsquo;avais utilisé en 2019 (la première fois que j&amp;rsquo;avais tenté de migrer, sans succès). J&amp;rsquo;ai re-installé l&amp;rsquo;extension &lt;code&gt;wordpress-to-hugo-exporter&lt;/code&gt; (je vous invite quand même à regarder les alternatives car il n&amp;rsquo;est pas impossible que ça ait évolué depuis).&lt;/p&gt;
&lt;h2 id="wordpress-to-hugo-exporter"&gt;wordpress-to-hugo-exporter
&lt;/h2&gt;&lt;p&gt;La première chose à faire pour installer cette extension est de vérifier que votre serveur qui héberge le WordPress dispose bien de l’extension PHP &lt;code&gt;zip.so&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/php.d/40-zip.ini
; Enable ZIP extension module
extension=zip.so
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On peut ensuite cloner le projet git du plugin directement dans le dossier plugin de WordPress&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd PATH_TO_WORDPRESS/wp-content/plugins/
git clone https://github.com/SchumacherFM/wordpress-to-hugo-exporter
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, il est possible de démarrer un export soit depuis l&amp;rsquo;interface, soit via un script en PHP lancé depuis le serveur en ligne de commandes. Évidemment, dans ce genre de procédures, on arrive toujours à un moment où on se tape un timeout quelque part. Dans mon cas, les données exportées (articles + medias, environ ~1.5 Go) prenaient 500 Mo de RAM et 20 minutes d&amp;rsquo;exécution.&lt;/p&gt;
&lt;p&gt;On oublie donc le clic dans l&amp;rsquo;interface (sauf à tuner votre nginx pour autoriser des requêtes clients avec un timeout &amp;gt; 60s) et on lance depuis la ligne de commande. Et bien entendu, on augmente toutes les limites possibles et imaginables, notamment celle de wordpress via le fichier wp-config.php.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-PHP" data-lang="PHP"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Set initial default constants including WP_MEMORY_LIMIT, WP_MAX_MEMORY_LIMIT, WP_DEBUG, SCRIPT_DEBUG, WP_CONTENT_DIR and WP_CACHE.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;wp_initial_constants&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="nx"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;WP_MEMORY_LIMIT&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2048M&amp;#39;&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="nx"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;WP_MAX_MEMORY_LIMIT&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2048M&amp;#39;&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;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="nb"&gt;cd&lt;/span&gt; PATH_TO_WORDPRESS/wp-content/plugins/wordpress-to-hugo-exporter/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;php hugo-export-cli.php &lt;span class="nv"&gt;memory_limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;-1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Qui devrait se terminer, si tout se passe bien, par un :&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;This is your file!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/tmp/wp-hugo.zip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Note: on peut également exporter les commentaires, il faut modifier manuellement une ligne dans le fichier &lt;code&gt;hugo-export.php&lt;/code&gt; (voir la doc)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A partir de là, on a une archive qui contient vos posts, vos pages et vos médias importés (grosso modo tout wp-content).&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;archive a l&amp;rsquo;arborescence suivante :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un dossier &lt;strong&gt;posts&lt;/strong&gt; qui contient tous les articles (&lt;em&gt;posts&lt;/em&gt; dans la terminologie wordpress) dans un mélange de markdown + html brut (ce qui n&amp;rsquo;aura pas été correctement converti, on y reviendra)&lt;/li&gt;
&lt;li&gt;un dossier &lt;strong&gt;wp-content&lt;/strong&gt; qui contient tous les médias&lt;/li&gt;
&lt;li&gt;des dossiers pour chacune de vos &amp;ldquo;&lt;em&gt;pages&lt;/em&gt; (&amp;ldquo;à propos&amp;rdquo;, &amp;ldquo;mentions légales&amp;rdquo;, etc).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="importer-dans-hugo"&gt;Importer dans Hugo
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;arborescence de Hugo est elle un peu différente. De base, tout ce qui est markdown doit être dans &lt;strong&gt;content&lt;/strong&gt;, avec des sous dossiers en fonction du type de page (&lt;em&gt;post&lt;/em&gt; ou &lt;em&gt;page&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;La première petite &amp;ldquo;blaguounette&amp;rdquo; est que les &lt;em&gt;posts&lt;/em&gt; doivent être déposés dans le sous-dossier &lt;strong&gt;content/post&lt;/strong&gt; (sans S à la fin !!!).&lt;/p&gt;
&lt;p&gt;Chaque post commence par des métadonnées encadrées par des triples tirets &amp;ldquo;&amp;mdash;&amp;rdquo; avant et après. Ca donne quelque chose comme ça :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#39;ESXi 4.0 &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Explorons l&amp;amp;rsquo;Hidden Console Part 1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;authors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;zwindler&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;post&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ld"&gt;2010-04-28T08:32:20&lt;/span&gt;&lt;span class="m"&gt;+00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/2010/04/28/esxi-4-0-explorons-lhidden-console-part-1/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;featured_image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://blog.example.org/wp-content/uploads/2014/10/vmware-220x162.jpg&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;Virtualisation&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;ESX(i)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;Hidden Console&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;SSH&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&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="l"&gt;L&amp;#39;article lui même...]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ca peut différer un peu selon les thèmes je pense, mais grosso modo les markdown des &lt;em&gt;pages&lt;/em&gt; iront eux dans &lt;strong&gt;content/page&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Enfin, tout ce qui est media (dossier wp-media) va dans un dossier &lt;strong&gt;static&lt;/strong&gt;. On peut garder la même arborescence que wordpress (/année/mois/) mais rien ne nous y oblige.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So far, so good&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="emile-et-images"&gt;Emile et Images
&lt;/h2&gt;&lt;p&gt;Enfin&amp;hellip; &lt;em&gt;so good&lt;/em&gt;, c&amp;rsquo;est vite dit&amp;hellip;&lt;/p&gt;
&lt;p&gt;Et oui parce que l&amp;rsquo;exporter n&amp;rsquo;exporte pas hyper bien un certain nombre de choses, à commencer par l&amp;rsquo;image de garde de chaque article :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;featured_image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://blog.example.org/wp-content/uploads/2014/10/vmware-220x162.jpg&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On peut remarquer plusieurs soucis avec cette variable. D&amp;rsquo;abord, la variable utilisée pour indiquer le chemin de l&amp;rsquo;image dans les métadonnées générées est &lt;code&gt;featured_image&lt;/code&gt; alors qu&amp;rsquo;Hugo attend &lt;code&gt;image&lt;/code&gt;. Petit &lt;code&gt;sed&lt;/code&gt; sur vos md pour corriger ça :&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;sed -i &lt;span class="s2"&gt;&amp;#34;s/featured_image/image/g&amp;#34;&lt;/span&gt; fichier.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mais bien sûr, ce n&amp;rsquo;est pas fini ;-)&lt;/p&gt;
&lt;p&gt;Ensuite, on remarque qu&amp;rsquo;on a un chemin est une URL complète et non pas relative. Si vous gardez les média dans le chemin &lt;strong&gt;static/wp-content/uploads/YYYY/MM&lt;/strong&gt; ça marchera, mais je trouve ça moche.&lt;/p&gt;
&lt;p&gt;2 solutions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;on supprime &lt;strong&gt;/wp-content/uploads&lt;/strong&gt; avec un bête &lt;code&gt;sed -i &amp;quot;s!/wp-content/uploads!!g fichier.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;on passe en relatif en supprimant carrément toute la première partie de l&amp;rsquo;URL &lt;strong&gt;&lt;a class="link" href="https://yourblog.example.org/wp-content/uploads" target="_blank" rel="noopener"
&gt;https://yourblog.example.org/wp-content/uploads&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous choisissez la 2ème solution (mon choix), faites quand même bien attention. En fonction de &lt;em&gt;comment&lt;/em&gt; vous rédigez votre expression régulière, ça pourrait affecter aussi toutes les autres images que vous auriez en lien dans vos articles. Ce n&amp;rsquo;est pas forcément une mauvaise chose (moi j&amp;rsquo;aime mieux les liens relatifs car c&amp;rsquo;est plus flexible) mais ça demande un travail supplémentaire.&lt;/p&gt;
&lt;h2 id="images-intermédiaires"&gt;Images intermédiaires
&lt;/h2&gt;&lt;p&gt;Toujours dans les images, vous remarquerez aussi que l&amp;rsquo;image &amp;ldquo;mise en avant&amp;rdquo; (dans les métadonnées) possède un suffixe de type &lt;code&gt;-111x222&lt;/code&gt; juste avant l&amp;rsquo;extension. En fait, chaque fois que vous importez une image dans wordpress, celui ci la convertie en plusieurs tailles pour accélérer le chargement des pages.&lt;/p&gt;
&lt;p&gt;Sauf que le &lt;strong&gt;wordpress-to-hugo-exporter&lt;/strong&gt; choisi une des plus petites résolution pour l&amp;rsquo;image en tête de l&amp;rsquo;article. Ca sera souvent hyper moche&amp;hellip;&lt;/p&gt;
&lt;p&gt;Là encore, j&amp;rsquo;ai donc passé un gros &lt;code&gt;sed&lt;/code&gt; pour virer tous les suffixes &lt;code&gt;-111x222&lt;/code&gt; avant l&amp;rsquo;extension, puis je n&amp;rsquo;ai copié QUE les images originales dans le dossier &lt;strong&gt;static&lt;/strong&gt; (regex non triviale) :&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="nb"&gt;cd&lt;/span&gt; PATH_TO_EXPORT/wp-content/uploads
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; i in &lt;span class="sb"&gt;`&lt;/span&gt;seq &lt;span class="m"&gt;2010&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; 2021&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; find &lt;span class="nv"&gt;$i&lt;/span&gt; -mindepth &lt;span class="m"&gt;1&lt;/span&gt; -type f -regextype posix-egrep -not -iregex &lt;span class="s2"&gt;&amp;#34;.*/.*-[0-9]{1,4}x[0-9]{1,4}.*\..*&amp;#34;&lt;/span&gt; -exec cp &lt;span class="o"&gt;{}&lt;/span&gt; PATH_TO_HUGO/static/&lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&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;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="nettoyer-les-caractères-spéciaux-html"&gt;Nettoyer les caractères spéciaux HTML
&lt;/h2&gt;&lt;p&gt;Si vous avez bien lu l&amp;rsquo;exemple de métadonnées exportées que j&amp;rsquo;ai donné, vous aurez peut être remarqué la présence d&amp;rsquo;un caractère spécial encodé &lt;code&gt;&amp;amp;rsquo;&lt;/code&gt; dans le titre.&lt;/p&gt;
&lt;p&gt;Dans une page HTML, ce n&amp;rsquo;est pas grave, mais Hugo lui, ne les interprète pas comme tel dans le markdown. Il faut donc leur faire la chasse et tous les convertir 🤦. Et encore, il faut faire attention, car certains de ces caractères pourraient être légitimement écris en HTML (si vous faite un tuto sur HTML, ce n&amp;rsquo;est pas impossible par exemple)&amp;hellip;&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai pour ma part lancé un gros &lt;code&gt;sed&lt;/code&gt; (une fois de plus) sur tous mes articles mais prudence !&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;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;rsquo;/’/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;#8211;/--/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;#8230;/.../g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;gt;/&amp;gt;/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;lt;/&amp;lt;/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;#8212;/-/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;#8217;/&amp;#39;/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;#215;/×/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Je n&amp;rsquo;ai pas osé modifier les caractères suivants, très souvent présents dans les URLs :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;amp;#038
&amp;amp;#039
&amp;amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Mais c&amp;rsquo;est quand même une bonne idée de faire une grosse recherche avec votre éditeur de texte favori pour voir s&amp;rsquo;il ne reste pas des &lt;code&gt;&amp;amp;#&lt;/code&gt; qui traînent dans votre contenu.&lt;/p&gt;
&lt;h2 id="html-désactivé"&gt;HTML désactivé
&lt;/h2&gt;&lt;p&gt;Au delà des caractères spéciaux, il arrive aussi que l&amp;rsquo;exporter est un peu de mal avec les différents types d&amp;rsquo;éditeurs que Wordpress a pu avoir au fil du temps.&lt;/p&gt;
&lt;p&gt;Typiquement, beaucoup du contenu &amp;ldquo;non texte&amp;rdquo; que j&amp;rsquo;ai ajouté au fil des années s&amp;rsquo;est retrouvé non converti par ce que j&amp;rsquo;ai rédigé s&amp;rsquo;est retrouvé exporté tel quel, en HTML brut inséré dans mon markdown.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est hyper traître car Hugo ne renvoie aucune erreur. Il manque &amp;ldquo;juste&amp;rdquo; des bouts ! On peut les retrouver en allant voir le code source de la page, qui affiche alors les commentaires HTML suivants :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-HTML" data-lang="HTML"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- raw HTML omitted --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En attendant de nettoyer tout ça à grand coup de &lt;code&gt;sed&lt;/code&gt;, on peut résoudre une partie des problèmes en &amp;ldquo;réactivant le support du code HTML dans le markdown dans votre &lt;code&gt;config.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;markup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;goldmark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;renderer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;## Set to true if you have HTML content inside Markdown&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;unsafe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ca permet de sauver les meubles mais ce n&amp;rsquo;est pas suffisant&amp;hellip;&lt;/p&gt;
&lt;h2 id="markdown-hates-html"&gt;Markdown hates HTML
&lt;/h2&gt;&lt;p&gt;Même comme ça, on grosse partie du HTML sera HS&amp;hellip; Tous les tableaux (table/tr/td) et listes (ul/li) HTML sont pétés car l&amp;rsquo;exporter laisse des sauts de lignes entre les blocs, que le markdown interprète mal. Il faudra supprimer tous les sauts de lignes en trop (ou réécrire en markdown)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;table class=&amp;#34;Content&amp;#34; border=&amp;#34;0&amp;#34; width=&amp;#34;750&amp;#34;&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td class=&amp;#34;LargeBold&amp;#34;&amp;gt;
SEND_CUSTOM_SVC_NOTIFICATION
&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td class=&amp;#34;MediumBold&amp;#34;&amp;gt;
Command Format:
&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sachez également que toutes les &amp;ldquo;videos embedded&amp;rdquo; Youtube disparaîtront purement et simplement, et que pour les tweets, vous aurez une version très moche du tweet, sans l&amp;rsquo;image&amp;hellip;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-HTML" data-lang="HTML"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;blockquote&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;twitter-tweet&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;550&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;en&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-dnt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;true&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-partner&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;jetpack&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;fr&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ltr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [[#SAPHANA](ht tps://tw itter.com/hashtag/SAPHANA?src=hash&lt;span class="err"&gt;&amp;amp;&lt;/span&gt;ref_src=twsrc%5Etfw)] Finies les mises à jour incompatibles avec votre plateforme, optez pour la simplicité et la tranquillité, chez SAP : on collecte, on connecte, ça marche : [t.co/2AdCCEQ97L](https://t.c o/2AdCCEQ97L) [pic.twi tter.com/yy7moMnZmC](ht tps://t.c o/yy7moMnZmC)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- SAP France (@SAPFrance)
&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; [October 8, 2018](ht tps://twiter.com/SAPFrance/status/1049286253533962241?ref_src=twsrc%5Etfw)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;blockquote&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;J&amp;rsquo;en avais peu heureusement, j&amp;rsquo;ai donc pris des captures d&amp;rsquo;écran et ajouté des liens.&lt;/p&gt;
&lt;h2 id="balises-de-code-pre-etc"&gt;Balises de code, pre, etc.
&lt;/h2&gt;&lt;p&gt;Une autre grosse catégorie de code &amp;ldquo;mal exporté&amp;rdquo; est le &amp;ldquo;code&amp;rdquo;. Je donne souvent des bouts de scripts ou de code ou tout simplement des commandes à passer sur des serveurs. Et au fil des années, j&amp;rsquo;ai (&amp;amp; wordpress) changé plusieurs fois la façon d&amp;rsquo;afficher du code dans mes articles.&lt;/p&gt;
&lt;p&gt;D&amp;rsquo;abord avec des balises HTML &lt;code&gt;&amp;lt;pre&amp;gt;&amp;lt;/pre&amp;gt;&lt;/code&gt;, puis des balises &lt;code&gt;&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;/code&gt;, puis via des extensions (pour avoir la coloration syntaxique), puis via du markdown via Jetpack, puis de nouveau via les extensions&amp;hellip;&lt;/p&gt;
&lt;p&gt;Autant dire que le HTML généré par Wordpress ne ressemble à rien&amp;hellip;&lt;/p&gt;
&lt;p&gt;Il a fallut faire un gros gros boulot pour détecter toutes les balises de code ouvrantes et fermantes pour les convertir en ``` de markdown&amp;hellip;&lt;/p&gt;
&lt;p&gt;Quelques exemples que j&amp;rsquo;ai rencontré :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-HTML" data-lang="HTML"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt;&lt;span class="p"&gt;&amp;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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;brush: plain; title: ; notranslate&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;brush: perl; collapse: false; title: ; wrap-lines: false; notranslate&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;EnlighterJSRAW&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-enlighter-language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;null&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;EnlighterJSRAW&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-enlighter-language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;generic&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;EnlighterJSRAW&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-enlighter-language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;generic&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-enlighter-theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;... et bien d&amp;#39;autres encore
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="final-words"&gt;Final words
&lt;/h2&gt;&lt;p&gt;Je m&amp;rsquo;arrête là car l&amp;rsquo;article est déjà très long, mais il y a eu d&amp;rsquo;autres petits problèmes du même style, plus sporadiques&amp;hellip;&lt;/p&gt;
&lt;p&gt;Vous voyez donc qu&amp;rsquo;exporter le blog sur Hugo n&amp;rsquo;aura pas été de tout repos, dans mon cas. Et encore ! Je n&amp;rsquo;ai pas exporté les commentaires historiques (plus de 1600) !&lt;/p&gt;
&lt;p&gt;Cependant, si vous avez un blog plus petit que celui ci, vous devriez avoir moins de mal et les conseils que je donne ici devraient vous permettre de régler rapidement 90% des problèmes.&lt;/p&gt;
&lt;p&gt;Enjoy !&lt;/p&gt;</description></item><item><title>J'ai enfin migré de Wordpress vers Hugo - partie 1</title><link>https://blog.zwindler.fr/2021/11/22/jai-enfin-migre-de-wordpress-a-hugo-partie-1/</link><pubDate>Mon, 22 Nov 2021 08:00:00 +0000</pubDate><guid>https://blog.zwindler.fr/2021/11/22/jai-enfin-migre-de-wordpress-a-hugo-partie-1/</guid><description>&lt;img src="https://blog.zwindler.fr/2021/11/wordpress-to-hugo.webp" alt="Featured image of post J'ai enfin migré de Wordpress vers Hugo - partie 1" /&gt;&lt;p&gt;Cette article fait partie d&amp;rsquo;une suite d&amp;rsquo;articles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2021/11/22/jai-enfin-migre-de-wordpress-a-hugo-partie-1/" &gt;J&amp;rsquo;ai enfin migré de Wordpress vers Hugo - partie 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2021/11/29/jai-enfin-migre-de-wordpress-a-hugo-partie-2/" &gt;J&amp;rsquo;ai enfin migré de Wordpress vers Hugo - partie 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="plus-de-2-ans-et-demi"&gt;Plus de 2 ans et demi
&lt;/h2&gt;&lt;p&gt;Ca fait plus de 2 ans et demi que je râle que j&amp;rsquo;en ai ma claque de Wordpress.&lt;/p&gt;
&lt;p&gt;Stack LEMP à maintenir, perfs bof (j&amp;rsquo;ai du mettre un cache pour passer sous la seconde, wtf&amp;hellip;), plugins aux MAJs hasardeuses, failles de sécu, pas de support propre du markdown, éditeur à ch*** (Gutenberg, je te hais), &amp;hellip; you name it.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/tweet_mieuxavant.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Après 12 ans de blogging, il était temps de faire l&amp;rsquo;effort et de quitter Wordpress pour quelque chose qui me convient mieux : un moteur de blog statique (rien de dynamique dans ce que je poste) en markdown (parce que de toute façon c&amp;rsquo;est comme ça que j&amp;rsquo;écris mes articles à la base). Le tout dans git pour historiser tout ça.&lt;/p&gt;
&lt;p&gt;Et j&amp;rsquo;ai choisi Hugo pour des raisons que &lt;a class="link" href="https://blog.zwindler.fr/2019/06/10/comment-migrer-de-wordpress-a-hugo/" &gt;je détaille dans l&amp;rsquo;article 2019 &amp;ldquo;Comment migrer de Wordpress à Hugo&amp;rdquo; si ça vous intéresse&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="forcément-cest-pas-si-facile"&gt;Forcément, c&amp;rsquo;est pas si facile
&lt;/h2&gt;&lt;p&gt;J&amp;rsquo;en parlais déjà dans l&amp;rsquo;article de 2019 : migrer de Wordpress à Hugo, forcément ce n&amp;rsquo;est pas si facile. D&amp;rsquo;ailleurs, j&amp;rsquo;avais même abandonné l&amp;rsquo;idée devant l&amp;rsquo;ampleur da tâche !&lt;/p&gt;
&lt;p&gt;Ce n&amp;rsquo;est pas tant la partie technique (installation de Hugo, export du blog existant) le problème. En quelques minutes, on a un blog fonctionnel, l&amp;rsquo;export prend guère plus de temps. Rajouter l&amp;rsquo;outillage pour automatiser certaines tâches prend un peu de temps mais rien d&amp;rsquo;incroyable.&lt;/p&gt;
&lt;p&gt;Mon problème était plutôt que je voulais obtenir au moins aussi bien que ce que j&amp;rsquo;avais avant, existant inclus.&lt;/p&gt;
&lt;p&gt;Et c&amp;rsquo;est là que le bat blesse : wordpress, avec mes 12 ans (350 articles) d&amp;rsquo;historique, c&amp;rsquo;est au fil des années 15 façons différentes d&amp;rsquo;afficher du HTML&amp;hellip; que le plugin d&amp;rsquo;export gère comme il peut ! Nous y reviendrons.&lt;/p&gt;
&lt;p&gt;Je vais donc vous guider un peu sur la partie technique, puis j&amp;rsquo;aborderai ensuite les points pénibles du nettoyage du markdown, qui m&amp;rsquo;a pris un bonne partie de mes vacances (plusieurs journées à ~2-3 heures par jour). Il y aura aussi, plus tard, des articles sur l&amp;rsquo;outillage à mettre en place pour se faciliter la vie au quotidien.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;installation en elle même est triviale. On a un binaire compilé en go packagé dans un &lt;strong&gt;.deb&lt;/strong&gt; (ou les sources si vous voulez le builder vous même) disponible sur github. Fin.&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;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt upgrade
&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;export&lt;/span&gt; &lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0.88.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://github.com/gohugoio/hugo/releases/download/v&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/hugo_&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;_Linux-64bit.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ou https://github.com/gohugoio/hugo/releases/download/v${VER}/hugo_extended_${VER}_Linux-64bit.deb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install ./hugo*_0.88.1_Linux-64bit.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A noter que dans mon cas, je n&amp;rsquo;ai pas téléchargé la version ci dessus, mais la version &amp;ldquo;extended&amp;rdquo;, nécessaire pour le thème que j&amp;rsquo;ai choisi, mais le principe est le même.&lt;/p&gt;
&lt;h2 id="initialisation-du-site-et-du-dépôt-git"&gt;Initialisation du site et du dépôt git
&lt;/h2&gt;&lt;p&gt;Hugo est maintenant disponible sur votre machine.&lt;/p&gt;
&lt;p&gt;A partir de là, je vous invite fortement à versionner tout ce que vous allez faire avec votre blog. C&amp;rsquo;est bien entendu optionnel mais pourquoi se priver de toute la puissance du couple markdown + git ?&lt;/p&gt;
&lt;p&gt;On commence par créer un dossier puis on génère un squelette de site vierge avec &lt;code&gt;hugo new site&lt;/code&gt; :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir hugo &amp;amp;&amp;amp; cd hugo
hugo new site toto
Congratulations! Your new Hugo site is created in toto.
Just a few more steps and you&amp;#39;re ready to go:
1. Download a theme into the same-named folder.
Choose a theme from https://themes.gohugo.io/ or
create your own with the &amp;#34;hugo new theme &amp;lt;THEMENAME&amp;gt;&amp;#34; command.
2. Perhaps you want to add some content. You can add single files
with &amp;#34;hugo new &amp;lt;SECTIONNAME&amp;gt;/&amp;lt;FILENAME&amp;gt;.&amp;lt;FORMAT&amp;gt;&amp;#34;.
3. Start the built-in live server via &amp;#34;hugo server&amp;#34;.
Visit https://gohugo.io/ for quickstart guide and full documentation.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, on va pouvoir initialiser notre dépôt git&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="nb"&gt;cd&lt;/span&gt; toto
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bon, si jamais vous lancez la génération du blog avec simplement la commande de preview &lt;code&gt;hugo server&lt;/code&gt;, vous allez être assez déçus, ça donne une page blanche. Mais, ça marche !&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;hugo server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Start building sites …
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo v0.88.1-5BC54738+extended linux/amd64 &lt;span class="nv"&gt;BuildDate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2021-09-04T09:39:19Z &lt;span class="nv"&gt;VendorInfo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gohugoio
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WARN 2021/11/14 06:57:47 found no layout file &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; kind &lt;span class="s2"&gt;&amp;#34;taxonomy&amp;#34;&lt;/span&gt;: You should create a template file which matches Hugo Layouts Lookup Rules &lt;span class="k"&gt;for&lt;/span&gt; this combination.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WARN 2021/11/14 06:57:47 found no layout file &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; kind &lt;span class="s2"&gt;&amp;#34;home&amp;#34;&lt;/span&gt;: You should create a template file which matches Hugo Layouts Lookup Rules &lt;span class="k"&gt;for&lt;/span&gt; this combination.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WARN 2021/11/14 06:57:47 found no layout file &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; kind &lt;span class="s2"&gt;&amp;#34;taxonomy&amp;#34;&lt;/span&gt;: You should create a template file which matches Hugo Layouts Lookup Rules &lt;span class="k"&gt;for&lt;/span&gt; this combination.
&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; EN
&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; Pages &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Paginator pages &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Non-page files &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Static files &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Processed images &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Aliases &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Sitemaps &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Cleaned &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&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;Built in &lt;span class="m"&gt;1&lt;/span&gt; ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Watching &lt;span class="k"&gt;for&lt;/span&gt; changes in /toto/&lt;span class="o"&gt;{&lt;/span&gt;archetypes,content,data,layouts,static&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Watching &lt;span class="k"&gt;for&lt;/span&gt; config changes in /toto/config.toml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Environment: &lt;span class="s2"&gt;&amp;#34;development&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Serving pages from memory
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Web Server is available at http://localhost:1313/ &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt; address 127.0.0.1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Press Ctrl+C to stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ajout-dun-thème"&gt;Ajout d&amp;rsquo;un thème
&lt;/h2&gt;&lt;p&gt;Avant même de commencer à ajouter du contenu, il est probable que vous allez vouloir choisir un thème. Il existe une liste de thèmes, plus fournie qu&amp;rsquo;en 2019, &lt;a class="link" href="https://themes.gohugo.io/" target="_blank" rel="noopener"
&gt;disponible ici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Une fois le thème choisi, on va l&amp;rsquo;ajouter au site à l&amp;rsquo;aide de la (très utile) commande git &lt;code&gt;git submodule&lt;/code&gt; qui va nous permettre de gérer notre thème et ses mises à jour avec git sans pour autant commiter tous les fichiers.&lt;/p&gt;
&lt;p&gt;Dans mon cas j&amp;rsquo;ai choisi le thème &amp;ldquo;stack&amp;rdquo; mais le principe est grosso modo le même pour tous (à quelques détails d&amp;rsquo;implémentation près) :&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="nb"&gt;cd&lt;/span&gt; themes/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule add https://github.com/CaiJimmy/hugo-theme-stack.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="avant-le-premier-article-"&gt;Avant le premier article !
&lt;/h2&gt;&lt;p&gt;Si on veut bosser un peu proprement, on va vouloir éviter de commiter n&amp;rsquo;importe quoi. Comme hugo est un générateur de blog statique, on va bien entendu éviter de commiter le code statique généré par la commande &lt;code&gt;hugo&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;On utilise simplement un fichier &lt;strong&gt;.gitignore&lt;/strong&gt; à la racine du projet pour ignorer tout ce qui est technique ou qui n&amp;rsquo;est pas du code :&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;cat &amp;gt; .gitignore &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;themes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;resources/_gen
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;assets/jsconfig.json
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;public
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On va aussi vouloir paramétrer a minima notre site. Vous aurez peut être remarqué qu&amp;rsquo;il existe un fichier &lt;code&gt;config.toml&lt;/code&gt; généré par défaut par la commande &lt;code&gt;hugo new site&lt;/code&gt;. Il s&amp;rsquo;agit de &amp;ldquo;l&amp;rsquo;ancienne&amp;rdquo; manière de faire de la configuration Hugo, mais surtout d&amp;rsquo;un fichier agnostique du thème utilisée. Généralement, il vaut mieux le supprimer et repartir du fichier d&amp;rsquo;exemple inclus avec votre thème.&lt;/p&gt;
&lt;p&gt;Dans mon cas, il s&amp;rsquo;agit du fichier &lt;strong&gt;theme/hugo-theme-stack/config.yaml&lt;/strong&gt; que j&amp;rsquo;ai donc copié à la racine du projet et modifié pour correspondre à mon site et mes besoins.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;baseurl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://blog.zwindler.fr&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;languageCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;fr-fr&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;hugo-theme-stack&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Zwindler&amp;#39;s Reflection&amp;#34;&lt;/span&gt;&lt;span class="w"&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="l"&gt;...]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="le-premier-commit"&gt;Le premier commit
&lt;/h2&gt;&lt;p&gt;C&amp;rsquo;est un petit moment agréable dans n&amp;rsquo;importe quel projet informatique. Le premier commit.&lt;/p&gt;
&lt;p&gt;Bon moi, comme j&amp;rsquo;ai hébergé le dépôt sur Github et qu&amp;rsquo;ils ont décidé de renommer &lt;strong&gt;master&lt;/strong&gt; en &lt;strong&gt;main&lt;/strong&gt; dans le nom de la branche par défaut on a un peu de gymnastique à faire, mais pourquoi pas.&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;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;first commit&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git branch -M main
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote add origin git@github.com:zwindler/example.org.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push -u origin main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le &amp;ldquo;code&amp;rdquo; de notre (absence de) blog est publié Internet :)&lt;/p&gt;
&lt;h2 id="et-en-prod-"&gt;Et en prod ?
&lt;/h2&gt;&lt;p&gt;Vous pouvez donc commencer à écrire (dans &lt;strong&gt;content/post&lt;/strong&gt;), tester votre blog en local, puis pousser le code sur git. Mais si jamais vous voulez héberger votre site ailleurs que sur votre laptop (et je parie que c&amp;rsquo;est le cas) ?&lt;/p&gt;
&lt;p&gt;Et bien c&amp;rsquo;est là où c&amp;rsquo;est chouette d&amp;rsquo;utiliser git et un dépôt accessible depuis Internet. Vous n&amp;rsquo;avez qu&amp;rsquo;à reproduire l&amp;rsquo;installation de hugo, ajouter votre dépôt, initialiser les submodules (notre thème) et le tour est joué !&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="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0.88.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://github.com/gohugoio/hugo/releases/download/v&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/hugo_&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;_Linux-64bit.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ou https://github.com/gohugoio/hugo/releases/download/v${VER}/hugo_extended_${VER}_Linux-64bit.deb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install ./hugo*_0.88.1_Linux-64bit.deb
&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;git clone https://github.com/zwindler/toto.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule update
&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;hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Normalement, le site devrait se générer, comme en local. Si vous n&amp;rsquo;avez pas d&amp;rsquo;historique à migrer, comme moi, vous êtes donc l&amp;rsquo;heureux propriétaire d&amp;rsquo;un blog statique fonctionnel :-). La classe !&lt;/p&gt;
&lt;p&gt;Sinon, dans le prochain article, j&amp;rsquo;aborderai un plus gros morceau, à savoir l&amp;rsquo;export et le nettoyage du markdown depuis un Wordpress existant.&lt;/p&gt;</description></item><item><title>Marp : présentations rapides et jolies avec Markdown</title><link>https://blog.zwindler.fr/2021/09/13/marp-presentations-rapides-et-jolies-avec-markdown/</link><pubDate>Mon, 13 Sep 2021 06:05:00 +0000</pubDate><guid>https://blog.zwindler.fr/2021/09/13/marp-presentations-rapides-et-jolies-avec-markdown/</guid><description>&lt;img src="https://blog.zwindler.fr/2021/09/marp-logo.webp" alt="Featured image of post Marp : présentations rapides et jolies avec Markdown" /&gt;&lt;h2 id="jai-remplacé-powerpoint-par-marp-en-2019"&gt;J’ai remplacé Powerpoint par Marp en 2019
&lt;/h2&gt;&lt;p&gt;Pendant des années, j’ai rédigé mes présentations professionnelles avec Powerpoint. J’étais un utilisateur correct de la suite Office en général (pas un roxxor, mais à l’aise).&lt;/p&gt;
&lt;p&gt;Et là, c’est le drame, j’ai (enfin !) pu passer sous Linux sur ma machine pro. Ma vie est devenue tellement plus simple pour toutes mes tâches quotidiennes&amp;hellip; SAUF&amp;hellip; la rédaction de présentations.&lt;/p&gt;
&lt;p&gt;J’ai vraiment pesté en passant à Libre Office. Je ne vais pas tacler ce dernier, beaucoup de la difficulté réside dans les formats ultras verrouillés de MS et le reverse engineering doit être horriblement complexe. J’ai donc commencé à chercher des alternatives.&lt;/p&gt;
&lt;h2 id="its-time-to-duel"&gt;It’s time to Duel&amp;hellip;
&lt;/h2&gt;&lt;p&gt;J’ai donc demandé à mes petits collègues et copains speakers autour de moi ce qu’ils utilisaient comme moteur pour leurs présentations.&lt;/p&gt;
&lt;p&gt;Grosso modo, les nerds m’ont répondu qu’ils n’avaient jamais quitté &lt;a class="link" href="https://fr.wikipedia.org/wiki/LaTeX" target="_blank" rel="noopener"
&gt;LaTeX&lt;/a&gt; et que pour les présentations ils utilisaient simplement &lt;a class="link" href="https://fr.wikipedia.org/wiki/Beamer" target="_blank" rel="noopener"
&gt;Beamer&lt;/a&gt;, et les autres m’ont répondu &lt;a class="link" href="https://asciidoctor.org/" target="_blank" rel="noopener"
&gt;Ascii doctor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour la première, c’est une bonne alternative si vous n’êtes pas allergiques à la syntaxe de LaTeX (c’est mon cas). D’autant plus qu’on avait pas à l’époque d’aperçu en temps réel du code LaTeX (je ne sais pas si c’est toujours le cas) et qu’un néophyte passe beaucoup de temps à juste corriger les erreurs de syntaxe et de mise en page&amp;hellip;&lt;/p&gt;
&lt;p&gt;La seconde alternative est intéressante aussi. La syntaxe est plus digeste (je trouve) que LaTeX, il existe des éditeurs de texte capable de montrer un aperçu en temps réel du rendu final, et les formats d’export natifs incluent HTML 5, les manpages, les PDFs et ebooks,&amp;hellip; bref, à peu près tout type de format récent qui peuvent intéresser un ingénieur en informatique qui partage quotidiennement sa connaissance. Sauf que la syntaxe d’AsciiDoctor est proche de celle de &lt;a class="link" href="https://fr.wikipedia.org/wiki/Markdown" target="_blank" rel="noopener"
&gt;Markdown&lt;/a&gt; (au moins dans la philosophie) et pour avoir jonglé quelque temps entre les deux, il est facile de se prendre les pieds dans le tapis.&lt;/p&gt;
&lt;p&gt;Or, j’utilisais déjà Markdown pour la rédaction de documentations de projets hébergés sur gitlab et accessoirement, pour rédiger une partie des articles de ce blog. Pour éviter mon auto-confusion et capitaliser sur mon habitude de Markdown, j’ai donc cherché une alternative à AsciiDoctor pour les présentations, mais en Markdown !&lt;/p&gt;
&lt;h2 id="entre-alors-marp"&gt;Entre alors Marp
&lt;/h2&gt;&lt;p&gt;Heureusement pour moi, j’ai trouvé très rapidement l’outil que je cherchais, et il s’appelle Marp. Pour être parfaitement précis, &lt;a class="link" href="https://marp.app/#get-started" target="_blank" rel="noopener"
&gt;Marp&lt;/a&gt; est une collection d’outils open source (Marpit, Marp Core, Marp CLI, Marp for VSCode).&lt;/p&gt;
&lt;p&gt;Ce que vous avez besoin de retenir c’est qu’en tant qu’utilisateur, vous n’aurez besoin que de &lt;a class="link" href="https://github.com/marp-team/marp-cli" target="_blank" rel="noopener"
&gt;Marp CLI&lt;/a&gt; si vous voulez générer vos decks de slides en ligne de commande. Un des gros intérêts de la CLI par rapport à une interface graphique est qu’elle va vous permettre d’automatiser la génération de vos decks de slide très facilement.&lt;/p&gt;
&lt;p&gt;D’ailleurs, si ça vous intéresse, il se retrouve que Rémi Verchère a fait un article là-dessus il y a très peu de temps sur le compte Medium de &lt;a class="link" href="https://medium.com/linkbynet/making-slides-from-anywhere-for-anyone-using-marp-gitlab-pages-and-gitpod-35001daf1c93" target="_blank" rel="noopener"
&gt;LinkByNet : Making slides from anywhere for anyone using Marp, GitLab Pages and Gitpod&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Si en revanche vous préférez rédiger comme moi dans votre éditeur de texte et voir en live le support prendre forme, il existe donc aussi une extension &lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=marp-team.marp-vscode" target="_blank" rel="noopener"
&gt;VSCode pour Marp&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/09/marp_extension.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="comment-ça-marche-"&gt;Comment ça marche ?
&lt;/h2&gt;&lt;p&gt;Grosso modo, Marp vient étendre le Markdown classique pour y ajouter :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La commande &lt;strong&gt;&lt;em&gt;marp: true&lt;/em&gt;&lt;/strong&gt; pour indiquer qu’il s’agit d’un document Marp et pas Markdown et une balise &lt;code&gt;---&lt;/code&gt; pour indiquer les nouvelles slides&lt;/li&gt;
&lt;li&gt;des styles de slides et des thèmes customizables en CSS&lt;/li&gt;
&lt;li&gt;un logiciel pour transformer le code Markdown en PDF ou HTML&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous êtes déjà à l’aise avec Markdown, vous remarquez donc que la prise en main est extrêmement simple. Finalement, si vous avez déjà un document Markdown, vous pouvez juste le transformer en présentation en ajoutant régulièrement des &lt;code&gt;---&lt;/code&gt; entre les paragraphes (j’exagère, mais vous voyez l’idée).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/09/preview_marp.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et ce que j’apprécie particulièrement avec la preview Markdown, c’est qu’on a un visuel en temps réel de notre future documentation/présentation à partir de notre code.&lt;/p&gt;
&lt;h2 id="les-styles"&gt;Les styles
&lt;/h2&gt;&lt;p&gt;Out of the box, Marp propose 3 thèmes, qu’il est possible d’inverser (clair/sombre). La documentation sur ces thèmes &lt;a class="link" href="https://github.com/marp-team/marp-core/tree/main/themes" target="_blank" rel="noopener"
&gt;est disponible ici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En début de document, on indique qu’il ne s’agit pas d’un simple fichier Markdown, mais d’une présentation Marp de la façon suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;---
marp: true
theme: gaia
markdown.marp.enableHtml: true
paginate: true
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans cet exemple, j’ai donc utilisé le thème Gaia, autorisé l’injection de HTML « perso » au milieu du code Markdown (on en reparlera) et ajouté le petit chiffre en fin de chaque slide avec « paginate: true ».&lt;/p&gt;
&lt;p&gt;Bon&amp;hellip; par défaut, c’est assez vite limité et pas super joli&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/09/marp_default_theme.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;J’ai tout de suite voulu trouver d’autres thèmes (je n’en ai pas trouvé) et la documentation pour créer son propre thème est assez obscure.&lt;/p&gt;
&lt;p&gt;Donc j’ai voulu customiser le mien, mais là aussi, la partie documentation sur la customisation/modification de thèmes existants est un peu légère, surtout si vous avez tout oublié en CSS comme moi.&lt;/p&gt;
&lt;p&gt;Note: La documentation peu claire, c’est quasiment le seul reproche que je fais au projet Marp, tant j’en suis content. D’ailleurs, les développeurs de Marp travaillent à refaire la doc.&lt;/p&gt;
&lt;p&gt;Grosso modo, la partie thème est gérée dans la partie « framework Marpit » (donc la partie la plus bas niveau du projet Marp). Vous trouverez ici la partie « customisation » via CSS &lt;a class="link" href="https://marpit.marp.app/theme-css?id=tweak-style-through-markdown" target="_blank" rel="noopener"
&gt;Theme CSS (marp.app)&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="ma-personnalisation-à-moi"&gt;Ma personnalisation à moi
&lt;/h2&gt;&lt;p&gt;Je ne vais donc pas vous cacher mes petits secrets de speaker, je me suis donc fait un thème « par défaut » que j’utilise pour toutes mes conférences en tant que speaker et mes présentations internes (quand elles n’ont pas « besoin » du thème corporate).&lt;/p&gt;
&lt;p&gt;En tout début de chaque deck, avant la première slide et après la partie Marp pure, j’ajoute ceci :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;style&amp;gt;
section {
background-color: #fefefe;
color: #333;
}
img[alt~=&amp;#34;center&amp;#34;] {
display: block;
margin: 0 auto;
}
blockquote {
background: #ffedcc;
border-left: 10px solid #d1bf9d;
margin: 1.5em 10px;
padding: 0.5em 10px;
}
blockquote:before{
content: unset;
}
blockquote:after{
content: unset;
}
&amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Le premier bloc change la couleur du fond des slides.&lt;/li&gt;
&lt;li&gt;Le second me permet d’ajouter un paramètre « center » dans les images en Markdown pour la centrer (souvent très pratique quand on fait un peu de mise en page pour faire joli).&lt;/li&gt;
&lt;li&gt;Les derniers me permettent de customiser l’apparence des blocs de « quotes ».&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ajouter-des-vidéos-du-js-etc"&gt;Ajouter des vidéos, du JS, etc
&lt;/h2&gt;&lt;p&gt;Si vous avez tout bien lu, vous vous souvenez peut-être que j’ai dit qu’on allait ajouter une option &lt;strong&gt;&lt;em&gt;markdown.marp.enableHtml: true&lt;/em&gt;&lt;/strong&gt; dans en début de fichier.&lt;/p&gt;
&lt;p&gt;Ça va nous permettre de rajouter des bidouilles en HTML pour étendre un peu le Markdown et réaliser les 2-3% qui ne sont pas couverts par le langage.&lt;/p&gt;
&lt;p&gt;Je l’utilise notamment de temps en temps pour rajouter un sauf de ligne pour faciliter la lecture, mais aussi lorsque j’ai besoin d’intégrer une vidéo dans un support.&lt;/p&gt;
&lt;p&gt;Dans ce cas-là, j’ajoute la balise HTML suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;div id=video&amp;gt;&amp;lt;video controls=&amp;#34;controls&amp;#34; width=&amp;#34;800&amp;#34; src=&amp;#34;binaries/microsoft_dance.mp4&amp;#34;&amp;gt;&amp;lt;/video&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/09/video_marp.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="un-exemple"&gt;Un exemple
&lt;/h2&gt;&lt;p&gt;Je ne vais pas continuer plus longtemps la liste des features de Marp, mais si vous voulez un exemple, j’ai mis à disposition le code Markdown ma conférence « Ciel ! Mon Kubernetes mine des Bitcoins ! »&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/zwindler/cloudnord-2021-ciel-mon-kube-mine-bitcoins" target="_blank" rel="noopener"
&gt;Le dépôt git avec le code Markdown et les binaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/talks/2022-ciel-kubernetes-mine-bitcoins/index.html" &gt;Le support généré en HTML5 par Marp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Have fun !&lt;/p&gt;</description></item></channel></rss>