Mise à jour du thème PaperMod
PaperMod est un sous-module Git (themes/PaperMod, source
github.com/adityatelange/hugo-PaperMod). Le site repose sur plusieurs
personnalisations qui peuvent casser silencieusement à chaque montée de version.
Ce document sert de checklist. Le dossier docs/ n’est pas publié par Hugo.
Procédure
cd themes/PaperMod
git fetch --tags
git checkout <tag> # ex. v8.0
cd ../..
git add themes/PaperMod
hugo --minify # rebuild local, lire les warningsParcourir la checklist ci-dessous avant de commiter. Committer le nouveau pointeur de sous-module et tout re-merge de partial dans le même commit.
1. Partials surchargés (layouts/_partials/)
| Fichier | Nature | À vérifier |
|---|---|---|
head.html | override partiel : seul le bloc <title> diffère du thème | Re-diff themes/PaperMod/layouts/_partials/head.html. Ne ré-appliquer que le bloc <title> (titres < 60 caractères, pas de suffixe de marque sur les articles). Détail dans docs/SEO.md. |
share_icons.html | override total | Re-diff themes/PaperMod/layouts/_partials/share_icons.html. Notre version impose l’ordre LinkedIn, e-mail, X, Reddit, Hacker News et retire Facebook / WhatsApp / Telegram. Récupérer tout nouveau réseau ou changement de markup / classe utile, puis ré-appliquer l’ordre et le bouton e-mail (icône enveloppe détourée à la main, règle evenodd). Le paramètre hugo.toml ShareButtons a été retiré : ne pas le réintroduire. |
extend_head.html | ajout (point d’extension officiel) | Rien à re-diff, mais vérifier que : le rendu Mermaid marche encore (classe pre.mermaid, bascule dark / light) ; les polices IBM Plex Sans / Mono se chargent toujours (bloc <link> Google Fonts en tête) ; le JSON-LD Person se pose toujours sur /about/ (condition .RelPermalink == "/about/", hasCredential à jour, site.Params.socialIcons toujours nommé ainsi pour sameAs). |
extend_post_content.html | ajout (hook officiel : single.html l’appelle après le corps, avant le footer) | Rien à re-diff. Vérifier que le hook existe toujours dans single.html du thème. Rend le mini-quiz (quiz.html, échappatoire hideQuiz), puis le bouton « utile ? » (feedback.html, échappatoire hideFeedback), puis l’encart auteur (échappatoire hideAuthorBox). |
extend_footer.html | override du stub vide du thème (appelé par footer.html) | Rien à re-diff. Appelle site_scripts.html, puis deux scripts : comportements du gabarit docs (repli de la colonne gauche mémorisé, filtre par titre + Entrée vers /search/, scrollspy du sommaire) et pré-remplissage de /search/ depuis ?q=. Ne pas conditionner sur .Section : footer.html passe par partialCached (clés .Layout .Kind), la sortie serait figée au premier rendu. Les scripts s’auto-neutralisent si leur cible est absente ; le bloc /search/ est sûr car .Layout est une clé de cache. |
doc_rail.html | ajout (appelé par doc_nav_shell.html, donc sur articles, pages-piliers, listes et pages de terme) | Rien à re-diff. Champ de filtre + liste des articles (série courante, puis les autres, sans doublon). Styles dans assets/css/extended/doc-layout.css. |
site_scripts.html | ajout (appelé par extend_footer.html, donc sur toutes les pages) | Rien à re-diff. Concatène fuse.basic.min.js (thème) + medium-zoom (vendu) + command-palette.js + zoom-init.js + feedback.js + contact-form.js + quiz.js en un bundle js/site.js, et rend le <dialog id="cmdk"> de la palette. Chaque script s’auto-neutralise si sa cible est absente de la page. Vérifier après montée de version que resources.Get "js/fuse.basic.min.js" résout toujours (chemin du thème). |
feedback.html | ajout (appelé par extend_post_content.html) | Rien à re-diff. Bouton « cet article vous a été utile ? ». Destination des votes : [params.feedback].web3formsKey ou .endpoint. Comportement : assets/js/feedback.js. |
callout.html | ajout (appelé par les shortcodes note / astuce / avertissement / piege) | Rien à re-diff. Encadré éditorial, dict { kind, content }, content passé à markdownify. |
contact_form.html | ajout (appelé par le shortcode contact-form, utilisé sur content/contact/_index.md) | Rien à re-diff. Formulaire nom / e-mail / message envoyé via Web3Forms ([params.contact].web3formsKey, même compte que [params.feedback]). Comportement : assets/js/contact-form.js. Styles : contact.css. |
quiz.html | ajout (appelé par extend_post_content.html, avant le bouton « utile ? ») | Rien à re-diff. Mini-quiz de fin d’article : rendu uniquement si le front matter porte quiz (intro + questions, chaque question q / options / a / why). Échappatoire hideQuiz. Données passées en JSON via jsonify | safeJS (sans safeJS, l’auto-échappement contextuel de Hugo dans un <script> double-encode la chaîne : piège à ne pas réintroduire). Comportement : assets/js/quiz.js. Styles : quiz.css. |
2. Templates ajoutés (section et shortcode)
layouts/pillar/list.html: gabarit des pages-piliers (front mattertype: "pillar"). Rend.Contentpuis les articles dont.Params.tagscroise.Params.pillarTags. Réutilise le markup.post-entryde PaperMod : si le thème renomme ces classes, réaligner. Pages concernées :content/microsoft-fabric,content/platform-engineering,content/certifications(chacune avecoutputs: ["html"]pour supprimer un RSS de section vide).layouts/_shortcodes/serie.html: encart de navigation de série, placé en tête des articles de la série. Litseries(taxonomy déclarée danshugo.toml) et trie parseriesOrder. Indépendant du thème.layouts/_shortcodes/{note,astuce,avertissement,piege}.html: encadrés éditoriaux, wrappers d’une ligne autour de_partials/callout.html. Usage :. Styles :Piègetexte markdowncallout.css.layouts/outil/single.html:single.htmlallégé pour le front mattertype: "outil"(pages decontent/ressources/). Reprend{{ define "main" }}, la coquille PaperMod (baseof),breadcrumbs,post_meta,share_icons. Vérifier que ces partials existent toujours après une montée de version.layouts/posts/single.html: gabarit article façon docs (Microsoft Learn), 3 colonnes dans un conteneur élargi. Le corps de.post-singlereprend fidèlementthemes/PaperMod/layouts/single.html; l’enrobage ajoute :.doc-shell(grille),doc_nav_shell.html(colonne gauche),.doc-toc(colonne droite, « Dans cet article », depuis.TableOfContents), plus l’appel detoc.htmlconservé pour le sommaire repliable sous 1200px. Styles :assets/css/extended/doc-layout.css(grille au-dessus de 1200px via.main:has(> .doc-shell)). À chaque montée de version : re-diff lesingle.htmldu thème et reporter les changements dans le bloc.post-single.layouts/list.html: copie dethemes/PaperMod/layouts/list.html, scindée sur.IsHome. Accueil : rendu du thème inchangé (pas de nav gauche). Pages personnelles / business (.Sectiondansabout,contact) : une seule colonne, corps rendu parlist_body.htmlsans enrobage. Tout le reste (sections, pages-listes, pages de terme de taxonomie) :.doc-shell.doc-shell--2col, nav gauche +.doc-main. La page d’index d’une taxonomie (/tags/,/series/, kindtaxonomy) passe parterms.htmldu thème, pas parlist.html: elle n’a pas la nav gauche (accepté, faible trafic). À chaque montée de version : re-difflist.htmldu thème, reporter dans les deux branches.IsHome.layouts/_shortcodes/contact-form.html: shortcode d’une ligne, rend_partials/contact_form.html. Utilisé uniquement surcontent/contact/_index.md.layouts/_partials/list_body.html: corps commun (en-tête, contenu, pages, pagination) partagé par les deux branches non-accueil delist.html.layouts/_partials/doc_nav_shell.html: colonne gauche complète (bandeau, bouton de repli, contenu dedoc_rail.html) et son bouton de réapparition. Appelée parposts/single.html,pillar/list.htmletlist.html.layouts/_shortcodes/sql-kql.html: aide-mémoire interactif SQL vers KQL. Styles et JS scopés sous.sqlkql(IIFE, IDssqlkql-*). Le skin n’utilise que des tokens du thème (--theme,--entry,--primary,--secondary,--content,--border,--code-bg,--code-block-bg,--radius,--tertiary) et l’accent--fab-green/--fab-graddefabric-theme.css: si le thème renomme ces variables, réaligner. Suit clair / sombre.
3. Render hooks (layouts/_markup/)
render-codeblock.html: ajout, pas un override (le thème ne fournit querender-image.html). Gère les blocs```mermaidet la coloration viatransform.HighlightCodeBlock. Vérifier qu’unrender-codeblock.htmln’est pas apparu côté thème, et que le comportement par défaut de ce hook côté Hugo n’a pas changé.
4. Output format LLMText
layouts/index.llmtext.txtet les blocs[outputFormats.LLMText]/[outputs] homedehugo.toml: indépendants du thème. Vérifier seulement que le build produit toujours/llms.txtentext/plain.
5. CSS étendu (assets/css/extended/)
Point d’extension officiel de PaperMod, donc rarement cassé, mais nos feuilles dépendent des variables CSS du thème :
- Variables utilisées :
--primary,--secondary,--content,--entry,--border,--theme,--code-bg,--gap,--radius,--header-height. Si PaperMod en renomme,about.css(.contact-links,.about-*),contact.css(.contact-form*, page/contact/),quiz.css(.quiz*, mini-quiz de fin d’article, réutilise le rouge#e5615ede.callout--piegepour les mauvaises réponses),certifications.css(.cert-*),fabric-theme.css(skin sombre, hero, accent vert),brand.css(polices, couleurs de marque, icône header) etdoc-layout.css(gabarit docs, nav gauche persistante) sont impactés. doc-layout.cssdépend en plus de.main:has(> .doc-shell)(élargit le conteneur au-dessus de 1200px) et suppose.post-single,.post-content,#TableOfContents,--header-heightinchangés côté thème.enhancements.css: palette.cmdk(<dialog>), zoom (.medium-zoom-*), bouton.feedback.callout.css: encadrés.callout--*. Ces deux fichiers utilisentcolor-mix()et l’attribut[hidden](règle!importanten tête deenhancements.css, le thème ne la pose pas).- Vérifier visuellement : accueil (hero, pas de nav gauche), page
/about/(une colonne),/posts/, une page pilier et une page de terme (2 colonnes, nav gauche), un article large (≥ 1200px : 3 colonnes, repli colonne gauche, scrollspy), un article étroit (< 1200px : sommaire repliable), la page/search/, la palette (Ctrl+K ou « / »), un encadré{{< piege >}}, le zoom sur une image, le bouton « utile ? ».
6. Chaînes d’interface (i18n/fr.toml)
Préparation du bilingue FR + EN (voir docs/roadmap-site.md, section
« Bilingue FR + EN ») : toutes les chaînes d’UI des partials et shortcodes
maison (hors contenu éditorial : bio auteur, description de site, front
matter des articles) passent par {{ i18n "clé" }} et sont définies dans
i18n/fr.toml, jamais écrites en dur dans un gabarit. Concerné : callout.html,
serie.html, doc_rail.html, doc_nav_shell.html, feedback.html,
contact_form.html, quiz.html, le <dialog id="cmdk"> de site_scripts.html.
Règle à suivre pour tout nouveau texte d’interface (pas pour le contenu
éditorial) : ajouter la clé dans i18n/fr.toml, jamais de texte français en
dur dans un .html de layouts/. Pour une chaîne dynamique construite en JS
(compteur, score, message qui change au clic) : le partial rend la chaîne déjà
traduite dans un attribut data-i18n-* avec des jetons littéraux (%d, %c,
%t, %s…) pour les parties variables, et le .js fait un simple
.replace() sur ces jetons. Un fichier .js ne doit jamais contenir de texte
français en dur : voir feedback.js, quiz.js, contact-form.js pour le
patron à reproduire. Le jour où i18n/en.toml est ajouté avec les mêmes clés,
aucun gabarit ni script n’a besoin d’être rouvert.
7. Paramètres hugo.toml
- Lire les avertissements de dépréciation au build. Paramètres PaperMod utilisés
susceptibles d’être renommés :
homeInfoParams,socialIcons,ShowShareButtons,cover.image/cover.relative/cover.hiddenInList,assets.favicon,defaultTheme,disableThemeToggle, lesShow*. - Paramètres maison :
label.icon/label.iconHeight(icône header),fuseOpts(recherche),feedback.web3formsKey/feedback.endpoint(bouton « utile ? »).outputs.homedoit garderJSON(index de recherche). - Consulter le CHANGELOG et les releases PaperMod pour les breaking changes.
8. Version de Hugo
- Comparer
min_versiondu nouveauthemes/PaperMod/theme.tomlavec la lignehugode.tool-versions(extended-0.165.0). Monter.tool-versionssi besoin : le pipeline Azure DevOps lit ce fichier. - Build extended obligatoire (PaperMod compile du SCSS).
9. Dépréciations Hugo connues (à traiter à l’occasion)
Déjà corrigées côté projet :
languages.fr.languageCode→languages.fr.locale(hugo.toml)languages.fr.languageName→languages.fr.label(hugo.toml)site.Language.LanguageCode→site.Language.Locale(layouts/_partials/templates/opengraph.html)
Le build émet encore, sans lien avec la mise à jour :
.Language.LanguageDirection(themes/PaperMod/layouts/baseof.html) et.Language.LanguageCode(themes/PaperMod/layouts/rss.xml) : dans les templates du thème, disparaîtront avec une version PaperMod récente. Ne pas modifier le thème, la mise à jour écraserait le changement.
Après la mise à jour
hugo --minifysans erreur.- Contrôler
/index.xml,/posts/index.xml,/sitemap.xml,/llms.txt,/robots.txt. - Contrôler le JSON-LD (
Personsur/about/,BlogPostingsur un article) avec le Rich Results Test de Google. - Vérifier qu’aucun
—(tiret cadratin) n’est réapparu dans les gabarits ou la config.