{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Cecil - Comment faire ?",
  "home_page_url": "https://cecil-945.pages.dev/fr/comment-faire/",
  "feed_url": "https://cecil-945.pages.dev/fr/comment-faire/feed.json",
  "description": "Articles et tutoriels pour réaliser les tâches courantes avec Cecil.",
  "icon": "https://cecil-945.pages.dev/favicon.7ff4b89eec6dad139a7d2d6561543285.png",
  "favicon": "https://cecil-945.pages.dev/thumbnails/64x/favicon.7ff4b89eec6dad139a7d2d6561543285.png",
  "language": "fr",
  "items": [
    {
      "id": "https://cecil-945.pages.dev/fr/comment-faire/markdown-sommaire-notes/",
      "url": "https://cecil-945.pages.dev/fr/comment-faire/markdown-sommaire-notes/",
      "title": "Ajouter une table des matières et des notes",
      "summary": "Enrichir les pages Markdown de Cecil avec une table des matières, des blocs de notes et des attributs personnalisés.",
      "date_published": "2026-10-14T00:00:00+00:00","content_text": "Cecil étend Markdown avec quelques fonctionnalités pratiques pour les pages longues : une table des matières automatique, des blocs de notes et des attributs sur les éléments.\nInsérer une table des matières\nAjoutez la balise [toc] à l’endroit où la table des matières doit apparaître dans le corps de la page :\n[toc]\n\n## Installation\n### Requirements\n## Usage\nPar défaut, la table des matières est construite à partir des titres H2 et H3. Modifiez ce comportement dans cecil.yml :\npages:\n  body:\n    toc: [h2, h3, h4]\nAfficher la table des matières dans un template\nPour placer la table des matières en dehors du contenu (ex. dans une barre latérale), utilisez le filtre toc sur le corps de la page :\n&lt;aside&gt;\n  {{ page.body|toc }}\n&lt;\/aside&gt;\n&lt;article&gt;\n  {{ page.content }}\n&lt;\/article&gt;\nLe filtre accepte aussi les titres à extraire, ex. {{ page.body|toc(selectors=['h2']) }}.\nAjouter des notes\nMettez en avant une information avec un bloc de note :\n:::tip\n**Tip:** This is advice.\n:::\nEst converti en :\n&lt;aside class=\"note note-tip\"&gt;\n  &lt;p&gt;\n    &lt;strong&gt;Tip:&lt;\/strong&gt; This is advice.\n  &lt;\/p&gt;\n&lt;\/aside&gt;\nLes types disponibles sont info, tip, important, warning et caution (ou aucun type). Stylisez-les avec les classes CSS note et note-&lt;type&gt;.\nAjouter des attributs\nDéfinissez un id, une classe ou n’importe quel attribut sur un titre, un bloc de code, un lien ou une image, entre accolades à la fin de la ligne :\n## Installation {#install .highlighted}\nL’id #install fournit une ancre stable vers laquelle créer un lien : [Voir l’installation](#install).\nPour un élément en ligne, comme un lien, ajoutez un saut de ligne après l’accolade fermante.\nConsultez la documentation de la table des matières, des notes, des attributs et du filtre toc.",
      "content_html": "<p>Cecil étend Markdown avec quelques fonctionnalités pratiques pour les pages longues : une table des matières automatique, des blocs de notes et des attributs sur les éléments.</p>\n<h2 id=\"inserer-une-table-des-matieres\">Insérer une table des matières</h2>\n<p>Ajoutez la balise <code translate=\"no\">[toc]</code> à l’endroit où la table des matières doit apparaître dans le corps de la page :</p>\n<pre><code class=\"language-markdown hljs markdown\" translate=\"no\">[toc]\n\n<span class=\"hljs-section\">## Installation</span>\n<span class=\"hljs-section\">### Requirements</span>\n<span class=\"hljs-section\">## Usage</span></code></pre>\n<p>Par défaut, la table des matières est construite à partir des titres H2 et H3. Modifiez ce comportement dans <code translate=\"no\">cecil.yml</code> :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-attr\">pages:</span>\n  <span class=\"hljs-attr\">body:</span>\n    <span class=\"hljs-attr\">toc:</span> <span class=\"hljs-string\">[h2,</span> <span class=\"hljs-string\">h3,</span> <span class=\"hljs-string\">h4]</span></code></pre>\n<h2 id=\"afficher-la-table-des-matieres-dans-un-template\">Afficher la table des matières dans un template</h2>\n<p>Pour placer la table des matières en dehors du contenu (ex. dans une barre latérale), utilisez le filtre <code translate=\"no\">toc</code> sur le corps de la page :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">aside</span>&gt;</span>\n  </span><span class=\"hljs-template-variable\">{{ page.body|toc }}</span><span class=\"xml\">\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">aside</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">article</span>&gt;</span>\n  </span><span class=\"hljs-template-variable\">{{ page.content }}</span><span class=\"xml\">\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">article</span>&gt;</span></span></code></pre>\n<p>Le filtre accepte aussi les titres à extraire, ex. <code translate=\"no\">{{ page.body|toc(selectors=['h2']) }}</code>.</p>\n<h2 id=\"ajouter-des-notes\">Ajouter des notes</h2>\n<p>Mettez en avant une information avec un bloc de note :</p>\n<pre><code class=\"language-markdown hljs markdown\" translate=\"no\">:::tip\n<span class=\"hljs-strong\">**Tip:**</span> This is advice.\n:::</code></pre>\n<p>Est converti en :</p>\n<pre><code class=\"language-html hljs xml\" translate=\"no\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">aside</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"note note-tip\"</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">strong</span>&gt;</span>Tip:<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">strong</span>&gt;</span> This is advice.\n  <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">p</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">aside</span>&gt;</span></code></pre>\n<p>Les types disponibles sont <code translate=\"no\">info</code>, <code translate=\"no\">tip</code>, <code translate=\"no\">important</code>, <code translate=\"no\">warning</code> et <code translate=\"no\">caution</code> (ou aucun type). Stylisez-les avec les classes CSS <code translate=\"no\">note</code> et <code translate=\"no\">note-&lt;type&gt;</code>.</p>\n<h2 id=\"ajouter-des-attributs\">Ajouter des attributs</h2>\n<p>Définissez un id, une classe ou n’importe quel attribut sur un titre, un bloc de code, un lien ou une image, entre accolades à la fin de la ligne :</p>\n<pre><code class=\"language-markdown hljs markdown\" translate=\"no\"><span class=\"hljs-section\">## Installation {#install .highlighted}</span></code></pre>\n<p>L’id <code translate=\"no\">#install</code> fournit une ancre stable vers laquelle créer un lien : <code translate=\"no\">[Voir l’installation](#install)</code>.</p>\n<aside class=\"note note-warning\"><p>Pour un élément en ligne, comme un lien, ajoutez un saut de ligne après l’accolade fermante.</p></aside>\n<aside class=\"note note-info\"><p>Consultez la documentation de la <a href=\"/documentation/content/#table-of-contents\">table des matières</a>, des <a href=\"/documentation/content/#notes\">notes</a>, des <a href=\"/documentation/content/#attributes\">attributs</a> et du <a href=\"/documentation/templates/#toc\">filtre <code translate=\"no\">toc</code></a>.</p></aside>",
      "language": "fr"
    },
    {
      "id": "https://cecil-945.pages.dev/fr/comment-faire/contenu-redirection-alias/",
      "url": "https://cecil-945.pages.dev/fr/comment-faire/contenu-redirection-alias/",
      "title": "Rediriger d’anciennes URL",
      "summary": "Conserver le fonctionnement des anciens liens dans Cecil avec les variables de front matter redirect et alias.",
      "date_published": "2026-10-13T00:00:00+00:00","content_text": "Quand une page est déplacée ou renommée, son ancienne URL ne doit pas mener à une erreur 404. Cecil propose deux variables de front matter pour cela : alias et redirect.\nRediriger d’anciennes URL vers une page\nLa variable alias liste les anciens chemins de la page courante. Chacun d’eux redirige vers la page :\n---\ntitle: About\nalias:\n  - contact\n  - about-us\n---\nDans cet exemple, \/contact\/ et \/about-us\/ redirigent vers \/about\/.\nRediriger une page vers une autre URL\nLa variable redirect transforme une page en redirection vers l’URL indiquée, interne ou externe :\n---\ntitle: Ancienne documentation\nredirect: \"https:\/\/cecil.app\/documentation\/\"\n---\nSans fichier Markdown\nSi l’ancienne page n’a plus de contenu, déclarez-la comme page virtuelle dans cecil.yml :\npages:\n  virtual:\n    - path: code\n      redirect: https:\/\/github.com\/Cecilapp\/Cecil\nPages générées\nPour chaque alias et chaque redirection, Cecil génère une page avec le template intégré redirect.html.twig. Elle contient :\n\nun &lt;link rel=\"canonical\"&gt; vers l’URL cible\nune balise &lt;meta name=\"robots\" content=\"noindex\"&gt;, pour que les moteurs de recherche ne l’indexent pas\nune balise &lt;meta http-equiv=\"refresh\"&gt; et une redirection JavaScript\nun lien de secours pour les visiteurs\n\nPour personnaliser cette page, créez votre propre template layouts\/redirect.html.twig : il est prioritaire sur le template intégré.\nConsultez la documentation des variables redirect et alias.",
      "content_html": "<p>Quand une page est déplacée ou renommée, son ancienne URL ne doit pas mener à une erreur 404. Cecil propose deux variables de front matter pour cela : <code translate=\"no\">alias</code> et <code translate=\"no\">redirect</code>.</p>\n<h2 id=\"rediriger-d-anciennes-url-vers-une-page\">Rediriger d’anciennes URL vers une page</h2>\n<p>La variable <code translate=\"no\">alias</code> liste les anciens chemins de la page courante. Chacun d’eux redirige vers la page :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-meta\">---</span>\n<span class=\"hljs-attr\">title:</span> <span class=\"hljs-string\">About</span>\n<span class=\"hljs-attr\">alias:</span>\n  <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">contact</span>\n  <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">about-us</span>\n<span class=\"hljs-meta\">---</span></code></pre>\n<p>Dans cet exemple, <code translate=\"no\">/contact/</code> et <code translate=\"no\">/about-us/</code> redirigent vers <code translate=\"no\">/about/</code>.</p>\n<h2 id=\"rediriger-une-page-vers-une-autre-url\">Rediriger une page vers une autre URL</h2>\n<p>La variable <code translate=\"no\">redirect</code> transforme une page en redirection vers l’URL indiquée, interne ou externe :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-meta\">---</span>\n<span class=\"hljs-attr\">title:</span> <span class=\"hljs-string\">Ancienne</span> <span class=\"hljs-string\">documentation</span>\n<span class=\"hljs-attr\">redirect:</span> <span class=\"hljs-string\">\"https://cecil.app/documentation/\"</span>\n<span class=\"hljs-meta\">---</span></code></pre>\n<h2 id=\"sans-fichier-markdown\">Sans fichier Markdown</h2>\n<p>Si l’ancienne page n’a plus de contenu, déclarez-la comme <a href=\"/documentation/configuration/#pages-virtual\">page virtuelle</a> dans <code translate=\"no\">cecil.yml</code> :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-attr\">pages:</span>\n  <span class=\"hljs-attr\">virtual:</span>\n    <span class=\"hljs-bullet\">-</span> <span class=\"hljs-attr\">path:</span> <span class=\"hljs-string\">code</span>\n      <span class=\"hljs-attr\">redirect:</span> <span class=\"hljs-string\">https://github.com/Cecilapp/Cecil</span></code></pre>\n<h2 id=\"pages-generees\">Pages générées</h2>\n<p>Pour chaque alias et chaque redirection, Cecil génère une page avec le template intégré <a href=\"https://github.com/Cecilapp/Cecil/blob/main/resources/layouts/_default/redirect.html.twig\" target=\"_blank\" rel=\"noopener noreferrer\"><code translate=\"no\">redirect.html.twig</code></a>. Elle contient :</p>\n<ul>\n<li>un <code translate=\"no\">&lt;link rel=\"canonical\"&gt;</code> vers l’URL cible</li>\n<li>une balise <code translate=\"no\">&lt;meta name=\"robots\" content=\"noindex\"&gt;</code>, pour que les moteurs de recherche ne l’indexent pas</li>\n<li>une balise <code translate=\"no\">&lt;meta http-equiv=\"refresh\"&gt;</code> et une redirection JavaScript</li>\n<li>un lien de secours pour les visiteurs</li>\n</ul>\n<aside class=\"note note-tip\"><p>Pour personnaliser cette page, créez votre propre template <code translate=\"no\">layouts/redirect.html.twig</code> : il est prioritaire sur le template intégré.</p></aside>\n<aside class=\"note note-info\"><p>Consultez la documentation des variables <a href=\"/documentation/content/#redirect\"><code translate=\"no\">redirect</code></a> et <a href=\"/documentation/content/#alias\"><code translate=\"no\">alias</code></a>.</p></aside>",
      "language": "fr"
    },
    {
      "id": "https://cecil-945.pages.dev/fr/comment-faire/configuration-environnements/",
      "url": "https://cecil-945.pages.dev/fr/comment-faire/configuration-environnements/",
      "title": "Utiliser des réglages différents selon l’environnement",
      "summary": "Surcharger la configuration de Cecil selon l’environnement avec les variables d’environnement CECIL_ et des fichiers de configuration supplémentaires.",
      "date_published": "2026-10-12T00:00:00+00:00","content_text": "Le site local et le site de production partagent rarement les mêmes réglages : URL de base, mode debug, répertoire de sortie… Cecil permet de conserver un unique cecil.yml et de le surcharger selon l’environnement.\nGarder les valeurs de production dans cecil.yml\ntitle: \"My site\"\nbaseurl: https:\/\/example.com\/\ndebug: false\nSurcharger avec des fichiers de configuration supplémentaires\nCréez un fichier contenant uniquement les clés à modifier, par exemple config\/dev.yml :\nbaseurl: http:\/\/localhost:8000\/\ndebug: true\nPuis chargez-le avec l’option --config, disponible avec les commandes build et serve :\nphp cecil.phar serve --config=config\/dev.yml\nVous pouvez passer plusieurs fichiers, séparés par des virgules. Ils sont fusionnés dans l’ordre après cecil.yml : chaque fichier surcharge donc les précédents.\nphp cecil.phar build --config=config\/prod.yml,config\/local.yml\nSurcharger avec des variables d’environnement\nToute clé de configuration peut être définie par une variable d’environnement préfixée par CECIL_, en majuscules. Les clés imbriquées sont séparées par un underscore (par exemple CECIL_OUTPUT_DIR définit output.dir) :\nexport CECIL_BASEURL=\"https:\/\/staging.example.com\/\"\nexport CECIL_DEBUG=true\nphp cecil.phar build\nCecil charge aussi un fichier .env à la racine du site, s’il existe (les variables déjà définies par le système sont conservées) :\nCECIL_BASEURL=\"http:\/\/localhost:8000\/\"\nCECIL_DEBUG=true\nLes variables d’environnement sont appliquées par-dessus les fichiers de configuration, ce qui les rend pratiques en CI, par exemple :\n# .gitlab-ci.yml\npages:\n  variables:\n    CECIL_ENV: production\n    CECIL_OUTPUT_DIR: public\nLire l’environnement dans les templates\nUtilisez la fonction getenv pour adapter les templates, par exemple pour n’inclure les statistiques d’audience qu’en production :\n{% if getenv('CECIL_ENV') == 'production' %}\n  {{ include('partials\/analytics.html.twig') }}\n{% endif %}\nLa variable site.debug indique si le mode debug est activé :\n{% if site.debug %}{{ dump(page) }}{% endif %}\nConsultez la documentation pour surcharger la configuration, l’option debug et la fonction getenv.",
      "content_html": "<p>Le site local et le site de production partagent rarement les mêmes réglages : URL de base, mode debug, répertoire de sortie… Cecil permet de conserver un unique <code translate=\"no\">cecil.yml</code> et de le surcharger selon l’environnement.</p>\n<h2 id=\"garder-les-valeurs-de-production-dans-cecil-yml\">Garder les valeurs de production dans <code translate=\"no\">cecil.yml</code></h2>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-attr\">title:</span> <span class=\"hljs-string\">\"My site\"</span>\n<span class=\"hljs-attr\">baseurl:</span> <span class=\"hljs-string\">https://example.com/</span>\n<span class=\"hljs-attr\">debug:</span> <span class=\"hljs-literal\">false</span></code></pre>\n<h2 id=\"surcharger-avec-des-fichiers-de-configuration-supplementaires\">Surcharger avec des fichiers de configuration supplémentaires</h2>\n<p>Créez un fichier contenant uniquement les clés à modifier, par exemple <code translate=\"no\">config/dev.yml</code> :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-attr\">baseurl:</span> <span class=\"hljs-string\">http://localhost:8000/</span>\n<span class=\"hljs-attr\">debug:</span> <span class=\"hljs-literal\">true</span></code></pre>\n<p>Puis chargez-le avec l’option <code translate=\"no\">--config</code>, disponible avec les commandes <code translate=\"no\">build</code> et <code translate=\"no\">serve</code> :</p>\n<pre><code class=\"language-bash hljs bash\" translate=\"no\">php cecil.phar serve --config=config/dev.yml</code></pre>\n<p>Vous pouvez passer plusieurs fichiers, séparés par des virgules. Ils sont fusionnés dans l’ordre après <code translate=\"no\">cecil.yml</code> : chaque fichier surcharge donc les précédents.</p>\n<pre><code class=\"language-bash hljs bash\" translate=\"no\">php cecil.phar build --config=config/prod.yml,config/local.yml</code></pre>\n<h2 id=\"surcharger-avec-des-variables-d-environnement\">Surcharger avec des variables d’environnement</h2>\n<p>Toute clé de configuration peut être définie par une variable d’environnement préfixée par <code translate=\"no\">CECIL_</code>, en majuscules. Les clés imbriquées sont séparées par un underscore (par exemple <code translate=\"no\">CECIL_OUTPUT_DIR</code> définit <code translate=\"no\">output.dir</code>) :</p>\n<pre><code class=\"language-bash hljs bash\" translate=\"no\"><span class=\"hljs-built_in\">export</span> CECIL_BASEURL=<span class=\"hljs-string\">\"https://staging.example.com/\"</span>\n<span class=\"hljs-built_in\">export</span> CECIL_DEBUG=<span class=\"hljs-literal\">true</span>\nphp cecil.phar build</code></pre>\n<p>Cecil charge aussi un fichier <code translate=\"no\">.env</code> à la racine du site, s’il existe (les variables déjà définies par le système sont conservées) :</p>\n<pre><code class=\"language-dotenv\" translate=\"no\">CECIL_BASEURL=\"http://localhost:8000/\"\nCECIL_DEBUG=true</code></pre>\n<p>Les variables d’environnement sont appliquées par-dessus les fichiers de configuration, ce qui les rend pratiques en CI, par exemple :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-comment\"># .gitlab-ci.yml</span>\n<span class=\"hljs-attr\">pages:</span>\n  <span class=\"hljs-attr\">variables:</span>\n    <span class=\"hljs-attr\">CECIL_ENV:</span> <span class=\"hljs-string\">production</span>\n    <span class=\"hljs-attr\">CECIL_OUTPUT_DIR:</span> <span class=\"hljs-string\">public</span></code></pre>\n<h2 id=\"lire-l-environnement-dans-les-templates\">Lire l’environnement dans les templates</h2>\n<p>Utilisez la fonction <code translate=\"no\">getenv</code> pour adapter les templates, par exemple pour n’inclure les statistiques d’audience qu’en production :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">if</span></span> getenv('CECIL_ENV') == 'production' %}</span><span class=\"xml\">\n  </span><span class=\"hljs-template-variable\">{{ <span class=\"hljs-name\">include</span><span class=\"hljs-params\">('partials/analytics.html.twig')</span> }}</span><span class=\"xml\">\n</span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endif</span></span> %}</span></code></pre>\n<p>La variable <code translate=\"no\">site.debug</code> indique si le mode debug est activé :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">if</span></span> site.debug %}</span><span class=\"hljs-template-variable\">{{ <span class=\"hljs-name\">dump</span><span class=\"hljs-params\">(page)</span> }}</span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endif</span></span> %}</span></code></pre>\n<aside class=\"note note-info\"><p>Consultez la documentation pour <a href=\"/documentation/configuration/#override-configuration\">surcharger la configuration</a>, l’<a href=\"/documentation/configuration/#debug\">option <code translate=\"no\">debug</code></a> et la <a href=\"/documentation/templates/#getenv\">fonction <code translate=\"no\">getenv</code></a>.</p></aside>",
      "language": "fr"
    },
    {
      "id": "https://cecil-945.pages.dev/fr/comment-faire/templates-assets-scss/",
      "url": "https://cecil-945.pages.dev/fr/comment-faire/templates-assets-scss/",
      "title": "Compiler, minifier et empreinter CSS et JavaScript",
      "summary": "Traiter les fichiers Sass, CSS et JavaScript dans les templates Cecil avec la fonction asset et ses filtres.",
      "date_published": "2026-10-11T00:00:00+00:00","content_text": "Cecil peut compiler des fichiers Sass, minifier le CSS et le JavaScript, et ajouter une empreinte du contenu aux noms de fichiers (cache busting) directement depuis vos templates, sans outil de build externe.\nConfigurer le traitement des assets\nLes fichiers sources sont stockés dans le répertoire assets\/. Le traitement est activé par défaut et peut être ajusté dans cecil.yml :\nassets:\n  compile:\n    style: compressed    # `expanded` ou `compressed`\n    import: [sass, scss] # chemins importés\n  minify: true           # minifie le CSS et le JS\n  fingerprint: true      # ajoute l’empreinte du contenu aux noms de fichiers\nCharger une feuille de style\nCréez un asset à partir d’un fichier Sass, compilez-le avec to_css et générez l’élément &lt;link&gt; avec la fonction html :\n{{ html(asset('css\/styles.scss')|to_css|minify) }}\nLes filtres peuvent être chaînés pour contrôler chaque étape explicitement, ce qui est utile si une fonctionnalité est désactivée globalement :\n{{ asset('css\/styles.scss')|to_css|minify|fingerprint }}\nRegrouper des fichiers JavaScript\nPassez un tableau de chemins pour créer un bundle unique, avec un nom de fichier personnalisé :\n{{ html(asset(['js\/menu.js', 'js\/search.js'], {filename: 'scripts.js'})) }}\nLes options peuvent aussi être définies par asset, par exemple pour laisser un fichier distant intact :\n{{ html(asset('https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/anchor-js\/4.3.1\/anchor.min.js', {minify: false})) }}\nAjouter l’intégrité des sous-ressources\nUtilisez la fonction integrity (ou l’attribut integrity de l’asset) pour générer un hash sha384 :\n{% set styles = asset('css\/styles.scss')|to_css %}\n&lt;link rel=\"stylesheet\" href=\"{{ url(styles) }}\" integrity=\"{{ integrity(styles) }}\" crossorigin=\"anonymous\"&gt;\nIntégrer le CSS critique\nAffichez le contenu d’un asset avec le filtre inline :\n&lt;style&gt;{{ asset('css\/critical.scss')|to_css|minify|inline }}&lt;\/style&gt;\nPour quelques lignes de styles écrites directement dans le template, utilisez les filtres scss_to_css et minify_css :\n&lt;style&gt;\n{% apply scss_to_css|minify_css %}\n  $color: #fcfcfc;\n  body {\n    background-color: $color;\n  }\n{% endapply %}\n&lt;\/style&gt;\nConsultez la documentation de la fonction asset, des filtres et de la configuration des assets.",
      "content_html": "<p>Cecil peut compiler des fichiers <a href=\"https://sass-lang.com\" target=\"_blank\" rel=\"noopener noreferrer\">Sass</a>, minifier le CSS et le JavaScript, et ajouter une empreinte du contenu aux noms de fichiers (cache busting) directement depuis vos templates, sans outil de build externe.</p>\n<h2 id=\"configurer-le-traitement-des-assets\">Configurer le traitement des assets</h2>\n<p>Les fichiers sources sont stockés dans le répertoire <code translate=\"no\">assets/</code>. Le traitement est activé par défaut et peut être ajusté dans <code translate=\"no\">cecil.yml</code> :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-attr\">assets:</span>\n  <span class=\"hljs-attr\">compile:</span>\n    <span class=\"hljs-attr\">style:</span> <span class=\"hljs-string\">compressed</span>    <span class=\"hljs-comment\"># `expanded` ou `compressed`</span>\n    <span class=\"hljs-attr\">import:</span> <span class=\"hljs-string\">[sass,</span> <span class=\"hljs-string\">scss]</span> <span class=\"hljs-comment\"># chemins importés</span>\n  <span class=\"hljs-attr\">minify:</span> <span class=\"hljs-literal\">true</span>           <span class=\"hljs-comment\"># minifie le CSS et le JS</span>\n  <span class=\"hljs-attr\">fingerprint:</span> <span class=\"hljs-literal\">true</span>      <span class=\"hljs-comment\"># ajoute l’empreinte du contenu aux noms de fichiers</span></code></pre>\n<h2 id=\"charger-une-feuille-de-style\">Charger une feuille de style</h2>\n<p>Créez un <em>asset</em> à partir d’un fichier Sass, compilez-le avec <code translate=\"no\">to_css</code> et générez l’élément <code translate=\"no\">&lt;link&gt;</code> avec la fonction <code translate=\"no\">html</code> :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-variable\">{{ html(asset('css/styles.scss')|to_css|minify) }}</span></code></pre>\n<p>Les filtres peuvent être chaînés pour contrôler chaque étape explicitement, ce qui est utile si une fonctionnalité est désactivée globalement :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-variable\">{{ asset('css/styles.scss')|to_css|minify|fingerprint }}</span></code></pre>\n<h2 id=\"regrouper-des-fichiers-javascript\">Regrouper des fichiers JavaScript</h2>\n<p>Passez un tableau de chemins pour créer un bundle unique, avec un nom de fichier personnalisé :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-variable\">{{ html(asset(['js/menu.js', 'js/search.js'], {filename: 'scripts.js'})) }}</span></code></pre>\n<p>Les options peuvent aussi être définies par asset, par exemple pour laisser un fichier distant intact :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-variable\">{{ html(asset('https://cdnjs.cloudflare.com/ajax/libs/anchor-js/4.3.1/anchor.<span class=\"hljs-name\">min</span>.js', {minify: false})) }}</span></code></pre>\n<h2 id=\"ajouter-l-integrite-des-sous-ressources\">Ajouter l’intégrité des sous-ressources</h2>\n<p>Utilisez la fonction <code translate=\"no\">integrity</code> (ou l’attribut <code translate=\"no\">integrity</code> de l’asset) pour générer un hash <code translate=\"no\">sha384</code> :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">set</span></span> styles = asset('css/styles.scss')|to_css %}</span><span class=\"xml\">\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link</span> <span class=\"hljs-attr\">rel</span>=<span class=\"hljs-string\">\"stylesheet\"</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ url(styles) }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span> <span class=\"hljs-attr\">integrity</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ integrity(styles) }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span> <span class=\"hljs-attr\">crossorigin</span>=<span class=\"hljs-string\">\"anonymous\"</span>&gt;</span></span></code></pre>\n<h2 id=\"integrer-le-css-critique\">Intégrer le CSS critique</h2>\n<p>Affichez le contenu d’un asset avec le filtre <code translate=\"no\">inline</code> :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">style</span>&gt;</span></span><span class=\"hljs-template-variable\">{{ asset('css/critical.scss')|to_css|minify|inline }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">style</span>&gt;</span></span></code></pre>\n<p>Pour quelques lignes de styles écrites directement dans le template, utilisez les filtres <code translate=\"no\">scss_to_css</code> et <code translate=\"no\">minify_css</code> :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">style</span>&gt;</span>\n</span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">apply</span></span> scss_to_css|minify_css %}</span><span class=\"xml\">\n  $color: #fcfcfc;\n  body {\n    background-color: $color;\n  }\n</span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endapply</span></span> %}</span><span class=\"xml\">\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">style</span>&gt;</span></span></code></pre>\n<aside class=\"note note-info\"><p>Consultez la documentation de la <a href=\"/documentation/templates/#asset\">fonction <code translate=\"no\">asset</code></a>, des <a href=\"/documentation/templates/#filters\">filtres</a> et de la <a href=\"/documentation/configuration/#assets\">configuration des assets</a>.</p></aside>",
      "language": "fr"
    },
    {
      "id": "https://cecil-945.pages.dev/fr/comment-faire/contenu-taxonomies/",
      "url": "https://cecil-945.pages.dev/fr/comment-faire/contenu-taxonomies/",
      "title": "Organiser les pages avec des tags et des catégories",
      "summary": "Classer les pages Cecil avec des taxonomies comme les tags et les catégories, et personnaliser leurs pages de liste.",
      "date_published": "2026-10-10T00:00:00+00:00","content_text": "Les taxonomies permettent de classer les pages avec des termes (ex. PHP) regroupés dans des vocabulaires (ex. tags). Cecil génère ensuite une page par vocabulaire et une page par terme.\nDéclarer les vocabulaires\nLes vocabulaires sont déclarés dans cecil.yml, par paires de noms au pluriel et au singulier :\ntaxonomies:\n  categories: category\n  tags: tag\nIl n’existe pas de vocabulaire par défaut : vous devez les déclarer pour les utiliser.\nClasser les pages\nAjoutez les termes dans le front matter de vos pages, en utilisant le nom au pluriel du vocabulaire :\n---\ntitle: Mon premier billet\ncategories: [\"Development\"]\ntags: [\"PHP\", \"Static site\"]\n---\nCecil génère :\n\n\/tags\/ : la liste des termes du vocabulaire\n\/tags\/php\/ et \/tags\/static-site\/ : la liste des pages de chaque terme\n\nPersonnaliser la liste des termes\nLe template de vocabulaire est nommé d’après le pluriel, ex. layouts\/taxonomy\/tags.html.twig :\n{% extends 'page.html.twig' %}\n\n{% block content %}\n  &lt;h1&gt;{{ page.title }}&lt;\/h1&gt;\n  &lt;ul&gt;\n  {% for term in page.terms %}\n    &lt;li&gt;&lt;a href=\"{{ url(term.id) }}\"&gt;{{ term.name }}&lt;\/a&gt; ({{ term|length }})&lt;\/li&gt;\n  {% endfor %}\n  &lt;\/ul&gt;\n{% endblock %}\nPersonnaliser les pages d’un terme\nLe template de terme est nommé d’après le singulier, ex. layouts\/taxonomy\/tag.html.twig :\n{% extends 'page.html.twig' %}\n\n{% block content %}\n  &lt;h1&gt;{{ page.title }}&lt;\/h1&gt;\n  {% for p in page.paginator.pages ?? page.pages %}\n    &lt;article&gt;\n      &lt;h2&gt;&lt;a href=\"{{ url(p) }}\"&gt;{{ p.title }}&lt;\/a&gt;&lt;\/h2&gt;\n    &lt;\/article&gt;\n  {% endfor %}\n  &lt;a href=\"{{ url(page.plural) }}\"&gt;All {{ page.plural }}&lt;\/a&gt;\n{% endblock %}\nAfficher les termes d’une page\nDans un template de page, liez chaque terme à sa page :\n{% for tag in page.tags ?? [] %}\n  &lt;a href=\"{{ url('tags\/' ~ tag) }}\"&gt;{{ tag }}&lt;\/a&gt;\n{% endfor %}\nOu utilisez le partial intégré : {{ include('partials\/terms-list.html.twig', {vocabulary: 'tags'}) }}.\nConsultez la documentation de la configuration des taxonomies, des règles de sélection des templates et des variables de taxonomie.",
      "content_html": "<p>Les taxonomies permettent de classer les pages avec des termes (ex. <code translate=\"no\">PHP</code>) regroupés dans des vocabulaires (ex. <code translate=\"no\">tags</code>). Cecil génère ensuite une page par vocabulaire et une page par terme.</p>\n<h2 id=\"declarer-les-vocabulaires\">Déclarer les vocabulaires</h2>\n<p>Les vocabulaires sont déclarés dans <code translate=\"no\">cecil.yml</code>, par paires de noms au pluriel et au singulier :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-attr\">taxonomies:</span>\n  <span class=\"hljs-attr\">categories:</span> <span class=\"hljs-string\">category</span>\n  <span class=\"hljs-attr\">tags:</span> <span class=\"hljs-string\">tag</span></code></pre>\n<aside class=\"note note-warning\"><p>Il n’existe pas de vocabulaire par défaut : vous devez les déclarer pour les utiliser.</p></aside>\n<h2 id=\"classer-les-pages\">Classer les pages</h2>\n<p>Ajoutez les termes dans le front matter de vos pages, en utilisant le nom au pluriel du vocabulaire :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-meta\">---</span>\n<span class=\"hljs-attr\">title:</span> <span class=\"hljs-string\">Mon</span> <span class=\"hljs-string\">premier</span> <span class=\"hljs-string\">billet</span>\n<span class=\"hljs-attr\">categories:</span> <span class=\"hljs-string\">[\"Development\"]</span>\n<span class=\"hljs-attr\">tags:</span> <span class=\"hljs-string\">[\"PHP\",</span> <span class=\"hljs-string\">\"Static site\"</span><span class=\"hljs-string\">]</span>\n<span class=\"hljs-meta\">---</span></code></pre>\n<p>Cecil génère :</p>\n<ul>\n<li><code translate=\"no\">/tags/</code> : la liste des termes du vocabulaire</li>\n<li><code translate=\"no\">/tags/php/</code> et <code translate=\"no\">/tags/static-site/</code> : la liste des pages de chaque terme</li>\n</ul>\n<h2 id=\"personnaliser-la-liste-des-termes\">Personnaliser la liste des termes</h2>\n<p>Le template de <em>vocabulaire</em> est nommé d’après le <strong>pluriel</strong>, ex. <code translate=\"no\">layouts/taxonomy/tags.html.twig</code> :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">extends</span></span> 'page.html.twig' %}</span><span class=\"xml\">\n\n</span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">block</span></span> content %}</span><span class=\"xml\">\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1</span>&gt;</span></span><span class=\"hljs-template-variable\">{{ page.title }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">h1</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ul</span>&gt;</span>\n  </span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">for</span></span> term in page.terms %}</span><span class=\"xml\">\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">li</span>&gt;</span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ url(term.id) }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span>&gt;</span></span><span class=\"hljs-template-variable\">{{ term.name }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">a</span>&gt;</span> (</span><span class=\"hljs-template-variable\">{{ term|<span class=\"hljs-keyword\">length</span> }}</span><span class=\"xml\">)<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">li</span>&gt;</span>\n  </span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endfor</span></span> %}</span><span class=\"xml\">\n  <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">ul</span>&gt;</span>\n</span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endblock</span></span> %}</span></code></pre>\n<h2 id=\"personnaliser-les-pages-d-un-terme\">Personnaliser les pages d’un terme</h2>\n<p>Le template de <em>terme</em> est nommé d’après le <strong>singulier</strong>, ex. <code translate=\"no\">layouts/taxonomy/tag.html.twig</code> :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">extends</span></span> 'page.html.twig' %}</span><span class=\"xml\">\n\n</span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">block</span></span> content %}</span><span class=\"xml\">\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1</span>&gt;</span></span><span class=\"hljs-template-variable\">{{ page.title }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">h1</span>&gt;</span>\n  </span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">for</span></span> p in page.paginator.pages ?? page.pages %}</span><span class=\"xml\">\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">article</span>&gt;</span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h2</span>&gt;</span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ url(p) }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span>&gt;</span></span><span class=\"hljs-template-variable\">{{ p.title }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">a</span>&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">h2</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">article</span>&gt;</span>\n  </span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endfor</span></span> %}</span><span class=\"xml\">\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ url(page.plural) }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span>&gt;</span>All </span><span class=\"hljs-template-variable\">{{ page.plural }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">a</span>&gt;</span>\n</span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endblock</span></span> %}</span></code></pre>\n<h2 id=\"afficher-les-termes-d-une-page\">Afficher les termes d’une page</h2>\n<p>Dans un template de page, liez chaque terme à sa page :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">for</span></span> tag in page.tags ?? [] %}</span><span class=\"xml\">\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ url('tags/' ~ tag) }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span>&gt;</span></span><span class=\"hljs-template-variable\">{{ tag }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">a</span>&gt;</span>\n</span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endfor</span></span> %}</span></code></pre>\n<p>Ou utilisez le partial intégré : <code translate=\"no\">{{ include('partials/terms-list.html.twig', {vocabulary: 'tags'}) }}</code>.</p>\n<aside class=\"note note-info\"><p>Consultez la documentation de la <a href=\"/documentation/configuration/#taxonomies\">configuration des taxonomies</a>, des <a href=\"/documentation/templates/#type-vocabulary\">règles de sélection des templates</a> et des <a href=\"/documentation/templates/#page\">variables de taxonomie</a>.</p></aside>",
      "language": "fr"
    },
    {
      "id": "https://cecil-945.pages.dev/fr/comment-faire/templates-menus/",
      "url": "https://cecil-945.pages.dev/fr/comment-faire/templates-menus/",
      "title": "Construire un menu de navigation",
      "summary": "Déclarer des menus dans la configuration ou le front matter de Cecil et les afficher dans les templates.",
      "date_published": "2026-10-09T00:00:00+00:00","content_text": "Cecil gère les menus de navigation comme des collections d’entrées (nom, URL, poids) que vous pouvez déclarer dans la configuration ou directement dans les pages, puis afficher n’importe où dans vos templates.\nDéclarer des entrées dans la configuration\nAjoutez une section menus dans cecil.yml. Chaque menu (ex. : main, footer) est une liste d’entrées avec un id unique :\nmenus:\n  main:\n    - id: about\n      name: \"About\"\n      url: \/about\/\n      weight: 1\n  footer:\n    - id: github\n      name: \"GitHub\"\n      url: https:\/\/github.com\/Cecilapp\/Cecil\n      weight: 99\nUn menu main est automatiquement créé avec l’entrée de la page d’accueil et celles de toutes les sections.\nAjouter une page depuis son front matter\nUne page peut s’ajouter à un ou plusieurs menus avec la variable menu. Le nom de l’entrée est le title de la page et l’URL est son chemin :\n---\ntitle: Our Expertise\nmenu:\n  main:\n    weight: 15\n  footer:\n    weight: 15\n    name: \"Expertise\" # surcharge le nom de l’entrée dans ce menu\n---\nSurcharger ou désactiver une entrée\nUtilisez l’ID de la page comme id pour surcharger une entrée existante, ou enabled: false pour la retirer :\nmenus:\n  main:\n    - id: index\n      name: \"Home\"\n      weight: 1\n    - id: about\n      enabled: false\nAfficher le menu\nBouclez sur site.menus.&lt;menu&gt;, trié par poids, et comparez l’ID de chaque entrée avec celui de la page courante pour mettre en évidence l’élément actif :\n&lt;nav&gt;\n  &lt;ul&gt;\n  {% for entry in site.menus.main|sort_by_weight %}\n    &lt;li&gt;\n      &lt;a href=\"{{ url(entry.url) }}\"{% if entry.id == page.id %} aria-current=\"page\" class=\"active\"{% endif %}&gt;{{ entry.name }}&lt;\/a&gt;\n    &lt;\/li&gt;\n  {% endfor %}\n  &lt;\/ul&gt;\n&lt;\/nav&gt;\nUne entrée peut aussi être atteinte directement par son ID :\n{% if site.menus.main.about is defined %}\n  &lt;a href=\"{{ url(site.menus.main.about.url) }}\"&gt;{{ site.menus.main.about.name }}&lt;\/a&gt;\n{% endif %}\nCecil fournit également un partial intégré : {{ include('partials\/navigation.html.twig', {menu: 'main'}) }}.\nConsultez la documentation de la configuration des menus, de la variable de front matter menu et de la variable site.menus.",
      "content_html": "<p>Cecil gère les menus de navigation comme des collections d’entrées (nom, URL, poids) que vous pouvez déclarer dans la configuration ou directement dans les pages, puis afficher n’importe où dans vos templates.</p>\n<h2 id=\"declarer-des-entrees-dans-la-configuration\">Déclarer des entrées dans la configuration</h2>\n<p>Ajoutez une section <code translate=\"no\">menus</code> dans <code translate=\"no\">cecil.yml</code>. Chaque menu (ex. : <code translate=\"no\">main</code>, <code translate=\"no\">footer</code>) est une liste d’entrées avec un <code translate=\"no\">id</code> unique :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-attr\">menus:</span>\n  <span class=\"hljs-attr\">main:</span>\n    <span class=\"hljs-bullet\">-</span> <span class=\"hljs-attr\">id:</span> <span class=\"hljs-string\">about</span>\n      <span class=\"hljs-attr\">name:</span> <span class=\"hljs-string\">\"About\"</span>\n      <span class=\"hljs-attr\">url:</span> <span class=\"hljs-string\">/about/</span>\n      <span class=\"hljs-attr\">weight:</span> <span class=\"hljs-number\">1</span>\n  <span class=\"hljs-attr\">footer:</span>\n    <span class=\"hljs-bullet\">-</span> <span class=\"hljs-attr\">id:</span> <span class=\"hljs-string\">github</span>\n      <span class=\"hljs-attr\">name:</span> <span class=\"hljs-string\">\"GitHub\"</span>\n      <span class=\"hljs-attr\">url:</span> <span class=\"hljs-string\">https://github.com/Cecilapp/Cecil</span>\n      <span class=\"hljs-attr\">weight:</span> <span class=\"hljs-number\">99</span></code></pre>\n<aside class=\"note note-info\"><p>Un menu <code translate=\"no\">main</code> est automatiquement créé avec l’entrée de la page d’accueil et celles de toutes les sections.</p></aside>\n<h2 id=\"ajouter-une-page-depuis-son-front-matter\">Ajouter une page depuis son front matter</h2>\n<p>Une page peut s’ajouter à un ou plusieurs menus avec la variable <code translate=\"no\">menu</code>. Le nom de l’entrée est le <code translate=\"no\">title</code> de la page et l’URL est son chemin :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-meta\">---</span>\n<span class=\"hljs-attr\">title:</span> <span class=\"hljs-string\">Our</span> <span class=\"hljs-string\">Expertise</span>\n<span class=\"hljs-attr\">menu:</span>\n  <span class=\"hljs-attr\">main:</span>\n    <span class=\"hljs-attr\">weight:</span> <span class=\"hljs-number\">15</span>\n  <span class=\"hljs-attr\">footer:</span>\n    <span class=\"hljs-attr\">weight:</span> <span class=\"hljs-number\">15</span>\n    <span class=\"hljs-attr\">name:</span> <span class=\"hljs-string\">\"Expertise\"</span> <span class=\"hljs-comment\"># surcharge le nom de l’entrée dans ce menu</span>\n<span class=\"hljs-meta\">---</span></code></pre>\n<h2 id=\"surcharger-ou-desactiver-une-entree\">Surcharger ou désactiver une entrée</h2>\n<p>Utilisez l’ID de la page comme <code translate=\"no\">id</code> pour surcharger une entrée existante, ou <code translate=\"no\">enabled: false</code> pour la retirer :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-attr\">menus:</span>\n  <span class=\"hljs-attr\">main:</span>\n    <span class=\"hljs-bullet\">-</span> <span class=\"hljs-attr\">id:</span> <span class=\"hljs-string\">index</span>\n      <span class=\"hljs-attr\">name:</span> <span class=\"hljs-string\">\"Home\"</span>\n      <span class=\"hljs-attr\">weight:</span> <span class=\"hljs-number\">1</span>\n    <span class=\"hljs-bullet\">-</span> <span class=\"hljs-attr\">id:</span> <span class=\"hljs-string\">about</span>\n      <span class=\"hljs-attr\">enabled:</span> <span class=\"hljs-literal\">false</span></code></pre>\n<h2 id=\"afficher-le-menu\">Afficher le menu</h2>\n<p>Bouclez sur <code translate=\"no\">site.menus.&lt;menu&gt;</code>, trié par poids, et comparez l’ID de chaque entrée avec celui de la page courante pour mettre en évidence l’élément actif :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">nav</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ul</span>&gt;</span>\n  </span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">for</span></span> entry in site.menus.main|sort_by_weight %}</span><span class=\"xml\">\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">li</span>&gt;</span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ url(entry.url) }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">if</span></span> entry.id == page.id %}</span><span class=\"xml\"><span class=\"hljs-tag\"> <span class=\"hljs-attr\">aria-current</span>=<span class=\"hljs-string\">\"page\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"active\"</span></span></span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endif</span></span> %}</span><span class=\"xml\"><span class=\"hljs-tag\">&gt;</span></span><span class=\"hljs-template-variable\">{{ entry.name }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">a</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">li</span>&gt;</span>\n  </span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endfor</span></span> %}</span><span class=\"xml\">\n  <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">ul</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">nav</span>&gt;</span></span></code></pre>\n<p>Une entrée peut aussi être atteinte directement par son ID :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">if</span></span> site.menus.main.about is defined %}</span><span class=\"xml\">\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ url(site.menus.main.about.url) }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span>&gt;</span></span><span class=\"hljs-template-variable\">{{ site.menus.main.about.name }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">a</span>&gt;</span>\n</span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endif</span></span> %}</span></code></pre>\n<aside class=\"note note-tip\"><p>Cecil fournit également un partial intégré : <code translate=\"no\">{{ include('partials/navigation.html.twig', {menu: 'main'}) }}</code>.</p></aside>\n<aside class=\"note note-info\"><p>Consultez la documentation de la <a href=\"/documentation/configuration/#menus\">configuration des menus</a>, de la <a href=\"/documentation/content/#menu\">variable de front matter <code translate=\"no\">menu</code></a> et de la <a href=\"/documentation/templates/#site\">variable <code translate=\"no\">site.menus</code></a>.</p></aside>",
      "language": "fr"
    },
    {
      "id": "https://cecil-945.pages.dev/fr/comment-faire/sortie-index-de-recherche/",
      "url": "https://cecil-945.pages.dev/fr/comment-faire/sortie-index-de-recherche/",
      "title": "Ajouter une recherche côté client",
      "summary": "Ajouter une recherche côté client à un site statique Cecil avec un index JSON des pages et une petite bibliothèque JavaScript.",
      "date_published": "2026-10-08T00:00:00+00:00","content_text": "Un site statique n’a pas de recherche côté serveur, mais Cecil peut générer un index JSON de vos pages au moment du build. Quelques lignes de JavaScript suffisent ensuite pour l’interroger dans le navigateur.\nCréer la page d’index\nCréez une page dont le seul format de sortie est json, avec un layout dédié :\npages\/search.md\n---\ntitle: Search index\nlayout: search\noutput: json\nexcluded: true\n---\nexcluded: true exclut cette page technique des pages de liste et du sitemap.\nÉcrire le template JSON\nSelon les règles de recherche, Cecil génère cette page avec layouts\/search.json.twig. Construisez un tableau des pages affichables (showable), puis encodez-le :\n{%- set index = [] -%}\n{%- for p in site.pages.showable|filter(p =&gt; p.type == 'page') -%}\n  {%- set index = index|merge([{\n    title: p.title,\n    url: url(p),\n    description: p.description|default(''),\n    content: p.content|striptags|excerpt(300)\n  }]) -%}\n{%- endfor -%}\n{{ index|json_encode(constant('JSON_UNESCAPED_UNICODE') b-or constant('JSON_UNESCAPED_SLASHES'))|raw }}\nAprès php cecil.phar build, l’index est disponible à l’adresse \/search.json.\nConsultez la documentation de la variable output, des formats de sortie et de la fonction url.\nRechercher avec Fuse.js\nAjoutez un champ de recherche dans un template et chargez Fuse.js depuis un CDN pour interroger l’index :\n&lt;input type=\"search\" id=\"search\" placeholder=\"Rechercher…\"&gt;\n&lt;ul id=\"results\"&gt;&lt;\/ul&gt;\n\n&lt;script type=\"module\"&gt;\n  import Fuse from 'https:\/\/cdn.jsdelivr.net\/npm\/fuse.js@7\/dist\/fuse.mjs';\n\n  const index = await fetch('{{ url('search', {format: 'json'}) }}').then(r =&gt; r.json());\n  const fuse = new Fuse(index, { keys: ['title', 'description', 'content'], threshold: 0.3 });\n  const results = document.getElementById('results');\n\n  document.getElementById('search').addEventListener('input', (e) =&gt; {\n    results.replaceChildren(...fuse.search(e.target.value, { limit: 10 }).map(({ item }) =&gt; {\n      const li = document.createElement('li');\n      const a = document.createElement('a');\n      a.href = item.url;\n      a.textContent = item.title;\n      li.append(a);\n      return li;\n    }));\n  });\n&lt;\/script&gt;\nAlternative : Pagefind\nPagefind indexe directement les fichiers HTML générés : aucun template JSON n’est nécessaire. Lancez-le après le build, sur le répertoire de sortie (_site par défaut) :\nphp cecil.phar build\nnpx pagefind --site _site\nChargez ensuite son interface dans un template :\n&lt;link href=\"\/pagefind\/pagefind-ui.css\" rel=\"stylesheet\"&gt;\n&lt;script src=\"\/pagefind\/pagefind-ui.js\"&gt;&lt;\/script&gt;\n&lt;div id=\"search\"&gt;&lt;\/div&gt;\n&lt;script&gt;\n  window.addEventListener('DOMContentLoaded', () =&gt; new PagefindUI({ element: '#search' }));\n&lt;\/script&gt;\nL’index est une page comme les autres : pour ne régénérer que les sorties JSON, déclarez un sous-ensemble et lancez php cecil.phar build --render-subset=&lt;name&gt;.",
      "content_html": "<p>Un site statique n’a pas de recherche côté serveur, mais Cecil peut générer un <strong>index JSON de vos pages</strong> au moment du build. Quelques lignes de JavaScript suffisent ensuite pour l’interroger dans le navigateur.</p>\n<h2 id=\"creer-la-page-d-index\">Créer la page d’index</h2>\n<p>Créez une page dont le seul <a href=\"/documentation/content/#output\">format de sortie</a> est <code translate=\"no\">json</code>, avec un layout dédié :</p>\n<p><em>pages/search.md</em></p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-meta\">---</span>\n<span class=\"hljs-attr\">title:</span> <span class=\"hljs-string\">Search</span> <span class=\"hljs-string\">index</span>\n<span class=\"hljs-attr\">layout:</span> <span class=\"hljs-string\">search</span>\n<span class=\"hljs-attr\">output:</span> <span class=\"hljs-string\">json</span>\n<span class=\"hljs-attr\">excluded:</span> <span class=\"hljs-literal\">true</span>\n<span class=\"hljs-meta\">---</span></code></pre>\n<p><a href=\"/documentation/content/#excluded\"><code translate=\"no\">excluded: true</code></a> exclut cette page technique des pages de liste et du sitemap.</p>\n<h2 id=\"ecrire-le-template-json\">Écrire le template JSON</h2>\n<p>Selon les <a href=\"/documentation/templates/#lookup-rules\">règles de recherche</a>, Cecil génère cette page avec <code translate=\"no\">layouts/search.json.twig</code>. Construisez un tableau des pages <a href=\"/documentation/templates/#site\">affichables</a> (<em>showable</em>), puis encodez-le :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-tag\">{%- <span class=\"hljs-name\"><span class=\"hljs-keyword\">set</span></span> index = [] -%}</span><span class=\"xml\">\n</span><span class=\"hljs-template-tag\">{%- <span class=\"hljs-name\"><span class=\"hljs-keyword\">for</span></span> p in site.pages.showable|<span class=\"hljs-keyword\">filter</span>(p =&gt; p.type == 'page') -%}</span><span class=\"xml\">\n  </span><span class=\"hljs-template-tag\">{%- <span class=\"hljs-name\"><span class=\"hljs-keyword\">set</span></span> index = index|<span class=\"hljs-keyword\">merge</span>([{\n    title: p.title,\n    url: url(p),\n    description: p.description|<span class=\"hljs-keyword\">default</span>(''),\n    content: p.content|<span class=\"hljs-keyword\">striptags</span>|excerpt(300)\n  }]) -%}</span><span class=\"xml\">\n</span><span class=\"hljs-template-tag\">{%- <span class=\"hljs-name\"><span class=\"hljs-keyword\">endfor</span></span> -%}</span><span class=\"xml\">\n</span><span class=\"hljs-template-variable\">{{ index|<span class=\"hljs-keyword\">json_encode</span>(<span class=\"hljs-name\">constant</span><span class=\"hljs-params\">('JSON_UNESCAPED_UNICODE')</span> b-or <span class=\"hljs-name\">constant</span><span class=\"hljs-params\">('JSON_UNESCAPED_SLASHES')</span>)|<span class=\"hljs-keyword\">raw</span> }}</span></code></pre>\n<p>Après <code translate=\"no\">php cecil.phar build</code>, l’index est disponible à l’adresse <code translate=\"no\">/search.json</code>.</p>\n<aside class=\"note note-info\"><p>Consultez la documentation de la <a href=\"/documentation/content/#output\">variable <code translate=\"no\">output</code></a>, des <a href=\"/documentation/configuration/#output-formats\">formats de sortie</a> et de la <a href=\"/documentation/templates/#url\">fonction <code translate=\"no\">url</code></a>.</p></aside>\n<h2 id=\"rechercher-avec-fuse-js\">Rechercher avec Fuse.js</h2>\n<p>Ajoutez un champ de recherche dans un template et chargez <a href=\"https://www.fusejs.io\" target=\"_blank\" rel=\"noopener noreferrer\">Fuse.js</a> depuis un CDN pour interroger l’index :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input</span> <span class=\"hljs-attr\">type</span>=<span class=\"hljs-string\">\"search\"</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"search\"</span> <span class=\"hljs-attr\">placeholder</span>=<span class=\"hljs-string\">\"Rechercher…\"</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ul</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"results\"</span>&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">ul</span>&gt;</span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script</span> <span class=\"hljs-attr\">type</span>=<span class=\"hljs-string\">\"module\"</span>&gt;</span><span class=\"javascript\">\n  <span class=\"hljs-keyword\">import</span> Fuse <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'https://cdn.jsdelivr.net/npm/fuse.js@7/dist/fuse.mjs'</span>;\n\n  <span class=\"hljs-keyword\">const</span> index = <span class=\"hljs-keyword\">await</span> fetch(<span class=\"hljs-string\">'</span></span></span><span class=\"hljs-template-variable\">{{ url('search', {format: 'json'}) }}</span><span class=\"xml\">').then(r =&gt; r.json());\n  const fuse = new Fuse(index, { keys: ['title', 'description', 'content'], threshold: 0.3 });\n  const results = document.getElementById('results');\n\n  document.getElementById('search').addEventListener('input', (e) =&gt; {\n    results.replaceChildren(...fuse.search(e.target.value, { limit: 10 }).map(({ item }) =&gt; {\n      const li = document.createElement('li');\n      const a = document.createElement('a');\n      a.href = item.url;\n      a.textContent = item.title;\n      li.append(a);\n      return li;\n    }));\n  });\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">script</span>&gt;</span></span></code></pre>\n<h2 id=\"alternative-pagefind\">Alternative : Pagefind</h2>\n<p><a href=\"https://pagefind.app\" target=\"_blank\" rel=\"noopener noreferrer\">Pagefind</a> indexe directement les fichiers HTML générés : aucun template JSON n’est nécessaire. Lancez-le après le build, sur le répertoire de sortie (<code translate=\"no\">_site</code> par défaut) :</p>\n<pre><code class=\"language-bash hljs bash\" translate=\"no\">php cecil.phar build\nnpx pagefind --site _site</code></pre>\n<p>Chargez ensuite son interface dans un template :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">\"/pagefind/pagefind-ui.css\"</span> <span class=\"hljs-attr\">rel</span>=<span class=\"hljs-string\">\"stylesheet\"</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script</span> <span class=\"hljs-attr\">src</span>=<span class=\"hljs-string\">\"/pagefind/pagefind-ui.js\"</span>&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">script</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"search\"</span>&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">div</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script</span>&gt;</span><span class=\"javascript\">\n  <span class=\"hljs-built_in\">window</span>.addEventListener(<span class=\"hljs-string\">'DOMContentLoaded'</span>, () =&gt; <span class=\"hljs-keyword\">new</span> PagefindUI({ <span class=\"hljs-attr\">element</span>: <span class=\"hljs-string\">'#search'</span> }));\n</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">script</span>&gt;</span></span></code></pre>\n<aside class=\"note note-tip\"><p>L’index est une page comme les autres : pour ne régénérer que les sorties JSON, déclarez un <a href=\"/documentation/configuration/#pages-subsets\">sous-ensemble</a> et lancez <code translate=\"no\">php cecil.phar build --render-subset=&lt;name&gt;</code>.</p></aside>",
      "language": "fr"
    },
    {
      "id": "https://cecil-945.pages.dev/fr/comment-faire/deploiement-github-pages/",
      "url": "https://cecil-945.pages.dev/fr/comment-faire/deploiement-github-pages/",
      "title": "Déployer sur GitHub Pages avec GitHub Actions",
      "summary": "Générer et déployer automatiquement un site Cecil sur GitHub Pages avec la GitHub Action de Cecil.",
      "date_published": "2026-10-07T00:00:00+00:00","content_text": "Avec la Cecil Action, chaque push sur votre dépôt génère le site et le publie sur GitHub Pages, sans serveur à gérer.\nActiver GitHub Pages\nDans votre dépôt, allez dans Settings → Pages puis, dans Build and deployment, choisissez GitHub Actions comme Source.\nAjouter le workflow\nCréez le fichier .github\/workflows\/build-and-deploy.yml :\nname: Build and deploy to GitHub Pages\non:\n  push:\n    branches: [master, main]\n  workflow_dispatch:\nconcurrency:\n  group: pages\n  cancel-in-progress: true\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout source\n        uses: actions\/checkout@v6\n      - name: Build site\n        uses: Cecilapp\/Cecil-Action@v4\n  deploy:\n    needs: build\n    permissions:\n      pages: write\n      id-token: write\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    runs-on: ubuntu-latest\n    steps:\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions\/deploy-pages@v5\nLe job build télécharge Cecil, installe les thèmes (si un fichier composer.json existe), génère le site et envoie le répertoire de sortie en tant qu’artefact Pages. Le job deploy le publie ensuite.\nURL de base\nInutile de modifier baseurl dans cecil.yml : l’action génère le site avec l’URL fournie par GitHub Pages (par exemple https:\/\/&lt;user&gt;.github.io\/&lt;repository&gt;\/), via l’option --baseurl.\nPersonnaliser la génération\nL’action accepte les paramètres optionnels suivants :\n      - name: Build site\n        uses: Cecilapp\/Cecil-Action@v4\n        with:\n          version: '9.6.2'       # version de Cecil (la dernière par défaut)\n          install_themes: 'no'   # ne pas installer les thèmes (`yes` par défaut)\n          options: '-v --drafts' # options de la commande build (`-v` par défaut)\nPour accélérer la génération, vous pouvez aussi restaurer et sauvegarder le répertoire .cache entre deux exécutions : consultez le workflow complet dans la documentation du déploiement sur GitHub Pages, ainsi que la liste des options de build.",
      "content_html": "<p>Avec la <a href=\"https://github.com/Cecilapp/Cecil-Action\" target=\"_blank\" rel=\"noopener noreferrer\">Cecil Action</a>, chaque push sur votre dépôt génère le site et le publie sur <strong>GitHub Pages</strong>, sans serveur à gérer.</p>\n<h2 id=\"activer-github-pages\">Activer GitHub Pages</h2>\n<p>Dans votre dépôt, allez dans <strong>Settings</strong> → <strong>Pages</strong> puis, dans <strong>Build and deployment</strong>, choisissez <strong>GitHub Actions</strong> comme <strong>Source</strong>.</p>\n<h2 id=\"ajouter-le-workflow\">Ajouter le workflow</h2>\n<p>Créez le fichier <code translate=\"no\">.github/workflows/build-and-deploy.yml</code> :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-attr\">name:</span> <span class=\"hljs-string\">Build</span> <span class=\"hljs-string\">and</span> <span class=\"hljs-string\">deploy</span> <span class=\"hljs-string\">to</span> <span class=\"hljs-string\">GitHub</span> <span class=\"hljs-string\">Pages</span>\n<span class=\"hljs-attr\">on:</span>\n  <span class=\"hljs-attr\">push:</span>\n    <span class=\"hljs-attr\">branches:</span> <span class=\"hljs-string\">[master,</span> <span class=\"hljs-string\">main]</span>\n  <span class=\"hljs-attr\">workflow_dispatch:</span>\n<span class=\"hljs-attr\">concurrency:</span>\n  <span class=\"hljs-attr\">group:</span> <span class=\"hljs-string\">pages</span>\n  <span class=\"hljs-attr\">cancel-in-progress:</span> <span class=\"hljs-literal\">true</span>\n<span class=\"hljs-attr\">jobs:</span>\n  <span class=\"hljs-attr\">build:</span>\n    <span class=\"hljs-attr\">runs-on:</span> <span class=\"hljs-string\">ubuntu-latest</span>\n    <span class=\"hljs-attr\">steps:</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-attr\">name:</span> <span class=\"hljs-string\">Checkout</span> <span class=\"hljs-string\">source</span>\n        <span class=\"hljs-attr\">uses:</span> <span class=\"hljs-string\">actions/checkout@v6</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-attr\">name:</span> <span class=\"hljs-string\">Build</span> <span class=\"hljs-string\">site</span>\n        <span class=\"hljs-attr\">uses:</span> <span class=\"hljs-string\">Cecilapp/Cecil-Action@v4</span>\n  <span class=\"hljs-attr\">deploy:</span>\n    <span class=\"hljs-attr\">needs:</span> <span class=\"hljs-string\">build</span>\n    <span class=\"hljs-attr\">permissions:</span>\n      <span class=\"hljs-attr\">pages:</span> <span class=\"hljs-string\">write</span>\n      <span class=\"hljs-attr\">id-token:</span> <span class=\"hljs-string\">write</span>\n    <span class=\"hljs-attr\">environment:</span>\n      <span class=\"hljs-attr\">name:</span> <span class=\"hljs-string\">github-pages</span>\n      <span class=\"hljs-attr\">url:</span> <span class=\"hljs-string\">${{</span> <span class=\"hljs-string\">steps.deployment.outputs.page_url</span> <span class=\"hljs-string\">}}</span>\n    <span class=\"hljs-attr\">runs-on:</span> <span class=\"hljs-string\">ubuntu-latest</span>\n    <span class=\"hljs-attr\">steps:</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-attr\">name:</span> <span class=\"hljs-string\">Deploy</span> <span class=\"hljs-string\">to</span> <span class=\"hljs-string\">GitHub</span> <span class=\"hljs-string\">Pages</span>\n        <span class=\"hljs-attr\">id:</span> <span class=\"hljs-string\">deployment</span>\n        <span class=\"hljs-attr\">uses:</span> <span class=\"hljs-string\">actions/deploy-pages@v5</span></code></pre>\n<p>Le job <code translate=\"no\">build</code> télécharge Cecil, installe les thèmes (si un fichier <code translate=\"no\">composer.json</code> existe), génère le site et envoie le répertoire de sortie en tant qu’artefact Pages. Le job <code translate=\"no\">deploy</code> le publie ensuite.</p>\n<h2 id=\"url-de-base\">URL de base</h2>\n<p>Inutile de modifier <code translate=\"no\">baseurl</code> dans <code translate=\"no\">cecil.yml</code> : l’action génère le site avec l’URL fournie par GitHub Pages (par exemple <code translate=\"no\">https://&lt;user&gt;.github.io/&lt;repository&gt;/</code>), via l’option <code translate=\"no\">--baseurl</code>.</p>\n<h2 id=\"personnaliser-la-generation\">Personnaliser la génération</h2>\n<p>L’action accepte les paramètres optionnels suivants :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\">      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-attr\">name:</span> <span class=\"hljs-string\">Build</span> <span class=\"hljs-string\">site</span>\n        <span class=\"hljs-attr\">uses:</span> <span class=\"hljs-string\">Cecilapp/Cecil-Action@v4</span>\n        <span class=\"hljs-attr\">with:</span>\n          <span class=\"hljs-attr\">version:</span> <span class=\"hljs-string\">'9.6.2'</span>       <span class=\"hljs-comment\"># version de Cecil (la dernière par défaut)</span>\n          <span class=\"hljs-attr\">install_themes:</span> <span class=\"hljs-string\">'no'</span>   <span class=\"hljs-comment\"># ne pas installer les thèmes (`yes` par défaut)</span>\n          <span class=\"hljs-attr\">options:</span> <span class=\"hljs-string\">'-v --drafts'</span> <span class=\"hljs-comment\"># options de la commande build (`-v` par défaut)</span></code></pre>\n<aside class=\"note note-tip\"><p>Pour accélérer la génération, vous pouvez aussi restaurer et sauvegarder le répertoire <code translate=\"no\">.cache</code> entre deux exécutions : consultez le workflow complet dans la <a href=\"/documentation/deploy/#github-pages\">documentation du déploiement sur GitHub Pages</a>, ainsi que la liste des <a href=\"/documentation/commands/#build\">options de build</a>.</p></aside>",
      "language": "fr"
    },
    {
      "id": "https://cecil-945.pages.dev/fr/comment-faire/sortie-flux-rss-json/",
      "url": "https://cecil-945.pages.dev/fr/comment-faire/sortie-flux-rss-json/",
      "title": "Publier un flux RSS ou JSON",
      "summary": "Publier des flux RSS, Atom ou JSON de votre site Cecil avec les formats de sortie et les templates intégrés.",
      "date_published": "2026-10-06T00:00:00+00:00","content_text": "Cecil génère les flux grâce aux formats de sortie : par défaut, la page d’accueil, les sections et les termes de taxonomie sont déjà publiés en HTML et en Atom (ex. \/atom.xml, \/blog\/atom.xml). Ajoutez les formats rss ou jsonfeed pour publier aussi des fichiers RSS 2.0 ou JSON Feed.\nActiver les flux pour toutes les pages de liste\nDéfinissez les formats appliqués à chaque type de page avec output.pagetypeformats :\noutput:\n  pagetypeformats:\n    homepage: [html, atom, rss, jsonfeed]\n    section: [html, atom, rss, jsonfeed]\nCecil génère alors rss.xml et feed.json à côté de chaque index.html de la page d’accueil et des sections (ex. \/blog\/rss.xml, \/blog\/feed.json).\nLes formats sont remplacés, pas fusionnés : conservez html dans la liste. Voir output.pagetypeformats et la liste des formats par défaut.\nActiver un flux pour une seule section\nPour publier un flux pour une seule section, utilisez la variable output dans le front matter de la page d’index de la section :\n---\ntitle: Blog\noutput: [html, rss]\n---\nSignaler le flux\nSi vos templates incluent le partial metatags, les balises &lt;link rel=\"alternate\"&gt; pointant vers les flux de la page courante sont ajoutées automatiquement dans le &lt;head&gt;.\nSinon, ajoutez le lien vous-même avec la fonction url() et son option format :\n&lt;link rel=\"alternate\" type=\"application\/rss+xml\" title=\"{{ site.title }}\" href=\"{{ url(page, {canonical: true, format: 'rss'}) }}\"&gt;\nPersonnaliser le template du flux\nLes flux sont générés par les templates intégrés _default\/list.rss.twig, _default\/list.atom.twig et _default\/list.jsonfeed.twig. Selon les règles de recherche, créez layouts\/list.rss.twig (toutes les pages de liste) ou layouts\/blog\/list.rss.twig (section blog uniquement) pour les surcharger.\nVous pouvez étendre le template intégré et redéfinir uniquement le bloc item, par exemple pour publier un extrait plutôt que le contenu complet :\n{% extends '_default\/list.rss.twig' %}\n\n{% block item %}\n      &lt;guid&gt;{{ url(item, {canonical: true}) }}&lt;\/guid&gt;\n      &lt;title&gt;{{ item.title|e }}&lt;\/title&gt;\n      &lt;pubDate&gt;{{ item.date|date('r') }}&lt;\/pubDate&gt;\n      &lt;link&gt;{{ url(item, {canonical: true}) }}&lt;\/link&gt;\n      &lt;description&gt;&lt;![CDATA[{{ item.content|excerpt_html }}]]&gt;&lt;\/description&gt;\n{% endblock %}\nDéfinissez baseurl dans cecil.yml : les flux utilisent des URL absolues.\nLe flux RSS peut aussi être mis en forme dans les navigateurs en activant la page par défaut xsl\/rss :\npages:\n  default:\n    xsl\/rss:\n      published: true",
      "content_html": "<p>Cecil génère les flux grâce aux <strong>formats de sortie</strong> : par défaut, la page d’accueil, les sections et les termes de taxonomie sont déjà publiés en HTML <strong>et en Atom</strong> (ex. <code translate=\"no\">/atom.xml</code>, <code translate=\"no\">/blog/atom.xml</code>). Ajoutez les formats <code translate=\"no\">rss</code> ou <code translate=\"no\">jsonfeed</code> pour publier aussi des fichiers RSS 2.0 ou <a href=\"https://www.jsonfeed.org\" target=\"_blank\" rel=\"noopener noreferrer\">JSON Feed</a>.</p>\n<h2 id=\"activer-les-flux-pour-toutes-les-pages-de-liste\">Activer les flux pour toutes les pages de liste</h2>\n<p>Définissez les formats appliqués à chaque type de page avec <code translate=\"no\">output.pagetypeformats</code> :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-attr\">output:</span>\n  <span class=\"hljs-attr\">pagetypeformats:</span>\n    <span class=\"hljs-attr\">homepage:</span> <span class=\"hljs-string\">[html,</span> <span class=\"hljs-string\">atom,</span> <span class=\"hljs-string\">rss,</span> <span class=\"hljs-string\">jsonfeed]</span>\n    <span class=\"hljs-attr\">section:</span> <span class=\"hljs-string\">[html,</span> <span class=\"hljs-string\">atom,</span> <span class=\"hljs-string\">rss,</span> <span class=\"hljs-string\">jsonfeed]</span></code></pre>\n<p>Cecil génère alors <code translate=\"no\">rss.xml</code> et <code translate=\"no\">feed.json</code> à côté de chaque <code translate=\"no\">index.html</code> de la page d’accueil et des sections (ex. <code translate=\"no\">/blog/rss.xml</code>, <code translate=\"no\">/blog/feed.json</code>).</p>\n<aside class=\"note note-info\"><p>Les formats sont remplacés, pas fusionnés : conservez <code translate=\"no\">html</code> dans la liste. Voir <a href=\"/documentation/configuration/#output-pagetypeformats\"><code translate=\"no\">output.pagetypeformats</code></a> et la liste des <a href=\"/documentation/configuration/#output-formats\">formats par défaut</a>.</p></aside>\n<h2 id=\"activer-un-flux-pour-une-seule-section\">Activer un flux pour une seule section</h2>\n<p>Pour publier un flux pour une seule section, utilisez la variable <a href=\"/documentation/content/#output\"><code translate=\"no\">output</code></a> dans le front matter de la page d’index de la section :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-meta\">---</span>\n<span class=\"hljs-attr\">title:</span> <span class=\"hljs-string\">Blog</span>\n<span class=\"hljs-attr\">output:</span> <span class=\"hljs-string\">[html,</span> <span class=\"hljs-string\">rss]</span>\n<span class=\"hljs-meta\">---</span></code></pre>\n<h2 id=\"signaler-le-flux\">Signaler le flux</h2>\n<p>Si vos templates incluent le <a href=\"/documentation/configuration/#metatags\">partial metatags</a>, les balises <code translate=\"no\">&lt;link rel=\"alternate\"&gt;</code> pointant vers les flux de la page courante sont ajoutées automatiquement dans le <code translate=\"no\">&lt;head&gt;</code>.</p>\n<p>Sinon, ajoutez le lien vous-même avec la fonction <code translate=\"no\">url()</code> et son option <code translate=\"no\">format</code> :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link</span> <span class=\"hljs-attr\">rel</span>=<span class=\"hljs-string\">\"alternate\"</span> <span class=\"hljs-attr\">type</span>=<span class=\"hljs-string\">\"application/rss+xml\"</span> <span class=\"hljs-attr\">title</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ site.title }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ url(page, {canonical: true, format: 'rss'}) }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span>&gt;</span></span></code></pre>\n<h2 id=\"personnaliser-le-template-du-flux\">Personnaliser le template du flux</h2>\n<p>Les flux sont générés par les <a href=\"/documentation/templates/#built-in-templates\">templates intégrés</a> <code translate=\"no\">_default/list.rss.twig</code>, <code translate=\"no\">_default/list.atom.twig</code> et <code translate=\"no\">_default/list.jsonfeed.twig</code>. Selon les <a href=\"/documentation/templates/#lookup-rules\">règles de recherche</a>, créez <code translate=\"no\">layouts/list.rss.twig</code> (toutes les pages de liste) ou <code translate=\"no\">layouts/blog/list.rss.twig</code> (section <code translate=\"no\">blog</code> uniquement) pour les surcharger.</p>\n<p>Vous pouvez étendre le template intégré et redéfinir uniquement le bloc <code translate=\"no\">item</code>, par exemple pour publier un extrait plutôt que le contenu complet :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">extends</span></span> '_default/list.rss.twig' %}</span><span class=\"xml\">\n\n</span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">block</span></span> item %}</span><span class=\"xml\">\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">guid</span>&gt;</span></span><span class=\"hljs-template-variable\">{{ url(item, {canonical: true}) }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">guid</span>&gt;</span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">title</span>&gt;</span></span><span class=\"hljs-template-variable\">{{ item.title|e }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">title</span>&gt;</span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pubDate</span>&gt;</span></span><span class=\"hljs-template-variable\">{{ item.<span class=\"hljs-name\">date</span>|<span class=\"hljs-keyword\">date</span>('r') }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">pubDate</span>&gt;</span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link</span>&gt;</span></span><span class=\"hljs-template-variable\">{{ url(item, {canonical: true}) }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">link</span>&gt;</span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">description</span>&gt;</span>&lt;![CDATA[</span><span class=\"hljs-template-variable\">{{ item.content|excerpt_html }}</span><span class=\"xml\">]]&gt;<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">description</span>&gt;</span>\n</span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endblock</span></span> %}</span></code></pre>\n<aside class=\"note note-tip\"><p>Définissez <a href=\"/documentation/configuration/#baseurl\"><code translate=\"no\">baseurl</code></a> dans <code translate=\"no\">cecil.yml</code> : les flux utilisent des URL absolues.</p>\n<p>Le flux RSS peut aussi être mis en forme dans les navigateurs en activant la <a href=\"/documentation/configuration/#pages-default\">page par défaut</a> <code translate=\"no\">xsl/rss</code> :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-attr\">pages:</span>\n  <span class=\"hljs-attr\">default:</span>\n    <span class=\"hljs-attr\">xsl/rss:</span>\n      <span class=\"hljs-attr\">published:</span> <span class=\"hljs-literal\">true</span></code></pre></aside>",
      "language": "fr"
    },
    {
      "id": "https://cecil-945.pages.dev/fr/comment-faire/templates-pagination/",
      "url": "https://cecil-945.pages.dev/fr/comment-faire/templates-pagination/",
      "title": "Paginer une liste de pages",
      "summary": "Découper les longues listes de pages (blog, sections, taxonomies) en plusieurs pages avec la pagination de Cecil.",
      "date_published": "2026-10-05T00:00:00+00:00","content_text": "Lorsqu’une section contient de nombreuses pages, Cecil peut découper sa liste en plusieurs pages (ex. : \/blog\/, \/blog\/page\/2\/, \/blog\/page\/3\/, etc.) et fournit un paginator pour construire les liens de navigation.\nConfigurer la pagination\nLa pagination est activée par défaut pour les pages de liste (homepage, section et term), avec 5 entrées par page. Modifiez-la dans cecil.yml :\npages:\n  pagination:\n    max: 10    # nombre maximum d’entrées par page\n    path: page # chemin des pages paginées\nLa surcharger pour une section\nDéfinissez la variable pagination dans le front matter du fichier index de la section (ex. : pages\/blog\/index.md) :\n---\ntitle: Blog\npagination:\n  max: 20\n---\nOu désactivez-la pour cette section uniquement :\n---\npagination: false\n---\nAfficher les pages paginées\nDans le template de liste (ex. : layouts\/blog\/list.html.twig), bouclez sur page.paginator.pages et utilisez page.pages lorsque la pagination est désactivée :\n{% for p in page.paginator.pages ?? page.pages %}\n  &lt;article&gt;\n    &lt;h2&gt;&lt;a href=\"{{ url(p) }}\"&gt;{{ p.title }}&lt;\/a&gt;&lt;\/h2&gt;\n    &lt;time datetime=\"{{ p.date|date('c') }}\"&gt;{{ p.date|date('j M Y') }}&lt;\/time&gt;\n  &lt;\/article&gt;\n{% endfor %}\nAjouter les liens de navigation\nLes liens du paginator sont des identifiants de pages : utilisez la fonction url() pour créer des liens fonctionnels :\n{% if page.paginator %}\n&lt;nav&gt;\n  {% if page.paginator.links.prev is defined %}\n  &lt;a href=\"{{ url(page.paginator.links.prev) }}\" rel=\"prev\"&gt;Previous&lt;\/a&gt;\n  {% endif %}\n  &lt;span&gt;Page {{ page.paginator.current }} of {{ page.paginator.count }}&lt;\/span&gt;\n  {% if page.paginator.links.next is defined %}\n  &lt;a href=\"{{ url(page.paginator.links.next) }}\" rel=\"next\"&gt;Next&lt;\/a&gt;\n  {% endif %}\n&lt;\/nav&gt;\n{% endif %}\nPour lister tous les numéros de page, itérez de 1 à page.paginator.count :\n{% if page.paginator %}\n&lt;nav&gt;\n  {% for i in 1..page.paginator.count %}\n    {% if i == page.paginator.current %}\n  &lt;span aria-current=\"page\"&gt;{{ i }}&lt;\/span&gt;\n    {% elseif i == 1 %}\n  &lt;a href=\"{{ url(page.paginator.links.first) }}\"&gt;{{ i }}&lt;\/a&gt;\n    {% else %}\n  &lt;a href=\"{{ url(page.paginator.links.path ~ '\/' ~ i) }}\"&gt;{{ i }}&lt;\/a&gt;\n    {% endif %}\n  {% endfor %}\n&lt;\/nav&gt;\n{% endif %}\nConsultez la documentation de la variable page.paginator, de la configuration de la pagination et de la variable pagination des sections.",
      "content_html": "<p>Lorsqu’une section contient de nombreuses pages, Cecil peut découper sa liste en plusieurs pages (ex. : <code translate=\"no\">/blog/</code>, <code translate=\"no\">/blog/page/2/</code>, <code translate=\"no\">/blog/page/3/</code>, etc.) et fournit un <em>paginator</em> pour construire les liens de navigation.</p>\n<h2 id=\"configurer-la-pagination\">Configurer la pagination</h2>\n<p>La pagination est activée par défaut pour les pages de liste (<em>homepage</em>, <em>section</em> et <em>term</em>), avec 5 entrées par page. Modifiez-la dans <code translate=\"no\">cecil.yml</code> :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-attr\">pages:</span>\n  <span class=\"hljs-attr\">pagination:</span>\n    <span class=\"hljs-attr\">max:</span> <span class=\"hljs-number\">10</span>    <span class=\"hljs-comment\"># nombre maximum d’entrées par page</span>\n    <span class=\"hljs-attr\">path:</span> <span class=\"hljs-string\">page</span> <span class=\"hljs-comment\"># chemin des pages paginées</span></code></pre>\n<h2 id=\"la-surcharger-pour-une-section\">La surcharger pour une section</h2>\n<p>Définissez la variable <code translate=\"no\">pagination</code> dans le front matter du fichier index de la section (ex. : <code translate=\"no\">pages/blog/index.md</code>) :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-meta\">---</span>\n<span class=\"hljs-attr\">title:</span> <span class=\"hljs-string\">Blog</span>\n<span class=\"hljs-attr\">pagination:</span>\n  <span class=\"hljs-attr\">max:</span> <span class=\"hljs-number\">20</span>\n<span class=\"hljs-meta\">---</span></code></pre>\n<p>Ou désactivez-la pour cette section uniquement :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-meta\">---</span>\n<span class=\"hljs-attr\">pagination:</span> <span class=\"hljs-literal\">false</span>\n<span class=\"hljs-meta\">---</span></code></pre>\n<h2 id=\"afficher-les-pages-paginees\">Afficher les pages paginées</h2>\n<p>Dans le template de liste (ex. : <code translate=\"no\">layouts/blog/list.html.twig</code>), bouclez sur <code translate=\"no\">page.paginator.pages</code> et utilisez <code translate=\"no\">page.pages</code> lorsque la pagination est désactivée :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">for</span></span> p in page.paginator.pages ?? page.pages %}</span><span class=\"xml\">\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">article</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h2</span>&gt;</span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ url(p) }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span>&gt;</span></span><span class=\"hljs-template-variable\">{{ p.title }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">a</span>&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">h2</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">time</span> <span class=\"hljs-attr\">datetime</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ p.<span class=\"hljs-name\">date</span>|<span class=\"hljs-keyword\">date</span>('c') }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span>&gt;</span></span><span class=\"hljs-template-variable\">{{ p.<span class=\"hljs-name\">date</span>|<span class=\"hljs-keyword\">date</span>('j M Y') }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">time</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">article</span>&gt;</span>\n</span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endfor</span></span> %}</span></code></pre>\n<h2 id=\"ajouter-les-liens-de-navigation\">Ajouter les liens de navigation</h2>\n<p>Les liens du paginator sont des identifiants de pages : utilisez la fonction <code translate=\"no\">url()</code> pour créer des liens fonctionnels :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">if</span></span> page.paginator %}</span><span class=\"xml\">\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">nav</span>&gt;</span>\n  </span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">if</span></span> page.paginator.links.prev is defined %}</span><span class=\"xml\">\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ url(page.paginator.links.prev) }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span> <span class=\"hljs-attr\">rel</span>=<span class=\"hljs-string\">\"prev\"</span>&gt;</span>Previous<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">a</span>&gt;</span>\n  </span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endif</span></span> %}</span><span class=\"xml\">\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">span</span>&gt;</span>Page </span><span class=\"hljs-template-variable\">{{ page.paginator.current }}</span><span class=\"xml\"> of </span><span class=\"hljs-template-variable\">{{ page.paginator.count }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">span</span>&gt;</span>\n  </span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">if</span></span> page.paginator.links.next is defined %}</span><span class=\"xml\">\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ url(page.paginator.links.next) }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span> <span class=\"hljs-attr\">rel</span>=<span class=\"hljs-string\">\"next\"</span>&gt;</span>Next<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">a</span>&gt;</span>\n  </span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endif</span></span> %}</span><span class=\"xml\">\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">nav</span>&gt;</span>\n</span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endif</span></span> %}</span></code></pre>\n<p>Pour lister tous les numéros de page, itérez de <code translate=\"no\">1</code> à <code translate=\"no\">page.paginator.count</code> :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">if</span></span> page.paginator %}</span><span class=\"xml\">\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">nav</span>&gt;</span>\n  </span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">for</span></span> i in 1..page.paginator.count %}</span><span class=\"xml\">\n    </span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">if</span></span> i == page.paginator.current %}</span><span class=\"xml\">\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">span</span> <span class=\"hljs-attr\">aria-current</span>=<span class=\"hljs-string\">\"page\"</span>&gt;</span></span><span class=\"hljs-template-variable\">{{ i }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">span</span>&gt;</span>\n    </span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\">elseif</span> i == 1 %}</span><span class=\"xml\">\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ url(page.paginator.links.first) }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span>&gt;</span></span><span class=\"hljs-template-variable\">{{ i }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">a</span>&gt;</span>\n    </span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\">else</span> %}</span><span class=\"xml\">\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ url(page.paginator.links.path ~ '/' ~ i) }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span>&gt;</span></span><span class=\"hljs-template-variable\">{{ i }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">a</span>&gt;</span>\n    </span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endif</span></span> %}</span><span class=\"xml\">\n  </span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endfor</span></span> %}</span><span class=\"xml\">\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">nav</span>&gt;</span>\n</span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endif</span></span> %}</span></code></pre>\n<aside class=\"note note-info\"><p>Consultez la documentation de la <a href=\"/documentation/templates/#page\">variable <code translate=\"no\">page.paginator</code></a>, de la <a href=\"/documentation/configuration/#pages-pagination\">configuration de la pagination</a> et de la <a href=\"/documentation/content/#section\">variable <code translate=\"no\">pagination</code> des sections</a>.</p></aside>",
      "language": "fr"
    },
    {
      "id": "https://cecil-945.pages.dev/fr/comment-faire/contenu-multilingue/",
      "url": "https://cecil-945.pages.dev/fr/comment-faire/contenu-multilingue/",
      "title": "Traduire un site en plusieurs langues",
      "summary": "Traduire les pages, la configuration et les textes des templates d’un site Cecil en plusieurs langues.",
      "date_published": "2026-10-04T00:00:00+00:00","content_text": "Cecil gère nativement les sites multilingues : il suffit de déclarer les langues, d’ajouter les pages traduites, puis de les relier entre elles et de traduire les templates.\nDéclarer les langues\nDéfinissez la langue principale et la liste des langues disponibles dans cecil.yml :\nlanguage: en\nlanguages:\n  - code: en\n    name: English\n    locale: en_US\n  - code: fr\n    name: Français\n    locale: fr_FR\n    config:\n      title: \"Mon site en français\"\nLes options placées sous la clé config d’une langue remplacent les options globales (ici le title du site).\nTraduire une page\nDupliquez la page de référence et suffixez son nom de fichier avec le code de la langue :\npages\/\n├─ about.md    # la page de référence\n└─ about.fr.md # la version française\nUtilisez la variable slug pour traduire l’URL de la page :\n---\ntitle: À propos\nslug: a-propos\n---\nabout.md est publiée sur \/about\/ et about.fr.md sur \/fr\/a-propos\/.\nPour créer une page qui n’existe que dans une autre langue (sans être une traduction), définissez language: fr dans son front matter.\nRelier les pages traduites\nChaque page expose ses traductions via page.translations. Ajoutez un sélecteur de langue à votre template :\n{% for p in page.translations %}\n  &lt;a href=\"{{ url(p) }}\" hreflang=\"{{ p.language }}\"&gt;{{ site.language.name(p.language) }}&lt;\/a&gt;\n{% endfor %}\nVous pouvez aussi inclure le partial intégré : {{ include('partials\/languages.html.twig') }}.\nTraduire les textes des templates\nEncadrez les textes avec le tag ou le filtre trans :\n{% trans %}Read more{% endtrans %}\n{{ 'Read more'|trans }}\nAjoutez ensuite un fichier de traduction nommé d’après la locale de la langue dans le dossier translations :\n# translations\/messages.fr_FR.yaml\nRead more: Lire la suite\nExtrayez les textes de vos templates avec :\nphp cecil.phar util:translations:extract --locale=fr_FR --save\nConsultez la documentation du contenu multilingue, de la configuration des langues et de la localisation des templates.",
      "content_html": "<p>Cecil gère nativement les sites multilingues : il suffit de déclarer les langues, d’ajouter les pages traduites, puis de les relier entre elles et de traduire les templates.</p>\n<h2 id=\"declarer-les-langues\">Déclarer les langues</h2>\n<p>Définissez la langue principale et la liste des langues disponibles dans <code translate=\"no\">cecil.yml</code> :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-attr\">language:</span> <span class=\"hljs-string\">en</span>\n<span class=\"hljs-attr\">languages:</span>\n  <span class=\"hljs-bullet\">-</span> <span class=\"hljs-attr\">code:</span> <span class=\"hljs-string\">en</span>\n    <span class=\"hljs-attr\">name:</span> <span class=\"hljs-string\">English</span>\n    <span class=\"hljs-attr\">locale:</span> <span class=\"hljs-string\">en_US</span>\n  <span class=\"hljs-bullet\">-</span> <span class=\"hljs-attr\">code:</span> <span class=\"hljs-string\">fr</span>\n    <span class=\"hljs-attr\">name:</span> <span class=\"hljs-string\">Français</span>\n    <span class=\"hljs-attr\">locale:</span> <span class=\"hljs-string\">fr_FR</span>\n    <span class=\"hljs-attr\">config:</span>\n      <span class=\"hljs-attr\">title:</span> <span class=\"hljs-string\">\"Mon site en français\"</span></code></pre>\n<p>Les options placées sous la clé <code translate=\"no\">config</code> d’une langue remplacent les options globales (ici le <code translate=\"no\">title</code> du site).</p>\n<h2 id=\"traduire-une-page\">Traduire une page</h2>\n<p>Dupliquez la page de référence et suffixez son nom de fichier avec le code de la langue :</p>\n<pre><code class=\"language-plaintext hljs plaintext\" translate=\"no\">pages/\n├─ about.md    # la page de référence\n└─ about.fr.md # la version française</code></pre>\n<p>Utilisez la variable <code translate=\"no\">slug</code> pour traduire l’URL de la page :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-meta\">---</span>\n<span class=\"hljs-attr\">title:</span> <span class=\"hljs-string\">À</span> <span class=\"hljs-string\">propos</span>\n<span class=\"hljs-attr\">slug:</span> <span class=\"hljs-string\">a-propos</span>\n<span class=\"hljs-meta\">---</span></code></pre>\n<p><code translate=\"no\">about.md</code> est publiée sur <code translate=\"no\">/about/</code> et <code translate=\"no\">about.fr.md</code> sur <code translate=\"no\">/fr/a-propos/</code>.</p>\n<aside class=\"note note-tip\"><p>Pour créer une page qui n’existe que dans une autre langue (sans être une traduction), définissez <code translate=\"no\">language: fr</code> dans son front matter.</p></aside>\n<h2 id=\"relier-les-pages-traduites\">Relier les pages traduites</h2>\n<p>Chaque page expose ses traductions via <code translate=\"no\">page.translations</code>. Ajoutez un sélecteur de langue à votre template :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">for</span></span> p in page.translations %}</span><span class=\"xml\">\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ url(p) }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span> <span class=\"hljs-attr\">hreflang</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ p.language }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span>&gt;</span></span><span class=\"hljs-template-variable\">{{ site.language.name(p.language) }}</span><span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">a</span>&gt;</span>\n</span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\"><span class=\"hljs-keyword\">endfor</span></span> %}</span></code></pre>\n<p>Vous pouvez aussi inclure le partial intégré : <code translate=\"no\">{{ include('partials/languages.html.twig') }}</code>.</p>\n<h2 id=\"traduire-les-textes-des-templates\">Traduire les textes des templates</h2>\n<p>Encadrez les textes avec le tag ou le filtre <code translate=\"no\">trans</code> :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\">trans</span> %}</span><span class=\"xml\">Read more</span><span class=\"hljs-template-tag\">{% <span class=\"hljs-name\">endtrans</span> %}</span><span class=\"xml\">\n</span><span class=\"hljs-template-variable\">{{ 'Read more'|trans }}</span></code></pre>\n<p>Ajoutez ensuite un fichier de traduction nommé d’après la locale de la langue dans le dossier <code translate=\"no\">translations</code> :</p>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-comment\"># translations/messages.fr_FR.yaml</span>\n<span class=\"hljs-attr\">Read more:</span> <span class=\"hljs-string\">Lire</span> <span class=\"hljs-string\">la</span> <span class=\"hljs-string\">suite</span></code></pre>\n<p>Extrayez les textes de vos templates avec :</p>\n<pre><code class=\"language-bash hljs bash\" translate=\"no\">php cecil.phar util:translations:extract --locale=fr_FR --save</code></pre>\n<aside class=\"note note-info\"><p>Consultez la documentation du <a href=\"/documentation/content/#multilingual\">contenu multilingue</a>, de la <a href=\"/documentation/configuration/#languages\">configuration des langues</a> et de la <a href=\"/documentation/templates/#localization\">localisation des templates</a>.</p></aside>",
      "language": "fr"
    },
    {
      "id": "https://cecil-945.pages.dev/fr/comment-faire/templates-metatags/",
      "url": "https://cecil-945.pages.dev/fr/comment-faire/templates-metatags/",
      "title": "Appliquer les fonctionnalités SEO dans les templates",
      "summary": "Ajouter les fonctionnalités SEO de Cecil aux templates avec le partial metatags.",
      "date_published": "2026-06-09T00:00:00+00:00","content_text": "Cecil expose sa feature SEO via le template partials\/metatags.html.twig. Il suffit de l’inclure dans le &lt;head&gt; du template de base pour que chaque page bénéficie automatiquement des balises meta, des liens canoniques, des cartes sociales et des données structurées.\n&lt;html lang=\"{{ site.language }}\"&gt;\n  &lt;head&gt;\n    &lt;meta charset=\"utf-8\"&gt;\n    {{ include('partials\/metatags.html.twig') }}\n  &lt;\/head&gt;\n  &lt;body&gt;\n    ...\n  &lt;\/body&gt;\n&lt;\/html&gt;\nLe partial lit d’abord le front matter de la page, puis reprend les options du site si nécessaire. Consultez la documentation de configuration des metatags pour voir toutes les options disponibles.\nSi vous devez surcharger le titre ou l’image, passez des valeurs directement au partial :\n{{ include('partials\/metatags.html.twig', {title: 'Custom title', image: og_image}) }}",
      "content_html": "<p>Cecil expose sa feature SEO via le template <code translate=\"no\">partials/metatags.html.twig</code>. Il suffit de l’inclure dans le <code translate=\"no\">&lt;head&gt;</code> du template de base pour que chaque page bénéficie automatiquement <strong>des balises meta, des liens canoniques, des cartes sociales et des données structurées</strong>.</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">html</span> <span class=\"hljs-attr\">lang</span>=<span class=\"hljs-string\">\"</span></span></span><span class=\"hljs-template-variable\">{{ site.language }}</span><span class=\"xml\"><span class=\"hljs-tag\"><span class=\"hljs-string\">\"</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">head</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">charset</span>=<span class=\"hljs-string\">\"utf-8\"</span>&gt;</span>\n    </span><span class=\"hljs-template-variable\">{{ <span class=\"hljs-name\">include</span><span class=\"hljs-params\">('partials/metatags.html.twig')</span> }}</span><span class=\"xml\">\n  <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">head</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body</span>&gt;</span>\n    ...\n  <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">body</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">html</span>&gt;</span></span></code></pre>\n<p>Le partial lit d’abord le front matter de la page, puis reprend les options du site si nécessaire. Consultez la <a href=\"/documentation/configuration/#metatags\">documentation de configuration des metatags</a> pour voir toutes les options disponibles.</p>\n<p>Si vous devez surcharger le titre ou l’image, passez des valeurs directement au partial :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-variable\">{{ <span class=\"hljs-name\">include</span><span class=\"hljs-params\">('partials/metatags.html.twig', {title: 'Custom title', image: og_image})</span> }}</span></code></pre>",
      "language": "fr"
    },
    {
      "id": "https://cecil-945.pages.dev/fr/comment-faire/markdown-performance-images/",
      "url": "https://cecil-945.pages.dev/fr/comment-faire/markdown-performance-images/",
      "title": "Optimiser les images dans Markdown",
      "summary": "Optimiser les images Markdown dans Cecil avec tailles responsives, formats et chargement différé.",
      "date_published": "2025-07-25T00:00:00+00:00","content_text": "L'optimisation des images est l'un des moyens les plus efficaces d'améliorer les performances de votre site web.\nCecil gère automatiquement les optimisations suivantes pour les images Markdown :\n\nDimensions : Les dimensions des images sont définies pour garantir une mise en page correcte et éviter les décalages.\nCompression : L'image est compressée pour réduire la taille du fichier sans perte significative de qualité.\nFormats d'image : Cecil génère les formats AVIF et WebP pour l'image.\nImages responsives : Cecil génère deux tailles d'image différentes (selon la configuration) pour s'adapter à la taille des différents appareils.\nChargement différé : L'image est configurée pour se charger de manière différée, c'est-à-dire uniquement lorsqu'elle apparaît dans la fenêtre d'affichage.\nDécodage : Le décodage de l'image est configuré pour être asynchrone, ce qui améliore le temps de chargement initial de la page.\nEspace réservé : Un espace réservé de couleur est utilisé pendant le chargement de l'image.\n\nConsultez la documentation pour plus de détails sur la configuration des ressources globales et la configuration des pages.\nExemple\nCi-dessous un exemple avec une image PNG 1920x1276 pixels.\n![Une région de formation d’étoiles dans le ciel](..\/..\/assets\/arnaud-girault-IjEtFjxXweE-unsplash.jpg \"Photo de Arnaud Girault\"){placeholder=color}\n\n\n\n\n\n\nPhoto de Arnaud Girault\n\nConfiguration\n# configuration globale des assets\nassets:\n  images:\n    optimize: true\n    responsive:\n      widths: [768, 1024]\n# configuration des images dans du Markdown\npages:\n  body:\n    images:\n      formats: [avif, webp]\n      responsive: true\n      lazy: true\n      decoding: true\n      placeholder: color\nHTML généré\n&lt;picture&gt;\n  &lt;source\n    type=\"image\/avif\"\n    srcset=\"\/thumbnails\/1024\/arnaud-girault-IjEtFjxXweE-unsplash.c0bdd31264ac3d0d364d02bced31038f.avif 1024w,\n            \/thumbnails\/768\/arnaud-girault-IjEtFjxXweE-unsplash.c0bdd31264ac3d0d364d02bced31038f.avif 768w\"\n    sizes=\"100vw\"\n    width=\"1024\"\n    height=\"681\"\n  &gt;\n  &lt;source\n    type=\"image\/webp\"\n    srcset=\"\/thumbnails\/1024\/arnaud-girault-IjEtFjxXweE-unsplash.c0bdd31264ac3d0d364d02bced31038f.webp 1024w,\n            \/thumbnails\/768\/arnaud-girault-IjEtFjxXweE-unsplash.c0bdd31264ac3d0d364d02bced31038f.webp 768w\"\n    sizes=\"100vw\"\n    width=\"1024\"\n    height=\"681\"\n  &gt;\n  &lt;img src=\"\/thumbnails\/1024\/arnaud-girault-IjEtFjxXweE-unsplash.c0bdd31264ac3d0d364d02bced31038f.jpg\"\n    alt=\"Photo de Arnaud Girault\"\n    loading=\"lazy\"\n    decoding=\"async\"\n    width=\"1024\"\n    height=\"681\"\n    style=\";max-width:100%;height:auto;background-color:rgb(58, 56, 44);\"\n    srcset=\"\/thumbnails\/1024\/arnaud-girault-IjEtFjxXweE-unsplash.c0bdd31264ac3d0d364d02bced31038f.jpg 1024w,\n            \/thumbnails\/768\/arnaud-girault-IjEtFjxXweE-unsplash.c0bdd31264ac3d0d364d02bced31038f.jpg 768w\"\n    sizes=\"100vw\"\n  &gt;\n&lt;\/picture&gt;",
      "content_html": "<p>L'optimisation des images est l'un des moyens les plus efficaces d'améliorer les performances de votre site web.</p>\n<p>Cecil gère automatiquement les optimisations suivantes pour les images Markdown :</p>\n<ol>\n<li><strong>Dimensions</strong> : Les dimensions des images sont définies pour garantir une mise en page correcte et éviter les décalages.</li>\n<li><strong>Compression</strong> : L'image est compressée pour réduire la taille du fichier sans perte significative de qualité.</li>\n<li><strong>Formats d'image</strong> : Cecil génère les formats AVIF et WebP pour l'image.</li>\n<li><strong>Images responsives</strong> : Cecil génère deux tailles d'image différentes (selon la configuration) pour s'adapter à la taille des différents appareils.</li>\n<li><strong>Chargement différé</strong> : L'image est configurée pour se charger de manière différée, c'est-à-dire uniquement lorsqu'elle apparaît dans la fenêtre d'affichage.</li>\n<li><strong>Décodage</strong> : Le décodage de l'image est configuré pour être asynchrone, ce qui améliore le temps de chargement initial de la page.</li>\n<li><strong>Espace réservé</strong> : Un espace réservé de couleur est utilisé pendant le chargement de l'image.</li>\n</ol>\n<aside class=\"note note-info\"><p>Consultez la documentation pour plus de détails sur la <a href=\"/documentation/configuration/#assets-images\">configuration des ressources globales</a> et la <a href=\"/documentation/configuration/#pages-body\">configuration des pages</a>.</p></aside>\n<h2 id=\"exemple\">Exemple</h2>\n<p>Ci-dessous un exemple avec une image PNG 1920x1276 pixels.</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"xml\">![Une région de formation d’étoiles dans le ciel](../../assets/arnaud-girault-IjEtFjxXweE-unsplash.jpg \"Photo de Arnaud Girault\"){placeholder=color}</span></code></pre>\n<figure>\n<picture title=\"Photo de Arnaud Girault\">\n<source type=\"image/avif\" srcset=\"/thumbnails/480x/images/examples/arnaud-girault-IjEtFjxXweE-unsplash.9f9b5448197aded5325854d4f3c79652.avif 480w, /thumbnails/768x/images/examples/arnaud-girault-IjEtFjxXweE-unsplash.9f9b5448197aded5325854d4f3c79652.avif 768w, /thumbnails/1024x/images/examples/arnaud-girault-IjEtFjxXweE-unsplash.9f9b5448197aded5325854d4f3c79652.avif 1024w\" width=\"1024\" height=\"681\" sizes=\"100vw\">\n<source type=\"image/webp\" srcset=\"/thumbnails/480x/images/examples/arnaud-girault-IjEtFjxXweE-unsplash.9f9b5448197aded5325854d4f3c79652.webp 480w, /thumbnails/768x/images/examples/arnaud-girault-IjEtFjxXweE-unsplash.9f9b5448197aded5325854d4f3c79652.webp 768w, /thumbnails/1024x/images/examples/arnaud-girault-IjEtFjxXweE-unsplash.9f9b5448197aded5325854d4f3c79652.webp 1024w\" width=\"1024\" height=\"681\" sizes=\"100vw\">\n<img src=\"/thumbnails/1024x/images/examples/arnaud-girault-IjEtFjxXweE-unsplash.9f9b5448197aded5325854d4f3c79652.jpg\" alt=\"Une région de formation d’étoiles dans le ciel\" loading=\"lazy\" decoding=\"async\" class=\"dark:brightness-90\" width=\"1024\" height=\"681\" style=\";max-width:100%;height:auto;background-color:rgb(20 28 29);\" srcset=\"/thumbnails/480x/images/examples/arnaud-girault-IjEtFjxXweE-unsplash.9f9b5448197aded5325854d4f3c79652.jpg 480w, /thumbnails/768x/images/examples/arnaud-girault-IjEtFjxXweE-unsplash.9f9b5448197aded5325854d4f3c79652.jpg 768w, /thumbnails/1024x/images/examples/arnaud-girault-IjEtFjxXweE-unsplash.9f9b5448197aded5325854d4f3c79652.jpg 1024w\" sizes=\"100vw\">\n</picture>\n<figcaption>Photo de <a href=\"https://unsplash.com/fr/photos/une-region-de-formation-detoiles-dans-le-ciel-IjEtFjxXweE\" target=\"_blank\" rel=\"noopener noreferrer\">Arnaud Girault</a></figcaption>\n</figure>\n<h3 id=\"configuration\">Configuration</h3>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-comment\"># configuration globale des assets</span>\n<span class=\"hljs-attr\">assets:</span>\n  <span class=\"hljs-attr\">images:</span>\n    <span class=\"hljs-attr\">optimize:</span> <span class=\"hljs-literal\">true</span>\n    <span class=\"hljs-attr\">responsive:</span>\n      <span class=\"hljs-attr\">widths:</span> <span class=\"hljs-string\">[768,</span> <span class=\"hljs-number\">1024</span><span class=\"hljs-string\">]</span>\n<span class=\"hljs-comment\"># configuration des images dans du Markdown</span>\n<span class=\"hljs-attr\">pages:</span>\n  <span class=\"hljs-attr\">body:</span>\n    <span class=\"hljs-attr\">images:</span>\n      <span class=\"hljs-attr\">formats:</span> <span class=\"hljs-string\">[avif,</span> <span class=\"hljs-string\">webp]</span>\n      <span class=\"hljs-attr\">responsive:</span> <span class=\"hljs-literal\">true</span>\n      <span class=\"hljs-attr\">lazy:</span> <span class=\"hljs-literal\">true</span>\n      <span class=\"hljs-attr\">decoding:</span> <span class=\"hljs-literal\">true</span>\n      <span class=\"hljs-attr\">placeholder:</span> <span class=\"hljs-string\">color</span></code></pre>\n<h3 id=\"html-genere\">HTML généré</h3>\n<pre><code class=\"language-html hljs xml\" translate=\"no\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">picture</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">source</span>\n    <span class=\"hljs-attr\">type</span>=<span class=\"hljs-string\">\"image/avif\"</span>\n    <span class=\"hljs-attr\">srcset</span>=<span class=\"hljs-string\">\"/thumbnails/1024/arnaud-girault-IjEtFjxXweE-unsplash.c0bdd31264ac3d0d364d02bced31038f.avif 1024w,\n            /thumbnails/768/arnaud-girault-IjEtFjxXweE-unsplash.c0bdd31264ac3d0d364d02bced31038f.avif 768w\"</span>\n    <span class=\"hljs-attr\">sizes</span>=<span class=\"hljs-string\">\"100vw\"</span>\n    <span class=\"hljs-attr\">width</span>=<span class=\"hljs-string\">\"1024\"</span>\n    <span class=\"hljs-attr\">height</span>=<span class=\"hljs-string\">\"681\"</span>\n  &gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">source</span>\n    <span class=\"hljs-attr\">type</span>=<span class=\"hljs-string\">\"image/webp\"</span>\n    <span class=\"hljs-attr\">srcset</span>=<span class=\"hljs-string\">\"/thumbnails/1024/arnaud-girault-IjEtFjxXweE-unsplash.c0bdd31264ac3d0d364d02bced31038f.webp 1024w,\n            /thumbnails/768/arnaud-girault-IjEtFjxXweE-unsplash.c0bdd31264ac3d0d364d02bced31038f.webp 768w\"</span>\n    <span class=\"hljs-attr\">sizes</span>=<span class=\"hljs-string\">\"100vw\"</span>\n    <span class=\"hljs-attr\">width</span>=<span class=\"hljs-string\">\"1024\"</span>\n    <span class=\"hljs-attr\">height</span>=<span class=\"hljs-string\">\"681\"</span>\n  &gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">img</span> <span class=\"hljs-attr\">src</span>=<span class=\"hljs-string\">\"/thumbnails/1024/arnaud-girault-IjEtFjxXweE-unsplash.c0bdd31264ac3d0d364d02bced31038f.jpg\"</span>\n    <span class=\"hljs-attr\">alt</span>=<span class=\"hljs-string\">\"Photo de Arnaud Girault\"</span>\n    <span class=\"hljs-attr\">loading</span>=<span class=\"hljs-string\">\"lazy\"</span>\n    <span class=\"hljs-attr\">decoding</span>=<span class=\"hljs-string\">\"async\"</span>\n    <span class=\"hljs-attr\">width</span>=<span class=\"hljs-string\">\"1024\"</span>\n    <span class=\"hljs-attr\">height</span>=<span class=\"hljs-string\">\"681\"</span>\n    <span class=\"hljs-attr\">style</span>=<span class=\"hljs-string\">\";max-width:100%;height:auto;background-color:rgb(58, 56, 44);\"</span>\n    <span class=\"hljs-attr\">srcset</span>=<span class=\"hljs-string\">\"/thumbnails/1024/arnaud-girault-IjEtFjxXweE-unsplash.c0bdd31264ac3d0d364d02bced31038f.jpg 1024w,\n            /thumbnails/768/arnaud-girault-IjEtFjxXweE-unsplash.c0bdd31264ac3d0d364d02bced31038f.jpg 768w\"</span>\n    <span class=\"hljs-attr\">sizes</span>=<span class=\"hljs-string\">\"100vw\"</span>\n  &gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">picture</span>&gt;</span></code></pre>",
      "language": "fr"
    },
    {
      "id": "https://cecil-945.pages.dev/fr/comment-faire/templates-image-formats/",
      "url": "https://cecil-945.pages.dev/fr/comment-faire/templates-image-formats/",
      "title": "Générer plusieurs formats d'images dans des modèles",
      "summary": "Générer des formats d'image AVIF et WebP dans les modèles Cecil.",
      "date_published": "2025-07-25T00:00:00+00:00","content_text": "Pour optimiser les performances et la bande passante, Cecil peut générer plusieurs formats d'image, tels qu'AVIF et WebP. Cela permet au navigateur de sélectionner le format le plus adapté à ses capacités :\n{{ html(asset('image.jpg'), attributes={alt: 'Description alternative'}, options={formats: ['avif', 'webp']}) }}\n\nAVIF et WebP sont des formats d'image offrant des caractéristiques de compression et de qualité supérieures à leurs homologues JPEG et PNG plus anciens. Encoder vos images dans ces formats plutôt que JPEG ou PNG permet un chargement plus rapide et une consommation de données mobiles réduite.\nAVIF est pris en charge par Chrome, Firefox et Opera et offre des tailles de fichier plus petites que d'autres formats à qualité égale.\nWebP est pris en charge par les dernières versions de Chrome, Firefox, Safari, Edge et Opera et offre une meilleure compression avec et sans perte pour les images sur le Web.\n\n– Documentation Chrome Lighthouse\nExemple\nCi-dessous un exemple de génération des formats AVIF et WebP d'une image :\n{{ html(asset('cecil-logo.png'), attributes={alt: 'Cecil logo'}, options={formats: ['avif', 'webp']}) }}\nHTML généré\n&lt;picture&gt;\n  &lt;source type=\"image\/avif\" srcset=\"\/cecil-logo.c1af8a129a0cde81f9b94ffbf452e10b.avif\"&gt;\n  &lt;source type=\"image\/webp\" srcset=\"\/cecil-logo.c1af8a129a0cde81f9b94ffbf452e10b.webp\"&gt;\n  &lt;img src=\"\/cecil-logo.c1af8a129a0cde81f9b94ffbf452e10b.png\" width=\"250\" height=\"250\" alt=\"Cecil logo\"&gt;\n&lt;\/picture&gt;",
      "content_html": "<p>Pour optimiser les performances et la bande passante, Cecil peut générer plusieurs formats d'image, tels qu'AVIF et WebP. Cela permet au navigateur de sélectionner le format le plus adapté à ses capacités :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-variable\">{{ html(asset('image.jpg'), attributes={alt: 'Description alternative'}, options={formats: ['avif', 'webp']}) }}</span></code></pre>\n<blockquote>\n<p>AVIF et WebP sont des formats d'image offrant des caractéristiques de compression et de qualité supérieures à leurs homologues JPEG et PNG plus anciens. Encoder vos images dans ces formats plutôt que JPEG ou PNG permet un chargement plus rapide et une consommation de données mobiles réduite.</p>\n<p>AVIF est pris en charge par Chrome, Firefox et Opera et offre des tailles de fichier plus petites que d'autres formats à qualité égale.</p>\n<p>WebP est pris en charge par les dernières versions de Chrome, Firefox, Safari, Edge et Opera et offre une meilleure compression avec et sans perte pour les images sur le Web.</p>\n</blockquote>\n<p>– <a href=\"https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images?hl=fr\" target=\"_blank\" rel=\"noopener noreferrer\">Documentation Chrome Lighthouse</a></p>\n<h2 id=\"exemple\">Exemple</h2>\n<p>Ci-dessous un exemple de génération des formats AVIF et WebP d'une image :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-variable\">{{ html(asset('cecil-logo.png'), attributes={alt: 'Cecil logo'}, options={formats: ['avif', 'webp']}) }}</span></code></pre>\n<h3 id=\"html-genere\">HTML généré</h3>\n<pre><code class=\"language-html hljs xml\" translate=\"no\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">picture</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">source</span> <span class=\"hljs-attr\">type</span>=<span class=\"hljs-string\">\"image/avif\"</span> <span class=\"hljs-attr\">srcset</span>=<span class=\"hljs-string\">\"/cecil-logo.c1af8a129a0cde81f9b94ffbf452e10b.avif\"</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">source</span> <span class=\"hljs-attr\">type</span>=<span class=\"hljs-string\">\"image/webp\"</span> <span class=\"hljs-attr\">srcset</span>=<span class=\"hljs-string\">\"/cecil-logo.c1af8a129a0cde81f9b94ffbf452e10b.webp\"</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">img</span> <span class=\"hljs-attr\">src</span>=<span class=\"hljs-string\">\"/cecil-logo.c1af8a129a0cde81f9b94ffbf452e10b.png\"</span> <span class=\"hljs-attr\">width</span>=<span class=\"hljs-string\">\"250\"</span> <span class=\"hljs-attr\">height</span>=<span class=\"hljs-string\">\"250\"</span> <span class=\"hljs-attr\">alt</span>=<span class=\"hljs-string\">\"Cecil logo\"</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">picture</span>&gt;</span></code></pre>",
      "language": "fr"
    },
    {
      "id": "https://cecil-945.pages.dev/fr/comment-faire/templates-responsive-images/",
      "url": "https://cecil-945.pages.dev/fr/comment-faire/templates-responsive-images/",
      "title": "Rendre des images réactives dans des modèles",
      "summary": "Rendre des images réactives dans les modèles Cecil avec la fonction html.",
      "date_published": "2025-07-25T00:00:00+00:00","content_text": "La manière la plus simple de rendre des images réactives dans des modèles est d'utiliser la fonction html :\n{{ html(asset('image.jpg'), attributes={alt: 'Description alternative'}, options={responsive: true}) }}\nLes valeurs de largeur par défaut des images générées sont 480, 640, 768, 1024, 1366, 1600 et 1920. Elles peuvent être modifiées dans la section assets de la configuration.\nExemple\nCi-dessous un exemple avec une image PNG 1000x1000 pixels.\n{{ html(asset('cecil-logo-1000.png'), attributes={alt: 'Cecil logo'}, options={responsive: true}) }}\nConfiguration\nassets:\n  images:\n    responsive:\n      widths: [768, 1024]\nHTML généré\n&lt;img\n  alt=\"Cecil logo\"\n  width=\"1000\"\n  height=\"1000\"\n  src=\"\/cecil-logo-1000.fbacb922cddbcdb7ca9a03a3ca3cf2ca.png\"\n  srcset=\"\/thumbnails\/768\/cecil-logo-1000.fbacb922cddbcdb7ca9a03a3ca3cf2ca.png 768w,\n          \/cecil-logo-1000.fbacb922cddbcdb7ca9a03a3ca3cf2ca.png 1000w\"\n  sizes=\"100vw\"\n&gt;",
      "content_html": "<p>La manière la plus simple de rendre des <a href=\"https://developer.mozilla.org/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images\" target=\"_blank\" rel=\"noopener noreferrer\">images réactives</a> dans des modèles est d'utiliser la <a href=\"/documentation/templates/#html\">fonction html</a> :</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-variable\">{{ html(asset('image.jpg'), attributes={alt: 'Description alternative'}, options={responsive: true}) }}</span></code></pre>\n<aside class=\"note note-important\"><p>Les valeurs de largeur par défaut des images générées sont 480, 640, 768, 1024, 1366, 1600 et 1920. Elles peuvent être modifiées dans la section <em>assets</em> de la <a href=\"/documentation/configuration/#assets-images\">configuration</a>.</p></aside>\n<h2 id=\"exemple\">Exemple</h2>\n<p>Ci-dessous un exemple avec une image PNG 1000x1000 pixels.</p>\n<pre><code class=\"language-twig hljs twig\" translate=\"no\"><span class=\"hljs-template-variable\">{{ html(asset('cecil-logo-1000.png'), attributes={alt: 'Cecil logo'}, options={responsive: true}) }}</span></code></pre>\n<h3 id=\"configuration\">Configuration</h3>\n<pre><code class=\"language-yaml hljs yaml\" translate=\"no\"><span class=\"hljs-attr\">assets:</span>\n  <span class=\"hljs-attr\">images:</span>\n    <span class=\"hljs-attr\">responsive:</span>\n      <span class=\"hljs-attr\">widths:</span> <span class=\"hljs-string\">[768,</span> <span class=\"hljs-number\">1024</span><span class=\"hljs-string\">]</span></code></pre>\n<h3 id=\"html-genere\">HTML généré</h3>\n<pre><code class=\"language-html hljs xml\" translate=\"no\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">img</span>\n  <span class=\"hljs-attr\">alt</span>=<span class=\"hljs-string\">\"Cecil logo\"</span>\n  <span class=\"hljs-attr\">width</span>=<span class=\"hljs-string\">\"1000\"</span>\n  <span class=\"hljs-attr\">height</span>=<span class=\"hljs-string\">\"1000\"</span>\n  <span class=\"hljs-attr\">src</span>=<span class=\"hljs-string\">\"/cecil-logo-1000.fbacb922cddbcdb7ca9a03a3ca3cf2ca.png\"</span>\n  <span class=\"hljs-attr\">srcset</span>=<span class=\"hljs-string\">\"/thumbnails/768/cecil-logo-1000.fbacb922cddbcdb7ca9a03a3ca3cf2ca.png 768w,\n          /cecil-logo-1000.fbacb922cddbcdb7ca9a03a3ca3cf2ca.png 1000w\"</span>\n  <span class=\"hljs-attr\">sizes</span>=<span class=\"hljs-string\">\"100vw\"</span>\n&gt;</span></code></pre>",
      "language": "fr"
    }
  ]
}
