<?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 kenji.blog</title><link>http://kenji.blog/fr/tags/markdown/</link><description>Recent content in Markdown on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>kenjinote</copyright><lastBuildDate>Sun, 13 Sep 2026 02:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/fr/tags/markdown/index.xml" rel="self" type="application/rss+xml"/><item><title>Introduction à Hugo en tant que générateur de site statique (guide de migration depuis WordPress)</title><link>http://kenji.blog/fr/p/hugo-static-site-generator-wordpress-migration/</link><pubDate>Sun, 13 Sep 2026 02:00:00 +0900</pubDate><guid>http://kenji.blog/fr/p/hugo-static-site-generator-wordpress-migration/</guid><description>&lt;img src="http://kenji.blog/p/hugo-static-site-generator-wordpress-migration/img/eyecatch.jpg" alt="Featured image of post Introduction à Hugo en tant que générateur de site statique (guide de migration depuis WordPress)" />&lt;p>Dans le développement web moderne et la gestion de blogs, la vitesse d&amp;rsquo;affichage, la sécurité et la maintenabilité d&amp;rsquo;un site sont des éléments cruciaux. Longtemps leader incontesté en tant que fondation pour les blogs et les sites d&amp;rsquo;entreprise, &amp;ldquo;WordPress&amp;rdquo; est utilisé par de nombreux utilisateurs grâce à son écosystème de plugins flexible et son interface d&amp;rsquo;administration intuitive. Cependant, parce qu&amp;rsquo;il implique une communication avec une base de données et la génération dynamique de pages côté serveur (traitement via PHP), il présente également des vulnérabilités face aux pics de trafic et des problèmes de latence (retards d&amp;rsquo;affichage).&lt;/p>
&lt;p>C&amp;rsquo;est pourquoi les &amp;ldquo;Générateurs de Sites Statiques (SSG: Static Site Generator)&amp;rdquo; connaissent une diffusion rapide ces dernières années. Dans cet article, nous allons nous pencher sur &amp;ldquo;&lt;strong>Hugo&lt;/strong>&amp;rdquo;, un SSG développé en langage Go et connu pour sa vitesse de compilation (build) impressionnante, parmi de nombreux autres SSG. Nous l&amp;rsquo;expliquerons en détail, de la comparaison de son architecture technique avec les CMS dynamiques (Content Management System) tels que WordPress, aux procédures de migration concrètes, en passant par une évaluation des performances à l&amp;rsquo;aide de modèles mathématiques, ainsi que la structure des répertoires et l&amp;rsquo;ordre de recherche des modèles (templates) spécifiques à Hugo.&lt;/p>
&lt;hr>
&lt;h2 id="1-différences-techniques-entre-un-cms-dynamique-wordpress-et-un-générateur-de-site-statique-hugo">1. Différences techniques entre un CMS dynamique (WordPress) et un générateur de site statique (Hugo)
&lt;/h2>&lt;p>Dans la façon dont ils distribuent un site web, WordPress et Hugo adoptent des approches fondamentalement différentes.&lt;/p>
&lt;h3 id="11-architecture-de-wordpress-génération-dynamique">1.1 Architecture de WordPress (Génération dynamique)
&lt;/h3>&lt;p>WordPress est un représentant typique des CMS dynamiques qui construisent la page côté serveur à chaque requête. Lorsqu&amp;rsquo;un utilisateur (navigateur) accède à une page, le serveur web (Apache, Nginx, etc.) exécute des scripts PHP et envoie une requête à une base de données relationnelle telle que MySQL (ou MariaDB). Il combine le contenu récupéré de la base de données (données d&amp;rsquo;articles, catégories, tags, paramètres du site, etc.) avec des fichiers de modèles (templates) pour générer le code HTML final et le renvoyer au client.&lt;/p>
&lt;p>Bien que ce système ait l&amp;rsquo;avantage de pouvoir générer en temps réel un contenu différent pour chaque visiteur (ex : panier d&amp;rsquo;un site e-commerce, page dédiée aux utilisateurs connectés), il consomme énormément de ressources serveur, à moins qu&amp;rsquo;un mécanisme de cache (reverse proxy, plugins, etc.) ne soit correctement configuré.&lt;/p>
&lt;h3 id="12-architecture-de-hugo-génération-préalable-à-la-compilation">1.2 Architecture de Hugo (Génération préalable à la compilation)
&lt;/h3>&lt;p>D&amp;rsquo;autre part, comme son nom de &amp;ldquo;générateur de site statique&amp;rdquo; l&amp;rsquo;indique, Hugo effectue la génération du contenu au moment de la &amp;ldquo;compilation (build)&amp;rdquo; et non au moment de la &amp;ldquo;requête&amp;rdquo;. Le contenu n&amp;rsquo;est pas conservé dans une base de données, mais sous forme de &amp;ldquo;fichiers Markdown&amp;rdquo; locaux dont les versions sont gérées via Git, etc.
Lorsque le développeur exécute la commande (&lt;code>hugo&lt;/code>), Hugo lit les fichiers Markdown, injecte les données dans les modèles HTML spécifiés (fichiers de layout) et génère un ensemble de fichiers HTML/CSS/JS purs et complets.&lt;/p>
&lt;p>L&amp;rsquo;ensemble des fichiers générés (assets statiques) peut être distribué simplement en le plaçant sur un &amp;ldquo;environnement d&amp;rsquo;hébergement statique&amp;rdquo; tel qu&amp;rsquo;Amazon S3, Cloudflare Pages, Netlify, Vercel, ou un simple serveur Nginx. Puisqu&amp;rsquo;il ne nécessite ni base de données ni langage côté serveur (comme PHP), les risques de sécurité (injections SQL, vulnérabilités PHP, etc.) sont drastiquement réduits, et la vitesse de distribution est maximisée en étant mise en cache sur les nœuds périphériques (edge nodes) d&amp;rsquo;un CDN (Content Delivery Network).&lt;/p>
&lt;p>Les schémas Mermaid ci-dessous illustrent les différences entre chaque architecture.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
subgraph WordPress[&amp;#34;CMS Dynamique (WordPress)&amp;#34;]
direction TB
Req1[&amp;#34;Requête de l&amp;#39;utilisateur&amp;#34;] --&amp;gt; WebServer1[&amp;#34;Serveur Web (Nginx/Apache)&amp;#34;]
WebServer1 --&amp;gt; PHP[&amp;#34;Interpréteur PHP&amp;#34;]
PHP &amp;lt;--&amp;gt; DB[&amp;#34;Base de données (MySQL)&amp;#34;]
PHP --&amp;gt; HTML1[&amp;#34;Génération HTML&amp;#34;]
HTML1 --&amp;gt; Res1[&amp;#34;Renvoi de la réponse&amp;#34;]
end
subgraph Hugo[&amp;#34;Générateur de site statique (Hugo)&amp;#34;]
direction TB
Dev[&amp;#34;Développeur / CI・CD&amp;#34;] --&amp;gt; HugoBuild[&amp;#34;Processus de compilation Hugo&amp;#34;]
Markdown[&amp;#34;Fichiers Markdown&amp;#34;] --&amp;gt; HugoBuild
Templates[&amp;#34;Modèles (HTML)&amp;#34;] --&amp;gt; HugoBuild
HugoBuild --&amp;gt; StaticFiles[&amp;#34;Fichiers statiques (HTML/CSS/JS)&amp;#34;]
StaticFiles --&amp;gt; CDN[&amp;#34;CDN / Hébergement statique&amp;#34;]
Req2[&amp;#34;Requête de l&amp;#39;utilisateur&amp;#34;] --&amp;gt; CDN
CDN --&amp;gt; Res2[&amp;#34;Renvoi de réponse instantanée&amp;#34;]
end
&lt;/pre>
&lt;hr>
&lt;h2 id="2-évaluation-des-performances-par-des-modèles-mathématiques">2. Évaluation des performances par des modèles mathématiques
&lt;/h2>&lt;p>L&amp;rsquo;un des plus grands avantages de la migration de WordPress vers Hugo est l&amp;rsquo;amélioration des performances (vitesse d&amp;rsquo;affichage). Pour comprendre cela quantitativement, exprimons-le avec un modèle mathématique simple.&lt;/p>
&lt;p>Le temps jusqu&amp;rsquo;à ce que le chargement de la page soit terminé (Load Time : $T_{load}$) est principalement divisé en temps de réponse du serveur (TTFB : Time To First Byte) et en temps de rendu/récupération des ressources par le navigateur ($T_{render}$).&lt;/p>
$$ T_{load} = T_{ttfb} + T_{render} $$&lt;p>Dans le cas d&amp;rsquo;un CMS dynamique (WordPress), le $T_{ttfb}$ est la somme des éléments suivants : latence du réseau ($T_{network}$), temps d&amp;rsquo;exécution des scripts côté serveur ($T_{php}$) et temps de traitement des requêtes de la base de données ($T_{db}$).&lt;/p>
$$ T_{ttfb\_wp} = T_{network} + T_{php} + T_{db} $$&lt;p>Dans un état où les accès sont concentrés (forte charge), $T_{php}$ et $T_{db}$ augmentent de manière non linéaire, et le système dans son ensemble peut devenir un goulot d&amp;rsquo;étranglement. Exprimé sous forme de formule, par rapport au nombre de requêtes ($N$), on observe la détérioration du temps de réponse suivante ($k$ est le coefficient de surcharge de traitement).&lt;/p>
$$ T_{php}(N) \approx O(N^k), \quad T_{db}(N) \approx O(N^k) \quad \text{where } k > 1 $$&lt;p>D&amp;rsquo;autre part, dans une architecture combinant un générateur de site statique (Hugo) et un CDN, il n&amp;rsquo;y a pas de traitement dynamique côté serveur (PHP ou requêtes DB). Comme le contenu est mis en cache sur des serveurs périphériques (edge servers) répartis dans le monde entier, le $T_{ttfb}$ dépend purement et uniquement de la latence du réseau du client jusqu&amp;rsquo;au serveur périphérique le plus proche ($T_{edge}$).&lt;/p>
$$ T_{ttfb\_hugo} = T_{edge} $$&lt;p>Par conséquent, $T_{edge} \ll (T_{network} + T_{php} + T_{db})$ se vérifie, et le TTFB est drastiquement réduit à quelques millisecondes à quelques dizaines de millisecondes. De plus, même si le nombre de requêtes $N$ augmente, le temps de réponse reste presque constant ($O(1)$) grâce à la fonction de répartition de charge (load balancing) des serveurs périphériques.&lt;/p>
$$ \lim_{N \to \infty} T_{ttfb\_hugo}(N) \approx \text{Constant} $$&lt;p>Ceci est la justification mathématique expliquant pourquoi Hugo (site statique) est extrêmement robuste face aux pics de trafic (par exemple, lors d&amp;rsquo;un buzz).&lt;/p>
&lt;hr>
&lt;h2 id="3-structure-de-base-et-principes-de-fonctionnement-de-hugo">3. Structure de base et principes de fonctionnement de Hugo
&lt;/h2>&lt;p>Pour maîtriser Hugo, il est essentiel de comprendre sa structure de répertoires unique et les concepts de &amp;ldquo;Front Matter&amp;rdquo; et de &amp;ldquo;Template Lookup Order&amp;rdquo; (Ordre de recherche des modèles).&lt;/p>
&lt;h3 id="31-explication-détaillée-de-la-structure-des-répertoires">3.1 Explication détaillée de la structure des répertoires
&lt;/h3>&lt;p>Lorsque vous créez un nouveau projet Hugo (&lt;code>hugo new site mysite&lt;/code>), la structure de répertoires suivante est générée.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">mysite/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── archetypes/ # Modèles (templates) lors de la création de nouveau contenu (modèles pour Front Matter)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── assets/ # Fichiers traités par Hugo Pipes (SCSS/Sass, JavaScript, etc.)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── content/ # Contenu réel du site (fichiers Markdown). Remplace la DB.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── data/ # Données externes et paramètres utilisés sur l&amp;#39;ensemble du site (JSON, TOML, YAML, CSV, etc.)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── layouts/ # Modèles HTML déterminant l&amp;#39;apparence du site (utilise Go html/template)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── public/ # Emplacement où les fichiers statiques générés sont placés après l&amp;#39;exécution de la commande de compilation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── static/ # Fichiers statiques publiés tels quels (images, favicon, fichiers texte pour robots, etc.)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── themes/ # Répertoire pour les thèmes tiers ou créés par soi-même
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── hugo.toml # Fichier de configuration de l&amp;#39;ensemble du site (auparavant config.toml était courant)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Dans WordPress, le contenu est stocké dans la table &lt;code>wp_posts&lt;/code> de MySQL, mais dans Hugo, il est entièrement géré en tant que fichiers texte (principalement Markdown) dans le répertoire &lt;code>content/&lt;/code>. Cela facilite la gestion des versions de contenu (Git).&lt;/p>
&lt;h3 id="32-gestion-de-contenu--markdown-et-front-matter">3.2 Gestion de contenu : Markdown et Front Matter
&lt;/h3>&lt;p>Chaque fichier d&amp;rsquo;article de Hugo possède un bloc de métadonnées appelé &amp;ldquo;Front Matter&amp;rdquo; tout en haut, suivi du corps du texte (Markdown) en dessous. Le Front Matter peut être écrit en TOML, YAML ou JSON, mais le YAML est largement utilisé.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Comprendre la taxonomie de Hugo&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="ld">2026-09-13T10:00:00&lt;/span>&lt;span class="m">+09&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">00&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">draft&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">false&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">categories&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;Explication technique&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">tags&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;Hugo&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;Go&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">aliases&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;/old-category/hugo-taxonomy/&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="l">Le texte commence ici. Il est écrit en **Markdown**.&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="l">Nous allons expliquer les fonctionnalités puissantes de Hugo...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Ce qu&amp;rsquo;il faut noter ici, c&amp;rsquo;est la clé &lt;code>aliases&lt;/code>. Lors d&amp;rsquo;une migration depuis WordPress, si le permalien (URL) change, cela a un impact négatif important sur le SEO. En utilisant la fonction d&amp;rsquo;alias de Hugo, il suffit de spécifier l&amp;rsquo;ancienne URL, et Hugo générera automatiquement un HTML de redirection (transfert via meta refresh). C&amp;rsquo;est très pratique car cela élimine le besoin de configurer des redirections côté serveur (comme .htaccess).&lt;/p>
&lt;h3 id="33-ordre-de-recherche-des-modèles-template-lookup-order">3.3 Ordre de recherche des modèles (Template Lookup Order)
&lt;/h3>&lt;p>L&amp;rsquo;une des fonctionnalités puissantes de Hugo est son mécanisme de recherche de modèles flexible (Template Lookup Order). Lors du rendu d&amp;rsquo;une page spécifique, Hugo recherche les répertoires et les noms de fichiers dans un ordre spécifique pour trouver le meilleur modèle.&lt;/p>
&lt;p>Par exemple, pour afficher un article unique (Single Page) appelé &lt;code>content/post/hello-world.md&lt;/code>, Hugo cherchera généralement un fichier de layout dans l&amp;rsquo;ordre suivant :&lt;/p>
&lt;ol>
&lt;li>&lt;code>layouts/post/single.html&lt;/code>&lt;/li>
&lt;li>&lt;code>layouts/post/list.html&lt;/code> (Ce n&amp;rsquo;est pas une erreur, mais généralement utilisé pour les listes)&lt;/li>
&lt;li>&lt;code>layouts/_default/single.html&lt;/code>&lt;/li>
&lt;li>&lt;code>themes/&amp;lt;THEME_NAME&amp;gt;/layouts/post/single.html&lt;/code>&lt;/li>
&lt;li>&lt;code>themes/&amp;lt;THEME_NAME&amp;gt;/layouts/_default/single.html&lt;/code>&lt;/li>
&lt;/ol>
&lt;p>Les développeurs peuvent &lt;strong>écraser (overrider)&lt;/strong> les modèles du thème en créant simplement un fichier du même nom dans le répertoire &lt;code>layouts/&lt;/code> de leur propre projet, sans modifier directement le code source du thème. Cela permet d&amp;rsquo;appliquer ses propres personnalisations sans bloquer les mises à jour du thème de base.&lt;/p>
&lt;h3 id="34-taxonomie-taxonomy">3.4 Taxonomie (Taxonomy)
&lt;/h3>&lt;p>Dans Hugo, le système de classification équivalent aux &amp;ldquo;catégories&amp;rdquo; et &amp;ldquo;tags&amp;rdquo; de WordPress est appelé &amp;ldquo;Taxonomie (Taxonomy)&amp;rdquo;.
Hugo prend en charge par défaut les taxonomies &lt;code>categories&lt;/code> et &lt;code>tags&lt;/code>, mais en éditant &lt;code>hugo.toml&lt;/code>, vous pouvez ajouter librement des taxonomies personnalisées (ex : &lt;code>series&lt;/code>, &lt;code>authors&lt;/code>, etc.).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-toml" data-lang="toml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Exemple de hugo.toml&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">taxonomies&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">category&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;categories&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">tag&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;tags&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">series&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;series&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">author&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;authors&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Cela permet d&amp;rsquo;organiser et de lister le contenu selon divers axes.&lt;/p>
&lt;hr>
&lt;h2 id="4-processus-de-migration-de-wordpress-vers-hugo">4. Processus de migration de WordPress vers Hugo
&lt;/h2>&lt;p>La clé du succès d&amp;rsquo;une migration de WordPress vers Hugo est la manière de convertir proprement le contenu dynamique de la base de données en fichiers statiques (Markdown + Front Matter) tout en maintenant la structure des URL existantes.&lt;/p>
&lt;p>Voici le flux de travail d&amp;rsquo;un pipeline de migration typique.&lt;/p>
&lt;pre class="mermaid">
flowchart LR
WPDB[&amp;#34;Base de données WP&amp;#34;] --&amp;gt;|Plugin| Exporter[&amp;#34;Outil d&amp;#39;exportation&amp;#34;]
Exporter --&amp;gt;| Extrait Texte, \nMéta, Images | ZipFile[&amp;#34;Fichier Zip / Dossier&amp;#34;]
ZipFile --&amp;gt;|Décompression| MarkdownFiles[&amp;#34;Fichiers Markdown \n(content/)&amp;#34;]
ZipFile --&amp;gt;|Décompression| ImageFiles[&amp;#34;Images \n(static/wp-content/)&amp;#34;]
MarkdownFiles --&amp;gt; Formatting[&amp;#34;Vérification et Formatage \n(Correction des Shortcodes)&amp;#34;]
Formatting --&amp;gt; Git[&amp;#34;Commit vers Git&amp;#34;]
&lt;/pre>
&lt;h3 id="41-extraction-des-données-et-conversion-en-markdown">4.1 Extraction des données et conversion en Markdown
&lt;/h3>&lt;p>Pour exporter les données WordPress pour Hugo, l&amp;rsquo;utilisation d&amp;rsquo;un plugin dédié est la méthode la plus simple et la plus fiable. Voici quelques approches représentatives.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Utilisation du plugin Jekyll Exporter&lt;/strong>
Comme Hugo a une structure de données très similaire à celle de Jekyll, un autre SSG, l&amp;rsquo;utilisation du plugin &amp;ldquo;Jekyll Exporter&amp;rdquo; pour WordPress est une méthode courante. En installant et en exécutant ce plugin, toutes vos publications et pages statiques seront converties en fichiers Markdown avec Front Matter et pourront être téléchargées sous forme de fichier ZIP avec vos fichiers d&amp;rsquo;images.&lt;/li>
&lt;li>&lt;strong>Scripts personnalisés utilisant l&amp;rsquo;API WordPress&lt;/strong>
Il s&amp;rsquo;agit de la méthode consistant à créer un script (par exemple en Python ou Node.js) qui interroge l&amp;rsquo;API REST de WordPress (&lt;code>/wp-json/wp/v2/posts&lt;/code>), analyse les données JSON et génère des fichiers Markdown par vous-même. Ceci est efficace pour les sites qui utilisent intensivement des champs personnalisés complexes (comme ACF) qui ne peuvent pas être entièrement gérés par des plugins.&lt;/li>
&lt;li>&lt;strong>Utilisation de l&amp;rsquo;outil wp2hugo&lt;/strong>
Il existe également une approche qui consiste à utiliser un outil CLI écrit en langage Go, par exemple, pour convertir directement le fichier XML d&amp;rsquo;exportation de WordPress (WXR) au format Hugo.&lt;/li>
&lt;/ol>
&lt;h3 id="42-maintien-de-la-structure-des-permaliens-url">4.2 Maintien de la structure des permaliens (URL)
&lt;/h3>&lt;p>Pour conserver les acquis SEO, il est extrêmement important de conserver l&amp;rsquo;URL de l&amp;rsquo;époque WordPress telle quelle. Si vous aviez configuré des permaliens tels que &lt;code>https://example.com/2026/09/13/my-post/&lt;/code> dans WordPress, vous devez spécifier la structure du permalien dans le &lt;code>hugo.toml&lt;/code> de Hugo.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-toml" data-lang="toml">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">permalinks&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">post&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;/:year/:month/:day/:slug/&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Alternativement, il est également possible de force une URL fixe pour chaque article en spécifiant directement le paramètre &lt;code>url&lt;/code> dans le Front Matter.
De plus, pour les pages dont les URL changent, utilisez &lt;code>aliases&lt;/code> comme mentionné précédemment pour configurer des redirections.&lt;/p>
&lt;h3 id="43-conversion-des-shortcodes">4.3 Conversion des shortcodes
&lt;/h3>&lt;p>Les shortcodes spécifiques à WordPress (ex : &lt;code>[gallery]&lt;/code>, &lt;code>[caption]&lt;/code>, et codes propres à divers plugins) restent souvent sous forme de chaînes de caractères brutes lors de l&amp;rsquo;exportation et nécessitent donc une attention particulière.
Celles-ci peuvent être soit supprimées en masse à l&amp;rsquo;aide de scripts de remplacement (sed ou Python), soit migrées pour être correctement rendues du côté de Hugo en utilisant la puissante &lt;strong>fonctionnalité de shortcodes personnalisés&lt;/strong> de Hugo (en créant un layout personnalisé dans &lt;code>layouts/shortcodes/&lt;/code>).&lt;/p>
&lt;hr>
&lt;h2 id="5-outil-cli-de-hugo-compilation-et-déploiement">5. Outil CLI de Hugo, Compilation et Déploiement
&lt;/h2>&lt;p>Une fois la migration terminée, il est temps de compiler (build) le site avec Hugo et de le publier dans le monde entier. Hugo, fourni sous forme de binaire du langage Go, offre une vitesse incroyable, compilant un site de plusieurs milliers ou dizaines de milliers de pages en seulement quelques secondes.&lt;/p>
&lt;h3 id="51-démarrage-du-serveur-de-développement-local">5.1 Démarrage du serveur de développement local
&lt;/h3>&lt;p>Lors de la rédaction d&amp;rsquo;articles ou de l&amp;rsquo;ajustement du design, démarrez le serveur local.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Commande pour démarrer le serveur de développement (utilisez -D pour inclure les articles brouillons)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hugo server -D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>En exécutant cette commande, vous pouvez prévisualiser le site sur &lt;code>http://localhost:1313/&lt;/code>. Hugo possède une puissante fonctionnalité intégrée de &amp;ldquo;LiveReload&amp;rdquo;. Dès l&amp;rsquo;instant où vous modifiez et enregistrez un fichier Markdown, un modèle ou un fichier CSS, l&amp;rsquo;écran de votre navigateur est automatiquement et très rapidement mis à jour. Ainsi, l&amp;rsquo;expérience de rédaction et de développement est bien plus confortable que sur l&amp;rsquo;écran d&amp;rsquo;administration de WordPress.&lt;/p>
&lt;h3 id="52-compilation-pour-la-production-et-optimisation-des-performances">5.2 Compilation pour la production et optimisation des performances
&lt;/h3>&lt;p>Pour générer des fichiers statiques à déployer en environnement de production, tapez simplement &lt;code>hugo&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Exécution de la compilation pour la production. L&amp;#39;option --minify minimise HTML/CSS/JS&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hugo --minify
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Grâce à cette commande, les fichiers de l&amp;rsquo;ensemble du site sont exportés vers le répertoire &lt;code>public/&lt;/code>. En ajoutant l&amp;rsquo;option &lt;code>--minify&lt;/code>, les sauts de ligne et espaces inutiles sont supprimés, réduisant encore davantage la taille des fichiers. Cela contribue directement à la réduction de la latence du réseau ($T_{network}$) dans le modèle mathématique mentionné précédemment.&lt;/p>
&lt;h3 id="53-automatisation-du-déploiement-cicd">5.3 Automatisation du déploiement (CI/CD)
&lt;/h3>&lt;p>Générer des fichiers statiques sur votre PC local à chaque fois et les télécharger via FTP, etc., est inefficace. Dans l&amp;rsquo;exploitation moderne des SSG, la meilleure pratique consiste à créer un environnement CI/CD qui compile et déploie automatiquement en utilisant un push vers un dépôt Git (GitHub, etc.) comme déclencheur.&lt;/p>
&lt;p>Par exemple, la forme de base d&amp;rsquo;une configuration (fichier YAML) pour déployer sur Cloudflare Pages ou GitHub Pages en utilisant GitHub Actions est la suivante :&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Exemple de .github/workflows/hugo.yml&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Déployer le site Hugo vers GitHub Pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">push&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">branches&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;main&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">workflow_dispatch&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">permissions&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">contents&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">read&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">pages&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">write&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">id-token&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">write&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">build&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ubuntu-latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Checkout&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/checkout@v3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">submodules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">recursive&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># Si vous gérez les thèmes avec des sous-modules&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">fetch-depth&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Setup Hugo&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">peaceiris/actions-hugo@v2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">hugo-version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;latest&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">extended&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Build&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">hugo --minify&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Upload artifact&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/upload-pages-artifact@v2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">path&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">./public&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">deploy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">environment&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">github-pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ steps.deployment.outputs.page_url }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ubuntu-latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">needs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">build&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Deploy to GitHub Pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">deployment&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/deploy-pages@v2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>En configurant ainsi, la simple action de &amp;ldquo;rédiger un article en Markdown et de le pousser (Push) vers GitHub&amp;rdquo; complète un pipeline automatisé où le site mis à jour est publié en environnement de production en quelques minutes.&lt;/p>
&lt;hr>
&lt;h2 id="6-le-seo-après-la-migration-et-les-avantages-opérationnels">6. Le SEO après la migration et les avantages opérationnels
&lt;/h2>&lt;p>Les administrateurs de site qui ont achevé la migration de WordPress vers Hugo ressentent souvent les 3 avantages notables suivants.&lt;/p>
&lt;h3 id="61-amélioration-spectaculaire-de-la-vitesse-du-site-et-des-core-web-vitals">6.1 Amélioration spectaculaire de la vitesse du site et des Core Web Vitals
&lt;/h3>&lt;p>Les requêtes de base de données et le rendu côté serveur étant éliminés, le temps de chargement de la page est réduit à l&amp;rsquo;ordre des millisecondes. Cela conduit directement à une amélioration significative des scores &amp;ldquo;Core Web Vitals&amp;rdquo; (LCP, FID/INP, CLS) qui sont des facteurs de classement pour Google. On peut s&amp;rsquo;attendre à une baisse du taux de rebond (bounce rate) des utilisateurs et à une amélioration du classement SEO.&lt;/p>
&lt;h3 id="62-libération-face-aux-menaces-de-sécurité">6.2 Libération face aux menaces de sécurité
&lt;/h3>&lt;p>Étant largement utilisé à travers le monde, WordPress est une cible constante d&amp;rsquo;attaques. Des risques persistent, tels que la falsification exploitant les vulnérabilités de plugins, ou la violation de l&amp;rsquo;écran de connexion par des attaques par force brute (brute-force).
Cependant, dans un site statique généré par Hugo, il n&amp;rsquo;y a pas de base de données, pas d&amp;rsquo;environnement PHP, et même pas d&amp;rsquo;interface d&amp;rsquo;administration (formulaire de connexion). Il n&amp;rsquo;y a aucune place pour qu&amp;rsquo;un pirate informatique s&amp;rsquo;introduise dans le serveur et réécrive la base de données, les risques de sécurité s&amp;rsquo;approchant au plus près de zéro.&lt;/p>
&lt;h3 id="63-une-exploitation-sans-maintenance">6.3 Une exploitation sans maintenance
&lt;/h3>&lt;p>L&amp;rsquo;utilisation de WordPress requiert des tâches de maintenance constantes : mise à jour du cœur du système, mise à jour des plugins, suivi des versions de PHP, etc. Vous devez constamment redouter le risque que votre site soit cassé en raison de problèmes de compatibilité.
Dans le cas de Hugo, il suffit de mettre à jour l&amp;rsquo;outil lui-même si nécessaire. Le code du site étant constitué d&amp;rsquo;ensembles de fichiers texte indépendants, cela offre un sentiment de tranquillité absolue : &amp;ldquo;même s&amp;rsquo;il est laissé tel quel, il ne se cassera pas&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="7-conclusion">7. Conclusion
&lt;/h2>&lt;p>Dans cet article, nous avons détaillé la migration d&amp;rsquo;un CMS dynamique tel que WordPress vers &amp;ldquo;Hugo&amp;rdquo;, un puissant générateur de site statique basé sur le langage Go, en couvrant les différences d&amp;rsquo;architecture technique, la preuve de performance via des modèles mathématiques, ainsi que les étapes concrètes de la migration.&lt;/p>
&lt;p>Bien que la migration vers un générateur de site statique nécessite un coût d&amp;rsquo;apprentissage initial (utilisation de Git, syntaxe Markdown, exécution de commandes CLI depuis un terminal, compréhension des spécifications du moteur de templates, etc.), elle offre en retour une &amp;ldquo;vitesse d&amp;rsquo;affichage écrasante&amp;rdquo;, une &amp;ldquo;sécurité robuste&amp;rdquo; et un état &amp;ldquo;sans maintenance&amp;rdquo; qui compensent largement cet effort.&lt;/p>
&lt;p>Si votre site web ne nécessite pas de changements fréquents de design ou de traitements dynamiques complexes (tels que des fonctionnalités réservées aux membres ou des fonctions e-commerce avancées) et que son objectif principal est la diffusion d&amp;rsquo;informations (blog, média, site d&amp;rsquo;entreprise), la migration vers Hugo constituera l&amp;rsquo;un des investissements techniques les plus efficaces. N&amp;rsquo;hésitez pas à faire de cet article votre point de départ vers la gestion de site web de nouvelle génération utilisant Hugo.&lt;/p></description></item><item><title>Blog technique écrit en Markdown : Paramètres d'éditeur pour doubler votre vitesse de rédaction</title><link>http://kenji.blog/fr/p/markdown-editor-setup-for-tech-blogs/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/fr/p/markdown-editor-setup-for-tech-blogs/</guid><description>&lt;img src="http://kenji.blog/p/markdown-editor-setup-for-tech-blogs/img/eyecatch.jpg" alt="Featured image of post Blog technique écrit en Markdown : Paramètres d'éditeur pour doubler votre vitesse de rédaction" />&lt;p>Pour écrire continuellement sur un blog technique, il est essentiel d&amp;rsquo;optimiser l&amp;rsquo;environnement de rédaction. Dans cet article, nous allons explorer en profondeur les paramètres d&amp;rsquo;éditeur avancés qui permettront d&amp;rsquo;améliorer de façon spectaculaire votre vitesse de rédaction de blogs techniques à l&amp;rsquo;aide de Markdown. Nous couvrirons tout de manière exhaustive : la personnalisation extrême de Visual Studio Code (VS Code) et Neovim, l&amp;rsquo;utilisation de snippets, l&amp;rsquo;introduction de textlint (un outil de vérification grammaticale), l&amp;rsquo;automatisation dans le pipeline CI/CD, et enfin les techniques de rédaction de pointe utilisant des LLM comme GitHub Copilot.&lt;/p>
&lt;h2 id="1-modèle-mathématique-de-lamélioration-de-la-vitesse-de-rédaction">1. Modèle mathématique de l&amp;rsquo;amélioration de la vitesse de rédaction
&lt;/h2>&lt;p>Commençons par modéliser l&amp;rsquo;impact de l&amp;rsquo;optimisation des paramètres de l&amp;rsquo;éditeur sur le temps de rédaction avec une formule mathématique simple. Soit $T_{total}$ le temps de saisie total pour écrire un article de blog.&lt;/p>
$$
T_{total} = T_{think} + T_{type} + T_{format} + T_{review}
$$&lt;p>Ici, $T_{think}$ est le temps de réflexion, $T_{type}$ est le temps de frappe, $T_{format}$ est le temps de formatage (pour Markdown, etc.), et $T_{review}$ est le temps de relecture et de correction.&lt;/p>
&lt;p>Le temps économisé $T_{saved}$ grâce à la personnalisation de l&amp;rsquo;éditeur (comme l&amp;rsquo;introduction de snippets ou la configuration de Linter) peut être exprimé comme suit, en utilisant le nombre d&amp;rsquo;occurrences $N$ d&amp;rsquo;un modèle spécifique (par exemple, un shortcode Hugo ou un tableau Markdown), le temps requis pour une saisie manuelle $t_{manual}$, et le temps pris par l&amp;rsquo;automatisation via des snippets $t_{snippet}$.&lt;/p>
$$
T_{saved} = \sum_{i=1}^{k} N_i \times (t_{manual, i} - t_{snippet, i}) + T_{review\_saved}
$$&lt;p>De plus, l&amp;rsquo;introduction d&amp;rsquo;outils de formatage automatique et de Linting réduit considérablement le temps de vérification visuelle humaine $T_{review}$. La maximisation de ce $T_{saved}$ est le but même de cet article.&lt;/p>
&lt;h2 id="2-la-meilleure-configuration-pour-visual-studio-code-vs-code">2. La meilleure configuration pour Visual Studio Code (VS Code)
&lt;/h2>&lt;p>VS Code est actuellement l&amp;rsquo;un des éditeurs les plus populaires et dispose d&amp;rsquo;un puissant écosystème d&amp;rsquo;extensions pour l&amp;rsquo;écriture en Markdown.&lt;/p>
&lt;h3 id="extensions-recommandées">Extensions recommandées
&lt;/h3>&lt;p>Pour accélérer la rédaction, nous recommandons fortement d&amp;rsquo;installer les extensions suivantes.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Markdown All in One&lt;/strong> : Il dispose de toutes les fonctionnalités de base nécessaires à la rédaction en Markdown, telles que le gras/italique avec des raccourcis clavier, la continuation automatique des listes, et la génération automatique d&amp;rsquo;une table des matières (TOC).&lt;/li>
&lt;li>&lt;strong>markdownlint&lt;/strong> : Il vous avertit en temps réel des erreurs de syntaxe Markdown et des violations de style.&lt;/li>
&lt;li>&lt;strong>vscode-textlint&lt;/strong> : Il applique un ensemble de règles destinées aux documents techniques pour éviter les incohérences de notation et les erreurs grammaticales.&lt;/li>
&lt;/ol>
&lt;h3 id="configuration-de-snippets-personnalisés-pour-hugo-markdownjson">Configuration de snippets personnalisés pour Hugo (&lt;code>markdown.json&lt;/code>)
&lt;/h3>&lt;p>Si vous utilisez un générateur de site statique comme Hugo ou Docusaurus pour votre blog technique, vous devrez fréquemment saisir le Frontmatter ou des shortcodes spécifiques. En utilisant la fonctionnalité de snippet de VS Code, vous pouvez les développer instantanément.&lt;/p>
&lt;p>Sélectionnez &lt;code>Preferences: Configure User Snippets&lt;/code> dans la palette de commandes et ajoutez la configuration suivante à &lt;code>markdown.json&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;Hugo Frontmatter&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;prefix&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;frontmatter&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;body&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;---&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;title: \&amp;#34;${1:Titre}\&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;slug: \&amp;#34;${2:slug-name}\&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;date: \&amp;#34;$CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE T$CURRENT_HOUR:$CURRENT_MINUTE:$CURRENT_SECOND+09:00\&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;image: \&amp;#34;img/eyecatch.jpg\&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;math: true&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;mermaid: true&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;categories: [\&amp;#34;${3:Catégorie}\&amp;#34;]&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;tags: [\&amp;#34;${4:Tag1}\&amp;#34;, \&amp;#34;${5:Tag2}\&amp;#34;]&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;---&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;${0}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;description&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Développe le YAML Frontmatter pour Hugo&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;Hugo Figure Shortcode&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;prefix&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;hfig&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;body&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;{{&amp;lt; figure src=\&amp;#34;${1:image.jpg}\&amp;#34; title=\&amp;#34;${2:Titre de l&amp;#39;image}\&amp;#34; &amp;gt;}}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;description&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Shortcode Figure de Hugo&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;Markdown Table&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;prefix&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;mtable&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;body&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;| ${1:En-tête 1} | ${2:En-tête 2} | ${3:En-tête 3} |&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;| :--- | :---: | ---: |&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;| ${4:Ligne 1} | ${5:Données} | ${6:Données} |&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;| ${7:Ligne 2} | ${8:Données} | ${9:Données} |&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;$0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;description&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Génère un tableau Markdown à 3 colonnes&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Avec cette configuration, il suffit de taper &lt;code>frontmatter&lt;/code> et d&amp;rsquo;appuyer sur la touche Tab pour déployer instantanément le YAML Frontmatter incluant l&amp;rsquo;heure actuelle, augmentant ainsi considérablement la vitesse initiale de rédaction.&lt;/p>
&lt;h3 id="assistance-à-la-rédaction-grâce-à-github-copilot">Assistance à la rédaction grâce à GitHub Copilot
&lt;/h3>&lt;p>Lorsque GitHub Copilot est activé dans VS Code, la complétion par l&amp;rsquo;IA basée sur le contexte fonctionne également en Markdown. Particulièrement pour les blogs techniques, l&amp;rsquo;IA anticipe et suggère &amp;ldquo;la prochaine structure à expliquer&amp;rdquo; ou &amp;ldquo;les blocs de code associés&amp;rdquo;, ce qui permet de réduire considérablement le temps de frappe $T_{type}$.&lt;/p>
&lt;h2 id="3-personnalisation-extrême-dans-neovim">3. Personnalisation extrême dans Neovim
&lt;/h2>&lt;p>L&amp;rsquo;interface graphique de VS Code est excellente, mais pour les amateurs de terminal et les Vimmers, Neovim est le choix ultime pour tout accomplir sans jamais retirer les mains du clavier.&lt;/p>
&lt;h3 id="architecture-lsp-de-neovim">Architecture LSP de Neovim
&lt;/h3>&lt;p>L&amp;rsquo;architecture du LSP (Language Server Protocol) et du Linter de Neovim dans un environnement Markdown est la suivante.&lt;/p>
&lt;pre class="mermaid">
classDiagram
class Neovim {
+&amp;#34;Tampon de texte&amp;#34;
+&amp;#34;Raccourcis clavier&amp;#34;
}
class nvim_lspconfig {
+&amp;#34;marksman (LSP Markdown)&amp;#34;
}
class null_ls_or_none_ls {
+&amp;#34;markdownlint&amp;#34;
+&amp;#34;textlint&amp;#34;
}
class LuaSnip {
+&amp;#34;Snippets dynamiques&amp;#34;
}
class CMP {
+&amp;#34;Moteur d&amp;#39;auto-complétion&amp;#34;
}
Neovim --&amp;gt; nvim_lspconfig : &amp;#34;Fournit des fonctionnalités sémantiques&amp;#34;
Neovim --&amp;gt; null_ls_or_none_ls : &amp;#34;Diagnostics et formatage&amp;#34;
Neovim --&amp;gt; CMP : &amp;#34;Requête de complétion&amp;#34;
CMP --&amp;gt; nvim_lspconfig : &amp;#34;Source LSP&amp;#34;
CMP --&amp;gt; LuaSnip : &amp;#34;Source de snippet&amp;#34;
&lt;/pre>
&lt;h3 id="développement-de-snippets-avancés-avec-luasnip">Développement de snippets avancés avec LuaSnip
&lt;/h3>&lt;p>Plus puissant encore que les snippets JSON de VS Code, il y a le plugin Neovim &lt;code>LuaSnip&lt;/code>. En utilisant la logique de Lua, vous pouvez calculer et déployer dynamiquement le contenu des snippets.&lt;/p>
&lt;p>Voici un exemple de configuration LuaSnip qui récupère dynamiquement la date et l&amp;rsquo;heure actuelles (JST) et développe le Frontmatter de Hugo.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-lua" data-lang="lua">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">local&lt;/span> &lt;span class="n">ls&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;luasnip&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">local&lt;/span> &lt;span class="n">s&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ls.snippet&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">local&lt;/span> &lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ls.text_node&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">local&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ls.insert_node&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">local&lt;/span> &lt;span class="n">f&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ls.function_node&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- Fonction pour obtenir l&amp;#39;heure actuelle JST&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">local&lt;/span> &lt;span class="kr">function&lt;/span> &lt;span class="nf">get_current_date_jst&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span> &lt;span class="n">os.date&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;!%Y-%m-%dT%H:%M:%S&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">..&lt;/span> &lt;span class="s2">&amp;#34;+09:00&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">end&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ls.add_snippets&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;markdown&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">s&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;frontmatter&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;---&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;title: &lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Titre&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;slug: &lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;nom-du-slug&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;date: &lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kr">function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="kr">return&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="n">get_current_date_jst&lt;/span>&lt;span class="p">()}&lt;/span> &lt;span class="kr">end&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{}),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;image: &lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">img/eyecatch.jpg&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;math: true&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;mermaid: true&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;categories: [&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Catégorie&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">]&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;tags: [&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Tag&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">]&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;---&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">s&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;mtable&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;| &amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;En-tête 1&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34; | &amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;En-tête 2&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34; |&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;|---|---|&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;| &amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Cellule 1&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34; | &amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Cellule 2&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34; |&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Ainsi, en exploitant la puissance d&amp;rsquo;un langage de programmation (Lua), vous pouvez créer des snippets complexes qui ne se contentent pas de chaînes de caractères fixes, mais intègrent des valeurs de retour de fonctions ou ajustent dynamiquement le nombre de colonnes d&amp;rsquo;un tableau en fonction du nombre de caractères saisis.&lt;/p>
&lt;h2 id="4-analyse-statique-textlint-et-expressions-régulières-pour-allier-qualité-et-rapidité-de-rédaction">4. Analyse statique (textlint et expressions régulières) pour allier qualité et rapidité de rédaction
&lt;/h2>&lt;p>Pour garantir la qualité de votre blog, vous devez éviter les fautes de frappe et les incohérences de notation. Faire cela manuellement augmenterait de façon exponentielle $T_{review}$, c&amp;rsquo;est pourquoi nous introduisons l&amp;rsquo;analyse statique avec &lt;code>textlint&lt;/code>.&lt;/p>
&lt;h3 id="introduction-de-textlint-et-de-lensemble-de-règles">Introduction de textlint et de l&amp;rsquo;ensemble de règles
&lt;/h3>&lt;p>Installez textlint dans l&amp;rsquo;environnement Node.js.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm install -D textlint textlint-rule-preset-ja-technical-writing textlint-rule-prh textlint-filter-rule-comments
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Créez un fichier &lt;code>.textlintrc.json&lt;/code> à la racine de votre projet et configurez-le comme suit.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;filters&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;comments&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;rules&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;preset-ja-technical-writing&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;ja-no-mixed-period&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;periodMark&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;。&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;sentence-length&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;max&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">100&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;prh&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;rulePaths&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;./prh.yml&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Créez un fichier &lt;code>prh.yml&lt;/code> pour définir les incohérences de notation des termes techniques. Par exemple, uniformisez &amp;ldquo;serveur&amp;rdquo; et &amp;ldquo;Serveur&amp;rdquo;, ou &amp;ldquo;Javascript&amp;rdquo; et &amp;ldquo;JavaScript&amp;rdquo;.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">rules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">expected&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;JavaScript&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">pattern&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Javascript&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">expected&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;serveur&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">pattern&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Serveur&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">expected&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;interface&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">pattern&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Interface&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Grâce à cela, chaque fois que vous tapez du texte dans l&amp;rsquo;éditeur, vous êtes averti en temps réel des incohérences de notation, ce qui réduit le temps de correction à presque zéro.&lt;/p>
&lt;h3 id="remplacement-par-lots-et-modèles-structurés-à-laide-dexpressions-régulières">Remplacement par lots et modèles structurés à l&amp;rsquo;aide d&amp;rsquo;expressions régulières
&lt;/h3>&lt;p>Lors de la migration d&amp;rsquo;articles existants vers Markdown ou de l&amp;rsquo;importation de texte depuis l&amp;rsquo;extérieur, le remplacement par lots avec des expressions régulières est très pratique.&lt;/p>
&lt;p>Par exemple, l&amp;rsquo;expression régulière pour convertir la balise HTML &lt;code>&amp;lt;b&amp;gt;gras&amp;lt;/b&amp;gt;&lt;/code> en Markdown &lt;code>**gras**&lt;/code> :&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Modèle de recherche&lt;/strong> : &lt;code>&amp;lt;b&amp;gt;(.*?)&amp;lt;/b&amp;gt;&lt;/code>&lt;/li>
&lt;li>&lt;strong>Modèle de remplacement&lt;/strong> : &lt;code>**$1**&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Pour regrouper les sauts de ligne consécutifs inutiles en un seul :&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Modèle de recherche&lt;/strong> : &lt;code>\n{3,}&lt;/code>&lt;/li>
&lt;li>&lt;strong>Modèle de remplacement&lt;/strong> : &lt;code>\n\n&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>En exécutant ces commandes via la fonction de recherche et de remplacement de VS Code (en mode expression régulière) ou la commande &lt;code>%s&lt;/code> de Neovim (&lt;code>:%s/&amp;lt;b&amp;gt;\(.*?\)&amp;lt;\/b&amp;gt;/**\1**/g&lt;/code>), vous pouvez unifier le formatage en un instant.&lt;/p>
&lt;h3 id="vérification-automatique-par-pipeline-cicd">Vérification automatique par pipeline CI/CD
&lt;/h3>&lt;p>De plus, en utilisant GitHub Actions, nous pouvons construire un pipeline CI qui exécute automatiquement textlint lors du push d&amp;rsquo;un article de blog. Cela permet d&amp;rsquo;empêcher à l&amp;rsquo;avance le déploiement d&amp;rsquo;articles violant les règles.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;Auteur&amp;#34;] --&amp;gt;|Pousser les modifications| B[&amp;#34;Dépôt GitHub&amp;#34;]
B --&amp;gt; C{&amp;#34;Déclenchement des actions GitHub&amp;#34;}
C --&amp;gt; D[&amp;#34;Cloner le dépôt&amp;#34;]
D --&amp;gt; E[&amp;#34;Configurer Node.js&amp;#34;]
E --&amp;gt; F[&amp;#34;npm install&amp;#34;]
F --&amp;gt; G[&amp;#34;Exécuter textlint&amp;#34;]
G --&amp;gt;|Succès| H[&amp;#34;Construire le site Hugo&amp;#34;]
G --&amp;gt;|Échec| I[&amp;#34;Signaler l&amp;#39;erreur sur la PR/Commit&amp;#34;]
H --&amp;gt; J[&amp;#34;Déployer sur l&amp;#39;hébergement (Vercel/Netlify)&amp;#34;]
&lt;/pre>
&lt;h2 id="5-lart-décrire-en-markdown-à-lère-des-llm">5. L&amp;rsquo;art d&amp;rsquo;écrire en Markdown à l&amp;rsquo;ère des LLM
&lt;/h2>&lt;p>Dans la rédaction de blogs techniques modernes, l&amp;rsquo;utilisation de LLM (Large Language Models) est incontournable. En exploitant les outils d&amp;rsquo;IA intégrés à l&amp;rsquo;éditeur, la vitesse de rédaction peut être encore doublée.&lt;/p>
&lt;h3 id="ingénierie-des-prompts-prompt-engineering-dans-léditeur">Ingénierie des prompts (Prompt Engineering) dans l&amp;rsquo;éditeur
&lt;/h3>&lt;p>En utilisant GitHub Copilot Chat dans VS Code, ou &lt;code>ChatGPT.nvim&lt;/code> et &lt;code>Copilot.vim&lt;/code> dans Neovim, vous pouvez lancer des prompts comme celui-ci sans quitter votre éditeur :&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Crée un plan structuré en Markdown pour les débutants concernant les technologies suivantes : Docker, Kubernetes, CI/CD&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>Immédiatement, une structure Markdown avec des titres et des puces sera générée. Il ne nous reste plus qu&amp;rsquo;à étoffer cette structure.&lt;/p>
&lt;p>De plus, pour la rédaction de diagrammes Mermaid complexes ou de formules mathématiques (LaTeX), donner des instructions à l&amp;rsquo;IA permet de générer une syntaxe précise. Par exemple, la base de la mise en page des formules et diagrammes de cet article a également été accélérée grâce au pair-writing avec un LLM.&lt;/p>
&lt;h2 id="6-conclusion">6. Conclusion
&lt;/h2>&lt;p>Nous avons expliqué les paramètres d&amp;rsquo;éditeur qui permettent de doubler la vitesse d&amp;rsquo;écriture lors de la rédaction d&amp;rsquo;un blog technique en Markdown.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Prise de conscience du modèle mathématique&lt;/strong> : Éliminer les tâches répétitives pour maximiser $T_{saved}$.&lt;/li>
&lt;li>&lt;strong>Utilisation de VS Code&lt;/strong> : Gagner du temps de saisie avec les extensions et les snippets de &lt;code>markdown.json&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Personnalisation extrême de Neovim&lt;/strong> : Snippets dynamiques avec &lt;code>LuaSnip&lt;/code> et utilisation exclusive du clavier.&lt;/li>
&lt;li>&lt;strong>textlint et analyse statique&lt;/strong> : Intégration d&amp;rsquo;un Linter local et du CI/CD pour réduire le temps de correction à presque zéro.&lt;/li>
&lt;li>&lt;strong>Intégration des LLM&lt;/strong> : Laisser l&amp;rsquo;IA générer la structure Markdown et le code des diagrammes directement dans l&amp;rsquo;éditeur.&lt;/li>
&lt;/ol>
&lt;p>En intégrant ces paramètres à votre propre environnement, la &amp;ldquo;corvée&amp;rdquo; de l&amp;rsquo;écriture disparaîtra, et le volume ainsi que la qualité de votre production technique s&amp;rsquo;amélioreront de manière spectaculaire. Pourquoi ne pas commencer par enregistrer un simple petit snippet dès aujourd&amp;rsquo;hui ?&lt;/p></description></item></channel></rss>