<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="https://cecil.app/fr/xsl/atom.xsl" media="all"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
  <id>https://cecil.app/fr/documentation/</id>
  <title>Cecil - Documentation</title>
  <subtitle><![CDATA[Cecil est une application PHP en ligne de commande qui fusionne des pages Markdown, des médias et des templates Twig afin de générer un site Web statique.]]></subtitle>
  <link href="https://cecil.app/fr/documentation/atom.xml" rel="self" type="application/atom+xml" />
  <link href="https://cecil.app/fr/documentation/" rel="alternate" type="text/html" />
  <updated>2026-10-07T21:40:48+00:00</updated>
  <author>
    <name>Cecil</name>
    <uri>https://cecil.app</uri>
  </author>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/bien-demarrer/installation/</id>
    <title>Installation</title>
    <published>2026-10-05T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/bien-demarrer/installation/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Installation</h1>
<p>Cecil est distribué sous la forme d’un unique fichier exécutable, <code translate="no">cecil.phar</code>, qui fonctionne partout où PHP est installé.</p>
<h2 id="prerequis">Prérequis</h2>
<ul>
<li><a href="https://www.php.net/manual/fr/install.php" target="_blank" rel="noopener noreferrer">PHP</a> 8.3+</li>
<li>Extensions PHP : <code translate="no">fileinfo</code>, <code translate="no">gd</code> et <code translate="no">mbstring</code></li>
</ul>
<p>Vérifiez votre version de PHP et les extensions chargées :</p>
<pre><code class="language-bash hljs bash" translate="no">php -v
php -m</code></pre>
<h3 id="extensions-optionnelles">Extensions optionnelles</h3>
<table>
<thead>
<tr>
<th>Extension</th>
<th>Usage</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.php.net/manual/fr/book.intl.php" target="_blank" rel="noopener noreferrer"><code translate="no">intl</code></a></td>
<td><a href="/fr/templates/localization/">Localisation</a> des dates avec d’autres locales que <code translate="no">en</code> (améliore les performances sinon).</td>
</tr>
<tr>
<td><a href="https://www.php.net/manual/fr/book.imagick.php" target="_blank" rel="noopener noreferrer"><code translate="no">imagick</code></a></td>
<td>Traitement des images, préféré à GD si disponible.</td>
</tr>
<tr>
<td><a href="https://www.php.net/manual/fr/book.ffi.php" target="_blank" rel="noopener noreferrer"><code translate="no">ffi</code></a></td>
<td>Traitement des images avec <a href="https://www.libvips.org/" target="_blank" rel="noopener noreferrer">libvips</a> (nécessite une <a href="#composer">installation via Composer</a>).</td>
</tr>
</tbody>
</table>
<h2 id="telecharger-le-phar">Télécharger le PHAR</h2>
<p>Téléchargez <code translate="no">cecil.phar</code> depuis votre terminal :</p>
<pre><code class="language-bash hljs bash" translate="no">curl -LO https://cecil.app/cecil.phar</code></pre>
<p>Puis exécutez-le avec PHP :</p>
<pre><code class="language-bash hljs bash" translate="no">php cecil.phar --version</code></pre>
<aside class="note note-info"><p>Vous pouvez également télécharger une <a href="/fr/telecharger/">version spécifique ou la version d’aperçu</a>.</p></aside>
<h2 id="installation-globale">Installation globale</h2>
<p>Installer Cecil globalement permet d’exécuter la commande <code translate="no">cecil</code> depuis n’importe quel dossier, au lieu de <code translate="no">php cecil.phar</code>.</p>
<h3 id="macos-et-linux">macOS et Linux</h3>
<p>Avec <a href="https://brew.sh" target="_blank" rel="noopener noreferrer">Homebrew</a> :</p>
<pre><code class="language-bash hljs bash" translate="no">brew install cecilapp/tap/cecil</code></pre>
<p>Ou manuellement, en déplaçant le PHAR dans un dossier de votre <code translate="no">PATH</code> :</p>
<pre><code class="language-bash hljs bash" translate="no">mv cecil.phar /usr/<span class="hljs-built_in">local</span>/bin/cecil
chmod +x /usr/<span class="hljs-built_in">local</span>/bin/cecil</code></pre>
<h3 id="windows">Windows</h3>
<p>Avec <a href="https://scoop.sh" target="_blank" rel="noopener noreferrer">Scoop</a> :</p>
<pre><code class="language-bash hljs bash" translate="no">scoop install https://cecil.app/scoop/cecil.json</code></pre>
<p>Ou manuellement :</p>
<ol>
<li>Déplacez <code translate="no">cecil.phar</code> dans un dossier dédié tel que <code translate="no">C:\bin</code></li>
<li>Renommez <code translate="no">cecil.phar</code> en <code translate="no">cecil</code></li>
<li>Ajoutez <code translate="no">;C:\bin</code> à votre variable d’environnement <code translate="no">PATH</code></li>
<li>Créez un <a href="https://raw.githubusercontent.com/Cecilapp/Cecil/main/bin/cecil.bat" target="_blank" rel="noopener noreferrer">« wrapping batch script »</a> à côté</li>
</ol>
<h3 id="phive">PHIVE</h3>
<p>Avec <a href="https://phar.io" target="_blank" rel="noopener noreferrer">PHIVE</a> (The PHAR Installation and Verification Environment) :</p>
<pre><code class="language-bash hljs bash" translate="no">phive install cecil</code></pre>
<h3 id="composer">Composer</h3>
<p>Avec <a href="https://getcomposer.org" target="_blank" rel="noopener noreferrer">Composer</a> :</p>
<pre><code class="language-bash hljs bash" translate="no">composer global require cecil/cecil</code></pre>
<aside class="note note-important"><p>Assurez-vous que le dossier des binaires globaux de Composer est dans votre <code translate="no">PATH</code>. Exécutez <code translate="no">composer global config bin-dir --absolute</code> pour l’obtenir.</p></aside>
<aside class="note note-tip"><p>Pour utiliser Cecil comme dépendance d’un projet PHP, voir <a href="/fr/developers/library/">Bibliothèque</a>.</p></aside>
<h2 id="verifier-l-installation">Vérifier l’installation</h2>
<pre><code class="language-bash hljs bash" translate="no">cecil --version</code></pre>
<aside class="note note-info"><p>Exécutez <code translate="no">cecil list</code> pour afficher les <a href="/fr/commands/">commandes disponibles</a>.</p></aside>
<h2 id="mise-a-jour">Mise à jour</h2>
<p>Mettez à jour Cecil vers la dernière version selon votre méthode d’installation :</p>
<pre><code class="language-bash hljs bash" translate="no"><span class="hljs-comment"># PHAR</span>
php cecil.phar self-update
<span class="hljs-comment"># Homebrew</span>
brew upgrade cecilapp/tap/cecil
<span class="hljs-comment"># Scoop</span>
scoop update cecil
<span class="hljs-comment"># PHIVE</span>
phive update cecil
<span class="hljs-comment"># Composer</span>
composer global update cecil/cecil</code></pre>
<p>La commande <code translate="no">self-update</code> (PHAR uniquement) accepte également les options suivantes :</p>
<ul>
<li><code translate="no">--rollback</code> : revient à la version précédemment installée</li>
<li><code translate="no">--stable</code> : force la mise à jour vers la dernière version stable</li>
<li><code translate="no">--preview</code> : force la mise à jour vers la dernière version instable</li>
</ul>
<aside class="note note-info"><p>Le journal des modifications de chaque version est disponible sur <a href="https://github.com/Cecilapp/Cecil/releases" target="_blank" rel="noopener noreferrer">GitHub</a>.</p></aside>
<h2 id="depannage">Dépannage</h2>
<h3 id="command-not-found-cecil"><code translate="no">command not found: cecil</code></h3>
<p>Le dossier d’installation n’est pas dans votre <code translate="no">PATH</code> : ajoutez-le, ou exécutez Cecil avec <code translate="no">php cecil.phar</code> depuis le dossier contenant le PHAR.</p>
<h3 id="erreur-de-version-ou-d-extension-php">Erreur de version ou d’extension PHP</h3>
<p>Le PHP utilisé en ligne de commande peut différer de celui attendu (plusieurs versions installées) : vérifiez-le avec <code translate="no">php -v</code> et <code translate="no">php --ini</code>, puis activez les extensions manquantes dans le fichier <code translate="no">php.ini</code> chargé.</p>
<h3 id="diagnostiquer-un-site">Diagnostiquer un site</h3>
<p>Une fois un site créé, exécutez la commande <a href="/fr/commands/doctor/"><code translate="no">doctor</code></a> pour diagnostiquer sa configuration.</p>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/developpeurs/architecture/</id>
    <title>Architecture</title>
    <published>2026-05-27T00:00:00+00:00</published>
    <updated>2026-10-02T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/developpeurs/architecture/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Architecture</h1>
<h2 id="diagramme">Diagramme</h2>
<pre><code class="language-mermaid" translate="no">graph TD
    %% Entrée
    CLI["bin/cecil\n(Point d'entrée CLI)"]
    APP["Application\n(Symfony Console)"]
    CMD["Commandes\nbuild / serve / new:site\nnew:page / clear / show:content"]

    CLI --&gt; APP --&gt; CMD

    %% Orchestrateur
    BUILDER["Builder\n(Orchestrateur)"]
    CONFIG["Configuration\n(config.yml + default.php\n+ thèmes)"]
    CMD --&gt; BUILDER
    CONFIG --&gt; BUILDER

    %% Pipeline
    subgraph PIPELINE["Pipeline de génération (étapes)"]
        S1["1. Pages/Load\n(Finder → fichiers Markdown)"]
        S2["2. Data/Load\n(fichiers YAML)"]
        S3["3. StaticFiles/Load\n(chargement des fichiers statiques)"]
        S4["4. Pages/Create\n(création des objets Page)"]
        S5["5. Pages/Convert\n(Markdown → HTML\nfront matter)"]
        S6["6. Taxonomies/Create\n(création des taxonomies)"]
        S7["7. Pages/Generate\n(générateurs)"]
        S8["8. Menus/Create\n(création des menus)"]
        S9["9. StaticFiles/Copy\n(copie des fichiers statiques)"]
        S10["10. Pages/Render\n(rendu Twig)"]
        S11["11. Pages/Save\n(sauvegarde des pages)"]
        S12["12. Assets/Save\n(sauvegarde des assets)"]
        S13["13. Optimize/*\n(optimisation HTML/CSS/JS/Images)"]

        S1 --&gt; S2 --&gt; S3 --&gt; S4 --&gt; S5 --&gt; S6 --&gt; S7 --&gt; S8 --&gt; S9 --&gt; S10 --&gt; S11 --&gt; S12 --&gt; S13
    end

    BUILDER --&gt; PIPELINE

    %% Sous-systèmes
    subgraph COLLECTIONS["Collections"]
        PC["PagesCollection\n(objets Page)"]
        TC["TaxonomiesCollection\n(vocabulaires/termes)"]
        MC["MenusCollection"]
    end

    subgraph GENERATORS["Générateurs (virtuels)"]
        GP["Pagination"]
        GT["Taxonomie"]
        GS["Section"]
        GR["Redirection"]
        GD["DefaultPages (accueil, 404)"]
    end

    subgraph RENDERER["Rendu Twig"]
        TW["Moteur Twig"]
        EXT["Extensions\n(Core, Content, Collection)"]
        PP["PostProcessors\n(métadonnées, extraits, liens)"]
        TH["Thèmes / Layouts"]
        TW --&gt; EXT
        TW --&gt; PP
        TH --&gt; TW
    end

    subgraph ASSETS["Assets"]
        AL["Localisateur d'assets"]
        AC["Compilateur\n(SCSS → CSS)"]
        AI["Processeur d'images\n(responsive, WebP, AVIF)"]
        AO["Optimiseur\n(minification CSS/JS)"]
    end

    subgraph OUTPUT["Sortie (_site/)"]
        HTML["pages .html"]
        CSS2["assets CSS/JS"]
        IMG["images"]
        SF["fichiers statiques"]
    end

    S4 --&gt; PC
    S6 --&gt; TC
    S8 --&gt; MC
    S7 --&gt; GENERATORS
    GENERATORS --&gt; PC
    S10 --&gt; RENDERER
    S12 --&gt; ASSETS

    PC --&gt; RENDERER
    TC --&gt; RENDERER
    MC --&gt; RENDERER

    RENDERER --&gt; S11
    S11 --&gt; HTML
    S12 --&gt; CSS2
    S12 --&gt; IMG
    S9 --&gt; SF

    %% Entrées
    subgraph INPUT["Sources"]
        MD["content/\n(Markdown + front matter)"]
        DATA["data/\n(YAML)"]
        STATIC["static/"]
        LAYOUTS["layouts/\n(modèles Twig)"]
    end

    MD --&gt; S1
    DATA --&gt; S2
    STATIC --&gt; S3
    LAYOUTS --&gt; TH</code></pre>
<h2 id="legende-des-composants-cles">Légende des composants clés</h2>
<table>
<thead>
<tr>
<th>Composant</th>
<th>Rôle</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Builder</strong></td>
<td>Orchestrateur central, exécute les étapes en séquence</td>
</tr>
<tr>
<td><strong>Config</strong></td>
<td>Fusion de la configuration par défaut + thème + projet + CLI</td>
</tr>
<tr>
<td><strong>Steps</strong></td>
<td>Pipeline modulaire (13 étapes), chacune avec <code translate="no">init()</code> / <code translate="no">canProcess()</code> / <code translate="no">process()</code></td>
</tr>
<tr>
<td><strong>Collections</strong></td>
<td>Pages, Taxonomies, Menus — structures de données centrales</td>
</tr>
<tr>
<td><strong>Generators</strong></td>
<td>Créent des pages virtuelles (pagination, tags, redirections…)</td>
</tr>
<tr>
<td><strong>Renderer (Twig)</strong></td>
<td>Applique les modèles + extensions + post-traitements</td>
</tr>
<tr>
<td><strong>Assets</strong></td>
<td>Compile SCSS, optimise images, fingerprinte les fichiers</td>
</tr>
</tbody>
</table>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/assets/images/</id>
    <title>Images</title>
    <published>2026-05-26T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/assets/images/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Images</h1>
<h2 id="image-srcset">image_srcset</h2>
<p>Construit l'attribut HTML img <code translate="no">srcset</code> (responsive) d'un élément d'image.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ image_srcset(asset) }}</span></code></pre>
<p><em>Exemples :</em></p>
<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> asset = asset(image_path) %}</span><span class="xml">
<span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{{ url(asset) }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{{ asset.width }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{{ asset.height }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">""</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"asset"</span> <span class="hljs-attr">srcset</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{{ image_srcset(asset) }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> <span class="hljs-attr">sizes</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{{ image_sizes('asset') }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>&gt;</span></span></code></pre>
<h2 id="image-sizes">image_sizes</h2>
<p>Renvoie l'attribut HTML img <code translate="no">sizes</code> basé sur un nom de classe CSS.
Il doit être utilisé conjointement avec la fonction <a href="/fr/documentation/images/#image-srcset"><code translate="no">image_srcset</code></a>.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ image_sizes('class') }}</span></code></pre>
<p><em>Exemples :</em></p>
<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> asset = asset(image_path) %}</span><span class="xml">
<span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{{ url(asset) }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{{ asset.width }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{{ asset.height }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">""</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"asset"</span> <span class="hljs-attr">srcset</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{{ image_srcset(asset) }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> <span class="hljs-attr">sizes</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{{ image_sizes('asset') }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>&gt;</span></span></code></pre>
<h2 id="image-from-website">image_from_website</h2>
<p>Construit l'élément HTML img à partir d'une URL de site Web en extrayant son image d'illustration.
Retourne <code translate="no">null</code> si aucune image n'est trouvée.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ image_from_website('url', {attributs}, {options}) }}</span></code></pre>
<p>L'image est recherchée dans le HTML de la page avec les fallbacks suivants, le premier candidat pouvant être téléchargé en tant qu'image est utilisé :</p>
<ol>
<li>Open Graph : <code translate="no">og:image:secure_url</code>, <code translate="no">og:image</code>, <code translate="no">og:image:url</code></li>
<li>Twitter : <code translate="no">twitter:image</code>, <code translate="no">twitter:image:src</code></li>
<li><code translate="no">&lt;link rel="image_src"&gt;</code></li>
<li>Microdata : <code translate="no">itemprop="image"</code></li>
<li>JSON-LD : propriété <code translate="no">image</code></li>
<li>Première <code translate="no">&lt;img&gt;</code> de <code translate="no">&lt;article&gt;</code>, <code translate="no">&lt;main&gt;</code> ou <code translate="no">&lt;body&gt;</code></li>
<li><code translate="no">&lt;link rel="apple-touch-icon"&gt;</code></li>
<li><code translate="no">&lt;link rel="icon"&gt;</code></li>
</ol>
<p>Les URL relatives sont résolues par rapport à <code translate="no">&lt;base href&gt;</code> ou à l'URL de la page.</p>
<p>L'URL de l'image trouvée et l'image téléchargée sont mises en cache (voir <a href="/fr/configuration/cache/"><code translate="no">cache.assets.remote.ttl</code></a>).</p>
<p>Options :</p>
<ul>
<li><code translate="no">fallback</code> : chemin (ou URL) de l'image utilisée si aucune image n'est trouvée</li>
<li>autres options de <a href="/fr/templates/reference/functions/#html"><code translate="no">image</code></a> (ex. : <code translate="no">responsive</code>, <code translate="no">formats</code>)</li>
</ul>
<p><em>Exemples :</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ image_from_website('https://example.com/page-with-image.html') }}</span><span class="xml">

</span><span class="hljs-comment">{# avec une image de fallback #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ image_from_website('https://example.com/', {alt: 'Illustration'}, {fallback: 'images/default.png'}) }}</span></code></pre>
<h2 id="resize">resize</h2>
<p>Redimensionne une image à une largeur (en pixels) ou/et une hauteur (en pixels) spécifiée.</p>
<ul>
<li>Si seule la largeur est spécifiée, la hauteur est calculée pour conserver le rapport hauteur/largeur</li>
<li>Si seule la hauteur est spécifiée, la largeur est calculée pour conserver le rapport hauteur/largeur</li>
<li>Si la largeur et la hauteur sont spécifiées, l'image est redimensionnée pour s'adapter aux dimensions données, l'image est recadrée et centrée si nécessaire</li>
<li>Si Remove_animation est vrai, toute animation dans l'image (par exemple, GIF) sera supprimée</li>
</ul>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ asset(image_path)|resize(width: width, height: height, remove_animation: bool) }}</span></code></pre>
<aside class="note note-info"><p>Le fichier original n'est pas modifié et la version redimensionnée est enregistrée sous <code translate="no">/thumbnails/&lt;width&gt;x&lt;height&gt;/image.jpg</code>.</p></aside>
<aside class="note note-tip"><p>Les fichiers ICO sont supportés : la plus grande icône est redimensionnée et enregistrée dans un fichier ICO à icône unique (compressée en PNG). Les icônes stockées en BMP avec une profondeur de couleur autre que 24 ou 32 bits nécessitent l'extension PHP <a href="https://www.php.net/manual/fr/book.imagick.php" target="_blank" rel="noopener noreferrer">Imagick</a> : à défaut, le fichier ICO original est conservé et un avertissement est journalisé.</p></aside>
<p><em>Exemples :</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ asset(page.image)|resize(300) }}</span><span class="xml">
</span><span class="hljs-comment">{# equivalent to: #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ asset(page.image)|resize(width: 300) }}</span><span class="xml">
</span><span class="hljs-comment">{# resizes to 300px width, height auto-calculated to preserve aspect ratio #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ asset(page.image)|resize(height: 200) }}</span><span class="xml">
</span><span class="hljs-comment">{# resizes to 300px width and 200px height, and crops if necessary #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ asset(page.image)|resize(300, 200) }}</span><span class="xml">
</span><span class="hljs-comment">{# removes any animation from the image #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ asset(page.image)|resize(width: 1200, height: 630, remove_animation: true) }}</span></code></pre>
<h2 id="cover">cover</h2>
<p>Redimensionne une image à une largeur et une hauteur spécifiées, en la recadrant si nécessaire.</p>
<aside class="note note-warning"><p>Le filtre <code translate="no">cover</code> est obsolète depuis la version <ins>8.77</ins> et sera supprimé dans les versions futures. Utilisez plutôt le filtre <a href="#resize"><code translate="no">resize</code></a>, avec les paramètres de largeur et de hauteur.</p></aside>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ asset(image_path)|cover(width, height) }}</span></code></pre>
<p><em>Exemple:</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ asset(page.image)|cover(1200, 630) }}</span></code></pre>
<h2 id="maskable">maskable</h2>
<p>Ajoute un remplissage, en pourcentages, à une image pour la rendre masquable.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ asset(image_path)|maskable(padding) }}</span></code></pre>
<p><em>Exemple:</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ asset('icon.png')|maskable }}</span></code></pre>
<h2 id="webp">webp</h2>
<p>Convertit une image au format <a href="https://developers.google.com/speed/webp" target="_blank" rel="noopener noreferrer">WebP</a>.</p>
<p><em>Exemple:</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">picture</span>&gt;</span>
    <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">"</span></span></span><span class="hljs-template-variable">{{ asset(image_path)|webp }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{{ url(asset(image_path)) }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{{ asset(image_path).width }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{{ asset(image_path).height }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">""</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">picture</span>&gt;</span></span></code></pre>
<h2 id="avif">avif</h2>
<p>Convertit une image au format <a href="https://github.com/AOMediaCodec/libavif" target="_blank" rel="noopener noreferrer">AVIF</a>.</p>
<p><em>Exemple:</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">picture</span>&gt;</span>
    <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">"</span></span></span><span class="hljs-template-variable">{{ asset(image_path)|avif }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{{ url(asset(image_path)) }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{{ asset(image_path).width }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{{ asset(image_path).height }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">""</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">picture</span>&gt;</span></span></code></pre>
<h2 id="lqip">lqip</h2>
<p>Renvoie un <a href="https://www.guypo.com/introducing-lqip-low-quality-image-placeholders" target="_blank" rel="noopener noreferrer">espace réservé pour une image de faible qualité</a> (100 x 100 px, flou à 50 %) comme URL de données.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ asset(image_path)|lqip }}</span></code></pre>
<h2 id="dominant-color">dominant_color</h2>
<p>Renvoie la <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/hex-color" target="_blank" rel="noopener noreferrer">couleur hexadécimale</a> dominante d'une image.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ asset(image_path)|dominant_color }}</span></code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/templates/regles-de-recherche/</id>
    <title>Organisation et règles de recherche</title>
    <published>2026-05-26T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/templates/regles-de-recherche/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Organisation et règles de recherche</h1>
<h2 id="organisation-des-fichiers">Organisation des fichiers</h2>
<h3 id="types-de-templates">Types de templates</h3>
<p>Il existe trois types de templates, <strong><em>layouts</em></strong>, <strong><em>components</em></strong> et <strong><em>autres templates</em></strong> : <em>layouts</em> sont utilisés pour afficher les <a href="/fr/content/pages/">pages</a>, et chacun d'eux peut <a href="https://twig.symfony.com/doc/templates.html#including-other-templates" target="_blank" rel="noopener noreferrer">inclure des templates</a> et <a href="/fr/documentation/components/">components</a>.</p>
<h3 id="convention-de-nommage">Convention de nommage</h3>
<p>Les fichiers templates sont stockés dans le répertoire <code translate="no">layouts/</code> et doivent être nommés selon la convention suivante :</p>
<pre><code class="language-plaintext hljs plaintext" translate="no">layouts/(&lt;section&gt;/)&lt;type&gt;|&lt;layout&gt;.&lt;format&gt;(.&lt;language&gt;).twig</code></pre>
<dl>
<dt><code translate="no">&lt;section&gt;</code> (<em>facultatif</em>)</dt>
<dd>La section de la page (ex. : <code translate="no">blog</code>).</dd>
<dt><code translate="no">&lt;type&gt;</code></dt>
<dd>Le type de page : <code translate="no">home</code> (ou <code translate="no">index</code>) pour <em>homepage</em>, <code translate="no">list</code> pour <em>list</em>, <code translate="no">page</code> pour <em>page</em>, etc. (Voir <a href="#regles-de-recherche"><em>Règles de recherche</em></a> pour plus de détails).</dd>
<dt><code translate="no">&lt;layout&gt;</code> (<em>facultatif</em>)</dt>
<dd>Le nom de la layout personnalisée défini dans le <a href="/fr/content/pages/#front-matter">front-matter</a> de la page (par exemple : <code translate="no">layout: my-layout</code>).</dd>
<dt><code translate="no">&lt;format&gt;</code></dt>
<dd>Le <a href="/fr/configuration/output/#output-formats">format de sortie</a> de la page rendue (par exemple : <code translate="no">html</code>, <code translate="no">rss</code>, <code translate="no">json</code>, <code translate="no">xml</code>, etc.).</dd>
<dt><code translate="no">&lt;language&gt;</code> (<em>facultatif</em>)</dt>
<dd>La langue de la page (ex. : <code translate="no">fr</code>).</dd>
</dl>
<p><em>Exemples :</em></p>
<pre><code class="language-plaintext hljs plaintext" translate="no">layouts/home.html.twig       # `type` est "homepage"
layouts/page.html.twig       # `type` est "page"
layouts/page.html.fr.twig    # `type` est "page" et `language` est "fr"
layouts/my-layout.html.twig  # `layout` est "my-layout"
layouts/blog/list.html.twig  # `section` est "blog"
layouts/blog/list.rss.twig   # `section` est "blog" et `format` est "rss"</code></pre>
<pre><code class="language-plaintext hljs plaintext" translate="no">&lt;mon-site&gt;
├─ ...
├─ layouts
|  ├─ index.html.twig      # Utilisé par le type "homepage"
|  ├─ list.html.twig       # Utilisé par les types "homepage" et "section"
|  ├─ list.rss.twig        # Utilisé par les types "homepage" et "section", pour le format de sortie RSS
|  ├─ page.html.twig       # Utilisé par le type "page"
|  ├─ taxonomy
|  |  ├─ tags.html.twig    # Utilisé par le type "vocabulary" de `tags` (liste des termes)
|  |  └─ tag.html.twig     # Utilisé par le type "term" de `tags` (liste des pages)
|  ├─ my-layout.html.twig  # Utilisé par les pages avec `layout: my-layout` dans le front-matter
|  ├─ ...
|  └─ partials
|     ├─ footer.html.twig  # Template inclus
|     └─ ...
└─ themes                  # Layouts et templates des thèmes
   └─ ...</code></pre>
<h3 id="templates-integres">Templates intégrés</h3>
<p>Cecil est livré avec un ensemble de <a href="https://github.com/Cecilapp/Cecil/tree/main/resources/layouts" target="_blank" rel="noopener noreferrer">templates intégrés</a>.</p>
<aside class="note note-tip"><p>Si vous avez besoin de modifier des templates intégrés, vous pouvez facilement les extraire via la commande suivante : ils seront copiés dans le répertoire <code translate="no">layouts</code> de votre site.</p>
<pre><code class="language-bash hljs bash" translate="no">php cecil.phar util:templates:extract</code></pre></aside>
<h2 id="regles-de-recherche">Règles de recherche</h2>
<p>Dans la plupart des cas <strong>vous n'avez pas besoin de préciser la layout</strong> : Cecil sélectionne la layout la plus appropriée, en fonction du <strong>type de la page</strong>.</p>
<p>Par exemple, la sortie HTML de <strong>home page</strong> (<code translate="no">index.md</code>) sera rendue :</p>
<ol>
<li>avec <code translate="no">my-layout.html.twig</code> si la variable <code translate="no">layout</code> est définie sur "my-layout" (dans le préambule)</li>
<li>sinon, avec <code translate="no">index.html.twig</code> si le fichier existe</li>
<li>sinon, avec <code translate="no">home.html.twig</code> si le fichier existe</li>
<li>sinon, avec <code translate="no">list.html.twig</code> si le fichier existe</li>
</ol>
<p>Toutes les règles sont détaillées ci-dessous, pour chaque type de page, par ordre de priorité.</p>
<h3 id="type-homepage">Type <em>homepage</em></h3>
<ol>
<li><code translate="no">&lt;layout&gt;.&lt;format&gt;.twig</code></li>
<li><code translate="no">index.&lt;format&gt;.twig</code></li>
<li><code translate="no">home.&lt;format&gt;.twig</code></li>
<li><code translate="no">list.&lt;format&gt;.twig</code></li>
<li><code translate="no">_default/&lt;layout&gt;.&lt;format&gt;.twig</code></li>
<li><code translate="no">_default/index.&lt;format&gt;.twig</code></li>
<li><code translate="no">_default/home.&lt;format&gt;.twig</code></li>
<li><code translate="no">_default/list.&lt;format&gt;.twig</code></li>
<li><code translate="no">_default/page.&lt;format&gt;.twig</code></li>
</ol>
<h3 id="type-page">Type <em>page</em></h3>
<ol>
<li><code translate="no">&lt;section&gt;/&lt;layout&gt;.&lt;format&gt;.twig</code></li>
<li><code translate="no">&lt;layout&gt;.&lt;format&gt;.twig</code></li>
<li><code translate="no">&lt;section&gt;/page.&lt;format&gt;.twig</code></li>
<li><code translate="no">_default/&lt;layout&gt;.&lt;format&gt;.twig</code></li>
<li><code translate="no">page.&lt;format&gt;.twig</code></li>
<li><code translate="no">_default/page.&lt;format&gt;.twig</code></li>
</ol>
<h3 id="type-section">Type <em>section</em></h3>
<ol>
<li><code translate="no">&lt;layout&gt;.&lt;format&gt;.twig</code></li>
<li><code translate="no">&lt;section&gt;/index.&lt;format&gt;.twig</code></li>
<li><code translate="no">&lt;section&gt;/list.&lt;format&gt;.twig</code></li>
<li><code translate="no">section/&lt;section&gt;.&lt;format&gt;.twig</code></li>
<li><code translate="no">&lt;parent&gt;/index.&lt;format&gt;.twig</code>, <code translate="no">&lt;parent&gt;/list.&lt;format&gt;.twig</code> et <code translate="no">section/&lt;parent&gt;.&lt;format&gt;.twig</code>, pour chaque section parente d’une sous-section (la plus proche en premier)</li>
<li><code translate="no">_default/section.&lt;format&gt;.twig</code></li>
<li><code translate="no">list.&lt;format&gt;.twig</code></li>
<li><code translate="no">_default/list.&lt;format&gt;.twig</code></li>
</ol>
<aside class="note note-tip"><p>La <code translate="no">&lt;section&gt;</code> d’une <a href="/fr/content/pages/#sous-section">sous-section</a> est son chemin complet (ex. : <code translate="no">blog/2024</code>), et une sous-section se replie sur les templates de ses sections parentes : si <code translate="no">blog/2024/list.html.twig</code> n’existe pas, la sous-section <code translate="no">blog/2024</code> est rendue avec <code translate="no">blog/list.html.twig</code>.</p></aside>
<h3 id="type-vocabulary">Type <em>vocabulary</em></h3>
<ol>
<li><code translate="no">taxonomy/&lt;plural&gt;.&lt;format&gt;.twig</code></li>
<li><code translate="no">vocabulary.&lt;format&gt;.twig</code></li>
<li><code translate="no">_default/vocabulary.&lt;format&gt;.twig</code></li>
</ol>
<h3 id="type-term">Type <em>term</em></h3>
<ol>
<li><code translate="no">taxonomy/&lt;plural&gt;/&lt;term&gt;.&lt;format&gt;.twig</code></li>
<li><code translate="no">taxonomy/&lt;singular&gt;.&lt;format&gt;.twig</code></li>
<li><code translate="no">term.&lt;format&gt;.twig</code></li>
<li><code translate="no">_default/term.&lt;format&gt;.twig</code></li>
<li><code translate="no">_default/list.&lt;format&gt;.twig</code></li>
</ol>
<aside class="note note-important"><p>Le template du <strong>vocabulaire</strong> est nommé d’après le <strong>pluriel</strong> (ex. : <code translate="no">taxonomy/categories.html.twig</code> pour <code translate="no">/categories/</code>), tandis que le template d’un <strong>terme</strong> est nommé d’après le <strong>singulier</strong> (ex. : <code translate="no">taxonomy/category.html.twig</code> pour <code translate="no">/categories/data-sovereignty/</code>).</p></aside>
<aside class="note note-tip"><p><code translate="no">&lt;term&gt;</code> est le nom du terme « slugifié » : un template dédié au terme « Data Sovereignty » du vocabulaire <code translate="no">categories</code> est <code translate="no">taxonomy/categories/data-sovereignty.html.twig</code>.</p></aside>
<aside class="note note-info"><p>La plupart de ces layouts sont disponibles par défaut, voir <a href="#templates-integres">templates intégrés</a>.</p></aside>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/templates/reference/fonctions/</id>
    <title>Fonctions</title>
    <published>2026-05-26T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/templates/reference/fonctions/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Fonctions</h1>
<blockquote>
<p><a href="https://twig.symfony.com/doc/functions/index.html" target="_blank" rel="noopener noreferrer">Fonctions</a> peut être appelée pour générer du contenu. Les fonctions sont appelées par leur nom suivi de parenthèses (<code translate="no">()</code>) et peuvent avoir des arguments.</p>
</blockquote>
<h2 id="url">url</h2>
<p>Crée une URL valide pour une page, une entrée de menu, un actif, un ID de page ou un chemin.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ url(value, {options}) }}</span></code></pre>
<table>
<thead>
<tr>
<th>Options</th>
<th>Descriptif</th>
<th>Tapez</th>
<th>Par défaut</th>
</tr>
</thead>
<tbody>
<tr>
<td>canonique</td>
<td>Préfixez l'URL avec <a href="/fr/configuration/site/#baseurl"><code translate="no">baseurl</code></a> ou utilisez <a href="/fr/configuration/site/#options-metatags"><code translate="no">canonical.url</code></a> s'il existe.</td>
<td>booléen</td>
<td><code translate="no">false</code></td>
</tr>
<tr>
<td>formats</td>
<td>Définit la page <a href="/fr/configuration/output/#output-formats">format de sortie</a> (par exemple : <code translate="no">json</code>).</td>
<td>chaîne</td>
<td><code translate="no">html</code></td>
</tr>
<tr>
<td>langue</td>
<td>Définit la page <a href="/fr/configuration/languages/#language">langue</a> (ex. : <code translate="no">fr</code>).</td>
<td>chaîne</td>
<td>nul</td>
</tr>
</tbody>
</table>
<p><em>Exemples :</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-comment">{# page #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ url(page) }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ url(page, {canonical: true}) }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ url(page, {format: json}) }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ url(page, {language: fr}) }}</span><span class="xml">
</span><span class="hljs-comment">{# menu entry #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ url(site.menus.main.about) }}</span><span class="xml">
</span><span class="hljs-comment">{# asset #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ url(asset('styles.css')) }}</span><span class="xml">
</span><span class="hljs-comment">{# page ID #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ url('page-id') }}</span><span class="xml">
</span><span class="hljs-comment">{# path #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ url('about-me/') }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ url('tags/' ~ tag) }}</span></code></pre>
<aside class="note note-info"><p>Pour plus de commodité, la fonction <code translate="no">url</code> est également disponible sous forme de filtre :</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-comment">{# page #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ page|url }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ page|url({canonical: true, format: json, language: fr}) }}</span><span class="xml">
</span><span class="hljs-comment">{# asset #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ asset('styles.css')|url }}</span></code></pre></aside>
<aside class="note note-tip"><p>Lorsque la valeur est une chaîne, <code translate="no">url()</code> la « slugifie » pour trouver un ID de page correspondant (ex. : <code translate="no">url('tags/My Tag')</code> retourne l’URL de la page <code translate="no">tags/my-tag</code>). Si aucune page ne correspond, la chaîne est conservée comme chemin, avec les caractères invalides (ex. : espaces) encodés.</p></aside>
<h2 id="html">html</h2>
<p>Crée un élément HTML à partir d'un actif (ou d'un tableau d'actifs avec des attributs personnalisés).</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ html(asset, {attributes}, {options}) }}</span><span class="xml">
</span><span class="hljs-comment">{# dedicated functions for each common type of asset #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ css(asset) }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ js(asset) }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ image(asset) }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ audio(asset) }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ video(asset) }}</span></code></pre>
<table>
<thead>
<tr>
<th>Options</th>
<th>Descriptif</th>
<th>Tapez</th>
</tr>
</thead>
<tbody>
<tr>
<td>attributs</td>
<td>Ajoute le couple <code translate="no">name="value"</code> à l'élément HTML.</td>
<td>tableau</td>
</tr>
<tr>
<td>options</td>
<td><code translate="no">{preload: boolean}</code> : préchargements.<br>Pour les images :<br><code translate="no">{formats: array}</code> : ajoute des formats alternatifs.<br><code translate="no">{responsive: bool|string}</code> : ajoute des images réactives (basées sur <code translate="no">width</code> ou des pixels <code translate="no">density</code>).<br><code translate="no">{placeholder: string}</code> : remplit l'arrière-plan de l'image avant son chargement (<code translate="no">color</code> ou <code translate="no">lqip</code>).</td>
<td>tableau</td>
</tr>
</tbody>
</table>
<aside class="note note-warning"><p>Depuis la version <ins>8.42.0</ins>, la fonction <code translate="no">html</code> remplace le filtre <code translate="no">html</code> obsolète.</p></aside>
<aside class="note note-tip"><p>Vous pouvez définir un comportement global par défaut des options d'images (<code translate="no">formats</code>, <code translate="no">responsive</code> et <code translate="no">placeholder</code>) via la <a href="/fr/configuration/layouts/#layouts-images">configuration des layouts</a>.</p>
<p>Lorsque <a href="/fr/configuration/layouts/#layouts-images"><code translate="no">layouts.images.dark_suffix</code></a> est configuré (par exemple <code translate="no">.dark</code>), Cecil recherche automatiquement une variante sombre de chaque image (par exemple <code translate="no">photo.dark.jpg</code> aux côtés de <code translate="no">photo.jpg</code>) et génère un élément <code translate="no">&lt;picture&gt;</code> avec un <code translate="no">&lt;source media="(prefers-color-scheme: dark)"&gt;</code>.</p>
<p>De la même manière, lorsque <a href="/fr/configuration/layouts/#layouts-images"><code translate="no">layouts.images.mobile_suffix</code></a> est configuré (par exemple <code translate="no">.mobile</code>), Cecil recherche une variante mobile de chaque image (par exemple <code translate="no">photo.mobile.jpg</code>) et ajoute un <code translate="no">&lt;source&gt;</code> avec la media query <a href="/fr/configuration/layouts/#layouts-images"><code translate="no">layouts.images.mobile_media_query</code></a>. Si une variante sombre de l’image mobile existe (par exemple <code translate="no">photo.mobile.dark.jpg</code>), elle est utilisée sur mobile en mode sombre.</p></aside>
<p><em>Exemples :</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-comment">{# CSS with an attribute #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ html(asset('print.css'), {media: 'print'}) }}</span><span class="xml">
</span><span class="hljs-comment">{# CSS with an attribute and an option #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ html(asset('styles.css'), {title: 'Main theme'}, {preload: true}) }}</span><span class="xml">
</span><span class="hljs-comment">{# Array of assets with media query #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ html([
  {asset: asset('css/style.css')},
  {asset: asset('css/style-dark.css'), attributes: {media: '(prefers-color-scheme: dark)'}}</span><span class="xml">
]) }}
</span><span class="hljs-comment">{# JavaScript #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ html(asset('script.js')) }}</span><span class="xml">
</span><span class="hljs-comment">{# image without specific attributes nor options #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ html(asset('image.png')) }}</span><span class="xml">
</span><span class="hljs-comment">{# image with specific attributes, responsive images and alternative formats #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ html(asset('image.jpg'), {alt: 'Description', loading: 'lazy'}, {responsive: true, formats: ['avif', 'webp']}) }}</span><span class="xml">
</span><span class="hljs-comment">{# image with responsive pixels density images #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ html(asset('image.jpg'), options={responsive: 'density'}, attributes={width: 256}) }}</span><span class="xml">
</span><span class="hljs-comment">{# image with a Low-Quality Image Placeholder #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ html(asset('image.jpg'), {alt: 'Description', loading: 'lazy'}, {placeholder: 'lqip'}) }}</span><span class="xml">
</span><span class="hljs-comment">{# Audio #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ html(asset('audio.mp3')) }}</span><span class="xml">
</span><span class="hljs-comment">{# Video #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ html(asset('video.mp4')) }}</span></code></pre>
<aside class="note note-info"><p>Pour plus de commodité, la fonction <code translate="no">html</code> reste disponible en tant que filtre (mais est considérée comme obsolète) :</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ asset|html({attributes}, {options}) }}</span></code></pre></aside>
<h2 id="readtime">readtime</h2>
<p>Détermine le temps de lecture d'un texte, en minutes.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ readtime(value) }}</span></code></pre>
<p><em>Exemple:</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ readtime(page.content) }}</span><span class="xml"> min</span></code></pre>
<h2 id="hash">hash</h2>
<p>Calcule le hachage d'un objet, d'un tableau ou d'une chaîne avec un algorithme donné.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ hash(value, algorithm) }}</span></code></pre>
<p><code translate="no">algorithm</code> peut être n'importe quel algorithme pris en charge par la fonction <code translate="no">hash()</code> de PHP (par exemple : <code translate="no">md5</code>, <code translate="no">sha256</code>, etc.). La valeur par défaut est <code translate="no">xxh128</code>.</p>
<p><em>Exemple:</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ hash('my string', 'sha256') }}</span></code></pre>
<h2 id="cache-key">cache_key</h2>
<p>Calcule une clé de cache pour <a href="/fr/cache/#fragments-de-cache"><em>fragments</em> cache</a> en fonction d'un nom et d'une valeur facultative.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-tag">{% <span class="hljs-name">cache</span> cache_key(name, value) %}</span><span class="xml">
  </span><span class="hljs-comment">{# cacheable content #}</span><span class="xml">
</span><span class="hljs-template-tag">{% <span class="hljs-name">endcache</span> %}</span></code></pre>
<p>La fonction ajoute un hachage de la valeur (peut être une chaîne, un tableau ou un objet) au nom (ainsi que la langue actuelle et l'ID de build pour être sûr que la clé de cache générée est unique), donc si la valeur est modifiée, la clé de cache est également modifiée et le cache est automatiquement vidé.</p>
<h2 id="getenv">getenv</h2>
<p>Obtient la valeur d'une variable d'environnement à partir de sa clé.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ getenv(var) }}</span></code></pre>
<p><em>Exemple:</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ getenv('VAR') }}</span></code></pre>
<h2 id="dump">dump</h2>
<p>La fonction <code translate="no">dump</code> affiche les informations sur une variable de modèle. Ceci est surtout utile pour déboguer un modèle qui ne se comporte pas comme prévu en introspectant ses variables :</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ <span class="hljs-name">dump</span><span class="hljs-params">(user)</span> }}</span></code></pre>
<aside class="note note-important"><p>Le <a href="/fr/configuration/site/#debug"><em>debug mode</em></a> doit être activé.</p></aside>
<h2 id="d">d</h2>
<p>La fonction <code translate="no">d()</code> est la version HTML de <a href="#dump"><code translate="no">dump()</code></a> et utilise le <a href="https://symfony.com/doc/5.4/components/var_dumper.html" target="_blank" rel="noopener noreferrer">Symfony VarDumper Component</a> en arrière-plan.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ d(variable, {theme: light}) }}</span></code></pre>
<ul>
<li>Si <em>variable</em> n'est pas fourni, la fonction renvoie le contexte Twig actuel</li>
<li>Les thèmes disponibles sont « clair » (par défaut) et « sombre »</li>
</ul>
<aside class="note note-important"><p>Le <a href="/fr/configuration/site/#debug"><em>debug mode</em></a> doit être activé.</p></aside>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/assets/traitements/</id>
    <title>CSS, JavaScript et traitements</title>
    <published>2026-05-26T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/assets/traitements/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>CSS, JavaScript et traitements</h1>
<h2 id="fingerprint">fingerprint</h2>
<p>Ajoutez l'empreinte digitale du contenu du fichier au nom du fichier.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ asset(path)|fingerprint }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ path|fingerprint }}</span></code></pre>
<p><em>Exemples :</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ asset('styles.css')|fingerprint }}</span></code></pre>
<h2 id="minify">minify</h2>
<p>Réduire un fichier CSS ou JavaScript.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ asset(path)|minify }}</span></code></pre>
<p><em>Exemples :</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ asset('styles.css')|minify }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ asset('scripts.js')|minify }}</span></code></pre>
<h2 id="minify-css">minify_css</h2>
<p>Réduire une chaîne CSS.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ variable|minify_css }}</span></code></pre>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">apply</span></span> minify_css %}</span><span class="xml">
</span><span class="hljs-comment">{# CSS here #}</span><span class="xml">
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endapply</span></span> %}</span></code></pre>
<p><em>Exemples :</em></p>
<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 = 'some CSS here' %}</span><span class="xml">
</span><span class="hljs-template-variable">{{ styles|minify_css }}</span></code></pre>
<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-tag">{% <span class="hljs-name"><span class="hljs-keyword">apply</span></span> minify_css %}</span><span class="xml"><span class="css">
  <span class="hljs-selector-tag">html</span> {
    <span class="hljs-attribute">background-color</span>: <span class="hljs-number">#fcfcfc</span>;
    <span class="hljs-attribute">color</span>: <span class="hljs-number">#444</span>;
  }
</span></span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endapply</span></span> %}</span><span class="xml">
<span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span></span></code></pre>
<h2 id="minify-js">minify_js</h2>
<p>Réduire une chaîne JavaScript.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ variable|minify_js }}</span></code></pre>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">apply</span></span> minify_js %}</span><span class="xml">
</span><span class="hljs-comment">{# JavaScript here #}</span><span class="xml">
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endapply</span></span> %}</span></code></pre>
<p><em>Exemples :</em></p>
<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> script = 'some JavaScript here' %}</span><span class="xml">
</span><span class="hljs-template-variable">{{ script|minify_js }}</span></code></pre>
<pre><code class="language-twig hljs twig" translate="no"><span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span>
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">apply</span></span> minify_js %}</span><span class="xml"><span class="javascript">
  <span class="hljs-keyword">var</span> test = <span class="hljs-string">'test'</span>;
  <span class="hljs-built_in">console</span>.log(test);
</span></span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endapply</span></span> %}</span><span class="xml">
<span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></span></code></pre>
<h2 id="scss-to-css">scss_to_css</h2>
<p>Compile une chaîne <a href="https://sass-lang.com" target="_blank" rel="noopener noreferrer">Sass</a> en CSS.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ variable|scss_to_css }}</span></code></pre>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">apply</span></span> scss_to_css %}</span><span class="xml">
</span><span class="hljs-comment">{# SCSS here #}</span><span class="xml">
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endapply</span></span> %}</span></code></pre>
<p>Alias : <code translate="no">sass_to_css</code>.</p>
<p><em>Exemples :</em></p>
<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> scss = 'some SCSS here' %}</span><span class="xml">
</span><span class="hljs-template-variable">{{ scss|scss_to_css }}</span></code></pre>
<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-tag">{% <span class="hljs-name"><span class="hljs-keyword">apply</span></span> scss_to_css %}</span><span class="xml">
  $color: #fcfcfc;
  div {
    color: lighten($color, 20%);
  }
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endapply</span></span> %}</span><span class="xml">
<span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span></span></code></pre>
<h2 id="to-css">to_css</h2>
<p>Compile un fichier <a href="https://sass-lang.com" target="_blank" rel="noopener noreferrer">Sass</a> en CSS.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ asset(path)|to_css }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ path|to_css }}</span></code></pre>
<p><em>Exemples :</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ asset('styles.scss')|to_css }}</span></code></pre>
<h2 id="inline">inline</h2>
<p>Affiche le contenu d'un <em>Asset</em>.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ asset(path)|inline }}</span></code></pre>
<p><em>Exemple:</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ asset('styles.css')|inline }}</span></code></pre>
<h2 id="dataurl">dataurl</h2>
<p>Renvoie l'<a href="https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs" target="_blank" rel="noopener noreferrer">URL de données</a> d'un actif.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ asset(path)|dataurl }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ asset(image_path)|dataurl }}</span></code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/templates/variables/</id>
    <title>Variables</title>
    <published>2026-05-26T00:00:00+00:00</published>
    <updated>2026-10-06T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/templates/variables/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Variables</h1>
<blockquote>
<p>L'application transmet des variables aux templates pour manipulation dans le modèle. Les variables peuvent également avoir des attributs ou des éléments auxquels vous pouvez accéder.
Utilisez un point (.) pour accéder aux attributs d'une variable : <code translate="no">{{ foo.bar }}</code></p>
</blockquote>
<p>Vous pouvez utiliser des variables de différentes portées : <a href="#site"><code translate="no">site</code></a>, <a href="#page"><code translate="no">page</code></a>, <a href="#cecil"><code translate="no">cecil</code></a>.</p>
<h2 id="site">site</h2>
<p>La variable <code translate="no">site</code> contient des variables intégrées <strong>et</strong> celles définies dans la <a href="/fr/configuration/">configuration</a>.</p>
<table>
<thead>
<tr>
<th>Variables</th>
<th>Descriptif</th>
</tr>
</thead>
<tbody>
<tr>
<td><code translate="no">site.pages</code></td>
<td>Collection de toutes les pages, dans la langue actuelle.</td>
</tr>
<tr>
<td><code translate="no">site.allpages</code></td>
<td>Collection de toutes les pages, dans toutes les langues.</td>
</tr>
<tr>
<td><code translate="no">site.page(id)</code></td>
<td>Une page avec l'ID donné.</td>
</tr>
<tr>
<td><code translate="no">site.taxonomies</code></td>
<td>Recueil de vocabulaires.</td>
</tr>
<tr>
<td><code translate="no">site.home</code></td>
<td>ID de la page d'accueil.</td>
</tr>
<tr>
<td><code translate="no">site.time</code></td>
<td>Actuel <a href="https://wikipedia.org/wiki/Unix_time" target="_blank" rel="noopener noreferrer"><em>Timestamp</em></a>.</td>
</tr>
<tr>
<td><code translate="no">site.debug</code></td>
<td>État du mode débogage (<code translate="no">true</code> ou <code translate="no">false</code>).</td>
</tr>
<tr>
<td><code translate="no">site.build</code></td>
<td>ID de build actuel.</td>
</tr>
</tbody>
</table>
<p><em>Exemple:</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">title:</span> <span class="hljs-string">"My amazing website!"</span></code></pre>
<p>Peut être affiché dans un modèle avec :</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ site.title }}</span></code></pre>
<aside class="note note-important"><p>Utilisez la méthode <code translate="no">showable</code> sur la collection de pages pour renvoyer uniquement les pages publiées et non les pages <em>virtuelles/redirectes/exclues</em>.</p>
<p><em>Exemple:</em></p>
<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> page in site.pages.showable %}</span><span class="xml">
  <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) }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>&gt;</span></span><span class="hljs-template-variable">{{ page.title }}</span><span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endfor</span></span> %}</span></code></pre></aside>
<aside class="note note-warning"><p>Dans certains cas, vous pouvez rencontrer des conflits entre la configuration et les variables intégrées (ex. : <code translate="no">pages.default</code> configuration), vous pouvez donc utiliser <code translate="no">config.&lt;variable&gt;</code> (avec <code translate="no">&lt;variable&gt;</code> est le nom/chemin de la variable) pour accéder directement à la configuration brute.</p>
<p>Exemple:</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ config.pages.default.sitemap.priority }}</span></code></pre></aside>
<h3 id="site-menus">site.menus</h3>
<p>Bouclez sur <code translate="no">site.menus.&lt;menu&gt;</code> pour obtenir chaque entrée de la collection <code translate="no">&lt;menu&gt;</code> (par exemple : <code translate="no">main</code>).</p>
<table>
<thead>
<tr>
<th>Variables</th>
<th>Descriptif</th>
</tr>
</thead>
<tbody>
<tr>
<td><code translate="no">&lt;entry&gt;.name</code></td>
<td>Nom de l'entrée.</td>
</tr>
<tr>
<td><code translate="no">&lt;entry&gt;.url</code></td>
<td>URL d'entrée.</td>
</tr>
<tr>
<td><code translate="no">&lt;entry&gt;.weight</code></td>
<td>Poids d'entrée (utile pour trier les entrées de menu).</td>
</tr>
</tbody>
</table>
<p><em>Exemple:</em></p>
<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>
  <span class="hljs-tag">&lt;<span class="hljs-name">ol</span>&gt;</span>
  </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">
    <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(entry.url) }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> <span class="hljs-attr">data-weight</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{{ entry.weight }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>&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><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
  </span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endfor</span></span> %}</span><span class="xml">
  <span class="hljs-tag">&lt;/<span class="hljs-name">ol</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span></span></code></pre>
<h3 id="site-language">site.language</h3>
<p>Informations sur la langue actuelle.</p>
<table>
<thead>
<tr>
<th>Variables</th>
<th>Descriptif</th>
</tr>
</thead>
<tbody>
<tr>
<td><code translate="no">site.language</code></td>
<td>Code de langue (ex. : <code translate="no">en</code>).</td>
</tr>
<tr>
<td><code translate="no">site.language.name</code></td>
<td>Nom de la langue (par exemple : <code translate="no">English</code>).</td>
</tr>
<tr>
<td><code translate="no">site.language.locale</code></td>
<td>Langue <a href="/fr/configuration/locale-codes/">code local</a> (par exemple : <code translate="no">en_US</code>).</td>
</tr>
<tr>
<td><code translate="no">site.language.weight</code></td>
<td>Position de la langue dans la liste <code translate="no">languages</code>.</td>
</tr>
</tbody>
</table>
<aside class="note note-tip"><p>Vous pouvez récupérer <code translate="no">name</code>, <code translate="no">locale</code> et <code translate="no">weight</code> d'un langage spécifique en passant son code en paramètre.
par exemple : <code translate="no">site.language.name('fr')</code>.</p></aside>
<h3 id="site-static">site.static</h3>
<p>La collection de fichiers statiques est accessible via <code translate="no">site.static</code> si le <a href="/fr/configuration/data-static/#static-load"><em>static load</em></a> est activé.</p>
<p>Chaque fichier expose les propriétés suivantes :</p>
<ul>
<li><code translate="no">path</code> : chemin relatif (ex. : <code translate="no">/images/img-1.jpg</code>)</li>
<li><code translate="no">date</code> : date de création (<em>timestamp</em>)</li>
<li><code translate="no">updated</code> : date de modification (<em>timestamp</em>)</li>
<li><code translate="no">name</code> : nom (ex. : <code translate="no">img-1.jpg</code>)</li>
<li><code translate="no">basename</code> : nom sans extension (ex. : <code translate="no">img-1</code>)</li>
<li><code translate="no">ext</code> : poste (ex. : <code translate="no">jpg</code>)</li>
<li><code translate="no">type</code> : type de média (ex. : <code translate="no">image</code>)</li>
<li><code translate="no">subtype</code> : sous-type de média (ex. : <code translate="no">image/jpeg</code>)</li>
<li><code translate="no">exif</code> : données EXIF ​​​​de l'image (<em>array</em>)</li>
<li><code translate="no">audio</code> : <a href="https://github.com/wapmorgan/Mp3Info#audio-information" target="_blank" rel="noopener noreferrer">Mp3Info</a> objet</li>
<li><code translate="no">video</code> : tableau d'informations vidéo de base (durée en secondes, largeur et hauteur)</li>
</ul>
<h3 id="site-data">site.data</h3>
<p>Une collection de données est accessible via <code translate="no">site.data.&lt;filename&gt;</code> (sans extension de fichier).</p>
<p><em>Exemples :</em></p>
<ul>
<li><code translate="no">data/authors.yml</code> : <code translate="no">site.data.authors</code></li>
<li><code translate="no">data/authors.fr.yml</code> : <code translate="no">site.data.authors</code> (si <code translate="no">site.language</code> = "fr")</li>
<li><code translate="no">data/galleries/gallery-1.json</code> : <code translate="no">site.data.galleries['gallery-1']</code></li>
</ul>
<h2 id="page">page</h2>
<p>La variable <code translate="no">page</code> contient les variables intégrées d'une page <strong>et</strong> celles définies dans le <a href="/fr/content/pages/#front-matter">avant-plan</a>.</p>
<table>
<thead>
<tr>
<th>Variables</th>
<th>Descriptif</th>
<th>Exemple</th>
</tr>
</thead>
<tbody>
<tr>
<td><code translate="no">page.id</code></td>
<td>Identifiant unique.</td>
<td><code translate="no">blog/post-1</code></td>
</tr>
<tr>
<td><code translate="no">page.title</code></td>
<td>Nom du fichier (sans extension).</td>
<td><code translate="no">Post 1</code></td>
</tr>
<tr>
<td><code translate="no">page.date</code></td>
<td>Date de création du fichier.</td>
<td><em>DateHeure</em></td>
</tr>
<tr>
<td><code translate="no">page.body</code></td>
<td>Corps du fichier.</td>
<td><em>Marquage</em></td>
</tr>
<tr>
<td><code translate="no">page.content</code></td>
<td>Corps du fichier converti en HTML.</td>
<td><em>HTML</em></td>
</tr>
<tr>
<td><code translate="no">page.section</code></td>
<td>Dossier racine du fichier (<em>slugified</em>).</td>
<td><code translate="no">blog</code></td>
</tr>
<tr>
<td><code translate="no">page.path</code></td>
<td>Chemin du fichier (<em>slugified</em>).</td>
<td><code translate="no">blog/post-1</code></td>
</tr>
<tr>
<td><code translate="no">page.slug</code></td>
<td>Nom du fichier (<em>slugified</em>).</td>
<td><code translate="no">post-1</code></td>
</tr>
<tr>
<td><code translate="no">page.filepath</code></td>
<td>Chemin du système de fichiers.</td>
<td><code translate="no">Blog/Post 1.md</code></td>
</tr>
<tr>
<td><code translate="no">page.type</code></td>
<td><code translate="no">homepage</code>, <code translate="no">page</code>, <code translate="no">section</code>, <code translate="no">vocabulary</code> ou <code translate="no">term</code>.</td>
<td><code translate="no">page</code></td>
</tr>
<tr>
<td><code translate="no">page.pages</code></td>
<td>Collection de toutes les sous-pages.</td>
<td><em>Collection</em></td>
</tr>
<tr>
<td><code translate="no">page.translations</code></td>
<td>Collection de pages traduites.</td>
<td><em>Collection</em></td>
</tr>
</tbody>
</table>
<aside class="note note-important"><p>Utilisez la méthode <code translate="no">showable</code> sur la collection de pages pour renvoyer uniquement les pages publiées et non les pages <em>virtuelles/redirectes/exclues</em>.</p>
<p><em>Exemple:</em></p>
<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> page in page.pages.showable %}</span><span class="xml">
  <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) }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>&gt;</span></span><span class="hljs-template-variable">{{ page.title }}</span><span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endfor</span></span> %}</span></code></pre></aside>
<h3 id="sections-imbriquees">Sections imbriquées</h3>
<p>Dans un contexte de <a href="/fr/content/pages/#sous-section">sections imbriquées</a>, les propriétés <code translate="no">page.parent</code>, <code translate="no">page.ancestors</code>, <code translate="no">page.sections</code> et <code translate="no">page.toplevel</code> facilitent la construction de la navigation.</p>
<table>
<thead>
<tr>
<th>Variables</th>
<th>Descriptif</th>
<th>Exemple</th>
</tr>
</thead>
<tbody>
<tr>
<td><code translate="no">page.parent</code></td>
<td>Page de la <em>section</em> parente (<code translate="no">null</code> si aucune).</td>
<td><em>Page</em></td>
</tr>
<tr>
<td><code translate="no">page.ancestors</code></td>
<td>Collection des <em>sections</em> ancêtres (la plus proche en premier).</td>
<td><em>Collection</em></td>
</tr>
<tr>
<td><code translate="no">page.sections</code></td>
<td>Collection des <em>sections</em> descendantes immédiates.</td>
<td><em>Collection</em></td>
</tr>
<tr>
<td><code translate="no">page.toplevel</code></td>
<td><code translate="no">true</code> si la page est une <em>section</em> de premier niveau.</td>
<td><em>Boolean</em></td>
</tr>
</tbody>
</table>
<p><em>Fil d'Ariane (de la page d'accueil à la page courante) :</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">nav</span> <span class="hljs-attr">aria-label</span>=<span class="hljs-string">"breadcrumb"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
    <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(site.home) }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>&gt;</span></span><span class="hljs-template-variable">{{ site.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">li</span>&gt;</span>
    </span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">for</span></span> section in page.ancestors|<span class="hljs-keyword">reverse</span> %}</span><span class="xml">
    <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(section) }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>&gt;</span></span><span class="hljs-template-variable">{{ section.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">li</span>&gt;</span>
    </span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endfor</span></span> %}</span><span class="xml">
    </span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">if</span></span> page.id != site.home %}</span><span class="xml">
    <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(page) }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> <span class="hljs-attr">aria-current</span>=<span class="hljs-string">"page"</span>&gt;</span></span><span class="hljs-template-variable">{{ page.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">li</span>&gt;</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">&lt;/<span class="hljs-name">ul</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span></span></code></pre>
<aside class="note note-tip"><p>Un partial <a href="https://github.com/Cecilapp/Cecil/blob/main/resources/layouts/partials/breadcrumb.html.twig" target="_blank" rel="noopener noreferrer"><code translate="no">breadcrumb.html.twig</code></a> prêt à l'emploi est disponible :</p>
<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/breadcrumb.html.twig')</span> }}</span></code></pre></aside>
<p><em>Menu des sous-sections (sections descendantes immédiates de la section courante) :</em></p>
<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.sections|<span class="hljs-keyword">length</span> %}</span><span class="xml">
<span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
  </span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">for</span></span> section in page.sections|sort_by_title %}</span><span class="xml">
  <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(section) }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>&gt;</span></span><span class="hljs-template-variable">{{ section.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">li</span>&gt;</span>
  </span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endfor</span></span> %}</span><span class="xml">
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endif</span></span> %}</span></code></pre>
<p><em>Navigation principale limitée aux sections de premier niveau (depuis n'importe quelle page) :</em></p>
<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>
  </span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">for</span></span> section in site.page(site.home).sections|sort_by_title %}</span><span class="xml">
  <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(section) }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>&gt;</span></span><span class="hljs-template-variable">{{ section.title }}</span><span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
  </span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endfor</span></span> %}</span><span class="xml">
<span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span></span></code></pre>
<p><em>Lien vers la section parente :</em></p>
<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.<span class="hljs-name">parent</span> %}</span><span class="xml">
<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.<span class="hljs-name">parent</span>) }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>&gt;</span>← </span><span class="hljs-template-variable">{{ page.<span class="hljs-name">parent</span>.title }}</span><span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endif</span></span> %}</span></code></pre>
<h3 id="page-prev-next">page.&lt;prev/next&gt;</h3>
<p>Navigation entre les pages d'une même <em>Section</em>, triées selon le <code translate="no">sortby</code> de la section (ordre chronologique pour les dates).</p>
<p>Avec des <a href="/fr/content/pages/#sous-section">sous-sections</a>, la navigation suit l'arbre des sections : les pages d'une <em>Section</em> de premier niveau et de toutes ses sous-sections sont enchaînées, chaque sous-section (sa page d'index) étant placée parmi les pages de sa <em>Section</em> parente et suivie de ses propres pages.</p>
<table>
<thead>
<tr>
<th>Variables</th>
<th>Descriptif</th>
<th>Exemple</th>
</tr>
</thead>
<tbody>
<tr>
<td><code translate="no">page.prev</code></td>
<td>Page précédente.</td>
<td><em>Page</em></td>
</tr>
<tr>
<td><code translate="no">page.next</code></td>
<td>Page suivante.</td>
<td><em>Page</em></td>
</tr>
</tbody>
</table>
<p><em>Exemple:</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="xml"><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.prev) }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>&gt;</span></span><span class="hljs-template-variable">{{ page.prev.title }}</span><span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span></span></code></pre>
<h3 id="page-paginator">page.paginator</h3>
<p><em>Paginator</em> vous aide à créer une navigation pour les pages de la liste : page d'accueil, sections et taxonomies.</p>
<table>
<thead>
<tr>
<th>Variables</th>
<th>Descriptif</th>
</tr>
</thead>
<tbody>
<tr>
<td><code translate="no">page.paginator.pages</code></td>
<td>Collection de pages.</td>
</tr>
<tr>
<td><code translate="no">page.paginator.pages_total</code></td>
<td>Nombre total de pages.</td>
</tr>
<tr>
<td><code translate="no">page.paginator.count</code></td>
<td>Nombre de pages du paginateur.</td>
</tr>
<tr>
<td><code translate="no">page.paginator.current</code></td>
<td>Index de position de la page actuelle.</td>
</tr>
<tr>
<td><code translate="no">page.paginator.links.first</code></td>
<td>ID de page de la première page.</td>
</tr>
<tr>
<td><code translate="no">page.paginator.links.prev</code></td>
<td>ID de page de la page précédente.</td>
</tr>
<tr>
<td><code translate="no">page.paginator.links.self</code></td>
<td>ID de page de la page actuelle.</td>
</tr>
<tr>
<td><code translate="no">page.paginator.links.next</code></td>
<td>ID de page de la page suivante.</td>
</tr>
<tr>
<td><code translate="no">page.paginator.links.last</code></td>
<td>ID de page de la dernière page.</td>
</tr>
<tr>
<td><code translate="no">page.paginator.links.path</code></td>
<td>ID de page sans l'index de position.</td>
</tr>
</tbody>
</table>
<aside class="note note-important"><p>Étant donné que les entrées de liens sont des ID de page, vous devez utiliser la fonction <code translate="no">url()</code> pour créer des liens fonctionnels.
par exemple : <code translate="no">{{ url(page.paginator.links.next) }}</code></p></aside>
<p><em>Exemple:</em></p>
<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">
<span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
  </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">
  <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>&gt;</span>Previous<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
  </span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endif</span></span> %}</span><span class="xml">
  </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">
  <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>&gt;</span>Next<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</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">&lt;/<span class="hljs-name">div</span>&gt;</span>
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endif</span></span> %}</span></code></pre>
<p><em>Exemple:</em></p>
<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">
<span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
  </span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">for</span></span> paginator_index in 1..page.paginator.count %}</span><span class="xml">
    </span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">if</span></span> paginator_index != page.paginator.current %}</span><span class="xml">
      </span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">if</span></span> paginator_index == 1 %}</span><span class="xml">
  <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">{{ paginator_index }}</span><span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
      </span><span class="hljs-template-tag">{% <span class="hljs-name">else</span> %}</span><span class="xml">
  <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 ~ '/' ~ paginator_index) }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>&gt;</span></span><span class="hljs-template-variable">{{ paginator_index }}</span><span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
      </span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endif</span></span> %}</span><span class="xml">
    </span><span class="hljs-template-tag">{% <span class="hljs-name">else</span> %}</span><span class="xml">
  </span><span class="hljs-template-variable">{{ paginator_index }}</span><span class="xml">
    </span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endif</span></span> %}</span><span class="xml">
  </span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endfor</span></span> %}</span><span class="xml">
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endif</span></span> %}</span></code></pre>
<h3 id="taxonomie">Taxonomie</h3>
<p>Variables disponibles dans les templates <em>vocabulary</em> et <em>term</em>.</p>
<h4>Vocabulaire</h4>
<p>Page <code translate="no">/&lt;plural&gt;/</code> (ex. : <code translate="no">/categories/</code>).</p>
<table>
<thead>
<tr>
<th>Variables</th>
<th>Descriptif</th>
</tr>
</thead>
<tbody>
<tr>
<td><code translate="no">page.plural</code></td>
<td>Nom de vocabulaire au pluriel.</td>
</tr>
<tr>
<td><code translate="no">page.singular</code></td>
<td>Nom de vocabulaire au singulier.</td>
</tr>
<tr>
<td><code translate="no">page.terms</code></td>
<td>Liste de termes (<em>Collection</em>).</td>
</tr>
</tbody>
</table>
<p>Chaque terme de <code translate="no">page.terms</code> fournit <code translate="no">term.id</code> (identifiant du terme, ex. : <code translate="no">categories/php</code>), <code translate="no">term.name</code> (nom du terme, ex. : <code translate="no">PHP</code>) et le nombre de ses pages avec <code translate="no">term|length</code>.</p>
<h4>Terme</h4>
<p>Page <code translate="no">/&lt;plural&gt;/&lt;term&gt;/</code> (ex. : <code translate="no">/categories/php/</code>).</p>
<table>
<thead>
<tr>
<th>Variables</th>
<th>Descriptif</th>
</tr>
</thead>
<tbody>
<tr>
<td><code translate="no">page.title</code></td>
<td>Nom du terme.</td>
</tr>
<tr>
<td><code translate="no">page.term</code></td>
<td>Identifiant du terme (ex. : <code translate="no">categories/php</code>).</td>
</tr>
<tr>
<td><code translate="no">page.plural</code></td>
<td>Nom de vocabulaire au pluriel.</td>
</tr>
<tr>
<td><code translate="no">page.singular</code></td>
<td>Nom de vocabulaire au singulier.</td>
</tr>
<tr>
<td><code translate="no">page.pages</code></td>
<td>Liste des pages dans ce terme, triées par date (<em>Collection</em>).</td>
</tr>
</tbody>
</table>
<h4>Exemple de taxonomie</h4>
<p>Configuration :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">taxonomies:</span>
  <span class="hljs-attr">categories:</span> <span class="hljs-string">category</span></code></pre>
<p>Front matter d’une page :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">categories:</span> <span class="hljs-string">["Data</span> <span class="hljs-string">Sovereignty"]</span>
<span class="hljs-meta">---</span></code></pre>
<p>Liste des termes (<code translate="no">/categories/</code>), dans <code translate="no">layouts/taxonomy/categories.html.twig</code> :</p>
<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">

</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">block</span></span> content %}</span><span class="xml">
  <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>
  <span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
  </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">
    <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>
  </span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endfor</span></span> %}</span><span class="xml">
  <span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endblock</span></span> %}</span></code></pre>
<p>Liste des pages d’un terme (<code translate="no">/categories/data-sovereignty/</code>), dans <code translate="no">layouts/taxonomy/category.html.twig</code> :</p>
<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">

</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">block</span></span> content %}</span><span class="xml">
  <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>
  </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">
    <span class="hljs-tag">&lt;<span class="hljs-name">article</span>&gt;</span>
      <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>
    <span class="hljs-tag">&lt;/<span class="hljs-name">article</span>&gt;</span>
  </span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endfor</span></span> %}</span><span class="xml">
  <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>Toutes les </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>
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endblock</span></span> %}</span></code></pre>
<p>Liens vers les termes de la page courante, dans un template de page :</p>
<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> category in page.categories ?? [] %}</span><span class="xml">
  <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('categories/' ~ category) }}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>&gt;</span></span><span class="hljs-template-variable">{{ category }}</span><span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endfor</span></span> %}</span></code></pre>
<aside class="note note-tip"><p>La fonction <a href="/fr/documentation/reference/functions/#url"><code translate="no">url()</code></a> « slugifie » la chaîne fournie pour trouver la page correspondante : <code translate="no">url('categories/Data Sovereignty')</code> retourne <code translate="no">/categories/data-sovereignty/</code>.</p>
<p>Vous pouvez aussi utiliser le partial intégré <code translate="no">{{ include('partials/terms-list.html.twig', {vocabulary: 'categories'}) }}</code>.</p></aside>
<h2 id="cecil">cecil</h2>
<table>
<thead>
<tr>
<th>Variables</th>
<th>Descriptif</th>
</tr>
</thead>
<tbody>
<tr>
<td><code translate="no">cecil.url</code></td>
<td>URL du site Cecil.</td>
</tr>
<tr>
<td><code translate="no">cecil.version</code></td>
<td>Version actuelle de Cecil.</td>
</tr>
<tr>
<td><code translate="no">cecil.poweredby</code></td>
<td>Imprimez <code translate="no">Cecil v%s</code>, avec <code translate="no">%s</code> est la version actuelle.</td>
</tr>
</tbody>
</table>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/templates/reference/tris/</id>
    <title>Tris</title>
    <published>2026-05-26T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/templates/reference/tris/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Tris</h1>
<p>Tri des collections (de pages, menus ou taxonomies).</p>
<h2 id="sort-by-title">sort_by_title</h2>
<p>Trie une collection par titre (avec <a href="https://en.wikipedia.org/wiki/Natural_sort_order" target="_blank" rel="noopener noreferrer">tri naturel</a>).</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ collection|sort_by_title }}</span></code></pre>
<p><em>Exemple:</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ site.pages|sort_by_title }}</span></code></pre>
<h2 id="sort-by-date">sort_by_date</h2>
<p>Trie une collection par date (la plus récente en premier).</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ collection|sort_by_date(variable='<span class="hljs-name">date</span>', desc_title=false) }}</span></code></pre>
<p><em>Exemple:</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-comment">{# sort by date #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ site.pages|sort_by_date }}</span><span class="xml">
</span><span class="hljs-comment">{# sort by updated variable instead of date #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ site.pages|sort_by_date(variable='updated') }}</span><span class="xml">
</span><span class="hljs-comment">{# sort items with the same date by desc title #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ site.pages|sort_by_date(desc_title=true) }}</span><span class="xml">
</span><span class="hljs-comment">{# reverse sort #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ site.pages|sort_by_date|<span class="hljs-keyword">reverse</span> }}</span></code></pre>
<h2 id="sort-by-weight">sort_by_weight</h2>
<p>Trie une collection par poids (le plus léger en premier).</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ collection|sort_by_weight }}</span></code></pre>
<p><em>Exemple:</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ site.menus.main|sort_by_weight }}</span></code></pre>
<h2 id="sort">sort</h2>
<p>Pour les cas plus complexes, vous devez utiliser <a href="https://twig.symfony.com/doc/filters/sort.html" target="_blank" rel="noopener noreferrer">le <code translate="no">sort</code></a> natif de Twig.</p>
<p><em>Exemple:</em></p>
<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> files = site.static|<span class="hljs-keyword">sort</span>((a, b) =&gt; a.<span class="hljs-name">date</span>|<span class="hljs-keyword">date</span>('U') &lt; b.<span class="hljs-name">date</span>|<span class="hljs-keyword">date</span>('U')) %}</span></code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/templates/reference/filtres/</id>
    <title>Filtres</title>
    <published>2026-05-26T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/templates/reference/filtres/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Filtres</h1>
<p>Les variables peuvent être modifiées par <a href="https://twig.symfony.com/doc/filters/index.html" target="_blank" rel="noopener noreferrer">filtres</a>. Les filtres sont séparés de la variable par un symbole de barre verticale (<code translate="no">|</code>). Plusieurs filtres peuvent être chaînés. La sortie d’un filtre est appliquée au suivant.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ page.title|truncate(25)|<span class="hljs-keyword">capitalize</span> }}</span></code></pre>
<h2 id="filter-by">filter_by</h2>
<p>Filtre une collection de pages par nom/valeur de variable.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ collection|filter_by(variable, value) }}</span></code></pre>
<p><em>Exemple:</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ pages|filter_by('section', 'blog') }}</span></code></pre>
<h2 id="filter">filter</h2>
<p>Pour les cas plus complexes, vous devez utiliser <a href="https://twig.symfony.com/doc/filters/filter.html" target="_blank" rel="noopener noreferrer">le <code translate="no">filter</code></a> natif de Twig.</p>
<p><em>Exemple:</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-tag">{% <span class="hljs-name">pages</span>|<span class="hljs-keyword">filter</span>(p =&gt; p.virtual == false and p.id not in ['page-1', 'page-2']) %}</span></code></pre>
<h2 id="markdown-to-html">markdown_to_html</h2>
<p>Convertit une chaîne Markdown en HTML.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ markdown|markdown_to_html }}</span></code></pre>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">apply</span></span> markdown_to_html %}</span><span class="xml">
</span><span class="hljs-comment">{# Markdown here #}</span><span class="xml">
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endapply</span></span> %}</span></code></pre>
<p><em>Exemples :</em></p>
<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> markdown = '**This is bold text**' %}</span><span class="xml">
</span><span class="hljs-template-variable">{{ markdown|markdown_to_html }}</span></code></pre>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">apply</span></span> markdown_to_html %}</span><span class="xml">
**This is bold text**
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endapply</span></span> %}</span></code></pre>
<h2 id="toc">toc</h2>
<p>Extrait uniquement les en-têtes correspondant au <code translate="no">selectors</code> donné (h2, h3, etc.), ou à ceux définis dans la configuration <code translate="no">pages.body.toc</code> s'ils ne sont pas spécifiés.
Le paramètre <code translate="no">format</code> définit le format de sortie : <code translate="no">html</code> ou <code translate="no">json</code>.
Le paramètre <code translate="no">url</code> est utilisé pour créer des liens vers des titres.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ markdown|toc(format, selectors, url) }}</span></code></pre>
<p><em>Exemples :</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ page.body|toc }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ page.body|toc('html') }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ page.body|toc(selectors=['h2']) }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ page.body|toc(url=url(page)) }}</span></code></pre>
<h2 id="json-decode">json_decode</h2>
<p>Convertit une chaîne JSON en tableau.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ json|json_decode }}</span></code></pre>
<p><em>Exemple:</em></p>
<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> json = '{"foo": "bar"}' %}</span><span class="xml">
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">set</span></span> array = json|json_decode %}</span><span class="xml">
</span><span class="hljs-template-variable">{{ array.foo }}</span></code></pre>
<h2 id="yaml-parse">yaml_parse</h2>
<p>Convertit une chaîne YAML en tableau.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ yaml|yaml_parse }}</span></code></pre>
<p><em>Exemple:</em></p>
<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> yaml = 'key: value' %}</span><span class="xml">
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">set</span></span> array = yaml|yaml_parse %}</span><span class="xml">
</span><span class="hljs-template-variable">{{ array.key }}</span></code></pre>
<h2 id="slugify">slugify</h2>
<p>Convertit une chaîne en slug.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ string|slugify }}</span></code></pre>
<h2 id="u">u</h2>
<p>Le filtre <code translate="no">u</code> enveloppe un texte dans un objet Unicode (une <a href="https://symfony.com/doc/current/components/string.html" target="_blank" rel="noopener noreferrer">instance Symfony UnicodeString</a>) qui expose des méthodes pour « manipuler » la chaîne.</p>
<p><em>Exemple:</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ 'cecil_string with twig'|u.camel.title }}</span></code></pre>
<blockquote>
<p>CecilStringAvecTwig</p>
</blockquote>
<h2 id="singular">singular</h2>
<p>Le filtre <code translate="no">singular</code> transforme un nom donné au pluriel en sa version singulière.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ string|singular(locale)}}</span></code></pre>
<p><em>Exemple:</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-comment">{# English (en) rules are used by default #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ 'partitions'|singular }}</span></code></pre>
<blockquote>
<p>partition</p>
</blockquote>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ 'partitions'|singular('fr') }}</span></code></pre>
<blockquote>
<p>partition</p>
</blockquote>
<h2 id="plural">plural</h2>
<p>Le filtre <code translate="no">plural</code> transforme un nom donné au singulier en sa version plurielle.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ string|plural(locale)}}</span></code></pre>
<p><em>Exemple:</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-comment">{# English (en) rules are used by default #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ 'animal'|plural }}</span></code></pre>
<blockquote>
<p>animaux</p>
</blockquote>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ 'animal'|plural('fr') }}</span></code></pre>
<blockquote>
<p>animaux</p>
</blockquote>
<h2 id="excerpt">excerpt</h2>
<p>Tronque une chaîne et ajoute un suffixe.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ string|excerpt(length, suffix) }}</span></code></pre>
<table>
<thead>
<tr>
<th>Options</th>
<th>Descriptif</th>
<th>Tapez</th>
<th>Par défaut</th>
</tr>
</thead>
<tbody>
<tr>
<td>longueur</td>
<td>Tronque après ce nombre de caractères.</td>
<td>entier</td>
<td>450</td>
</tr>
<tr>
<td>suffixe</td>
<td>Ajoute des caractères.</td>
<td>chaîne</td>
<td><code translate="no">…</code></td>
</tr>
</tbody>
</table>
<p><em>Exemples :</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ variable|excerpt }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ variable|excerpt(250, '...') }}</span></code></pre>
<h2 id="excerpt-html">excerpt_html</h2>
<p>Lit les caractères avant ou après la balise <code translate="no">&lt;!-- excerpt --&gt;</code> ou <code translate="no">&lt;!-- break --&gt;</code>.
Voir <a href="/fr/content/markdown/#extrait">Documentation de contenu</a> pour plus de détails.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ string|excerpt_html({separator, capture}) }}</span></code></pre>
<table>
<thead>
<tr>
<th>Options</th>
<th>Descriptif</th>
<th>Tapez</th>
<th>Par défaut</th>
</tr>
</thead>
<tbody>
<tr>
<td>séparateur</td>
<td>Chaîne à utiliser comme séparateur.</td>
<td>chaîne</td>
<td><code translate="no">excerpt|break</code></td>
</tr>
<tr>
<td>capturer</td>
<td>Pièce à capturer, <code translate="no">before</code> ou <code translate="no">after</code> le séparateur.</td>
<td>chaîne</td>
<td><code translate="no">before</code></td>
</tr>
</tbody>
</table>
<p><em>Exemples :</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ variable|excerpt_html }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ variable|excerpt_html({separator: 'excerpt|break', capture: 'before'}) }}</span><span class="xml">
</span><span class="hljs-template-variable">{{ variable|excerpt_html({capture: 'after'}) }}</span></code></pre>
<h2 id="highlight">highlight</h2>
<p>Met en surbrillance une chaîne de code avec <a href="https://github.com/scrivo/highlight.php" target="_blank" rel="noopener noreferrer">highlight.php</a>.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ code|highlight(language) }}</span></code></pre>
<p><em>Exemples :</em></p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ '&lt;?php echo $highlighted-&gt;value; ?&gt;'|highlight('php') }}</span></code></pre>
<h2 id="preg-split">preg_split</h2>
<p>Divise une chaîne en un tableau à l'aide d'une expression régulière.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ string|preg_split(pattern, limit) }}</span></code></pre>
<p><em>Exemple:</em></p>
<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> headers = page.content|preg_split('/&lt;br[^&gt;]*&gt;/') %}</span></code></pre>
<h2 id="preg-match-all">preg_match_all</h2>
<p>Effectue une correspondance d'expression régulière et renvoie le groupe pour toutes les correspondances.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ string|preg_match_all(pattern, group) }}</span></code></pre>
<p><em>Exemple:</em></p>
<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> tags = page.content|preg_match_all('/&lt;[^&gt;]+&gt;(.*)&lt;\/[^&gt;]+&gt;/') %}</span></code></pre>
<h2 id="hex-to-rgb">hex_to_rgb</h2>
<p>Convertit une couleur hexadécimale en RVB.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ color|hex_to_rgb }}</span></code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/templates/composants/</id>
    <title>Composants</title>
    <published>2026-05-26T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/templates/composants/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Composants</h1>
<p>Cecil fournit une logique de composants pour vous donner le pouvoir de créer des "unités" de templates réutilisables.</p>
<aside class="note note-info"><p>La fonctionnalité des composants est fournie par l'<a href="https://github.com/giorgiopogliani/twig-components" target="_blank" rel="noopener noreferrer"><em>extension de composants Twig</em></a> créée par Giorgio Pogliani.</p></aside>
<h2 id="syntaxe-des-composants">Syntaxe des composants</h2>
<p>Les composants ne sont que des templates Twig stockés dans le sous-répertoire <code translate="no">components/</code> et peuvent être utilisés n'importe où dans vos templates :</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-comment">{# /components/button.twig #}</span><span class="xml">
<span class="hljs-tag">&lt;<span class="hljs-name">button</span> </span></span><span class="hljs-template-variable">{{ attributes.merge({class: 'rounded px-4'}) }}</span><span class="xml"><span class="hljs-tag">&gt;</span>
    </span><span class="hljs-template-variable">{{ slot }}</span><span class="xml">
<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></span></code></pre>
<blockquote>
<p>La variable slot correspond à tout contenu que vous ajouterez entre la balise d'ouverture et la balise de fermeture.</p>
</blockquote>
<p>Pour accéder à un composant vous devez utiliser la balise dédiée <code translate="no">x</code> suivie de <code translate="no">:</code> et du nom de fichier de votre composant sans extension :</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-comment">{# /index.twig #}</span><span class="xml">
</span><span class="hljs-template-tag">{% <span class="hljs-name">x</span>:button with {class: 'text-white'} %}</span><span class="xml">
    <span class="hljs-tag">&lt;<span class="hljs-name">strong</span>&gt;</span>Click me<span class="hljs-tag">&lt;/<span class="hljs-name">strong</span>&gt;</span>
</span><span class="hljs-template-tag">{% <span class="hljs-name">endx</span> %}</span></code></pre>
<p>Il rendra :</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-white rounded px-4"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">strong</span>&gt;</span>Click me<span class="hljs-tag">&lt;/<span class="hljs-name">strong</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></span></code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/templates/localisation/</id>
    <title>Localisation</title>
    <published>2026-05-26T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/templates/localisation/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Localisation</h1>
<p>Cecil prend en charge <a href="#traduction-de-texte">traduction du texte</a> et <a href="#localisation-de-la-date">localisation de la date</a>.</p>
<h2 id="traduction-de-texte">Traduction de texte</h2>
<p>Utilise le <code translate="no">trans</code> <em>tag</em> ou <em>filter</em> pour traduire des textes dans des templates.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-tag">{% <span class="hljs-name">trans</span> with variables into locale %}</span><span class="hljs-template-tag">{% <span class="hljs-name">endtrans</span> %}</span></code></pre>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ message|trans(variables = []) }}</span></code></pre>
<h3 id="exemples">Exemples</h3>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-tag">{% <span class="hljs-name">trans</span> %}</span><span class="xml">Hello World!</span><span class="hljs-template-tag">{% <span class="hljs-name">endtrans</span> %}</span></code></pre>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ message|trans }}</span></code></pre>
<p>Inclure des variables :</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-tag">{% <span class="hljs-name">trans</span> with {'%name%': 'Arnaud'} %}</span><span class="xml">Hello %name%!</span><span class="hljs-template-tag">{% <span class="hljs-name">endtrans</span> %}</span></code></pre>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ message|trans({'%name%': 'Arnaud'}) }}</span></code></pre>
<p>Forcer les paramètres régionaux :</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-tag">{% <span class="hljs-name">trans</span> into 'fr_FR' %}</span><span class="xml">Hello World!</span><span class="hljs-template-tag">{% <span class="hljs-name">endtrans</span> %}</span></code></pre>
<p>Pluraliser :</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-tag">{% <span class="hljs-name">trans</span> with {'%count%': 42}%}</span><span class="xml">{0}I don't have apples|{1}I have one apple|]1,Inf[I have %count% apples</span><span class="hljs-template-tag">{% <span class="hljs-name">endtrans</span> %}</span></code></pre>
<h2 id="fichiers-de-traduction">Fichiers de traduction</h2>
<p>Les fichiers de traduction doivent être nommés <code translate="no">messages.&lt;locale&gt;.&lt;extension&gt;</code> et stockés dans le répertoire <a href="/fr/configuration/layouts/"><code translate="no">translations</code></a>.
Les extensions prises en charge sont définies pour chaque format de traduction dans <a href="/fr/configuration/layouts/#layouts-translations"><code translate="no">layouts.translations.formats</code></a>.</p>
<p>Le code locale (ex. : <code translate="no">fr_FR</code>) d'une langue est défini dans les entrées <a href="/fr/configuration/languages/#languages"><code translate="no">languages</code></a> de la configuration.</p>
<p><em>Exemple:</em></p>
<pre><code class="language-plaintext hljs plaintext" translate="no">&lt;mywebsite&gt;
└─ translations
   ├─ messages.fr_FR.mo   &lt;- Machine Object format
   └─ messages.fr_FR.yaml &lt;- Yaml format</code></pre>
<aside class="note note-info"><p>Vous pouvez facilement extraire les traductions de vos templates avec la commande suivante :</p>
<pre><code class="language-bash hljs bash" translate="no">php cecil.phar util:translations:extract --locale=&lt;code&gt; --show</code></pre>
<p>Utilisez <code translate="no">--save</code> à la place (ou en plus) de <code translate="no">--show</code> pour enregistrer les traductions dans un fichier. L'option <code translate="no">--locale</code> est obligatoire. Le format de sortie par défaut est <code translate="no">yaml</code> (utilisez <code translate="no">--format=po</code> pour le format gettext PO).</p></aside>
<aside class="note note-tip"><p><a href="https://poedit.net" target="_blank" rel="noopener noreferrer"><em>Poedit</em></a> est un éditeur de traduction simple et multiplateforme pour gettext (PO), et <a href="https://poedit.net/pro" target="_blank" rel="noopener noreferrer"><em>Poedit Pro</em></a> prend en charge l'extraction de chaînes de traduction à partir de templates prêts à l'emploi.</p></aside>
<aside class="note note-important"><p>Faites attention au <a href="/fr/documentation/cache/">cache</a> lorsque vous mettez à jour les fichiers de traduction.</p>
<p>Le cache peut être vidé avec la commande suivante :</p>
<pre><code class="language-bash hljs bash" translate="no">php cecil.phar cache:clear:translations`</code></pre></aside>
<h2 id="localisation-de-la-date">Localisation de la date</h2>
<p>Utilise le filtre Twig <a href="https://twig.symfony.com/doc/3.x/filters/format_date.html" target="_blank" rel="noopener noreferrer"><code translate="no">format_date</code></a> pour localiser une date dans les templates.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ page.<span class="hljs-name">date</span>|format_date('long') }}</span><span class="xml">
</span><span class="hljs-comment">{# September 30, 2022 #}</span></code></pre>
<p>Les valeurs prises en charge sont : <code translate="no">short</code>, <code translate="no">medium</code>, <code translate="no">long</code> et <code translate="no">full</code>.</p>
<aside class="note note-important"><p>Si vous souhaitez utiliser le filtre <code translate="no">format_date</code> <strong>avec des paramètres régionaux autres que "en"</strong>, vous devez <a href="https://php.net/intl.setup" target="_blank" rel="noopener noreferrer">installer l'extension PHP internationale</a>.</p></aside>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/templates/cache/</id>
    <title>Cache</title>
    <published>2026-05-26T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/templates/cache/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Cache</h1>
<p>Cecil utilise un système de cache pour accélérer le processus de génération, il peut être désactivé ou effacé.</p>
<p>Il existe trois types de cache dans le cas du rendu des templates : les templates eux-mêmes, <a href="/fr/assets/#asset">assets</a> et <a href="/fr/documentation/localization/#fichiers-de-traduction">translations</a>.</p>
<h2 id="vider-le-cache">Vider le cache</h2>
<p>Vous pouvez vider le cache avec les commandes suivantes :</p>
<pre><code class="language-bash hljs bash" translate="no">php cecil.phar cache:clear               <span class="hljs-comment"># clear all caches</span>
php cecil.phar cache:clear:assets        <span class="hljs-comment"># clear assets cache</span>
php cecil.phar cache:clear:templates     <span class="hljs-comment"># clear templates cache</span>
php cecil.phar cache:clear:translations  <span class="hljs-comment"># clear translations cache</span></code></pre>
<aside class="note note-important"><p>En pratique, vous n'avez pas besoin de vider le cache manuellement, Cecil le fait pour vous en cas de besoin (par exemple lorsque des fichiers changent).</p></aside>
<h2 id="fragments-de-cache">Fragments de cache</h2>
<p>Cecil fournit un moyen de mettre en cache des parties du rendu des templates pour éviter de restituer plusieurs fois le même contenu partiel.</p>
<p>Pour utiliser les <em>fragments</em> de cache, vous devez envelopper le contenu que vous souhaitez mettre en cache avec la balise <a href="https://twig.symfony.com/doc/tags/cache.html" target="_blank" rel="noopener noreferrer"><code translate="no">cache</code></a>.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-tag">{% <span class="hljs-name">cache</span> 'unique-key' %}</span><span class="xml">
  </span><span class="hljs-comment">{# cacheable content #}</span><span class="xml">
</span><span class="hljs-template-tag">{% <span class="hljs-name">endcache</span> %}</span></code></pre>
<aside class="note note-tip"><p>Vous devez utiliser la fonction <a href="/fr/documentation/reference/functions/#cache-key"><code translate="no">cache_key</code></a> pour être sûr d'avoir une clé de cache unique pour chaque contenu que vous souhaitez mettre en cache.</p></aside>
<aside class="note note-warning"><p>Les <em>fragments</em> de cache sont persistants, donc si la clé de cache est trop générique, vous risquez de vous retrouver avec un mauvais contenu affiché.</p></aside>
<p>Pour vider uniquement le cache des fragments, vous pouvez utiliser la commande suivante :</p>
<pre><code class="language-bash hljs bash" translate="no">php cecil.phar cache:clear:templates --fragments</code></pre>
<h2 id="desactiver-le-cache">Désactiver le cache</h2>
<p>Vous pouvez désactiver le cache avec la <a href="/fr/configuration/cache/">configuration</a>.</p>
<aside class="note note-warning"><p>La désactivation du cache peut ralentir le processus de génération, ce n'est donc pas recommandé.</p>
<p>Lors du développement local, si vous devez vider le cache avant chaque génération, vous pouvez utiliser l'option suivante :</p>
<pre><code class="language-bash hljs bash" translate="no">php cecil.phar serve --clear-cache          <span class="hljs-comment"># clear all caches</span>
php cecil.phar serve --clear-cache=&lt;regex&gt;  <span class="hljs-comment"># clear cache for cache key matches with the regular expression &lt;regex&gt;</span></code></pre>
<p>Exemple:</p>
<pre><code class="language-bash hljs bash" translate="no">php cecil.phar serve --clear-cache=css  <span class="hljs-comment"># clear cache for all CSS files</span></code></pre></aside>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/templates/etendre/</id>
    <title>Étendre</title>
    <published>2026-05-26T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/templates/etendre/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Étendre</h1>
<h2 id="fonctions-et-filtres">Fonctions et filtres</h2>
<p>Vous pouvez ajouter des <a href="/fr/documentation/reference/functions/">fonctions</a> et des <a href="/fr/documentation/reference/filters/">filtres</a> personnalisés avec une <a href="/fr/developers/extend/#extension-twig"><strong><em>extension Twig</em></strong></a>.</p>
<h2 id="theme">Thème</h2>
<p>C'est simple de construire un thème, il suffit de créer un dossier <code translate="no">&lt;theme&gt;</code> avec la structure suivante (comme un site web mais sans pages) :</p>
<pre><code class="language-plaintext hljs plaintext" translate="no">&lt;mywebsite&gt;
└─ themes
   └─ &lt;theme&gt;
      ├─ config.yml
      ├─ assets
      ├─ layouts
      ├─ static
      └─ translations</code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/commandes/new-site/</id>
    <title>new:site</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-02T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/commandes/new-site/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>new:site</h1>
<p>Crée un nouveau site.</p>
<pre><code class="language-plaintext hljs plaintext" translate="no">Description:
  Creates a new website

Usage:
  new:site [options] [--] [&lt;path&gt;]

Arguments:
  path                  Use the given path as working directory

Options:
  -f, --force           Override directory if it already exists
      --demo            Add demo content (pages, templates and assets)
  -h, --help            Display help for the given command. When no command is given display help for the list command
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi|--no-ansi  Force (or disable --no-ansi) ANSI output
  -n, --no-interaction  Do not ask any interactive question
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Help:
  The new:site command creates a new website in the current directory, or in &lt;path&gt; if provided.
  If you run this command without any options, it will ask you for the website title, baseline, base URL, description, etc.

    cecil.phar new:site
    cecil.phar new:site path/to/the/working/directory

  To create a new website with demo content, run:

    cecil.phar new:site --demo

  To override an existing website, run:

    cecil.phar new:site --force</code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/configuration/site/</id>
    <title>Options du site</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/configuration/site/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Options du site</h1>
<h2 id="title">title</h2>
<p>Titre principal du site.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">title:</span> <span class="hljs-string">"&lt;site title&gt;"</span></code></pre>
<h2 id="baseline">baseline</h2>
<p>Description courte (~ 20 caractères).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">baseline:</span> <span class="hljs-string">"&lt;baseline&gt;"</span></code></pre>
<h2 id="baseurl">baseurl</h2>
<p>URL de base.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">baseurl:</span> <span class="hljs-string">&lt;url&gt;</span></code></pre>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">baseurl:</span> <span class="hljs-string">http://localhost:8000/</span></code></pre>
<aside class="note note-important"><p><code translate="no">baseurl</code> doit se terminer par un slash final (<code translate="no">/</code>).</p></aside>
<h2 id="canonicalurl">canonicalurl</h2>
<p>Si la valeur est <code translate="no">true</code>, la fonction <a href="/fr/templates/reference/functions/#url"><code translate="no">url()</code></a> renverra l’URL absolue (<code translate="no">false</code> par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">canonicalurl:</span> <span class="hljs-string">&lt;true|false&gt;</span> <span class="hljs-comment"># false by default</span></code></pre>
<h2 id="description">description</h2>
<p>Description du site (~ 250 caractères).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">description:</span> <span class="hljs-string">"&lt;description&gt;"</span></code></pre>
<h2 id="menus">menus</h2>
<p>Les menus sont utilisés pour créer des <a href="/fr/templates/variables/#site-menus">liens de navigation dans les templates</a>.</p>
<p>Un menu est composé d’un identifiant unique et des propriétés des entrées (nom, URL, poids).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">menus:</span>
  <span class="hljs-string">&lt;name&gt;:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">id:</span> <span class="hljs-string">&lt;unique-id&gt;</span>   <span class="hljs-comment"># unique identifier (required)</span>
      <span class="hljs-attr">name:</span> <span class="hljs-string">"&lt;name&gt;"</span>    <span class="hljs-comment"># name displayed in templates</span>
      <span class="hljs-attr">url:</span> <span class="hljs-string">&lt;url&gt;</span>        <span class="hljs-comment"># relative or absolute URL</span>
      <span class="hljs-attr">weight:</span> <span class="hljs-string">&lt;integer&gt;</span> <span class="hljs-comment"># integer value used to sort entries (lighter first)</span></code></pre>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">menus:</span>
  <span class="hljs-attr">main:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">id:</span> <span class="hljs-string">about</span>
      <span class="hljs-attr">name:</span> <span class="hljs-string">"About"</span>
      <span class="hljs-attr">url:</span> <span class="hljs-string">/about/</span>
      <span class="hljs-attr">weight:</span> <span class="hljs-number">1</span>
  <span class="hljs-attr">footer:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">id:</span> <span class="hljs-string">author</span>
      <span class="hljs-attr">name:</span> <span class="hljs-string">The</span> <span class="hljs-string">author</span>
      <span class="hljs-attr">url:</span> <span class="hljs-string">https://arnaudligny.fr</span>
      <span class="hljs-attr">weight:</span> <span class="hljs-number">99</span></code></pre>
<aside class="note note-info"><p>Un menu <code translate="no">main</code> est créé automatiquement avec l’entrée de la page d’accueil et toutes les entrées de sections (<a href="/fr/content/">Voir la gestion du contenu</a>).</p></aside>
<aside class="note note-tip"><p>Une page peut être ajoutée à un menu en définissant la variable <a href="/fr/content/front-matter/#menu"><code translate="no">menu</code></a> dans son front matter.</p></aside>
<h3 id="surcharger-une-entree">Surcharger une entrée</h3>
<p>Une entrée de menu de page peut être surchargée : utilisez l’ID de la page comme <code translate="no">id</code>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">menus:</span>
  <span class="hljs-attr">main:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">id:</span> <span class="hljs-string">index</span>
      <span class="hljs-attr">name:</span> <span class="hljs-string">"My amazing homepage!"</span>
      <span class="hljs-attr">weight:</span> <span class="hljs-number">1</span></code></pre>
<h3 id="desactiver-une-entree">Désactiver une entrée</h3>
<p>Une entrée de menu peut être désactivée avec <code translate="no">enabled: false</code>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">menus:</span>
  <span class="hljs-attr">main:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">id:</span> <span class="hljs-string">about</span>
      <span class="hljs-attr">enabled:</span> <span class="hljs-literal">false</span></code></pre>
<h2 id="taxonomies">taxonomies</h2>
<p>Liste des vocabulaires, associant une valeur au pluriel à une valeur au singulier.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">taxonomies:</span>
  <span class="hljs-string">&lt;plural&gt;:</span> <span class="hljs-string">&lt;singular&gt;</span></code></pre>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">taxonomies:</span>
  <span class="hljs-attr">categories:</span> <span class="hljs-string">category</span>
  <span class="hljs-attr">tags:</span> <span class="hljs-string">tag</span></code></pre>
<p>Vous pouvez ensuite utiliser ces vocabulaires dans le <a href="/fr/content/front-matter/#taxonomie">front matter</a> de votre contenu.</p>
<aside class="note note-warning"><p>Depuis la <ins>version 8.37.0</ins>, les vocabulaires par défaut <code translate="no">category</code> et <code translate="no">tag</code> ont été supprimés. Vous devez les définir dans le fichier de configuration si vous souhaitez les utiliser.</p></aside>
<aside class="note note-tip"><p>Un vocabulaire peut être désactivé avec la valeur spéciale <code translate="no">disabled</code>. Exemple : <code translate="no">tags: disabled</code>.</p></aside>
<h2 id="theme">theme</h2>
<p>Thème à utiliser, ou liste de thèmes.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">theme:</span> <span class="hljs-string">&lt;theme&gt;</span> <span class="hljs-comment"># theme name</span>
<span class="hljs-comment"># or</span>
<span class="hljs-attr">theme:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">&lt;theme1&gt;</span> <span class="hljs-comment"># theme name</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">&lt;theme2&gt;</span></code></pre>
<aside class="note note-info"><p>Le premier thème surcharge les suivants, et ainsi de suite.</p></aside>
<p><em>Exemples :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">theme:</span> <span class="hljs-string">hyde</span></code></pre>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">theme:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">serviceworker</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">hyde</span></code></pre>
<aside class="note note-info"><p>Voir les <a href="https://github.com/Cecilapp?q=theme#org-repositories" target="_blank" rel="noopener noreferrer">thèmes sur GitHub</a> ou la <a href="https://cecil.app/themes/">section thèmes</a> du site.</p></aside>
<h2 id="date">date</h2>
<p>Format de date et fuseau horaire.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">date:</span>
  <span class="hljs-attr">format:</span> <span class="hljs-string">&lt;format&gt;</span>     <span class="hljs-comment"># date format (optional, `F j, Y` by default)</span>
  <span class="hljs-attr">timezone:</span> <span class="hljs-string">&lt;timezone&gt;</span> <span class="hljs-comment"># date timezone (optional, local time zone by default)</span></code></pre>
<ul>
<li><code translate="no">format</code> : spécificateur de format de <a href="https://php.net/date" target="_blank" rel="noopener noreferrer">date PHP</a></li>
<li><code translate="no">timezone</code> : voir les <a href="https://php.net/timezones" target="_blank" rel="noopener noreferrer">fuseaux horaires</a></li>
</ul>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">date:</span>
  <span class="hljs-attr">format:</span> <span class="hljs-string">'j F, Y'</span>
  <span class="hljs-attr">timezone:</span> <span class="hljs-string">'Europe/Paris'</span></code></pre>
<h2 id="metatags">metatags</h2>
<p>Les <em>metatags</em> sont des aides SEO et réseaux sociaux qui peuvent être injectées automatiquement dans le <code translate="no">&lt;head&gt;</code>, via le template <a href="https://github.com/Cecilapp/Cecil/blob/main/resources/layouts/partials/metatags.html.twig" target="_blank" rel="noopener noreferrer"><code translate="no">partials/metatags.html.twig</code></a>.</p>
<p>Ce template ajoute les balises meta suivantes :</p>
<ul>
<li>Titre de page + titre du site, ou titre du site + baseline du site</li>
<li>Description de la page/du site</li>
<li>Mots-clés de la page/du site</li>
<li>Auteur de la page/du site</li>
<li>Directives des robots des moteurs de recherche (<em>robots</em>)</li>
<li>Liens de favicon</li>
<li>Liens de navigation (premier, précédent, suivant, dernier)</li>
<li>URL canonique</li>
<li>Liens alternatifs (ex. : flux RSS, autres langues)</li>
<li>Liens <a href="https://developer.mozilla.org/docs/Web/HTML/Reference/Attributes/rel/me" target="_blank" rel="noopener noreferrer"><code translate="no">rel=me</code></a></li>
<li><a href="https://ogp.me" target="_blank" rel="noopener noreferrer">Open Graph</a></li>
<li>Identifiant de profil Facebook</li>
<li><a href="https://developer.x.com/docs/x-for-websites/cards/guides/getting-started" target="_blank" rel="noopener noreferrer">Twitter/X Card</a></li>
<li><a href="https://blog.joinmastodon.org/2024/07/highlighting-journalism-on-mastodon/" target="_blank" rel="noopener noreferrer">Fediverse tag</a></li>
<li><a href="https://www.dublincore.org/specifications/dublin-core/dcmi-terms/" target="_blank" rel="noopener noreferrer">Dublin Core</a></li>
<li><a href="https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data" target="_blank" rel="noopener noreferrer">Structured data</a> (JSON-LD)</li>
</ul>
<h3 id="options-metatags">options metatags</h3>
<p>Cecil utilise le front matter de la page pour alimenter les meta tags, avec repli sur les options du site si nécessaire.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">title:</span> <span class="hljs-string">"Page/Site title"</span>              <span class="hljs-comment"># used by title meta</span>
<span class="hljs-attr">description:</span> <span class="hljs-string">"Page/Site description"</span>  <span class="hljs-comment"># used by description meta</span>
<span class="hljs-attr">tags:</span> <span class="hljs-string">[tag1,</span> <span class="hljs-string">tag2]</span>                    <span class="hljs-comment"># used by keywords meta</span>
<span class="hljs-attr">keywords:</span> <span class="hljs-string">[keyword1,</span> <span class="hljs-string">keyword2]</span>        <span class="hljs-comment"># obsolete</span>
<span class="hljs-attr">author:</span>                               <span class="hljs-comment"># used by author meta</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">&lt;name&gt;</span>                          <span class="hljs-comment"># author name</span>
  <span class="hljs-attr">url:</span> <span class="hljs-string">&lt;url&gt;</span>                            <span class="hljs-comment"># author URL</span>
  <span class="hljs-attr">email:</span> <span class="hljs-string">&lt;email&gt;</span>                        <span class="hljs-comment"># author email</span>
<span class="hljs-attr">image:</span> <span class="hljs-string">image.jpg</span>                      <span class="hljs-comment"># used by Open Graph and social networks cards</span>
<span class="hljs-attr">canonical:</span>                            <span class="hljs-comment"># used to override the generated canonical URL</span>
  <span class="hljs-attr">url:</span> <span class="hljs-string">&lt;URL&gt;</span>                            <span class="hljs-comment"># absolute URL</span>
  <span class="hljs-attr">title:</span> <span class="hljs-string">"&lt;URL title&gt;"</span>                  <span class="hljs-comment"># optional canonical title</span>
<span class="hljs-attr">social:</span>                               <span class="hljs-comment"># used by social networks meta</span>
  <span class="hljs-attr">twitter:</span>                              <span class="hljs-comment"># used by Twitter/X Card</span>
    <span class="hljs-attr">url:</span> <span class="hljs-string">&lt;URL&gt;</span>                            <span class="hljs-comment"># used for `rel=me` link</span>
    <span class="hljs-attr">site:</span> <span class="hljs-string">username</span>                        <span class="hljs-comment"># site username</span>
    <span class="hljs-attr">creator:</span> <span class="hljs-string">username</span>                     <span class="hljs-comment"># page author username</span>
  <span class="hljs-attr">mastodon:</span>                             <span class="hljs-comment"># used by Mastodon meta</span>
    <span class="hljs-attr">url:</span> <span class="hljs-string">&lt;URL&gt;</span>                            <span class="hljs-comment"># used for `rel=me` link</span>
    <span class="hljs-attr">creator:</span> <span class="hljs-string">handle</span>                       <span class="hljs-comment"># page author account</span>
  <span class="hljs-attr">facebook:</span>                             <span class="hljs-comment"># used by Facebook meta</span>
    <span class="hljs-attr">url:</span> <span class="hljs-string">&lt;URL&gt;</span>                            <span class="hljs-comment"># used for `rel=me` link</span>
    <span class="hljs-attr">id:</span> <span class="hljs-number">123456789</span>                         <span class="hljs-comment"># Facebook profile ID</span>
    <span class="hljs-attr">username:</span> <span class="hljs-string">username</span>                    <span class="hljs-comment"># page author username</span></code></pre>
<aside class="note note-tip"><p>Si besoin, <code translate="no">title</code> et <code translate="no">image</code> peuvent être surchargés :</p>
<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></aside>
<h3 id="configuration-metatags">configuration metatags</h3>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">metatags:</span>
  <span class="hljs-attr">title:</span>                   <span class="hljs-comment"># title options</span>
    <span class="hljs-attr">divider:</span> <span class="hljs-string">" &amp;middot; "</span>    <span class="hljs-comment"># string between page title and site title</span>
    <span class="hljs-attr">only:</span> <span class="hljs-literal">false</span>              <span class="hljs-comment"># displays page title only (`false` by default)</span>
    <span class="hljs-attr">pagination:</span>              <span class="hljs-comment"># pagination options</span>
      <span class="hljs-attr">shownumber:</span> <span class="hljs-literal">true</span>         <span class="hljs-comment"># displays page number in title (`true` by default)</span>
      <span class="hljs-attr">label:</span> <span class="hljs-string">"Page %s"</span>         <span class="hljs-comment"># how to display page number (`Page %s` by default)</span>
  <span class="hljs-attr">robots:</span> <span class="hljs-string">"index,follow"</span>   <span class="hljs-comment"># web crawlers directives (`index,follow` by default)</span>
  <span class="hljs-attr">favicon:</span>                 <span class="hljs-comment"># favicon options</span>
    <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>            <span class="hljs-comment"># includes favicon (`true` by default)</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">favicon.png</span>       <span class="hljs-comment"># path to favicon image</span>
    <span class="hljs-attr">sizes:</span>                   <span class="hljs-comment"># sizes by device</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">"icon":</span> <span class="hljs-string">[32,</span> <span class="hljs-number">57</span><span class="hljs-string">,</span> <span class="hljs-number">76</span><span class="hljs-string">,</span> <span class="hljs-number">96</span><span class="hljs-string">,</span> <span class="hljs-number">128</span><span class="hljs-string">,</span> <span class="hljs-number">192</span><span class="hljs-string">,</span> <span class="hljs-number">228</span><span class="hljs-string">]</span>  <span class="hljs-comment"># web browsers</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">"shortcut icon":</span> <span class="hljs-string">[196]</span>                   <span class="hljs-comment"># Android</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">"apple-touch-icon":</span> <span class="hljs-string">[120,</span> <span class="hljs-number">152</span><span class="hljs-string">,</span> <span class="hljs-number">180</span><span class="hljs-string">]</span>      <span class="hljs-comment"># iOS</span>
  <span class="hljs-attr">navigation:</span> <span class="hljs-literal">true</span>         <span class="hljs-comment"># includes previous and next links (`true` by default)</span>
  <span class="hljs-attr">image:</span> <span class="hljs-literal">true</span>              <span class="hljs-comment"># includes image (`true` by default)</span>
  <span class="hljs-attr">og:</span> <span class="hljs-literal">true</span>                 <span class="hljs-comment"># includes Open Graph meta tags (`true` by default)</span>
  <span class="hljs-attr">articles:</span> <span class="hljs-string">"blog"</span>         <span class="hljs-comment"># articles' section (`blog` by default)</span>
  <span class="hljs-attr">twitter:</span> <span class="hljs-literal">true</span>            <span class="hljs-comment"># includes Twitter/X Card meta tags (`true` by default)</span>
  <span class="hljs-attr">mastodon:</span> <span class="hljs-literal">true</span>           <span class="hljs-comment"># includes Mastodon meta tags (`true` by default)</span>
  <span class="hljs-attr">dc:</span> <span class="hljs-literal">false</span>                <span class="hljs-comment"># includes Dublin Core meta tags (`false` by default)</span>
  <span class="hljs-attr">data:</span> <span class="hljs-literal">false</span>              <span class="hljs-comment"># includes JSON-LD structured data (`false` by default)</span></code></pre>
<h2 id="debug">debug</h2>
<p>Active le <em>mode debug</em>, utilisé pour afficher des informations de débogage comme des journaux très verbeux, le dump Twig, le profileur Twig, le sourcemap SCSS, etc.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">debug:</span> <span class="hljs-literal">true</span></code></pre>
<p>Il existe deux autres façons d’activer le <em>mode debug</em> :</p>
<ol>
<li>Exécuter une commande avec l’option <code translate="no">-vvv</code></li>
<li>Définir la variable d’environnement <code translate="no">CECIL_DEBUG</code> à <code translate="no">true</code></li>
</ol>
<hr>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/contenu/pages/</id>
    <title>Pages et sections</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-06T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/contenu/pages/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Pages et sections</h1>
<p>Une page est un fichier composé d’un <a href="#front-matter"><strong>front matter</strong></a> et d’un <a href="#corps-body"><strong>body</strong></a>.</p>
<h2 id="front-matter">Front matter</h2>
<p>Le <em>front matter</em> est une collection de <a href="/fr/documentation/front-matter/">variables</a> (au format <em>clé/valeur</em>) entourée par <code translate="no">---</code>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">title:</span> <span class="hljs-string">"The title"</span>
<span class="hljs-attr">date:</span> <span class="hljs-number">2019</span><span class="hljs-number">-02</span><span class="hljs-number">-21</span>
<span class="hljs-attr">tags:</span> <span class="hljs-string">[tag</span> <span class="hljs-number">1</span><span class="hljs-string">,</span> <span class="hljs-string">tag</span> <span class="hljs-number">2</span><span class="hljs-string">]</span>
<span class="hljs-attr">customvar:</span> <span class="hljs-string">"Value of customvar"</span>
<span class="hljs-meta">---</span></code></pre>
<aside class="note note-info"><p>Vous pouvez aussi utiliser <code translate="no">&lt;!-- --&gt;</code> ou <code translate="no">+++</code> comme séparateur.</p></aside>
<h2 id="corps-body">Corps (body)</h2>
<p>Le <em>body</em> est le contenu principal d’une page ; il peut être écrit en <a href="/fr/documentation/markdown/">Markdown</a> ou en texte brut.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no"><span class="hljs-section"># Header</span>

[toc]

<span class="hljs-section">## Sub-Header 1</span>

Lorem ipsum dolor [<span class="hljs-string">sit amet</span>](<span class="hljs-link">https://example.com</span>), consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
<span class="xml"><span class="hljs-comment">&lt;!-- excerpt --&gt;</span></span>
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

<span class="hljs-section">## Sub-Header 2</span>

![<span class="hljs-string">Description</span>](<span class="hljs-link">/image.jpg "Title"</span>)

<span class="hljs-section">## Sub-Header 3</span>

:::tip
This is advice.
:::</code></pre>
<h2 id="prefixe-de-fichier">Préfixe de fichier</h2>
<p>Le nom de fichier peut contenir un préfixe pour définir les variables <code translate="no">date</code> ou <code translate="no">weight</code> de la page (utilisé par <a href="/fr/templates/reference/sorts/#sort-by-date"><code translate="no">sortby</code></a>).</p>
<aside class="note note-info"><p>Séparateurs de préfixe par défaut : <code translate="no">_</code> et <code translate="no">-</code>.</p>
<p>Vous pouvez les personnaliser avec l’option <a href="/fr/configuration/pages/#pages-prefix-separator"><code translate="no">pages.prefix.separator</code></a>.</p></aside>
<h3 id="date">date</h3>
<p>Le <em>date prefix</em> est utilisé pour définir la <code translate="no">date</code> de la page et doit être un format de date valide (c.-à-d. : « YYYY-MM-DD »).</p>
<p><em>Exemple :</em></p>
<p>Dans « 2019-04-23_My blog post.md » :</p>
<ul>
<li>le préfixe est « 2019-04-23 »</li>
<li>la <code translate="no">date</code> de la page est « 2019-04-23 »</li>
<li>le <code translate="no">title</code> de la page est « My blog post »</li>
</ul>
<h3 id="weight">weight</h3>
<p>Le <em>weight prefix</em> est utilisé pour définir l’ordre de tri de la page et doit être une valeur entière valide.</p>
<p><em>Exemple :</em></p>
<p>Dans « 1_The first project.md » :</p>
<ul>
<li>le préfixe est « 1 »</li>
<li>le <code translate="no">weight</code> de la page est « 1 »</li>
<li>le <code translate="no">title</code> de la page est « The first project »</li>
</ul>
<h2 id="section">Section</h2>
<p>Certaines variables dédiées peuvent être utilisées dans une <em>Section</em> personnalisée (c.-à-d. : <code translate="no">&lt;section&gt;/index.md</code>).</p>
<h3 id="sortby">sortby</h3>
<p>L’ordre des pages dans une <em>Section</em> peut être modifié.</p>
<p>Valeurs disponibles :</p>
<ul>
<li><code translate="no">date</code>: plus récentes en premier</li>
<li><code translate="no">title</code>: ordre alphabétique</li>
<li><code translate="no">weight</code>: plus léger en premier</li>
</ul>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">sortby:</span> <span class="hljs-string">title</span>
<span class="hljs-meta">---</span></code></pre>
<p><strong>More options:</strong></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">sortby:</span>
  <span class="hljs-attr">variable:</span> <span class="hljs-string">date</span>    <span class="hljs-comment"># "date", "updated", "title" or "weight"</span>
  <span class="hljs-attr">desc_title:</span> <span class="hljs-literal">false</span> <span class="hljs-comment"># used with "date" or "updated" variable value to sort by desc title order if items have the same date</span>
  <span class="hljs-attr">reverse:</span> <span class="hljs-literal">false</span>    <span class="hljs-comment"># reversed if true</span>
<span class="hljs-meta">---</span></code></pre>
<h3 id="pagination">pagination</h3>
<p>La <a href="/fr/configuration/pages/#pages-pagination">configuration globale de pagination</a> est utilisée par défaut, mais vous pouvez la modifier pour une <em>Section</em> donnée.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">pagination:</span>
  <span class="hljs-attr">max:</span> <span class="hljs-number">5</span>
  <span class="hljs-attr">path:</span> <span class="hljs-string">"page"</span>
<span class="hljs-meta">---</span></code></pre>
<p>La pagination peut être désactivée pour une <em>Section</em> :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">pagination:</span> <span class="hljs-literal">false</span>
<span class="hljs-meta">---</span></code></pre>
<h3 id="cascade">cascade</h3>
<p>Toutes les variables de <code translate="no">cascade</code> sont ajoutées au front matter de toutes les <em>sous-pages</em>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">cascade:</span>
  <span class="hljs-attr">banner:</span> <span class="hljs-string">image.jpg</span>
<span class="hljs-meta">---</span></code></pre>
<aside class="note note-info"><p>Les variables existantes ne sont pas écrasées.</p></aside>
<h3 id="circular">circular</h3>
<p>Définissez <code translate="no">circular</code> à <code translate="no">true</code> pour activer la navigation circulaire avec <a href="/fr/templates/variables/#page-prev-next"><em>page.&lt;prev/next&gt;</em></a>.</p>
<aside class="note note-info"><p>Avec des <a href="#sous-section">sous-sections</a>, seule la valeur <code translate="no">circular</code> de la <em>Section</em> de premier niveau est utilisée.</p></aside>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">circular:</span> <span class="hljs-literal">true</span>
<span class="hljs-meta">---</span></code></pre>
<h3 id="sous-section">Sous-section</h3>
<p>Un dossier imbriqué qui contient explicitement un fichier <code translate="no">index.md</code> devient une <em>sous-section</em> de sa <em>Section</em> parente.</p>
<pre><code class="language-plaintext hljs plaintext" translate="no">&lt;monsiteweb&gt;
└─ pages
   └─ blog                 &lt;- Section
      ├─ index.md
      ├─ post-1.md         &lt;- Page de la Section « blog »
      └─ 2024              &lt;- Sous-section (contient un « index.md »)
         ├─ index.md
         └─ post-2.md      &lt;- Page de la Section « blog » *et* de la sous-section « blog/2024 »</code></pre>
<p>Une <em>sous-section</em> :</p>
<ul>
<li>est une <em>Section</em> (même type, mêmes variables et même résolution de <a href="/fr/templates/lookup-rules/#type-section">gabarit</a>) accessible à sa propre URL (ex. : <code translate="no">/blog/2024/</code>)</li>
<li>est rendue avec les gabarits de ses <em>Sections</em> parentes si elle n'a pas les siens (ex. : <code translate="no">blog/list.html.twig</code>)</li>
<li>peut être imbriquée à n'importe quelle profondeur (ex. : <code translate="no">blog/2024/06/</code>)</li>
<li>liste ses propres pages, et ses pages appartiennent aussi à chacune de leurs <em>Sections</em> parentes</li>
<li>n'est <strong>pas</strong> listée dans sa <em>Section</em> parente</li>
<li>est placée dans la navigation <a href="/fr/templates/variables/#page-prev-next"><em>page.&lt;prev/next&gt;</em></a> de sa <em>Section</em> parente (selon son <code translate="no">sortby</code>), suivie de ses propres pages</li>
</ul>
<aside class="note note-info"><p>Un dossier imbriqué <strong>sans</strong> fichier <code translate="no">index.md</code> n'est pas une <em>sous-section</em> : ses pages appartiennent simplement à la <em>Section</em> parente.</p></aside>
<h2 id="page-d-accueil">Page d'accueil</h2>
<p>Comme une autre section, la <em>Page d'accueil</em> prend en charge la configuration <code translate="no">sortby</code> et <code translate="no">pagination</code>.</p>
<h3 id="pagesfrom">pagesfrom</h3>
<p>Définissez un nom de <em>Section</em> valide dans <code translate="no">pagesfrom</code> pour utiliser la collection de pages de cette <em>Section</em> dans la <em>Page d'accueil</em>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">pagesfrom:</span> <span class="hljs-string">blog</span>
<span class="hljs-meta">---</span></code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/deployer/plateformes-jamstack/</id>
    <title>Plateformes Jamstack</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-02T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/deployer/plateformes-jamstack/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Plateformes Jamstack</h1>
<h2 id="netlify">Netlify</h2>
<blockquote>
<p>Une puissante plateforme serverless avec un flux de travail intuitif basé sur Git. Déploiements automatisés, aperçus partageables, et bien plus encore.</p>
</blockquote>
<p>➡️ <a href="https://www.netlify.com" target="_blank" rel="noopener noreferrer">https://www.netlify.com</a></p>
<p><em>netlify.toml</em>:</p>
<pre><code class="language-bash hljs bash" translate="no">[build]
  publish = <span class="hljs-string">"_site"</span>
  <span class="hljs-built_in">command</span> = <span class="hljs-string">"curl -sSOL https://cecil.app/build.sh &amp;&amp; bash ./build.sh"</span>
[context.production.environment]
  CECIL_ENV = <span class="hljs-string">"production"</span>
[context.deploy-preview.environment]
  CECIL_ENV = <span class="hljs-string">"preview"</span></code></pre>
<p><a href="https://www.netlify.com/docs/continuous-deployment/" target="_blank" rel="noopener noreferrer">Documentation officielle</a></p>
<h2 id="vercel">Vercel</h2>
<blockquote>
<p>Vercel associe une excellente expérience développeur à une attention obsessionnelle portée aux performances côté utilisateur final.</p>
</blockquote>
<p>➡️ <a href="https://vercel.com" target="_blank" rel="noopener noreferrer">https://vercel.com</a></p>
<p><em>vercel.json</em>:</p>
<pre><code class="language-json hljs json" translate="no">{
  <span class="hljs-attr">"buildCommand"</span>: <span class="hljs-string">"curl -sSOL https://cecil.app/build.sh &amp;&amp; bash ./build.sh"</span>,
  <span class="hljs-attr">"outputDirectory"</span>: <span class="hljs-string">"_site"</span>
}</code></pre>
<p><a href="https://vercel.com/docs/concepts/deployments/build-step#build-command" target="_blank" rel="noopener noreferrer">Documentation officielle</a></p>
<h2 id="statichost">statichost</h2>
<blockquote>
<p>Hébergement moderne de sites statiques avec des serveurs européens et absolument aucune collecte de données personnelles !</p>
</blockquote>
<p>➡️ <a href="https://statichost.eu" target="_blank" rel="noopener noreferrer">https://statichost.eu</a></p>
<p><em>statichost.yml</em>:</p>
<pre><code class="language-yml hljs yaml" translate="no"><span class="hljs-attr">image:</span> <span class="hljs-string">wordpress:cli-php8.4</span>
<span class="hljs-attr">command:</span> <span class="hljs-string">curl</span> <span class="hljs-string">-sSOL</span> <span class="hljs-string">https://cecil.app/build.sh</span> <span class="hljs-string">&amp;&amp;</span> <span class="hljs-string">bash</span> <span class="hljs-string">./build.sh</span>
<span class="hljs-attr">public:</span> <span class="hljs-string">_site</span></code></pre>
<p><a href="https://www.statichost.eu/docs/" target="_blank" rel="noopener noreferrer">Documentation officielle</a></p>
<h2 id="cloudflare-pages">Cloudflare Pages</h2>
<aside class="note note-caution"><p>Cloudflare Pages ne prend plus en charge PHP.</p></aside>
<blockquote>
<p>Cloudflare Pages est une plateforme JAMstack qui permet aux développeurs frontend de collaborer et de déployer des sites web.</p>
</blockquote>
<p>➡️ <a href="https://pages.cloudflare.com" target="_blank" rel="noopener noreferrer">https://pages.cloudflare.com</a></p>
<p>Configurations de build :</p>
<ul>
<li>Préréglage de framework : <code translate="no">None</code></li>
<li>Commande de build : <code translate="no">curl -sSOL https://cecil.app/build.sh &amp;&amp; bash ./build.sh</code></li>
<li>Répertoire de sortie du build : <code translate="no">_site</code></li>
</ul>
<p><a href="https://developers.cloudflare.com/pages/" target="_blank" rel="noopener noreferrer">Documentation officielle</a></p>
<h2 id="render">Render</h2>
<aside class="note note-caution"><p>Render ne prend plus en charge PHP.</p></aside>
<blockquote>
<p>Render est un cloud unifié pour créer et exécuter toutes vos applications et tous vos sites web, avec certificats TLS gratuits, CDN global, réseaux privés et déploiements automatiques depuis Git.</p>
</blockquote>
<p>➡️ <a href="https://render.com" target="_blank" rel="noopener noreferrer">https://render.com</a></p>
<p><em>render.yaml</em>:</p>
<pre><code class="language-yml hljs yaml" translate="no"><span class="hljs-attr">previewsEnabled:</span> <span class="hljs-literal">true</span>
<span class="hljs-attr">services:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">type:</span> <span class="hljs-string">web</span>
    <span class="hljs-attr">name:</span> <span class="hljs-string">Cecil</span>
    <span class="hljs-attr">env:</span> <span class="hljs-string">static</span>
    <span class="hljs-attr">buildCommand:</span> <span class="hljs-string">curl</span> <span class="hljs-string">-sSOL</span> <span class="hljs-string">https://cecil.app/build.sh</span> <span class="hljs-string">&amp;&amp;</span> <span class="hljs-string">bash</span> <span class="hljs-string">./build.sh</span>
    <span class="hljs-attr">staticPublishPath:</span> <span class="hljs-string">_site</span>
    <span class="hljs-attr">pullRequestPreviewsEnabled:</span> <span class="hljs-literal">true</span></code></pre>
<p><a href="https://render.com/docs/static-sites" target="_blank" rel="noopener noreferrer">Documentation officielle</a></p>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/developpeurs/etendre/</id>
    <title>Étendre</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-02T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/developpeurs/etendre/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Étendre</h1>
<p>Comme Cecil repose sur PHP, il est facile d'en étendre les capacités.</p>
<h2 id="generateur-de-pages">Générateur de pages</h2>
<p>Un générateur permet de créer des pages sans fichiers Markdown (avec des données provenant d'une API ou d'une base de données, par exemple), ou de modifier des pages existantes.</p>
<p>Créez simplement une nouvelle classe PHP dans l'espace de noms <code translate="no">Cecil\Generator</code>, puis ajoutez le nom de la classe à la liste <a href="/fr/configuration/pages/#pages-generators"><code translate="no">pages.generators</code></a>.</p>
<p><strong>Exemple:</strong></p>
<p><em>/extensions/Cecil/Generator/DummyPage.php</em></p>
<pre><code class="language-php hljs php" translate="no"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-keyword">namespace</span> <span class="hljs-title">Cecil</span>\<span class="hljs-title">Generator</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">Cecil</span>\<span class="hljs-title">Collection</span>\<span class="hljs-title">Page</span>\<span class="hljs-title">Page</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Cecil</span>\<span class="hljs-title">Collection</span>\<span class="hljs-title">Page</span>\<span class="hljs-title">Type</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DummyPage</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AbstractGenerator</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">GeneratorInterface</span>
</span>{
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">generate</span><span class="hljs-params">()</span>: <span class="hljs-title">void</span>
    </span>{
        <span class="hljs-comment">// create a new page $page, then add it to the site collection</span>
        $page = (<span class="hljs-keyword">new</span> Page(<span class="hljs-string">'my-page'</span>))
            -&gt;setType(Type::PAGE-&gt;value)
            -&gt;setPath(<span class="hljs-string">'mypage'</span>)
            -&gt;setBodyHtml(<span class="hljs-string">'&lt;p&gt;My page body&lt;/p&gt;'</span>)
            -&gt;setVariable(<span class="hljs-string">'language'</span>, <span class="hljs-string">'en'</span>)
            -&gt;setVariable(<span class="hljs-string">'title'</span>, <span class="hljs-string">'My page'</span>)
            -&gt;setVariable(<span class="hljs-string">'date'</span>, now())
            -&gt;setVariable(<span class="hljs-string">'menu'</span>, [<span class="hljs-string">'main'</span> =&gt; [<span class="hljs-string">'weight'</span> =&gt; <span class="hljs-number">99</span>]]);
        <span class="hljs-keyword">$this</span>-&gt;generatedPages-&gt;add($page);
    }
}</code></pre>
<p><em>/extensions/Cecil/Generator/Database.php</em></p>
<pre><code class="language-php hljs php" translate="no"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-keyword">namespace</span> <span class="hljs-title">Cecil</span>\<span class="hljs-title">Generator</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">Cecil</span>\<span class="hljs-title">Collection</span>\<span class="hljs-title">Page</span>\<span class="hljs-title">Page</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Cecil</span>\<span class="hljs-title">Collection</span>\<span class="hljs-title">Page</span>\<span class="hljs-title">Type</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Database</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AbstractGenerator</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">GeneratorInterface</span>
</span>{
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">generate</span><span class="hljs-params">()</span>: <span class="hljs-title">void</span>
    </span>{
        <span class="hljs-comment">// create pages from a SQLite database</span>
        $db = <span class="hljs-keyword">new</span> SQLite3(<span class="hljs-string">'database.sqlite'</span>);
        $statement = $db-&gt;prepare(<span class="hljs-string">'SELECT * FROM blog'</span>);
        $result = $statement-&gt;execute();
        <span class="hljs-keyword">while</span> ($row = $result-&gt;fetchArray(SQLITE3_ASSOC)) {
            $page = (<span class="hljs-keyword">new</span> Page($row[<span class="hljs-string">'page-id'</span>]))
                -&gt;setType(Type::PAGE-&gt;value)
                -&gt;setPath($row[<span class="hljs-string">'path'</span>])
                -&gt;setBodyHtml($row[<span class="hljs-string">'html'</span>])
                -&gt;setVariable(<span class="hljs-string">'title'</span>, $row[<span class="hljs-string">'title'</span>])
                -&gt;setVariable(<span class="hljs-string">'date'</span>, $row[<span class="hljs-string">'date'</span>]);
            <span class="hljs-keyword">$this</span>-&gt;generatedPages-&gt;add($page);
        }
        $result-&gt;finalize();
        $db-&gt;close();
    }
}</code></pre>
<p><em>configuration</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">generators:</span>
    <span class="hljs-comment"># priority: class name</span>
    <span class="hljs-attr">99:</span> <span class="hljs-string">Cecil\Generator\DummyPage</span>
    <span class="hljs-attr">35:</span> <span class="hljs-string">Cecil\Generator\Database</span></code></pre>
<h2 id="extension-twig">Extension Twig</h2>
<p>Vous pouvez ajouter des <a href="/fr/templates/reference/functions/">fonctions</a> et des <a href="/fr/templates/reference/filters/">filtres</a> personnalisés :</p>
<ol>
<li><a href="https://twig.symfony.com/doc/advanced.html#creating-an-extension" target="_blank" rel="noopener noreferrer">créez une extension Twig</a> dans l'espace de noms <code translate="no">Cecil\Renderer\Extension</code></li>
<li>ajoutez le fichier PHP dans le répertoire <code translate="no">extensions</code></li>
<li>ajoutez le nom de la classe à la configuration</li>
</ol>
<p><strong>Exemple:</strong></p>
<p><em>/extensions/Cecil/Renderer/Extension/MyTwigExtension.php</em></p>
<pre><code class="language-php hljs php" translate="no"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-keyword">namespace</span> <span class="hljs-title">Cecil</span>\<span class="hljs-title">Renderer</span>\<span class="hljs-title">Extension</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyTwigExtension</span> <span class="hljs-keyword">extends</span> \<span class="hljs-title">Twig</span>\<span class="hljs-title">Extension</span>\<span class="hljs-title">AbstractExtension</span>
</span>{
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getFilters</span><span class="hljs-params">()</span>
    </span>{
        <span class="hljs-comment">// add a new filter named 'md5'</span>
        <span class="hljs-keyword">return</span> [
            <span class="hljs-keyword">new</span> \Twig\TwigFilter(<span class="hljs-string">'md5'</span>, <span class="hljs-string">'md5'</span>),
        ];
    }
}</code></pre>
<p><em>configuration</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">layouts:</span>
  <span class="hljs-attr">extensions:</span>
    <span class="hljs-attr">MyExtension:</span> <span class="hljs-string">Cecil\Renderer\Extension\MyTwigExtension</span></code></pre>
<h2 id="post-processeur-de-rendu">Post-processeur de rendu</h2>
<p>Vous pouvez post-traiter le rendu des pages.</p>
<p>Créez simplement une nouvelle classe PHP dans l'espace de noms <code translate="no">Cecil\Renderer\PostProcessor</code> et ajoutez le nom de la classe à la liste <code translate="no">output.postprocessors</code>.</p>
<p><strong>Exemple:</strong></p>
<p><em>/extensions/Cecil/Renderer/PostProcessor/MyProcessor.php</em></p>
<pre><code class="language-php hljs php" translate="no"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-keyword">namespace</span> <span class="hljs-title">Cecil</span>\<span class="hljs-title">Renderer</span>\<span class="hljs-title">PostProcessor</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">Cecil</span>\<span class="hljs-title">Collection</span>\<span class="hljs-title">Page</span>\<span class="hljs-title">Page</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyProcessor</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AbstractPostProcessor</span>
</span>{
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">process</span><span class="hljs-params">(Page $page, string $output, string $format)</span>: <span class="hljs-title">string</span>
    </span>{
        <span class="hljs-comment">// add a meta tag to the head of the HTML output</span>
        <span class="hljs-keyword">if</span> ($format == <span class="hljs-string">'html'</span>) {
            <span class="hljs-keyword">if</span> (!preg_match(<span class="hljs-string">'/&lt;meta name="test".*/i'</span>, $output)) {
                $meta = \sprintf(<span class="hljs-string">'&lt;meta name="test" content="Test"&gt;'</span>);
                $output = preg_replace_callback(<span class="hljs-string">'/([[:blank:]]*)(&lt;\/head&gt;)/i'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">($matches)</span> <span class="hljs-title">use</span> <span class="hljs-params">($meta)</span> </span>{
                    <span class="hljs-keyword">return</span> str_repeat($matches[<span class="hljs-number">1</span>] ?: <span class="hljs-string">' '</span>, <span class="hljs-number">2</span>) . $meta . <span class="hljs-string">"\n"</span> . $matches[<span class="hljs-number">1</span>] . $matches[<span class="hljs-number">2</span>];
                }, $output);
            }
        }

        <span class="hljs-keyword">return</span> $output;
    }
}</code></pre>
<p><em>configuration</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">output:</span>
  <span class="hljs-attr">postprocessors:</span>
    <span class="hljs-attr">MyProcessor:</span> <span class="hljs-string">Cecil\Renderer\PostProcessor\MyProcessor</span></code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/commandes/new-page/</id>
    <title>new:page</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-02T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/commandes/new-page/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>new:page</h1>
<p>Crée une nouvelle page.</p>
<pre><code class="language-plaintext hljs plaintext" translate="no">Description:
  Creates a new page

Usage:
  new:page [options] [--] [&lt;path&gt;]

Arguments:
  path                        Use the given path as working directory

Options:
      --name=NAME             Page path name
      --slugify|--no-slugify  Slugify file name (or disable --no-slugify)
  -p, --prefix                Prefix the file name with the current date (`YYYY-MM-DD`)
  -f, --force                 Override the file if already exist
  -o, --open                  Open editor automatically
      --editor=EDITOR         Editor to use with open option
  -h, --help                  Display help for the given command. When no command is given display help for the list command
  -q, --quiet                 Do not output any message
  -V, --version               Display this application version
      --ansi|--no-ansi        Force (or disable --no-ansi) ANSI output
  -n, --no-interaction        Do not ask any interactive question
  -v|vv|vvv, --verbose        Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Help:
  The new:page command creates a new page file.
  If you run this command without any options, it will ask you for the page name and other options.

    cecil.phar new:page
    cecil.phar new:page --name=path/to/a-page.md
    cecil.phar new:page --name=path/to/A Page.md --slugify

  To create a new page with a date prefix (i.e: `YYYY-MM-DD`), run:

    cecil.phar new:page --prefix

  To create a new page and open it with an editor, run:

    cecil.phar new:page --open --editor=editor

  To override an existing page, run:

    cecil.phar new:page --force</code></pre>
<h2 id="modeles-de-page">Modèles de page</h2>
<p>Vous pouvez définir vos propres modèles pour vos nouvelles pages dans le répertoire <code translate="no">models</code> :</p>
<ol>
<li>Le nom doit être basé sur le nom de la section (par exemple : <code translate="no">blog.md</code>)</li>
<li>Le modèle par défaut doit être nommé <code translate="no">default.md</code> (pour les pages racine ou les sections de pages sans modèle)</li>
</ol>
<p>Deux variables dynamiques sont disponibles :</p>
<ol>
<li><code translate="no">%title%</code> : le nom du fichier</li>
<li><code translate="no">%date%</code> : la date actuelle</li>
</ol>
<h2 id="ouvrir-avec-votre-editeur">Ouvrir avec votre éditeur</h2>
<p>Avec l’option <code translate="no">--open</code>, l’éditeur s’ouvrira automatiquement. Utilisez donc la clé <code translate="no">editor</code> dans votre fichier de configuration pour définir l’éditeur par défaut (par exemple : <code translate="no">editor: typora</code>).</p>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/configuration/langues/</id>
    <title>Langues</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/configuration/langues/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Langues</h1>
<h2 id="language">language</h2>
<p>Langue principale, définie par son code.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">language:</span> <span class="hljs-string">&lt;code&gt;</span> <span class="hljs-comment"># unique code (`en` by default)</span></code></pre>
<p>Par défaut, seuls les chemins des pages des autres <a href="#languages">langues</a> sont préfixés par leur code de langue, mais vous pouvez préfixer le chemin des pages de la langue principale avec l’option suivante :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-comment">#language: &lt;code&gt;</span>
<span class="hljs-attr">language:</span>
  <span class="hljs-attr">code:</span> <span class="hljs-string">&lt;code&gt;</span>
  <span class="hljs-attr">prefix:</span> <span class="hljs-literal">true</span></code></pre>
<aside class="note note-info"><p>Quand <code translate="no">prefix</code> est défini à <code translate="no">true</code>, un alias est automatiquement créé pour la page d’accueil afin de rediriger de <code translate="no">/</code> vers <code translate="no">/&lt;code&gt;/</code>.</p></aside>
<h2 id="languages">languages</h2>
<p>Options des langues disponibles, utilisées pour la localisation des <a href="/fr/content/multilingual/">pages</a> et des <a href="/fr/templates/localization/">templates</a>.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">languages:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">code:</span> <span class="hljs-string">&lt;code&gt;</span>          <span class="hljs-comment"># unique code (e.g.: `en`, `fr`, 'en-US', `fr-CA`)</span>
    <span class="hljs-attr">name:</span> <span class="hljs-string">&lt;name&gt;</span>          <span class="hljs-comment"># human readable name (e.g.: `Français`)</span>
    <span class="hljs-attr">locale:</span> <span class="hljs-string">&lt;locale&gt;</span>      <span class="hljs-comment"># locale code (`language_COUNTRY`, e.g.: `en_US`, `fr_FR`, `fr_CA`)</span>
    <span class="hljs-attr">enabled:</span> <span class="hljs-string">&lt;true|false&gt;</span> <span class="hljs-comment"># enabled or not (`true` by default)</span></code></pre>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">language:</span> <span class="hljs-string">en</span>
<span class="hljs-attr">languages:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">code:</span> <span class="hljs-string">en</span>
    <span class="hljs-attr">name:</span> <span class="hljs-string">English</span>
    <span class="hljs-attr">locale:</span> <span class="hljs-string">en_US</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">code:</span> <span class="hljs-string">fr</span>
    <span class="hljs-attr">name:</span> <span class="hljs-string">Français</span>
    <span class="hljs-attr">locale:</span> <span class="hljs-string">fr_FR</span></code></pre>
<aside class="note note-info"><p>Une <a href="/fr/documentation/locale-codes/">liste des codes de locale</a> est disponible si nécessaire.</p></aside>
<h3 id="localiser">Localiser</h3>
<p>Pour localiser des options de configuration, vous devez les stocker sous la clé <code translate="no">config</code> de la langue.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">title:</span> <span class="hljs-string">"Cecil in english"</span>
<span class="hljs-attr">languages:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">code:</span> <span class="hljs-string">en</span>
    <span class="hljs-attr">name:</span> <span class="hljs-string">English</span>
    <span class="hljs-attr">locale:</span> <span class="hljs-string">en_US</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">code:</span> <span class="hljs-string">fr</span>
    <span class="hljs-attr">name:</span> <span class="hljs-string">Français</span>
    <span class="hljs-attr">locale:</span> <span class="hljs-string">fr_FR</span>
    <span class="hljs-attr">config:</span>
      <span class="hljs-attr">title:</span> <span class="hljs-string">"Cecil en français"</span></code></pre>
<aside class="note note-info"><p>Dans les <a href="/fr/templates/">templates</a>, vous pouvez accéder à une option avec <code translate="no">{{ site.&lt;option&gt; }}</code>, par exemple <code translate="no">{{ site.title }}</code>.<br>
Si une option n’est pas disponible dans la langue actuelle (ex. : <code translate="no">fr</code>), elle revient à la valeur globale (ex. : <code translate="no">en</code>).</p></aside>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/contenu/front-matter/</id>
    <title>Front matter</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-03T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/contenu/front-matter/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Front matter</h1>
<p>Le <em>front matter</em> peut contenir des variables personnalisées appliquées à la page courante.</p>
<p>Il doit se trouver au tout début du fichier et être un <a href="https://en.wikipedia.org/wiki/YAML" target="_blank" rel="noopener noreferrer">YAML</a> valide.</p>
<h2 id="variables-predefinies">Variables prédéfinies</h2>
<table>
<thead>
<tr>
<th>Variable</th>
<th>Description</th>
<th>Valeur par défaut</th>
<th>Exemple</th>
</tr>
</thead>
<tbody>
<tr>
<td><code translate="no">title</code></td>
<td>Titre</td>
<td>Nom de fichier sans extension.</td>
<td><code translate="no">Post 1</code></td>
</tr>
<tr>
<td><code translate="no">layout</code></td>
<td>Template</td>
<td>Voir <a href="/fr/templates/lookup-rules/#regles-de-recherche"><em>Lookup rules</em></a>.</td>
<td><code translate="no">404</code></td>
</tr>
<tr>
<td><code translate="no">date</code></td>
<td>Date de création</td>
<td>Date de création du fichier (objet PHP <em>DateTime</em>).</td>
<td><code translate="no">2019/04/15</code></td>
</tr>
<tr>
<td><code translate="no">section</code></td>
<td>Section</td>
<td><em>Section</em> de la page.</td>
<td><code translate="no">blog</code></td>
</tr>
<tr>
<td><code translate="no">path</code></td>
<td>Chemin</td>
<td><em>Path</em> de la page.</td>
<td><code translate="no">blog/post-1</code></td>
</tr>
<tr>
<td><code translate="no">slug</code></td>
<td>Slug</td>
<td><em>Slug</em> de la page.</td>
<td><code translate="no">post-1</code></td>
</tr>
<tr>
<td><code translate="no">published</code></td>
<td>Publié ou non</td>
<td><code translate="no">true</code>.</td>
<td><code translate="no">false</code></td>
</tr>
<tr>
<td><code translate="no">draft</code></td>
<td>Brouillon ou non</td>
<td><code translate="no">false</code>.</td>
<td><code translate="no">true</code></td>
</tr>
</tbody>
</table>
<aside class="note note-info"><p>Toutes les variables prédéfinies peuvent être surchargées, sauf <code translate="no">section</code>.</p></aside>
<h2 id="updated">updated</h2>
<p>La variable <code translate="no">updated</code> sert à définir la date de dernière modification d’une page.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">updated:</span> <span class="hljs-number">2026</span><span class="hljs-number">-02</span><span class="hljs-number">-02</span>
<span class="hljs-meta">---</span></code></pre>
<aside class="note note-warning"><p>Avant la version 8.80.1, la variable <code translate="no">updated</code> était une variable prédéfinie. Elle est désormais optionnelle (et doit être définie dans le front matter pour être utilisée).</p></aside>
<h2 id="menu">menu</h2>
<p>Une page peut être ajoutée à un <a href="/fr/configuration/site/#menus">menu</a>.</p>
<p>Le nom de l’entrée est le <code translate="no">title</code> de la page et l’URL est le <code translate="no">path</code> de la page.</p>
<p>La même page peut être ajoutée à plusieurs menus, et la position de chaque entrée peut être définie avec la clé <code translate="no">weight</code> (la plus faible en premier). La clé <code translate="no">name</code> peut être utilisée pour personnaliser le nom de l’entrée par menu.</p>
<p><em>Exemples :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">menu:</span> <span class="hljs-string">main</span>
<span class="hljs-meta">---</span></code></pre>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">menu:</span> <span class="hljs-string">[main,</span> <span class="hljs-string">navigation]</span> <span class="hljs-comment"># same page in multiple menus</span>
<span class="hljs-meta">---</span></code></pre>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">menu:</span>
  <span class="hljs-attr">main:</span>
    <span class="hljs-attr">weight:</span> <span class="hljs-number">10</span>
  <span class="hljs-attr">navigation:</span>
    <span class="hljs-attr">weight:</span> <span class="hljs-number">20</span>
<span class="hljs-meta">---</span></code></pre>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">title:</span> <span class="hljs-string">'Notre expertise'</span>
<span class="hljs-attr">menu:</span>
  <span class="hljs-attr">main:</span>
    <span class="hljs-attr">weight:</span> <span class="hljs-number">15</span>
  <span class="hljs-attr">footer:</span>
    <span class="hljs-attr">weight:</span> <span class="hljs-number">15</span>
    <span class="hljs-attr">name:</span> <span class="hljs-string">"Expertise"</span> <span class="hljs-comment"># personnalise le nom de l'entrée dans ce menu</span>
<span class="hljs-meta">---</span></code></pre>
<h2 id="taxonomie">Taxonomie</h2>
<p>La taxonomie permet de connecter, relier et classer le contenu de votre site Web.<br>
Dans Cecil, ces termes sont regroupés dans des vocabulaires.</p>
<p>Les vocabulaires sont déclarés dans la <a href="/fr/configuration/site/#taxonomies"><em>Configuration</em></a>.</p>
<dl>
<dt>Vocabulaire</dt>
<dd>Une catégorisation du contenu (ex. : <code translate="no">tags</code>, <code translate="no">categories</code>, etc.).</dd>
<dt>Terme</dt>
<dd>Un terme est un élément d’un vocabulaire (ex. : <code translate="no">Développement</code>, <code translate="no">PHP</code>, etc.).</dd>
</dl>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">tags:</span> <span class="hljs-string">["Développement",</span> <span class="hljs-string">"PHP"</span><span class="hljs-string">]</span>
<span class="hljs-meta">---</span></code></pre>
<p>Cecil génère ensuite, pour chaque vocabulaire :</p>
<ul>
<li>une page listant ses termes, ex. : <code translate="no">/tags/</code></li>
<li>une page par terme listant ses pages, ex. : <code translate="no">/tags/developpement/</code> et <code translate="no">/tags/php/</code></li>
</ul>
<p>Voir les <a href="/fr/templates/lookup-rules/#type-vocabulary">règles de recherche des templates</a> et les <a href="/fr/templates/variables/#taxonomie">variables de taxonomie</a> pour personnaliser ces pages.</p>
<h2 id="planification">Planification</h2>
<p>Planifie la publication des pages.</p>
<p><em>Exemple :</em></p>
<p>La page sera publiée si la date courante est &gt;= 2023-02-07 :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">schedule:</span>
  <span class="hljs-attr">publish:</span> <span class="hljs-number">2023</span><span class="hljs-number">-02</span><span class="hljs-number">-07</span></code></pre>
<p>Cette page est publiée si la date courante est &lt;= 2022-04-28 :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">schedule:</span>
  <span class="hljs-attr">expiry:</span> <span class="hljs-number">2022</span><span class="hljs-number">-04</span><span class="hljs-number">-28</span></code></pre>
<h2 id="redirect">redirect</h2>
<p>Comme son nom l’indique, la variable <code translate="no">redirect</code> sert à rediriger une page vers une URL dédiée.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">redirect:</span> <span class="hljs-string">"https://arnaudligny.fr"</span>
<span class="hljs-meta">---</span></code></pre>
<aside class="note note-info"><p>La redirection fonctionne avec le template <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>.</p></aside>
<h2 id="alias">alias</h2>
<p>Un alias est une redirection vers la page courante.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">title:</span> <span class="hljs-string">"About"</span>
<span class="hljs-attr">alias:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">contact</span>
<span class="hljs-meta">---</span></code></pre>
<p>Dans l’exemple précédent, <code translate="no">contact/</code> redirige vers <code translate="no">about/</code>.</p>
<h2 id="output">output</h2>
<p>Définit le format de sortie de la page.</p>
<p>Les formats disponibles sont : <code translate="no">html</code>, <code translate="no">atom</code>, <code translate="no">rss</code>, <code translate="no">json</code>, <code translate="no">xml</code>, etc.<br>
Vous pouvez définir un ou plusieurs formats dans un tableau.</p>
<p>Il n’est pas obligatoire de définir un format de sortie, mais si vous le faites, il doit correspondre à l’un des formats disponibles définis dans la <a href="/fr/configuration/output/#output-formats"><em>Configuration</em></a>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">output:</span> <span class="hljs-string">[html,</span> <span class="hljs-string">atom]</span>
<span class="hljs-meta">---</span></code></pre>
<h2 id="external">external</h2>
<p>Une page avec une variable <code translate="no">external</code> tente de récupérer le contenu de la ressource ciblée.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">external:</span> <span class="hljs-string">"https://raw.githubusercontent.com/Cecilapp/Cecil/main/README.md"</span>
<span class="hljs-meta">---</span></code></pre>
<h2 id="excluded">excluded</h2>
<p>Définissez <code translate="no">excluded</code> à <code translate="no">true</code> pour masquer une page des pages de liste (c.-à-d. : <em>Home page</em>, <em>Section</em>, <em>Sitemap</em>, etc.).</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">excluded:</span> <span class="hljs-literal">true</span>
<span class="hljs-meta">---</span></code></pre>
<aside class="note note-info"><p><code translate="no">excluded</code> est différent de <a href="#variables-predefinies"><code translate="no">published</code></a> : une page exclue est publiée, mais masquée des pages de liste.</p></aside>
<aside class="note note-warning"><p>Depuis la version 8.49.0, l’ancienne variable <code translate="no">exclude</code> a été remplacée par <code translate="no">excluded</code>.</p></aside>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/deployer/deploiement-continu/</id>
    <title>Build et déploiement continus</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-02T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/deployer/deploiement-continu/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Build et déploiement continus</h1>
<h2 id="github-pages">GitHub Pages</h2>
<blockquote>
<p>Des sites web pour vous et vos projets, hébergés directement depuis votre dépôt GitHub. Il suffit de modifier, pousser, et vos changements sont en ligne.</p>
</blockquote>
<p>➡️ <a href="https://pages.github.com" target="_blank" rel="noopener noreferrer">https://pages.github.com</a></p>
<p><em>.github/workflows/build-and-deploy.yml</em>:</p>
<pre><code class="language-yml 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>
<span class="hljs-attr">on:</span>
  <span class="hljs-attr">push:</span>
    <span class="hljs-attr">branches:</span> <span class="hljs-string">[master,</span> <span class="hljs-string">main]</span>
  <span class="hljs-attr">workflow_dispatch:</span>
<span class="hljs-attr">concurrency:</span>
  <span class="hljs-attr">group:</span> <span class="hljs-string">pages</span>
  <span class="hljs-attr">cancel-in-progress:</span> <span class="hljs-literal">true</span>
<span class="hljs-attr">jobs:</span>
  <span class="hljs-attr">build:</span>
    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>
    <span class="hljs-attr">steps:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Checkout</span> <span class="hljs-string">source</span>
        <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v6</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Restore</span> <span class="hljs-string">Cecil</span> <span class="hljs-string">cache</span>
        <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/cache/restore@v5</span>
        <span class="hljs-attr">with:</span>
          <span class="hljs-attr">path:</span> <span class="hljs-string">./.cache</span>
          <span class="hljs-attr">key:</span> <span class="hljs-string">cecil-cache-</span>
          <span class="hljs-attr">restore-keys:</span> <span class="hljs-string">|
            cecil-cache-
</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Build</span> <span class="hljs-string">site</span>
        <span class="hljs-attr">uses:</span> <span class="hljs-string">Cecilapp/Cecil-Action@v4</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Save</span> <span class="hljs-string">Cecil</span> <span class="hljs-string">cache</span>
        <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/cache/save@v5</span>
        <span class="hljs-attr">with:</span>
          <span class="hljs-attr">path:</span> <span class="hljs-string">./.cache</span>
          <span class="hljs-attr">key:</span> <span class="hljs-string">cecil-cache-${{</span> <span class="hljs-string">hashFiles('./.cache/**/*')</span> <span class="hljs-string">}}</span>
  <span class="hljs-attr">deploy:</span>
    <span class="hljs-attr">needs:</span> <span class="hljs-string">build</span>
    <span class="hljs-attr">permissions:</span>
      <span class="hljs-attr">pages:</span> <span class="hljs-string">write</span>
      <span class="hljs-attr">id-token:</span> <span class="hljs-string">write</span>
    <span class="hljs-attr">environment:</span>
      <span class="hljs-attr">name:</span> <span class="hljs-string">github-pages</span>
      <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>
    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>
    <span class="hljs-attr">steps:</span>
      <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>
        <span class="hljs-attr">id:</span> <span class="hljs-string">deployment</span>
        <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/deploy-pages@v5</span></code></pre>
<p><a href="https://docs.github.com/en/pages" target="_blank" rel="noopener noreferrer">Documentation officielle</a></p>
<h2 id="gitlab-ci">GitLab CI</h2>
<blockquote>
<p>Avec GitLab Pages, vous pouvez publier des sites web statiques directement depuis un dépôt GitLab.</p>
</blockquote>
<p>➡️ <a href="https://about.gitlab.com/solutions/continuous-integration/" target="_blank" rel="noopener noreferrer">https://about.gitlab.com/solutions/continuous-integration/</a></p>
<p><em>.gitlab-ci.yml</em>:</p>
<pre><code class="language-yml hljs yaml" translate="no"><span class="hljs-attr">image:</span> <span class="hljs-string">wordpress:cli-php8.4</span>
<span class="hljs-attr">test:</span>
  <span class="hljs-attr">stage:</span> <span class="hljs-string">test</span>
  <span class="hljs-attr">variables:</span>
    <span class="hljs-attr">CECIL_OUTPUT_DIR:</span> <span class="hljs-string">test</span>
  <span class="hljs-attr">script:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">curl</span> <span class="hljs-string">-sSOL</span> <span class="hljs-string">https://cecil.app/build.sh</span> <span class="hljs-string">&amp;&amp;</span> <span class="hljs-string">bash</span> <span class="hljs-string">./build.sh</span>
  <span class="hljs-attr">artifacts:</span>
    <span class="hljs-attr">paths:</span>
     <span class="hljs-bullet">-</span> <span class="hljs-string">test</span>
  <span class="hljs-attr">except:</span>
   <span class="hljs-bullet">-</span> <span class="hljs-string">master</span>
<span class="hljs-attr">pages:</span>
  <span class="hljs-attr">stage:</span> <span class="hljs-string">deploy</span>
  <span class="hljs-attr">variables:</span>
    <span class="hljs-attr">CECIL_ENV:</span> <span class="hljs-string">production</span>
    <span class="hljs-attr">CECIL_OUTPUT_DIR:</span> <span class="hljs-string">public</span>
  <span class="hljs-attr">script:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">curl</span> <span class="hljs-string">-sSOL</span> <span class="hljs-string">https://cecil.app/build.sh</span> <span class="hljs-string">&amp;&amp;</span> <span class="hljs-string">bash</span> <span class="hljs-string">./build.sh</span>
  <span class="hljs-attr">artifacts:</span>
    <span class="hljs-attr">paths:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">public</span>
  <span class="hljs-attr">only:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">master</span>
<span class="hljs-attr">cache:</span>
  <span class="hljs-attr">paths:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">composer-cache/</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">vendor/</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">.cache/</span></code></pre>
<p><a href="https://about.gitlab.com/stages-devops-lifecycle/continuous-integration/" target="_blank" rel="noopener noreferrer">Documentation officielle</a></p>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/developpeurs/bibliotheque/</id>
    <title>Bibliothèque</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-03T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/developpeurs/bibliotheque/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Bibliothèque</h1>
<p>Cecil propose une API PHP simple pour générer votre site web.</p>
<p>Vous pouvez consulter la <a href="https://cecil.app/documentation/library/api/namespaces/cecil.html">documentation de l'API</a> pour plus de détails.</p>
<h2 id="installation">Installation</h2>
<pre><code class="language-bash hljs bash" translate="no">composer require cecil/cecil</code></pre>
<h3 id="support-de-libvips">Support de libvips</h3>
<p>Pour traiter les images avec <a href="https://www.libvips.org/" target="_blank" rel="noopener noreferrer">libvips</a> (optionnel), installez le driver libvips dans votre projet :</p>
<pre><code class="language-bash hljs bash" translate="no">composer require intervention/image-driver-vips</code></pre>
<aside class="note note-important"><p>Ce driver nécessite <a href="https://www.libvips.org/install.html" target="_blank" rel="noopener noreferrer">libvips</a> installé sur le système et l’extension PHP <a href="https://www.php.net/manual/book.ffi.php" target="_blank" rel="noopener noreferrer">FFI</a> activée.<br>
Sans lui, Cecil utilise <a href="https://www.php.net/manual/book.imagick.php" target="_blank" rel="noopener noreferrer">Imagick</a> ou <a href="https://www.php.net/manual/book.image.php" target="_blank" rel="noopener noreferrer">GD</a> à la place.</p></aside>
<h2 id="utilisation">Utilisation</h2>
<h3 id="construction">Construction</h3>
<p>Construisez un nouveau site web avec une configuration personnalisée :</p>
<pre><code class="language-php hljs php" translate="no"><span class="hljs-keyword">require_once</span> <span class="hljs-string">'vendor/autoload.php'</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">Cecil</span>\<span class="hljs-title">Builder</span>;

$config = [
    <span class="hljs-string">'title'</span>   =&gt; <span class="hljs-string">"My website"</span>,
    <span class="hljs-string">'baseurl'</span> =&gt; <span class="hljs-string">'https://domain.tld/'</span>,
];

Builder::create($config)-&gt;build();

exec(<span class="hljs-string">'php -S localhost:8000 -t _site'</span>); <span class="hljs-comment">// prévisualisation locale</span></code></pre>
<aside class="note note-info"><p>Le paramètre principal de la méthode <code translate="no">create</code> doit être un <code translate="no">array</code> PHP ou une instance de <a href="https://github.com/Cecilapp/Cecil/blob/main/src/Config.php" target="_blank" rel="noopener noreferrer"><code translate="no">Cecil\Config</code></a>.</p></aside>
<h3 id="diagnostic">Diagnostic</h3>
<p>Vous pouvez aussi exécuter les vérifications doctor via des services de domaine dédiés, sans utiliser les commandes CLI.</p>
<pre><code class="language-php hljs php" translate="no"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">require_once</span> <span class="hljs-string">'vendor/autoload.php'</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">Cecil</span>\<span class="hljs-title">Builder</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Cecil</span>\<span class="hljs-title">Doctor</span>\<span class="hljs-title">SeoDoctor</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Cecil</span>\<span class="hljs-title">Doctor</span>\<span class="hljs-title">SiteDoctor</span>;

$builder = Builder::create(<span class="hljs-keyword">require</span> <span class="hljs-string">'config.php'</span>)
    -&gt;setSourceDir(<span class="hljs-keyword">__DIR__</span>)
    -&gt;setDestinationDir(<span class="hljs-keyword">__DIR__</span>);

$siteDoctor = <span class="hljs-keyword">new</span> SiteDoctor();
$diagnosis = $siteDoctor-&gt;diagnose($builder, <span class="hljs-keyword">__DIR__</span>, [<span class="hljs-string">'cecil.yml'</span>]);

$seoDoctor = <span class="hljs-keyword">new</span> SeoDoctor();
$seoAudit = $seoDoctor-&gt;audit($builder, [
    <span class="hljs-string">'page'</span> =&gt; <span class="hljs-string">''</span>,
    <span class="hljs-string">'include_virtual'</span> =&gt; <span class="hljs-keyword">false</span>,
]);

var_dump($diagnosis[<span class="hljs-string">'errors'</span>], $seoAudit[<span class="hljs-string">'summary'</span>]);</code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/commandes/serve/</id>
    <title>serve</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-02T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/commandes/serve/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>serve</h1>
<p>Construit et sert le site en local.</p>
<aside class="note note-warning"><p>Le serveur web est conçu pour faciliter les tests d’un site. Il n’a pas vocation à être un serveur web complet et ne doit pas être utilisé sur un réseau public.</p></aside>
<pre><code class="language-plaintext hljs plaintext" translate="no">Description:
  Starts the built-in server

Usage:
  serve [options] [--] [&lt;path&gt;]

Arguments:
  path                             Use the given path as working directory

Options:
  -o, --open                       Open web browser automatically
      --host=HOST                  Server host [default: "localhost"]
      --port=PORT                  Server port [default: "8000"]
  -w, --watch|--no-watch           Enable (or disable --no-watch) changes watcher (enabled by default)
  -i, --incremental                Enable incremental builds (rebuild only changed pages)
  -d, --drafts                     Include drafts
      --optimize|--no-optimize     Enable (or disable --no-optimize) optimization of generated files
  -c, --config=CONFIG              Set the path to extra config files (comma-separated)
      --clear-cache[=CLEAR-CACHE]  Clear cache before build (optional cache key as regular expression) [default: false]
  -p, --page=PAGE                  Build a specific page
      --no-ignore-vcs              Changes watcher must not ignore VCS directories
  -m, --metrics                    Show build metrics (duration and memory) of each step
      --timeout=TIMEOUT            Sets the process timeout (max. runtime) in seconds [default: 7200]
      --notify                     Send desktop notification on server start
  -b, --background                 Run the server in the background
  -h, --help                       Display help for the given command. When no command is given display help for the list command
  -q, --quiet                      Do not output any message
  -V, --version                    Display this application version
      --ansi|--no-ansi             Force (or disable --no-ansi) ANSI output
  -n, --no-interaction             Do not ask any interactive question
  -v|vv|vvv, --verbose             Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Help:
  The serve command starts the live-reloading-built-in web server.

    cecil.phar serve
    cecil.phar serve path/to/the/working/directory
    cecil.phar serve --open
    cecil.phar serve --drafts
    cecil.phar serve --no-watch

  To speed up local development you can enable incremental builds with the --incremental option.
  When content pages change, Cecil rebuilds just those pages.
  When templates change, Cecil rebuilds only pages using those templates (including Twig dependencies such as extends/include).
  Any other change (data, config, static or asset file, or file deletion) triggers a full rebuild:

    cecil.phar serve --incremental

  You can use a custom host and port by using the --host and --port options:

    cecil.phar serve --host=127.0.0.1 --port=8080

  To build the website with an extra configuration file, you can use the --config option.
  This is useful during local development to override some settings without modifying the main configuration:

    cecil.phar serve --config=config/dev.yml

  To start the server with changes watcher not ignoring VCS directories, run:

    cecil.phar serve --no-ignore-vcs

  To define the process timeout (in seconds), run:

    cecil.phar serve --timeout=7200

  To run the server in the background, run:

    cecil.phar serve --background
    cecil.phar serve -b

  Then stop it with:

    cecil.phar serve:stop

  In background mode, file changes are not watched automatically.</code></pre>
<h2 id="serve-background">serve:background</h2>
<p>Alias de <code translate="no">serve --background</code> : démarre le serveur intégré en arrière-plan sans occuper le terminal.</p>
<pre><code class="language-plaintext hljs plaintext" translate="no">Description:
  Starts the built-in server in the background (alias of `serve --background`)

Usage:
  serve:background [options] [--] [&lt;path&gt;]

Help:
  The serve:background command starts the built-in web server in the background.

    cecil.phar serve:background
    cecil.phar serve:background path/to/the/working/directory

  This command is an alias of serve --background.

  Stop the server with:

    cecil.phar serve:stop</code></pre>
<h2 id="serve-log">serve:log</h2>
<p>Affiche les logs combinés du serveur et des erreurs, triés par date.</p>
<pre><code class="language-plaintext hljs plaintext" translate="no">Description:
  Shows combined server and error logs

Usage:
  serve:log [options] [--] [&lt;path&gt;]

Arguments:
  path                  Use the given path as working directory

Options:
  -l, --lines=LINES     Number of entries to display (default: 25)

Help:
  The serve:log command displays entries from combined server and error logs, sorted by date.

    cecil.phar serve:log
    cecil.phar serve:log path/to/the/working/directory
    cecil.phar serve:log --lines=100
    cecil.phar serve:log -l 100

  This command shows logs from `.cecil/errors.log` and `.cecil/server.log`.
  It is useful for debugging issues with your local development server.</code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/contenu/markdown/</id>
    <title>Markdown</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-03T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/contenu/markdown/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Markdown</h1>
<p>Cecil prend en charge le format <a href="http://daringfireball.net/projects/markdown/syntax" target="_blank" rel="noopener noreferrer">Markdown</a>, ainsi que <a href="https://michelf.ca/projects/php-markdown/extra/" target="_blank" rel="noopener noreferrer">Markdown Extra</a>.</p>
<p>Cecil fournit aussi des <strong>fonctionnalités supplémentaires</strong> pour enrichir votre contenu, voir ci-dessous.</p>
<h2 id="attributs">Attributs</h2>
<p>Avec <a href="https://michelf.ca/projects/php-markdown/extra/" target="_blank" rel="noopener noreferrer">Markdown Extra</a>, vous pouvez définir un id, une classe et des attributs personnalisés sur certains éléments à l’aide d’un bloc d’attributs.<br>
Par exemple, placez le(s) attribut(s) souhaité(s) après un en-tête, un bloc de code délimité, un lien ou une image en fin de ligne, entre accolades, comme ceci :</p>
<pre><code class="language-markdown hljs markdown" translate="no"><span class="hljs-section">## En-tête {#id .class attribute=value}</span></code></pre>
<aside class="note note-warning"><p>Pour un élément en ligne, comme un lien, vous devez utiliser un retour à la ligne après l’accolade fermante :</p>
<pre><code class="language-markdown hljs markdown" translate="no">Lorem ipsum [<span class="hljs-string">dolor</span>](<span class="hljs-link">url</span>){attribute=value} 
sit amet.</code></pre></aside>
<h2 id="liens">Liens</h2>
<p>Vous pouvez créer un lien avec la syntaxe <code translate="no">[Texte](url)</code> ; <code translate="no">url</code> peut être un chemin, un chemin relatif vers un fichier Markdown, une URL externe, etc.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">[<span class="hljs-string">Link to a path</span>](<span class="hljs-link">/about/</span>)
[<span class="hljs-string">Link to a Markdown file</span>](<span class="hljs-link">/fr/a-propos/</span>)
[<span class="hljs-string">Link to Cecil website</span>](<span class="hljs-link">https://cecil.app</span>)</code></pre>
<aside class="note note-info"><p>Un lien relatif vers un fichier Markdown est résolu depuis le dossier du fichier courant (comme sur GitHub), puis remplacé par l’URL de la page ciblée.</p></aside>
<h3 id="lien-vers-une-page">Lien vers une page</h3>
<p>Vous pouvez facilement créer un lien vers une page avec la syntaxe <code translate="no">[Titre de page](page:page-id)</code>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">[<span class="hljs-string">Link to a blog post</span>](<span class="hljs-link">page:blog/post-1</span>)</code></pre>
<h3 id="externe">Externe</h3>
<p>Par défaut, les liens externes ont la valeur suivante pour l’attribut <code translate="no">rel</code> : <code translate="no">noopener noreferrer</code>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"&lt;url&gt;"</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"noopener noreferrer"</span>&gt;</span>Link to another website<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span></code></pre>
<p>Vous pouvez modifier ce comportement avec les <a href="/fr/configuration/pages/#pages-body-links">options <code translate="no">pages.body.links.external</code></a>.</p>
<h3 id="liens-integres">Liens intégrés</h3>
<p>Vous pouvez laisser Cecil essayer de transformer un lien en contenu embarqué en utilisant l’attribut <code translate="no">{embed}</code> ou en activant l’option de configuration globale <code translate="no">pages.body.links.embed.enabled</code> à <code translate="no">true</code>.</p>
<aside class="note note-important"><p>Seuls les liens <strong>YouTube</strong>, <strong>Vimeo</strong>, <strong>Dailymotion</strong> et <strong>GitHub Gists</strong> sont pris en charge.</p></aside>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">[<span class="hljs-string">CECIL : LE générateur de SITES STATIQUES en PHP</span>](<span class="hljs-link">https://www.youtube.com/watch?v=ur8koU0iYvc</span>){embed}</code></pre>
<p><div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
<iframe src="https://www.youtube-nocookie.com/embed/ur8koU0iYvc" loading="lazy" width="640" height="360" frameborder="0" allow="accelerometer;autoplay;encrypted-media;gyroscope;picture-in-picture;fullscreen;web-share;" allowfullscreen="" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background-color:#d8d8d8;"></iframe>
</div></p>
<h4>Local video/audio files</h4>
<p>Cecil peut aussi créer des éléments HTML vidéo et audio, selon l’extension du fichier.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">[<span class="hljs-string">Video file</span>](<span class="hljs-link">video.mp4</span>){embed controls poster=/images/video-test.png}
[<span class="hljs-string">Audio file</span>](<span class="hljs-link">song.mp3</span>){embed controls}</code></pre>
<p>Est converti en :</p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">video</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/video.mp4"</span> <span class="hljs-attr">controls</span> <span class="hljs-attr">poster</span>=<span class="hljs-string">"/images/video-test.png"</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"max-width:100%;height:auto;"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">video</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">audio</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/song.mp3"</span> <span class="hljs-attr">controls</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">audio</span>&gt;</span></code></pre>
<h2 id="images">Images</h2>
<p>Pour ajouter une image, utilisez un point d’exclamation (<code translate="no">!</code>) suivi d’une description alternative entre crochets (<code translate="no">[]</code>), puis du chemin ou de l’URL de l’image entre parenthèses (<code translate="no">()</code>).<br>
Vous pouvez facultativement ajouter un titre entre guillemets.</p>
<pre><code class="language-markdown hljs markdown" translate="no">![<span class="hljs-string">Alternative description</span>](<span class="hljs-link">/image.jpg "Image title"</span>)</code></pre>
<aside class="note note-info"><p>Le chemin doit être relatif à la racine de votre site Web (ex. : <code translate="no">/image.jpg</code>), mais Cecil est capable de normaliser un chemin relatif aux répertoires <em>assets</em> et <em>static</em> (ex. : <code translate="no">../../assets/image.jpg</code>).</p></aside>
<h3 id="lazy-loading">Lazy loading</h3>
<p>Cecil ajoute l’attribut <code translate="no">loading="lazy"</code> à chaque image.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">![](/image.jpg)</code></pre>
<p>Est converti en :</p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/image.jpg"</span> <span class="hljs-attr">loading</span>=<span class="hljs-string">"lazy"</span>&gt;</span></code></pre>
<aside class="note note-info"><p>Vous pouvez désactiver ce comportement avec l’attribut <code translate="no">{loading=eager}</code> ou avec l’<a href="/fr/configuration/pages/#pages-body-images">option <code translate="no">lazy</code></a>.</p></aside>
<h3 id="decoding">Decoding</h3>
<p>Cecil ajoute l’attribut <code translate="no">decoding="async"</code> à chaque image.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">![](/image.jpg)</code></pre>
<p>Est converti en :</p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/image.jpg"</span> <span class="hljs-attr">decoding</span>=<span class="hljs-string">"async"</span>&gt;</span></code></pre>
<aside class="note note-info"><p>Vous pouvez désactiver ce comportement avec l’attribut <code translate="no">{decoding=auto}</code> ou avec l’<a href="/fr/configuration/pages/#pages-body-images">option <code translate="no">decoding</code></a>.</p></aside>
<h3 id="redimensionnement">Redimensionnement</h3>
<p>Chaque image du <em>body</em> peut être redimensionnée automatiquement en définissant une largeur inférieure à celle d’origine, avec l’attribut additionnel <code translate="no">{width=X}</code>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">![](/image.jpg){width=800}</code></pre>
<p>Est converti en :</p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/thumbnails/800/image.jpg"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"800"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"600"</span>&gt;</span></code></pre>
<aside class="note note-info"><p>Le ratio est conservé (l’attribut <code translate="no">height</code> est calculé automatiquement), le fichier original n’est pas modifié et la version redimensionnée est stockée dans <code translate="no">/thumbnails/&lt;width&gt;/</code>.</p></aside>
<aside class="note note-important"><p>Cette fonctionnalité nécessite une bibliothèque de traitement d’images : <a href="https://www.php.net/manual/book.imagick.php" target="_blank" rel="noopener noreferrer">Imagick</a> est utilisé en priorité s’il est disponible (et capable de lire le JPEG et le PNG), puis <a href="https://www.libvips.org/" target="_blank" rel="noopener noreferrer">libvips</a> (via l’extension PHP <a href="https://www.php.net/manual/book.ffi.php" target="_blank" rel="noopener noreferrer">FFI</a>), et enfin <a href="https://www.php.net/manual/book.image.php" target="_blank" rel="noopener noreferrer">GD</a> en dernier recours ; sinon, elle ajoute seulement un attribut HTML <code translate="no">width</code> à la balise <code translate="no">img</code>.</p></aside>
<aside class="note note-info"><p>Le support de libvips est optionnel et n’est pas inclus dans <code translate="no">cecil.phar</code>. Pour l’utiliser, Cecil doit être installé avec <a href="https://getcomposer.org" target="_blank" rel="noopener noreferrer">Composer</a> et il faut :</p>
<ol>
<li><a href="https://www.libvips.org/install.html" target="_blank" rel="noopener noreferrer">libvips</a> installé sur le système</li>
<li>l’extension PHP <a href="https://www.php.net/manual/book.ffi.php" target="_blank" rel="noopener noreferrer">FFI</a> activée</li>
<li>le paquet <code translate="no">intervention/image-driver-vips</code> installé avec Cecil</li>
</ol>
<p>Si Cecil est une dépendance de votre projet (voir <a href="/fr/developers/library/#support-de-libvips">Bibliothèque</a>) :</p>
<pre><code class="language-bash hljs bash" translate="no">composer require intervention/image-driver-vips</code></pre>
<p>Si Cecil est installé globalement :</p>
<pre><code class="language-bash hljs bash" translate="no">composer global require cecil/cecil intervention/image-driver-vips</code></pre></aside>
<h3 id="formats">Formats</h3>
<p>Si l’<a href="/fr/configuration/pages/#pages-body-images">option <code translate="no">formats</code></a> est définie, des images alternatives sont créées et ajoutées.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">![](/image.jpg)</code></pre>
<p>Peut être converti en :</p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">picture</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">source</span> <span class="hljs-attr">srcset</span>=<span class="hljs-string">"/image.avif"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"image/avif"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">source</span> <span class="hljs-attr">srcset</span>=<span class="hljs-string">"/image.webp"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"image/webp"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/image.jpg"</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">picture</span>&gt;</span></code></pre>
<aside class="note note-important"><p>Veuillez noter que <strong>tous les formats d’image</strong> ne sont pas toujours inclus dans les extensions d’image PHP.</p></aside>
<h3 id="responsive">Responsive</h3>
<p>Si l’<a href="/fr/configuration/pages/#pages-body-images">option <code translate="no">responsive</code></a> est activée, alors toutes les images du <em>body</em> seront automatiquement rendues « responsive ».</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">![](/image.jpg){width=800}</code></pre>
<p>sera converti en :</p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/thumbnails/800/image.jpg"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"800"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"600"</span>
  <span class="hljs-attr">srcset</span>=<span class="hljs-string">"/thumbnails/320/image.jpg 320w,
          /thumbnails/640/image.jpg 640w,
          /thumbnails/800/image.jpg 800w"</span>
  <span class="hljs-attr">sizes</span>=<span class="hljs-string">"100vw"</span>
&gt;</span></code></pre>
<aside class="note note-info"><p>Comme une image du body est convertie en <a href="/fr/assets/#asset">Asset</a>, les différentes largeurs doivent être définies dans la <a href="/fr/configuration/assets/">configuration des assets</a>.</p></aside>
<p>L’attribut <code translate="no">sizes</code> prend la valeur de l’option de configuration <code translate="no">assets.images.responsive.sizes.default</code>, mais peut être modifié en créant une nouvelle entrée nommée d’après une <em>class</em> ajoutée à l’image.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">assets:</span>
  <span class="hljs-attr">images:</span>
    <span class="hljs-attr">responsive:</span>
      <span class="hljs-attr">sizes:</span>
        <span class="hljs-attr">default:</span> <span class="hljs-string">100vw</span>
        <span class="hljs-attr">my_class:</span> <span class="hljs-string">"(max-width: 800px) 768px, 1024px"</span></code></pre>
<pre><code class="language-markdown hljs markdown" translate="no">![](/image.jpg){.my_class}</code></pre>
<aside class="note note-info"><p>Vous pouvez combiner les options <code translate="no">formats</code> et <code translate="no">responsive</code>.</p></aside>
<h3 id="css-class">CSS class</h3>
<p>Vous pouvez définir une valeur par défaut pour l’attribut <code translate="no">class</code> de chaque image avec l’<a href="/fr/configuration/pages/#pages-body-images">option <code translate="no">class</code></a>.</p>
<h3 id="caption">Caption</h3>
<p>Le titre optionnel peut être utilisé pour créer automatiquement une légende (<code translate="no">figcaption</code>) en activant l’<a href="/fr/configuration/pages/#pages-body-images">option <code translate="no">caption</code></a>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">![](/images/img.jpg "Title")</code></pre>
<p>Est converti en :</p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">figure</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/image.jpg"</span> <span class="hljs-attr">title</span>=<span class="hljs-string">"Title"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">figcaption</span>&gt;</span>Title<span class="hljs-tag">&lt;/<span class="hljs-name">figcaption</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">figure</span>&gt;</span></code></pre>
<aside class="note note-info"><p>La légende prend en charge le contenu Markdown.</p></aside>
<h3 id="image-localisee">Image localisée</h3>
<p>Pour les pages traduites, Cecil recherche d’abord un fichier suffixé par la langue lors de la résolution des chemins d’image Markdown.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">![](/images/cecil-logo.png)</code></pre>
<p>Avec une page française (<code translate="no">fr</code>), Cecil essaie d’abord <code translate="no">/images/cecil-logo.fr.png</code>, puis revient à <code translate="no">/images/cecil-logo.png</code>.</p>
<h3 id="placeholder">Placeholder</h3>
<p>Comme les images sont généralement des ressources plus lourdes et plus lentes, et qu’elles ne bloquent pas le rendu, il est préférable de donner aux utilisateurs quelque chose à voir pendant qu’ils attendent leur chargement.</p>
<p>L’attribut <code translate="no">placeholder</code> accepte 2 options :</p>
<ol>
<li><code translate="no">color</code>: affiche un fond coloré (basé sur la couleur dominante de l’image)</li>
<li><code translate="no">lqip</code>: <a href="https://www.guypo.com/introducing-lqip-low-quality-image-placeholders" target="_blank" rel="noopener noreferrer">Low-Quality Image Placeholder</a></li>
</ol>
<p><em>Exemples :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">![](/images/img.jpg){placeholder=color}
![](/images/img.jpg){placeholder=lqip}</code></pre>
<aside class="note note-tip"><p>Vous pouvez définir une valeur pour l’attribut <code translate="no">placeholder</code> de chaque image avec l’<a href="/fr/configuration/pages/#pages-body-images">option <code translate="no">placeholder</code></a>.</p></aside>
<aside class="note note-warning"><p>L’option <code translate="no">lqip</code> n’est pas compatible avec les GIF animés.</p></aside>
<h2 id="table-des-matieres">Table des matières</h2>
<p>Vous pouvez ajouter une table des matières avec la syntaxe Markdown suivante :</p>
<pre><code class="language-markdown hljs markdown" translate="no">[toc]</code></pre>
<aside class="note note-info"><p>Par défaut, la ToC extrait les en-têtes H2 et H3. Vous pouvez modifier ce comportement avec les <a href="/fr/configuration/pages/#pages-body">options de body</a>.</p></aside>
<h2 id="extrait">Extrait</h2>
<p>Un extrait peut être défini dans le <em>body</em> avec l’une des balises suivantes : <code translate="no">excerpt</code> ou <code translate="no">break</code>.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-html hljs xml" translate="no">Introduction.
<span class="hljs-comment">&lt;!-- excerpt --&gt;</span>
Main content.</code></pre>
<p>Utilisez ensuite le filtre <a href="/fr/templates/reference/filters/#excerpt-html"><code translate="no">excerpt_html</code></a> dans votre template.</p>
<h2 id="notes">Notes</h2>
<p>Créez un bloc de <em>Note</em> (info, astuce, important, etc.).</p>
<p><em>Exemple :</em></p>
<pre><code class="language-markdown hljs markdown" translate="no">:::tip
<span class="hljs-strong">**Tip:**</span> This is advice.
:::</code></pre>
<p>Est converti en :</p>
<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>
  <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
    <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.
  <span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">aside</span>&gt;</span></code></pre>
<aside class="note note-tip"><p><strong>Tip:</strong> This is advice.</p></aside>
<p><em>Autres exemples :</em></p>
<aside class="note"><p>empty</p></aside>
<aside class="note note-info"><p>info</p></aside>
<aside class="note note-tip"><p>tip</p></aside>
<aside class="note note-important"><p>important</p></aside>
<aside class="note note-warning"><p>warning</p></aside>
<aside class="note note-caution"><p>caution</p></aside>
<h2 id="coloration-syntaxique">Coloration syntaxique</h2>
<p>La coloration syntaxique des blocs de code est activée par défaut avec l’option <a href="/fr/configuration/pages/#pages-body-highlight">pages.body.highlight</a>.</p>
<p>Si besoin, vous pouvez la désactiver avec :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">body:</span>
    <span class="hljs-attr">highlight:</span> <span class="hljs-literal">false</span></code></pre>
<p><em>Exemple :</em></p>
<pre>
```php
echo "Hello world";
```
</pre>
<p>Est rendu en :</p>
<pre><code class="language-php hljs php" translate="no"><span class="hljs-keyword">echo</span> <span class="hljs-string">"Hello world"</span>;</code></pre>
<aside class="note note-info"><p>Vous pouvez personnaliser le style de coloration syntaxique en créant votre propre thème. Consultez le <a href="https://highlightjs.readthedocs.io/en/latest/theme-guide.html" target="_blank" rel="noopener noreferrer">guide des thèmes de Highlight.js</a>.</p></aside>
<h2 id="texte-insere">Texte inséré</h2>
<p>Représente une plage de texte qui a été ajoutée.</p>
<pre><code class="language-markdown hljs markdown" translate="no">++text++</code></pre>
<p>Est converti en :</p>
<pre><code class="language-html hljs xml" translate="no"><span class="hljs-tag">&lt;<span class="hljs-name">ins</span>&gt;</span>text<span class="hljs-tag">&lt;/<span class="hljs-name">ins</span>&gt;</span></code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/deployer/hebergement-statique/</id>
    <title>Hébergement statique</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-02T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/deployer/hebergement-statique/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Hébergement statique</h1>
<h2 id="surge">Surge</h2>
<blockquote>
<p>Publier des projets web doit être rapide, simple et peu risqué. Surge est un service de publication de sites statiques pour les développeurs frontend, directement depuis la CLI.</p>
</blockquote>
<p>➡️ <a href="https://surge.sh" target="_blank" rel="noopener noreferrer">https://surge.sh</a></p>
<p>Terminal:</p>
<pre><code class="language-bash hljs bash" translate="no">npm install -g surge
surge _site/</code></pre>
<p><a href="https://surge.sh/help/" target="_blank" rel="noopener noreferrer">Documentation officielle</a></p>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/bien-demarrer/structure-des-dossiers/</id>
    <title>Structure des dossiers</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-03T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/bien-demarrer/structure-des-dossiers/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Structure des dossiers</h1>
<h2 id="arborescence-du-systeme-de-fichiers">Arborescence du système de fichiers</h2>
<p>Organisation des fichiers du projet.</p>
<pre><code class="language-plaintext hljs plaintext" translate="no">&lt;monsiteweb&gt;
├─ pages
|  ├─ blog            &lt;- Section
|  |  ├─ billet-1.md  &lt;- Page dans Section
|  |  └─ billet-2.md
|  ├─ projets
|  |  └─ projet-a.md
|  └─ about.md        &lt;- Page racine
├─ assets
|  ├─ styles.scss     &lt;- Fichier d'asset
|  └─ logo.png
├─ static
|  └─ fichier.pdf     &lt;- Fichier statique
└─ data
   └─ auteurs.yml     &lt;- Collection de données</code></pre>
<h2 id="arborescence-du-site-genere">Arborescence du site généré</h2>
<p>Résultat de la génération.</p>
<pre><code class="language-plaintext hljs plaintext" translate="no">&lt;monsiteweb&gt;
└─ _site
   ├─ index.html               &lt;- Page d'accueil générée
   ├─ blog/
   |  ├─ index.html            &lt;- Liste des articles générée
   |  ├─ billet-1/index.html   &lt;- Article de blog
   |  └─ billet-2/index.html
   ├─ projets/
   |  ├─ index.html            &lt;- Liste des projets générée
   |  └─ projet-a/index.html   &lt;- Projet individuel
   ├─ about/index.html         &lt;- Page "À propos"
   ├─ styles.css
   ├─ logo.png
   └─ fichier.pdf</code></pre>
<aside class="note note-info"><p>Par défaut, chaque page est générée sous la forme <code translate="no">nomdufichier-sluglifié/index.html</code> pour obtenir une « belle » URL comme <code translate="no">https://monsiteweb.tld/section/nomdufichier-sluglifié/</code>.</p>
<p>Pour obtenir une URL « ugly » (comme <code translate="no">404.html</code> au lieu de <code translate="no">404/</code>), définissez <code translate="no">uglyurl: true</code> dans le <a href="/fr/content/pages/#front-matter">front matter</a> de la page.</p></aside>
<h2 id="routage-base-sur-les-fichiers">Routage basé sur les fichiers</h2>
<p>Les fichiers Markdown du répertoire <code translate="no">pages</code> activent un routage basé sur les fichiers. Cela signifie que l’ajout, par exemple, de <code translate="no">pages/mon-projet/projet-a.md</code> le rendra accessible à l’URL <code translate="no">/projet-a</code> dans votre navigateur.</p>
<pre><code class="language-plaintext hljs plaintext" translate="no">Fichier :
                   pages/mon-projet/projet-a.md
                        └───── filepath ──────┘
URL :
    ┌───── baseurl ─────┬─────── path ────────┐
     https://exemple.com/mon-projet/projet-a/index.html
                        └─ section ─┴─ slug ──┘</code></pre>
<aside class="note note-important"><p>Deux types de préfixes peuvent modifier l’URL, voir la section <a href="/fr/content/pages/#prefixe-de-fichier">Préfixe de fichier</a> ci-dessous.</p></aside>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/commandes/build/</id>
    <title>build</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-02T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/commandes/build/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>build</h1>
<p>Construit le site.</p>
<pre><code class="language-plaintext hljs plaintext" translate="no">Description:
  Builds the website

Usage:
  build [options] [--] [&lt;path&gt;]

Arguments:
  path                               Use the given path as working directory

Options:
  -d, --drafts                       Include drafts
  -u, --baseurl=BASEURL              Set the base URL
  -o, --output=OUTPUT                Set the output directory
      --optimize|--no-optimize       Enable (or disable --no-optimize) optimization of generated files
      --dry-run                      Build without saving
  -c, --config=CONFIG                Set the path to extra config files (comma-separated)
      --clear-cache[=CLEAR-CACHE]    Clear cache before build (optional cache key as regular expression) [default: false]
  -p, --page=PAGE                    Build a specific page
      --render-subset=RENDER-SUBSET  Render a subset of pages
      --show-pages                   Show list of built pages in a table
  -m, --metrics                      Show build metrics (duration and memory) of each step
      --notify                       Send desktop notification on build completion
  -h, --help                         Display help for the given command. When no command is given display help for the list command
  -q, --quiet                        Do not output any message
  -V, --version                      Display this application version
      --ansi|--no-ansi               Force (or disable --no-ansi) ANSI output
  -n, --no-interaction               Do not ask any interactive question
  -v|vv|vvv, --verbose               Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Help:
  The build command generates the website in the output directory.

    cecil.phar build
    cecil.phar build path/to/the/working/directory
    cecil.phar build --baseurl=https://example.com/
    cecil.phar build --output=_site

  To build the website with optimization of generated files, you can use the --optimize option.
  This is useful to reduce the size of the generated files and improve performance:

    cecil.phar build --optimize
    cecil.phar build --no-optimize

  To build the website without overwriting files in the output directory, you can use the --dry-run option.
  This is useful to check what would be built without actually writing files:

    cecil.phar build --dry-run

  To build the website with a specific subset of rendered pages, you can use the --render-subset option.
  This is useful to build only a part of the website, for example, only "hot" pages or a specific section:

    cecil.phar build --render-subset=subset

  To show build steps metrics, run:

    cecil.phar build --metrics</code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/configuration/pages/</id>
    <title>Pages</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/configuration/pages/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Pages</h1>
<h2 id="pages-dir">pages.dir</h2>
<p>Répertoire source des pages (<code translate="no">pages</code> par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">dir:</span> <span class="hljs-string">pages</span></code></pre>
<h2 id="pages-ext">pages.ext</h2>
<p>Extensions des fichiers de pages.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">ext:</span> <span class="hljs-string">[md,</span> <span class="hljs-string">markdown,</span> <span class="hljs-string">mdown,</span> <span class="hljs-string">mkdn,</span> <span class="hljs-string">mkd,</span> <span class="hljs-string">text,</span> <span class="hljs-string">txt]</span></code></pre>
<h2 id="pages-exclude">pages.exclude</h2>
<p>Répertoires, chemins et noms de fichiers à exclure (accepte les glob, les chaînes et les expressions régulières).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">exclude:</span> <span class="hljs-string">['vendor',</span> <span class="hljs-string">'node_modules'</span><span class="hljs-string">,</span> <span class="hljs-string">'*.scss'</span><span class="hljs-string">,</span> <span class="hljs-string">'/\.bck$/'</span><span class="hljs-string">]</span></code></pre>
<h2 id="pages-prefix-separator">pages.prefix.separator</h2>
<p>Liste des caractères utilisés comme séparateur entre un préfixe de nom de fichier (<code translate="no">date</code> ou <code translate="no">weight</code>) et le slug.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">prefix:</span>
    <span class="hljs-attr">separator:</span> <span class="hljs-string">['-',</span> <span class="hljs-string">'_'</span><span class="hljs-string">]</span></code></pre>
<h2 id="pages-sortby">pages.sortby</h2>
<p>Méthode de tri par défaut des collections.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">sortby:</span> <span class="hljs-string">date</span> <span class="hljs-comment"># `date`, `updated`, `title` ou `weight`</span>
  <span class="hljs-comment"># ou</span>
  <span class="hljs-attr">sortby:</span>
    <span class="hljs-attr">variable:</span> <span class="hljs-string">date</span>    <span class="hljs-comment"># `date`, `updated`, `title` ou `weight`</span>
    <span class="hljs-attr">desc_title:</span> <span class="hljs-literal">false</span> <span class="hljs-comment"># tri par titre décroissant</span>
    <span class="hljs-attr">reverse:</span> <span class="hljs-literal">false</span>    <span class="hljs-comment"># inverse l’ordre de tri</span></code></pre>
<h2 id="pages-pagination">pages.pagination</h2>
<p>La pagination est disponible pour les pages de liste (<em>type</em> <code translate="no">homepage</code>, <code translate="no">section</code> ou <code translate="no">term</code>).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">pagination:</span>
    <span class="hljs-attr">max:</span> <span class="hljs-number">5</span>     <span class="hljs-comment"># nombre maximum d’entrées par page</span>
    <span class="hljs-attr">path:</span> <span class="hljs-string">page</span> <span class="hljs-comment"># chemin de la page paginée</span></code></pre>
<h3 id="desactiver-la-pagination">Désactiver la pagination</h3>
<p>La pagination peut être désactivée :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">pagination:</span> <span class="hljs-literal">false</span></code></pre>
<h2 id="pages-paths">pages.paths</h2>
<p>Applique un <a href="/fr/content/front-matter/#variables-predefinies"><code translate="no">path</code></a> personnalisé à toutes les pages d’une <strong><em>section</em></strong>.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">paths:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">section:</span> <span class="hljs-string">&lt;section’s</span> <span class="hljs-string">ID&gt;</span>
      <span class="hljs-attr">path:</span> <span class="hljs-string">&lt;path</span> <span class="hljs-string">of</span> <span class="hljs-string">pages&gt;</span></code></pre>
<h3 id="emplacements-des-variables-de-chemin">Emplacements des variables de chemin</h3>
<ul>
<li><code translate="no">:year</code></li>
<li><code translate="no">:month</code></li>
<li><code translate="no">:day</code></li>
<li><code translate="no">:section</code></li>
<li><code translate="no">:slug</code></li>
</ul>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">paths:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">section:</span> <span class="hljs-string">Blog</span>
      <span class="hljs-attr">path:</span> <span class="hljs-string">:section/:year/:month/:day/:slug</span> <span class="hljs-comment"># ex. : /blog/2020/12/01/my-post/</span>
<span class="hljs-comment"># localized</span>
<span class="hljs-attr">languages:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">code:</span> <span class="hljs-string">fr</span>
    <span class="hljs-attr">name:</span> <span class="hljs-string">Français</span>
    <span class="hljs-attr">locale:</span> <span class="hljs-string">fr_FR</span>
    <span class="hljs-attr">config:</span>
      <span class="hljs-attr">pages:</span>
        <span class="hljs-attr">paths:</span>
          <span class="hljs-bullet">-</span> <span class="hljs-attr">section:</span> <span class="hljs-string">Blog</span>
            <span class="hljs-attr">path:</span> <span class="hljs-string">blogue/:year/:month/:day/:slug</span> <span class="hljs-comment"># ex. : /blogue/2020/12/01/mon-billet/</span></code></pre>
<h2 id="pages-frontmatter">pages.frontmatter</h2>
<p>Format du front matter des pages (<code translate="no">yaml</code> par défaut, accepte aussi <code translate="no">ini</code>, <code translate="no">toml</code> et <code translate="no">json</code>).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">frontmatter:</span> <span class="hljs-string">yaml</span></code></pre>
<h2 id="pages-body">pages.body</h2>
<p>Options du corps des pages.</p>
<aside class="note note-info"><p>Pour savoir comment ces options influencent votre contenu, voir la documentation <em><a href="/fr/content/markdown/">Contenu &gt; Markdown</a></em>.</p></aside>
<h3 id="pages-body-toc">pages.body.toc</h3>
<p>En-têtes utilisés pour construire la table des matières (<code translate="no">[h2, h3]</code> par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">body:</span>
    <span class="hljs-attr">toc:</span> <span class="hljs-string">[h2,</span> <span class="hljs-string">h3]</span></code></pre>
<h3 id="pages-body-highlight">pages.body.highlight</h3>
<p>Active la coloration syntaxique du code (<code translate="no">true</code> par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">body:</span>
    <span class="hljs-attr">highlight:</span> <span class="hljs-literal">false</span> <span class="hljs-comment"># définissez à false pour désactiver la coloration syntaxique</span></code></pre>
<h3 id="pages-body-images">pages.body.images</h3>
<p>Options de gestion des images.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">body:</span>
    <span class="hljs-attr">images:</span>
      <span class="hljs-attr">formats:</span> <span class="hljs-string">[]</span>       <span class="hljs-comment"># ajoute des formats d’image alternatifs comme `source` (ex. `[avif, webp]`, tableau vide par défaut)</span>
      <span class="hljs-attr">resize:</span> <span class="hljs-number">0</span>         <span class="hljs-comment"># redimensionne toutes les images à &lt;width&gt; (en pixels, `0` pour désactiver)</span>
      <span class="hljs-attr">responsive:</span> <span class="hljs-literal">false</span> <span class="hljs-comment"># ajoute des variantes responsives à l’attribut `srcset` (`false` par défaut)</span>
      <span class="hljs-attr">lazy:</span> <span class="hljs-literal">true</span>        <span class="hljs-comment"># ajoute l’attribut `loading="lazy"` (`true` par défaut)</span>
      <span class="hljs-attr">decoding:</span> <span class="hljs-literal">true</span>    <span class="hljs-comment"># ajoute l’attribut `decoding="async"` (`true` par défaut)</span>
      <span class="hljs-attr">caption:</span> <span class="hljs-literal">false</span>    <span class="hljs-comment"># place l’image dans un élément &lt;figure&gt; et ajoute une &lt;figcaption&gt; contenant le titre (`false` par défaut)</span>
      <span class="hljs-attr">placeholder:</span> <span class="hljs-string">''</span>   <span class="hljs-comment"># remplit l’arrière-plan de &lt;img&gt; avant le chargement ('color' ou 'lqip', vide par défaut)</span>
      <span class="hljs-attr">class:</span> <span class="hljs-string">''</span>         <span class="hljs-comment"># définit une classe par défaut sur chaque image (vide par défaut)</span>
      <span class="hljs-attr">dark_suffix:</span> <span class="hljs-string">''</span>   <span class="hljs-comment"># suffixe de l’image variante sombre (ex. `.dark`), désactivé par défaut</span>
      <span class="hljs-attr">mobile_suffix:</span> <span class="hljs-string">''</span> <span class="hljs-comment"># suffixe de l’image variante mobile (ex. `.mobile`), désactivé par défaut</span>
      <span class="hljs-attr">mobile_media_query:</span> <span class="hljs-string">'(max-width: 767px)'</span> <span class="hljs-comment"># media query de la `&lt;source&gt;` de la variante mobile</span>
      <span class="hljs-attr">remote:</span>           <span class="hljs-comment"># traitement des images distantes (mettre à `false` pour désactiver)</span>
        <span class="hljs-attr">fallback:</span>         <span class="hljs-comment"># chemin de l’image de secours, stockée dans le répertoire assets (vide par défaut)</span></code></pre>
<aside class="note note-warning"><p>Depuis la version <ins>8.41.0</ins>, l’option <code translate="no">pages.body.images.resize</code> sert à redimensionner les images à une largeur précise, et non plus à activer la fonctionnalité de redimensionnement (activée systématiquement).</p></aside>
<aside class="note note-important"><p>Les options globales, comme les largeurs et tailles des images responsives, sont configurables dans la section <a href="/fr/documentation/assets/#assets-images"><code translate="no">assets.images</code></a>.</p></aside>
<aside class="note note-info"><p>Les images distantes sont téléchargées et converties en <em>Assets</em> pour être manipulées. Vous pouvez désactiver ce comportement en définissant l’option <code translate="no">pages.body.images.remote.enabled</code> à <code translate="no">false</code>.</p></aside>
<aside class="note note-tip"><p>Lorsque <code translate="no">dark_suffix</code> est défini (par ex. <code translate="no">dark_suffix: .dark</code>), Cecil cherche automatiquement une variante sombre de chaque image (par ex. <code translate="no">photo.dark.jpg</code> à côté de <code translate="no">photo.jpg</code>). Si elle est trouvée, l’image est entourée d’un élément <code translate="no">&lt;picture&gt;</code> avec une balise <code translate="no">&lt;source media="(prefers-color-scheme: dark)"&gt;</code> pour un basculement automatique clair/sombre. Cela fonctionne avec <code translate="no">formats</code> et <code translate="no">responsive</code>.</p>
<p>De la même manière, lorsque <code translate="no">mobile_suffix</code> est défini (par ex. <code translate="no">mobile_suffix: .mobile</code>), Cecil cherche une variante mobile de chaque image (par ex. <code translate="no">photo.mobile.jpg</code> à côté de <code translate="no">photo.jpg</code>) et ajoute une balise <code translate="no">&lt;source&gt;</code> avec la media query <code translate="no">mobile_media_query</code> (<code translate="no">(max-width: 767px)</code> par défaut). Si <code translate="no">dark_suffix</code> est également défini, la variante sombre de l’image mobile (par ex. <code translate="no">photo.mobile.dark.jpg</code>) est utilisée sur mobile en mode sombre. Les sources mobiles sont placées avant les sources sombres, afin que la variante mobile soit prioritaire.</p></aside>
<h3 id="pages-body-links">pages.body.links</h3>
<p>Options de gestion des liens.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">body:</span>
    <span class="hljs-attr">links:</span>
      <span class="hljs-attr">embed:</span>
        <span class="hljs-attr">enabled:</span> <span class="hljs-literal">false</span>     <span class="hljs-comment"># transforme les liens en contenu embarqué si possible (`false` par défaut)</span>
        <span class="hljs-attr">video:</span> <span class="hljs-string">[mp4,</span> <span class="hljs-string">webm]</span> <span class="hljs-comment"># extensions des fichiers vidéo</span>
        <span class="hljs-attr">audio:</span> <span class="hljs-string">[mp3]</span>       <span class="hljs-comment"># extensions des fichiers audio</span>
      <span class="hljs-attr">external:</span>
        <span class="hljs-attr">blank:</span> <span class="hljs-literal">false</span>     <span class="hljs-comment"># si `true`, ouvre le lien externe dans un nouvel onglet</span>
        <span class="hljs-attr">noopener:</span> <span class="hljs-literal">true</span>   <span class="hljs-comment"># si `true`, ajoute `noopener` à l’attribut `rel`</span>
        <span class="hljs-attr">noreferrer:</span> <span class="hljs-literal">true</span> <span class="hljs-comment"># si `true`, ajoute `noreferrer` à l’attribut `rel`</span>
        <span class="hljs-attr">nofollow:</span> <span class="hljs-literal">false</span>  <span class="hljs-comment"># si `true`, ajoute `nofollow` à l’attribut `rel`</span></code></pre>
<h3 id="pages-body-excerpt">pages.body.excerpt</h3>
<p>Options de gestion des extraits.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">body:</span>
    <span class="hljs-attr">excerpt:</span>
      <span class="hljs-attr">separator:</span> <span class="hljs-string">excerpt|break</span> <span class="hljs-comment"># chaîne utilisée comme séparateur (`excerpt|break` par défaut)</span>
      <span class="hljs-attr">capture:</span> <span class="hljs-string">before</span>          <span class="hljs-comment"># partie à capturer, `before` ou `after` le séparateur (`before` par défaut)</span></code></pre>
<h2 id="pages-virtual">pages.virtual</h2>
<p>Les pages virtuelles sont la meilleure façon de créer des pages sans contenu (<strong>front matter uniquement</strong>).</p>
<p>Elles consistent en une liste de pages avec un <code translate="no">path</code> et quelques variables de front matter.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">virtual:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">path:</span> <span class="hljs-string">code</span>
      <span class="hljs-attr">redirect:</span> <span class="hljs-string">https://github.com/ArnaudLigny</span></code></pre>
<h2 id="pages-default">pages.default</h2>
<p>Les pages par défaut sont des pages créées automatiquement par Cecil (à partir de modèles intégrés) :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">default:</span>
    <span class="hljs-attr">index:</span>
      <span class="hljs-attr">path:</span> <span class="hljs-string">''</span>
      <span class="hljs-attr">title:</span> <span class="hljs-string">Accueil</span>
      <span class="hljs-attr">published:</span> <span class="hljs-literal">true</span>
    <span class="hljs-attr">404:</span>
      <span class="hljs-attr">path:</span> <span class="hljs-number">404</span>
      <span class="hljs-attr">title:</span> <span class="hljs-string">Page</span> <span class="hljs-string">introuvable</span>
      <span class="hljs-attr">layout:</span> <span class="hljs-number">404</span>
      <span class="hljs-attr">uglyurl:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">published:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">excluded:</span> <span class="hljs-literal">true</span>
    <span class="hljs-attr">robots:</span>
      <span class="hljs-attr">path:</span> <span class="hljs-string">robots</span>
      <span class="hljs-attr">title:</span> <span class="hljs-string">Robots.txt</span>
      <span class="hljs-attr">layout:</span> <span class="hljs-string">robots</span>
      <span class="hljs-attr">output:</span> <span class="hljs-string">txt</span>
      <span class="hljs-attr">published:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">excluded:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">multilingual:</span> <span class="hljs-literal">false</span>
    <span class="hljs-attr">sitemap:</span>
      <span class="hljs-attr">path:</span> <span class="hljs-string">sitemap</span>
      <span class="hljs-attr">title:</span> <span class="hljs-string">Plan</span> <span class="hljs-string">de</span> <span class="hljs-string">site</span> <span class="hljs-string">XML</span>
      <span class="hljs-attr">layout:</span> <span class="hljs-string">sitemap</span>
      <span class="hljs-attr">output:</span> <span class="hljs-string">xml</span>
      <span class="hljs-attr">changefreq:</span> <span class="hljs-string">monthly</span>
      <span class="hljs-attr">priority:</span> <span class="hljs-number">0.5</span>
      <span class="hljs-attr">published:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">excluded:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">multilingual:</span> <span class="hljs-literal">false</span>
    <span class="hljs-attr">xsl/atom:</span>
      <span class="hljs-attr">path:</span> <span class="hljs-string">xsl/atom</span>
      <span class="hljs-attr">layout:</span> <span class="hljs-string">feed</span>
      <span class="hljs-attr">output:</span> <span class="hljs-string">xsl</span>
      <span class="hljs-attr">uglyurl:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">published:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">excluded:</span> <span class="hljs-literal">true</span>
    <span class="hljs-attr">xsl/rss:</span>
      <span class="hljs-attr">path:</span> <span class="hljs-string">xsl/rss</span>
      <span class="hljs-attr">layout:</span> <span class="hljs-string">feed</span>
      <span class="hljs-attr">output:</span> <span class="hljs-string">xsl</span>
      <span class="hljs-attr">uglyurl:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">published:</span> <span class="hljs-literal">false</span>
      <span class="hljs-attr">excluded:</span> <span class="hljs-literal">true</span></code></pre>
<aside class="note note-info"><p>La structure est presque identique à celle de <a href="#pages-virtual"><code translate="no">pages.virtual</code></a>, à l’exception de la clé nommée.</p></aside>
<p>Chaque page peut être :</p>
<ol>
<li>désactivée : <code translate="no">published: false</code></li>
<li>exclue des pages de liste : <code translate="no">excluded: true</code></li>
<li>exclue de la localisation : <code translate="no">multilingual: false</code></li>
</ol>
<aside class="note note-tip"><p>Depuis la version 8.68.0, vous pouvez surcharger la page <code translate="no">robots.txt</code> par défaut en créant une page avec le même <code translate="no">path</code> :</p>
<p><em>pages/robots.md</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">layout:</span> <span class="hljs-string">robots</span>
<span class="hljs-attr">output:</span> <span class="hljs-string">txt</span>
<span class="hljs-meta">---</span>
<span class="hljs-attr">User-agent:</span> <span class="hljs-string">AI-bot</span>
<span class="hljs-attr">Disallow:</span> <span class="hljs-string">/</span></code></pre></aside>
<h2 id="pages-generators">pages.generators</h2>
<p>Les générateurs servent à Cecil pour créer des pages supplémentaires (par ex. sitemap, flux, pagination, etc.) à partir de pages existantes, ou à partir d’autres sources comme le fichier de configuration ou des sources externes.</p>
<p>Voici la liste des générateurs fournis par Cecil, dans un ordre défini :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">generators:</span>
    <span class="hljs-attr">10:</span> <span class="hljs-string">'Cecil\Generator\DefaultPages'</span>
    <span class="hljs-attr">20:</span> <span class="hljs-string">'Cecil\Generator\VirtualPages'</span>
    <span class="hljs-attr">30:</span> <span class="hljs-string">'Cecil\Generator\ExternalBody'</span>
    <span class="hljs-attr">40:</span> <span class="hljs-string">'Cecil\Generator\Section'</span>
    <span class="hljs-attr">50:</span> <span class="hljs-string">'Cecil\Generator\Taxonomy'</span>
    <span class="hljs-attr">60:</span> <span class="hljs-string">'Cecil\Generator\Homepage'</span>
    <span class="hljs-attr">70:</span> <span class="hljs-string">'Cecil\Generator\Pagination'</span>
    <span class="hljs-attr">80:</span> <span class="hljs-string">'Cecil\Generator\Alias'</span>
    <span class="hljs-attr">90:</span> <span class="hljs-string">'Cecil\Generator\Redirect'</span></code></pre>
<aside class="note note-tip"><p>Vous pouvez étendre Cecil avec un <a href="/fr/developers/extend/#generateur-de-pages">générateur de pages</a>.</p></aside>
<h2 id="pages-subsets">pages.subsets</h2>
<p>Les sous-ensembles servent à rendre une partie de la collection de pages, selon un chemin, une langue ou un format de sortie spécifique, avec la commande :</p>
<pre><code class="language-bash hljs bash" translate="no">cecil build --render-subset=&lt;name&gt;</code></pre>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">subsets:</span>
    <span class="hljs-string">&lt;name&gt;:</span>
      <span class="hljs-attr">path:</span> <span class="hljs-string">&lt;path&gt;</span> <span class="hljs-comment"># chemin glob ou chaîne (ex. `blog/*`, `blog`)</span>
      <span class="hljs-attr">language:</span> <span class="hljs-string">&lt;language&gt;</span> <span class="hljs-comment"># code de langue (ex. `en`, `fr`)</span>
      <span class="hljs-attr">output:</span> <span class="hljs-string">&lt;output&gt;</span> <span class="hljs-comment"># format de sortie (ex. `html`, `atom`)</span></code></pre>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">pages:</span>
  <span class="hljs-attr">subsets:</span>
    <span class="hljs-attr">blog_en:</span>
      <span class="hljs-attr">path:</span> <span class="hljs-string">blog</span>
      <span class="hljs-attr">language:</span> <span class="hljs-string">en</span>
      <span class="hljs-attr">output:</span> <span class="hljs-string">html</span>
    <span class="hljs-attr">search_index:</span>
      <span class="hljs-attr">path:</span> <span class="hljs-string">'*'</span>
      <span class="hljs-attr">output:</span> <span class="hljs-string">json</span></code></pre>
<hr>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/contenu/multilingue/</id>
    <title>Multilingue</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-03T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/contenu/multilingue/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Multilingue</h1>
<p>Si vos pages sont disponibles en plusieurs <a href="/fr/configuration/languages/#languages">langues</a>, il existe 2 façons différentes de le définir :</p>
<h2 id="via-le-nom-de-fichier">Via le nom de fichier</h2>
<p>C’est la méthode la plus courante pour traduire une page depuis la <a href="/fr/configuration/languages/#language">langue</a> principale vers une autre langue.</p>
<p>Il suffit de dupliquer la page de référence et de lui ajouter en suffixe le <code translate="no">code</code> de la langue cible (ex. : <code translate="no">fr</code>).</p>
<p><em>Exemple :</em></p>
<pre><code class="language-plaintext hljs plaintext" translate="no">├─ about.md    # the reference page
└─ about.fr.md # the french version (`fr`)</code></pre>
<aside class="note note-tip"><p>Vous pouvez changer l’URL de la page traduite avec la variable <code translate="no">slug</code> dans le front matter. Par exemple :</p>
<pre><code class="language-yml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">slug:</span> <span class="hljs-string">a-propos</span>
<span class="hljs-meta">---</span>
<span class="hljs-comment"># about.md    -&gt; /about/</span>
<span class="hljs-comment"># about.fr.md -&gt; /fr/a-propos/</span></code></pre></aside>
<h2 id="via-le-front-matter">Via le front matter</h2>
<p>Si vous souhaitez créer une page dans une langue autre que la langue principale, sans qu’elle soit la traduction d’une page existante, vous pouvez utiliser la variable <code translate="no">language</code> dans son front matter.</p>
<p><em>Exemple :</em></p>
<pre><code class="language-yml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">language:</span> <span class="hljs-string">fr</span>
<span class="hljs-meta">---</span></code></pre>
<h2 id="lier-les-pages-traduites">Lier les pages traduites</h2>
<p>Chaque page traduite référence les pages dans les autres langues.</p>
<p>Cette collection de pages est disponible dans les <a href="/fr/templates/variables/#page">templates</a> via la variable suivante :</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ page.translations }}</span></code></pre>
<aside class="note note-info"><p>La variable <code translate="no">langref</code> est fournie par défaut, mais vous pouvez la modifier dans le front matter :</p>
<pre><code class="language-yml hljs yaml" translate="no"><span class="hljs-meta">---</span>
<span class="hljs-attr">langref:</span> <span class="hljs-string">my-page-ref</span>
<span class="hljs-meta">---</span></code></pre></aside>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/commandes/doctor/</id>
    <title>doctor</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-02T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/commandes/doctor/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>doctor</h1>
<p>Diagnostique le site courant et l'environnement Cecil.</p>
<pre><code class="language-plaintext hljs plaintext" translate="no">Description:
  Diagnoses the site configuration

Usage:
  doctor [options] [--] [&lt;path&gt;]

Arguments:
  path                       Use the given path as working directory

Options:
  -c, --config=CONFIG        Set the path to an extra configuration file
  -h, --help                 Display help for the given command. When no command is given display help for the list command
  -q, --quiet                Do not output any message
  -V, --version              Display this application version
      --ansi|--no-ansi       Force (or disable --no-ansi) ANSI output
  -n, --no-interaction       Do not ask any interactive question
  -v|vv|vvv, --verbose       Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Help:
  The doctor command diagnoses the current site and Cecil environment.

    cecil.phar doctor
    cecil.phar doctor path/to/the/working/directory

  To inspect a site with an extra configuration file, run:

    cecil.phar doctor --config=config.yml</code></pre>
<h2 id="doctor-frontmatter">doctor:frontmatter</h2>
<p>Valide la syntaxe du front matter des pages.</p>
<pre><code class="language-plaintext hljs plaintext" translate="no">Description:
  Validates pages front matter syntax

Usage:
  doctor:frontmatter|doctor:fm [options] [--] [&lt;path&gt;]

Arguments:
  path                  Use the given path as working directory

Options:
  -c, --config=CONFIG   Set the path to an extra configuration file
  -p, --page=PAGE       Validate a single page relative to the pages directory
      --ansi|--no-ansi  Force (or disable --no-ansi) ANSI output
  -n, --no-interaction  Do not ask any interactive question
  -h, --help            Display help for the given command. When no command is given display help for the list command
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
  -v|vv|vvv             Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug</code></pre>
<h2 id="doctor-seo">doctor:seo</h2>
<p>Audite les pages HTML rendues pour détecter les problèmes SEO courants.</p>
<pre><code class="language-plaintext hljs plaintext" translate="no">Description:
  Audits rendered HTML pages for common SEO issues

Usage:
  doctor:seo [options] [--] [&lt;path&gt;]

Arguments:
  path                  Use the given path as working directory

Options:
  -c, --config=CONFIG   Set the path to an extra configuration file
  -p, --page=PAGE       Audit a single page relative to the pages directory
      --format=FORMAT   Output format: text (default) or json
      --feedback        Include findings with feedback level
      --include-virtual Include virtual pages (paginated, taxonomies) in audit</code></pre>
<p>La commande construit le site en mode dry-run, puis audite le HTML rendu avec un jeu de contrôles ciblés : balise title, meta description, URL canonique, structure des titres, balises Open Graph, attributs alt des images et longueur estimée du contenu.</p>
<p>Par défaut, les pages virtuelles (paginées, pages de taxonomie) sont exclues de l'audit. Utilisez <code translate="no">--include-virtual</code> pour les inclure.</p>
<p>Par défaut, les findings de niveau <code translate="no">feedback</code> ne sont pas listés.</p>
<p>Utilisez <code translate="no">--feedback</code> pour inclure les findings de niveau <code translate="no">feedback</code> en plus des autres findings.</p>
<p>Exportez les résultats en JSON pour l'intégration CI en utilisant <code translate="no">--format=json</code>.</p>
<h3 id="configuration">Configuration</h3>
<p>Personnalisez les seuils d'audit et les contrôles activés dans votre fichier de configuration :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">doctor:</span>
  <span class="hljs-attr">seo:</span>
    <span class="hljs-attr">title:</span> <span class="hljs-string">{</span> <span class="hljs-attr">min:</span> <span class="hljs-number">30</span><span class="hljs-string">,</span> <span class="hljs-attr">max:</span> <span class="hljs-number">60</span> <span class="hljs-string">}</span>
    <span class="hljs-attr">description:</span> <span class="hljs-string">{</span> <span class="hljs-attr">min:</span> <span class="hljs-number">120</span><span class="hljs-string">,</span> <span class="hljs-attr">max:</span> <span class="hljs-number">160</span> <span class="hljs-string">}</span>
    <span class="hljs-attr">content:</span> <span class="hljs-string">{</span> <span class="hljs-attr">min_words:</span> <span class="hljs-number">300</span> <span class="hljs-string">}</span>
    <span class="hljs-attr">checks:</span>
      <span class="hljs-attr">title:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">description:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">canonical:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">h1:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">og_tags:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">img_alt:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">content_length:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">lang_attribute:</span> <span class="hljs-literal">true</span></code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/configuration/donnees-et-statiques/</id>
    <title>Données et fichiers statiques</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/configuration/donnees-et-statiques/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Données et fichiers statiques</h1>
<h2 id="donnees">Données</h2>
<p>Emplacement des fichiers de données et types d’extensions pris en charge.</p>
<p>Formats pris en charge : YAML, JSON, XML et CSV.</p>
<h3 id="data-dir">data.dir</h3>
<p>Répertoire source des données (<code translate="no">data</code> par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">data:</span>
  <span class="hljs-attr">dir:</span> <span class="hljs-string">data</span></code></pre>
<h3 id="data-ext">data.ext</h3>
<p>Tableau des extensions de fichiers.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">data:</span>
  <span class="hljs-attr">ext:</span> <span class="hljs-string">[yaml,</span> <span class="hljs-string">yml,</span> <span class="hljs-string">json,</span> <span class="hljs-string">xml,</span> <span class="hljs-string">csv]</span></code></pre>
<h3 id="data-load">data.load</h3>
<p>Active la collection <code translate="no">site.data</code> (<code translate="no">true</code> par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">data:</span>
  <span class="hljs-attr">load:</span> <span class="hljs-literal">true</span></code></pre>
<hr>
<h2 id="fichiers-statiques">Fichiers statiques</h2>
<p>Gestion des fichiers statiques copiés (PDF, polices, etc.).</p>
<aside class="note note-important"><p>Vous devez placer les fichiers d’assets, utilisés par <a href="/fr/assets/#asset"><code translate="no">asset()</code></a>, dans le <a href="/fr/documentation/assets/#assets-dir"><code translate="no">répertoire assets</code></a> afin d’éviter des copies de fichiers inutiles.</p></aside>
<h3 id="static-dir">static.dir</h3>
<p>Répertoire source des fichiers statiques (<code translate="no">static</code> par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">static:</span>
  <span class="hljs-attr">dir:</span> <span class="hljs-string">static</span></code></pre>
<h3 id="static-target">static.target</h3>
<p>Répertoire vers lequel les fichiers statiques sont copiés (<code translate="no">root</code> par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">static:</span>
  <span class="hljs-attr">target:</span> <span class="hljs-string">''</span></code></pre>
<h3 id="static-exclude">static.exclude</h3>
<p>Liste des fichiers exclus. Accepte les glob, les chaînes et les expressions régulières.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">static:</span>
  <span class="hljs-attr">exclude:</span> <span class="hljs-string">['sass',</span> <span class="hljs-string">'scss'</span><span class="hljs-string">,</span> <span class="hljs-string">'*.scss'</span><span class="hljs-string">,</span> <span class="hljs-string">'package*.json'</span><span class="hljs-string">,</span> <span class="hljs-string">'node_modules'</span><span class="hljs-string">]</span></code></pre>
<aside class="note note-tip"><p>Si vous utilisez <a href="https://icons.getbootstrap.com" target="_blank" rel="noopener noreferrer">Bootstrap Icons</a>, vous pouvez exclure <code translate="no">node_modules</code> sauf <code translate="no">node_modules/bootstrap-icons</code> avec une expression régulière :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">exclude:</span> <span class="hljs-string">['sass',</span> <span class="hljs-string">'scss'</span><span class="hljs-string">,</span> <span class="hljs-string">'*.scss'</span><span class="hljs-string">,</span> <span class="hljs-string">'package*.json'</span><span class="hljs-string">,</span> <span class="hljs-string">'#node_modules/(?!bootstrap-icons)#'</span><span class="hljs-string">]</span></code></pre></aside>
<h3 id="static-load">static.load</h3>
<p>Active la collection <code translate="no">site.static</code> (<code translate="no">false</code> par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">static:</span>
  <span class="hljs-attr">load:</span> <span class="hljs-literal">false</span></code></pre>
<h3 id="static-mounts">static.mounts</h3>
<p>Permet de copier des fichiers ou répertoires spécifiques vers une destination spécifique.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">static:</span>
  <span class="hljs-attr">mounts:</span> <span class="hljs-string">[]</span></code></pre>
<h3 id="exemple-de-static">exemple de static</h3>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">static:</span>
  <span class="hljs-attr">dir:</span> <span class="hljs-string">docs</span>
  <span class="hljs-attr">target:</span> <span class="hljs-string">docs</span>
  <span class="hljs-attr">exclude:</span> <span class="hljs-string">['sass',</span> <span class="hljs-string">'*.scss'</span><span class="hljs-string">,</span> <span class="hljs-string">'/\.bck$/'</span><span class="hljs-string">]</span>
  <span class="hljs-attr">load:</span> <span class="hljs-literal">true</span>
  <span class="hljs-attr">mounts:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">source/path/file.ext:</span> <span class="hljs-string">dest/path/file.ext</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">node_modules/bootstrap-icons/font/fonts:</span> <span class="hljs-string">fonts</span></code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/contenu/contenu-dynamique/</id>
    <title>Contenu dynamique</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-03T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/contenu/contenu-dynamique/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Contenu dynamique</h1>
<p>Vous pouvez créer du contenu dynamique dans une page en utilisant la fonction Twig <a href="https://twig.symfony.com/doc/3.x/functions/template_from_string.html" target="_blank" rel="noopener noreferrer"><code translate="no">template_from_string</code></a>.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="hljs-template-variable">{{ <span class="hljs-name">include</span><span class="hljs-params">(template_from_string(page.content, "contenu dynamique pour la page " ~ page.id)</span>) }}</span></code></pre>
<p>Avec cette approche, vous pouvez utiliser n’importe quelle variable de page dans le <em>body</em> de la page.</p>
<pre><code class="language-twig hljs twig" translate="no"><span class="xml">--
var: 'value'
---
La valeur de `var` est </span><span class="hljs-template-variable">{{ page.var }}</span><span class="xml">.</span></code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/configuration/assets/</id>
    <title>Assets</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/configuration/assets/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Assets</h1>
<p>Gestion des ressources (images, fichiers CSS et JS).</p>
<h2 id="assets-dir">assets.dir</h2>
<p>Répertoire source des ressources (<code translate="no">assets</code> par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">assets:</span>
  <span class="hljs-attr">dir:</span> <span class="hljs-string">assets</span></code></pre>
<h2 id="assets-target">assets.target</h2>
<p>Répertoire où les fichiers de ressources distants et redimensionnés sont enregistrés (<code translate="no">root</code> par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">assets:</span>
  <span class="hljs-attr">target:</span> <span class="hljs-string">''</span></code></pre>
<h2 id="assets-fingerprint">assets.fingerprint</h2>
<p>Active le fingerprinting (cache busting) pour les fichiers de ressources (<code translate="no">true</code> par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">assets:</span>
  <span class="hljs-attr">fingerprint:</span> <span class="hljs-literal">true</span></code></pre>
<h2 id="assets-compile">assets.compile</h2>
<p>Active la compilation des fichiers <a href="https://sass-lang.com" target="_blank" rel="noopener noreferrer">Sass</a> (<code translate="no">true</code> par défaut). Voir la <a href="https://scssphp.github.io/scssphp/docs/#output-formatting" target="_blank" rel="noopener noreferrer">documentation de scssphp</a> pour les détails des options.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">assets:</span>
  <span class="hljs-attr">compile:</span>
    <span class="hljs-attr">style:</span> <span class="hljs-string">expanded</span>      <span class="hljs-comment"># style de compilation (`expanded` ou `compressed`, `expanded` par défaut)</span>
    <span class="hljs-attr">import:</span> <span class="hljs-string">[sass,</span> <span class="hljs-string">scss]</span> <span class="hljs-comment"># liste des chemins importés (`[sass, scss, node_modules]` par défaut)</span>
    <span class="hljs-attr">sourcemap:</span> <span class="hljs-literal">false</span>     <span class="hljs-comment"># active les sourcemaps en mode debug (`false` par défaut)</span>
    <span class="hljs-attr">variables:</span> <span class="hljs-string">[]</span>        <span class="hljs-comment"># liste de variables préconfigurées (vide par défaut)</span></code></pre>
<aside class="note note-info"><p><code translate="no">sourcemap</code> sert à déboguer la compilation SCSS (<a href="/fr/documentation/site/#debug">mode debug</a> requis).</p></aside>
<h2 id="assets-minify">assets.minify</h2>
<p>Active la minification CSS et JS (<code translate="no">true</code> par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">assets:</span>
  <span class="hljs-attr">minify:</span> <span class="hljs-literal">true</span></code></pre>
<h2 id="assets-images">assets.images</h2>
<p>Gestion des images.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">assets:</span>
  <span class="hljs-attr">images:</span>
    <span class="hljs-attr">optimize:</span> <span class="hljs-literal">false</span> <span class="hljs-comment"># active l’optimisation d’images avec JpegOptim, Optipng, Pngquant 2, SVGO 1, Gifsicle, cwebp, avifenc (`false` par défaut)</span>
    <span class="hljs-attr">quality:</span> <span class="hljs-number">75</span>     <span class="hljs-comment"># qualité d’image pour `optimize` et `resize` (`75` par défaut)</span>
    <span class="hljs-attr">responsive:</span>
      <span class="hljs-attr">widths:</span> <span class="hljs-string">[480,</span> <span class="hljs-number">640</span><span class="hljs-string">,</span> <span class="hljs-number">768</span><span class="hljs-string">,</span> <span class="hljs-number">1024</span><span class="hljs-string">,</span> <span class="hljs-number">1366</span><span class="hljs-string">,</span> <span class="hljs-number">1600</span><span class="hljs-string">,</span> <span class="hljs-number">1920</span><span class="hljs-string">]</span> <span class="hljs-comment"># largeurs d’image pour l’attribut `srcset`</span>
      <span class="hljs-attr">sizes:</span>
        <span class="hljs-attr">default:</span> <span class="hljs-string">'100vw'</span> <span class="hljs-comment"># attribut `sizes` par défaut (`100vw` par défaut)</span></code></pre>
<h2 id="assets-images-cdn">assets.images.cdn</h2>
<p>L’URL des ressources image peut être facilement remplacée par une <code translate="no">url</code> de CDN fournie.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">assets:</span>
  <span class="hljs-attr">images:</span>
    <span class="hljs-attr">cdn:</span>
      <span class="hljs-attr">enabled:</span> <span class="hljs-literal">false</span>  <span class="hljs-comment"># active Image CDN (`false` par défaut)</span>
      <span class="hljs-attr">canonical:</span> <span class="hljs-literal">true</span> <span class="hljs-comment"># `image_url` est canonique (au lieu d’un chemin relatif) (`true` par défaut)</span>
      <span class="hljs-attr">remote:</span> <span class="hljs-literal">true</span>    <span class="hljs-comment"># prend aussi en charge les images non locales (`true` par défaut)</span>
      <span class="hljs-attr">account:</span> <span class="hljs-string">'xxxx'</span> <span class="hljs-comment"># compte du fournisseur</span>
      <span class="hljs-attr">url:</span> <span class="hljs-string">'https://provider.tld/%account%/%image_url%?w=%width%&amp;q=%quality%&amp;format=%format%'</span></code></pre>
<p><code translate="no">url</code> est un modèle qui contient des variables :</p>
<ul>
<li><code translate="no">%account%</code> remplacé par l’option <code translate="no">assets.images.cdn.account</code></li>
<li><code translate="no">%image_url%</code> remplacé par l’URL canonique de l’image ou par <code translate="no">path</code></li>
<li><code translate="no">%width%</code> remplacé par la largeur de l’image</li>
<li><code translate="no">%quality%</code> remplacé par l’option <code translate="no">assets.images.quality</code></li>
<li><code translate="no">%format%</code> remplacé par le format de l’image</li>
</ul>
<p>Voir les <a href="/fr/assets/cdn-providers/"><strong>fournisseurs CDN</strong></a>.</p>
<h2 id="assets-remote-useragent">assets.remote.useragent</h2>
<p>User agent utilisé pour télécharger les ressources distantes.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">assets:</span>
  <span class="hljs-attr">remote:</span>
    <span class="hljs-attr">useragent:</span>
      <span class="hljs-attr">default:</span> <span class="hljs-string">&lt;string&gt;</span> <span class="hljs-comment"># user agent par défaut</span>
      <span class="hljs-attr">useragent1:</span> <span class="hljs-string">&lt;string&gt;</span>
      <span class="hljs-attr">useragent2:</span> <span class="hljs-string">&lt;string&gt;</span></code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/configuration/layouts/</id>
    <title>Layouts</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/configuration/layouts/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Layouts</h1>
<p>Options des templates.</p>
<h2 id="layouts-dir">layouts.dir</h2>
<p>Répertoire source des templates (<code translate="no">layouts</code> par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">layouts:</span>
  <span class="hljs-attr">dir:</span> <span class="hljs-string">layouts</span></code></pre>
<h2 id="layouts-autoescape">layouts.autoescape</h2>
<p>Surcharge l’option Twig <code translate="no">autoescape</code> (<code translate="no">false</code> par défaut).</p>
<p>Si la valeur est <code translate="no">null</code>, Cecil applique une stratégie basée sur l’extension du nom de template :</p>
<ul>
<li><code translate="no">*.js.twig</code> -&gt; <code translate="no">js</code></li>
<li><code translate="no">*.css.twig</code> -&gt; <code translate="no">css</code></li>
<li><code translate="no">*.html.twig</code> et <code translate="no">*.twig</code> -&gt; <code translate="no">html</code></li>
<li>toute autre extension -&gt; <code translate="no">false</code></li>
</ul>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">layouts:</span>
  <span class="hljs-attr">autoescape:</span> <span class="hljs-literal">false</span>  <span class="hljs-comment"># désactive l’échappement automatique (par défaut)</span>
  <span class="hljs-comment">#autoescape: null  # utilise la stratégie automatique Cecil selon l’extension du template</span>
  <span class="hljs-comment">#autoescape: html</span>
  <span class="hljs-comment">#autoescape: js</span></code></pre>
<h2 id="layouts-images">layouts.images</h2>
<p>Options de gestion des images.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">layouts:</span>
  <span class="hljs-attr">images:</span>
    <span class="hljs-attr">formats:</span> <span class="hljs-string">[]</span>       <span class="hljs-comment"># utilisé par la fonction `html` : ajoute des formats d’image alternatifs comme `source` (ex. `[avif, webp]`, tableau vide par défaut)</span>
    <span class="hljs-attr">responsive:</span> <span class="hljs-literal">false</span> <span class="hljs-comment"># utilisé par la fonction `html` : ajoute des images responsives ('width' ou 'density', `false` par défaut)</span>
    <span class="hljs-attr">placeholder:</span> <span class="hljs-string">''</span>   <span class="hljs-comment"># utilisé par la fonction `html` : remplit l’arrière-plan de l’image avant son chargement (`color` ou `lqip`, désactivé par défaut)</span>
    <span class="hljs-attr">dark_suffix:</span> <span class="hljs-string">''</span>   <span class="hljs-comment"># suffixe de l’image variante sombre (ex. `.dark`), désactivé par défaut</span>
    <span class="hljs-attr">mobile_suffix:</span> <span class="hljs-string">''</span> <span class="hljs-comment"># suffixe de l’image variante mobile (ex. `.mobile`), désactivé par défaut</span>
    <span class="hljs-attr">mobile_media_query:</span> <span class="hljs-string">'(max-width: 767px)'</span> <span class="hljs-comment"># media query de la `&lt;source&gt;` de la variante mobile</span></code></pre>
<h2 id="layouts-translations">layouts.translations</h2>
<p>Options de gestion des traductions.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">layouts:</span>
  <span class="hljs-attr">translations:</span>
    <span class="hljs-attr">dir:</span> <span class="hljs-string">translations</span> <span class="hljs-comment"># répertoire source des traductions (`translations` par défaut)</span>
    <span class="hljs-attr">formats:</span>          <span class="hljs-comment"># formats de traduction pris en charge</span>
      <span class="hljs-attr">yaml:</span>
        <span class="hljs-attr">loader:</span> <span class="hljs-string">Symfony\Component\Translation\Loader\YamlFileLoader</span>
        <span class="hljs-attr">ext:</span> <span class="hljs-string">[yml,</span> <span class="hljs-string">yaml]</span>
      <span class="hljs-attr">mo:</span>
        <span class="hljs-attr">loader:</span> <span class="hljs-string">Symfony\Component\Translation\Loader\MoFileLoader</span>
        <span class="hljs-attr">ext:</span> <span class="hljs-string">[mo]</span></code></pre>
<p>Chaque format de traduction définit :</p>
<ul>
<li><code translate="no">loader</code> : classe du chargeur de traduction Symfony</li>
<li><code translate="no">ext</code> : une ou plusieurs extensions de fichier associées à ce format</li>
</ul>
<h2 id="layouts-components">layouts.components</h2>
<p>Options des <a href="/fr/templates/components/">composants de template</a>.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">layouts:</span>
  <span class="hljs-attr">components:</span>
    <span class="hljs-attr">dir:</span> <span class="hljs-string">components</span> <span class="hljs-comment"># répertoire source des composants (`components` par défaut)</span>
    <span class="hljs-attr">ext:</span> <span class="hljs-string">twig</span>       <span class="hljs-comment"># extension des fichiers de composants (`twig` par défaut)</span></code></pre>
<h2 id="layouts-sections">layouts.sections</h2>
<p>Associe une section aux layouts d’une autre section : le nom associé est utilisé à la place de <code translate="no">&lt;section&gt;</code> par les <a href="/fr/templates/lookup-rules/#regles-de-recherche">règles de recherche</a> de la section et de ses pages.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">layouts:</span>
  <span class="hljs-attr">sections:</span>
    <span class="hljs-attr">news:</span> <span class="hljs-string">blog</span> <span class="hljs-comment"># la section « news » est rendue avec `blog/list.html.twig` et ses pages avec `blog/page.html.twig`</span></code></pre>
<aside class="note note-tip"><p>Une <a href="/fr/content/pages/#sous-section">sous-section</a> se replie déjà sur les layouts de ses sections parentes : aucune association n’est nécessaire pour cela.</p></aside>
<hr>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/configuration/sortie/</id>
    <title>Sortie</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/configuration/sortie/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Sortie</h1>
<p>Définit où et dans quel format les pages sont rendues.</p>
<h2 id="output-dir">output.dir</h2>
<p>Répertoire où les fichiers de pages rendues sont enregistrés (<code translate="no">_site</code> par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">output:</span>
  <span class="hljs-attr">dir:</span> <span class="hljs-string">_site</span></code></pre>
<h2 id="output-formats">output.formats</h2>
<p>Liste de définition des formats de sortie, utilisés pour rendre les pages (par ex. HTML, Atom, RSS, JSON, XML, etc.).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">output:</span>
  <span class="hljs-attr">formats:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">&lt;name&gt;</span>            <span class="hljs-comment"># nom du format, par ex. `html` (requis)</span>
      <span class="hljs-attr">mediatype:</span> <span class="hljs-string">&lt;media</span> <span class="hljs-string">type&gt;</span> <span class="hljs-comment"># type MIME, ex. `text/html` (facultatif)</span>
      <span class="hljs-attr">subpath:</span> <span class="hljs-string">&lt;sub</span> <span class="hljs-string">path&gt;</span>     <span class="hljs-comment"># sous-chemin, ex. `amp` dans `path/amp/index.html` (facultatif)</span>
      <span class="hljs-attr">filename:</span> <span class="hljs-string">&lt;file</span> <span class="hljs-string">name&gt;</span>   <span class="hljs-comment"># nom du fichier, ex. `index` dans `path/index.html` (facultatif)</span>
      <span class="hljs-attr">extension:</span> <span class="hljs-string">&lt;extension&gt;</span>  <span class="hljs-comment"># extension du fichier, ex. `html` dans `path/index.html` (requis)</span>
      <span class="hljs-attr">exclude:</span> <span class="hljs-string">[&lt;variable&gt;]</span>   <span class="hljs-comment"># n’applique pas ce format aux pages identifiées par les variables listées, ex. `[redirect, paginated]` (facultatif)</span></code></pre>
<p>Ces formats sont utilisés dans la configuration <a href="#output-pagetypeformats"><code translate="no">output.pagetypeformats</code></a> et dans la variable de page <a href="/fr/content/front-matter/#output"><code translate="no">output</code></a>.</p>
<h3 id="formats-par-defaut">Formats par défaut</h3>
<p>Cecil fournit quelques <a href="https://github.com/Cecilapp/Cecil/blob/main/config/base.php#L81-L162" target="_blank" rel="noopener noreferrer">formats par défaut</a>, qui peuvent être surchargés dans le fichier de configuration : <code translate="no">html</code> (par défaut), <code translate="no">atom</code>, <code translate="no">rss</code>, <code translate="no">json</code>, <code translate="no">xml</code>, <code translate="no">txt</code>, <code translate="no">amp</code>, <code translate="no">js</code>, <code translate="no">webmanifest</code>, <code translate="no">xsl</code>, <code translate="no">jsonfeed</code>, <code translate="no">iframe</code>, <code translate="no">oembed</code>.</p>
<h2 id="output-pagetypeformats">output.pagetypeformats</h2>
<p>Il n’est pas nécessaire de définir la variable <code translate="no">output</code> pour chaque page, car Cecil applique automatiquement les formats définis pour chaque type de page (<code translate="no">homepage</code>, <code translate="no">page</code>, <code translate="no">section</code>, <code translate="no">vocabulary</code> et <code translate="no">term</code>).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">output:</span>
  <span class="hljs-attr">pagetypeformats:</span>
    <span class="hljs-attr">page:</span> <span class="hljs-string">[&lt;format&gt;]</span>
    <span class="hljs-attr">homepage:</span> <span class="hljs-string">[&lt;format&gt;]</span>
    <span class="hljs-attr">section:</span> <span class="hljs-string">[&lt;format&gt;]</span>
    <span class="hljs-attr">vocabulary:</span> <span class="hljs-string">[&lt;format&gt;]</span>
    <span class="hljs-attr">term:</span> <span class="hljs-string">[&lt;format&gt;]</span></code></pre>
<p>Plusieurs formats peuvent être définis pour un même type de page. Par exemple, le type de page <code translate="no">section</code> peut être rendu automatiquement en HTML et Atom :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">output:</span>
  <span class="hljs-attr">pagetypeformats:</span>
    <span class="hljs-attr">section:</span> <span class="hljs-string">[html,</span> <span class="hljs-string">atom]</span></code></pre>
<aside class="note note-info"><p>Pour rendre une page, <a href="/fr/templates/lookup-rules/#regles-de-recherche">Cecil recherche un template</a> nommé <code translate="no">&lt;layout&gt;.&lt;format&gt;.twig</code> (ex. <code translate="no">page.html.twig</code>).</p></aside>
<h2 id="exemple-de-output">exemple de output</h2>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">output:</span>
  <span class="hljs-attr">dir:</span> <span class="hljs-string">_site</span>
  <span class="hljs-attr">formats:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">html</span>
      <span class="hljs-attr">mediatype:</span> <span class="hljs-string">text/html</span>
      <span class="hljs-attr">filename:</span> <span class="hljs-string">index</span>
      <span class="hljs-attr">extension:</span> <span class="hljs-string">html</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">atom</span>
      <span class="hljs-attr">mediatype:</span> <span class="hljs-string">application/xml</span>
      <span class="hljs-attr">filename:</span> <span class="hljs-string">atom</span>
      <span class="hljs-attr">extension:</span> <span class="hljs-string">xml</span>
      <span class="hljs-attr">exclude:</span> <span class="hljs-string">[redirect,</span> <span class="hljs-string">paginated]</span>
  <span class="hljs-attr">pagetypeformats:</span>
    <span class="hljs-attr">page:</span> <span class="hljs-string">[html]</span>
    <span class="hljs-attr">homepage:</span> <span class="hljs-string">[html,</span> <span class="hljs-string">atom]</span>
    <span class="hljs-attr">section:</span> <span class="hljs-string">[html,</span> <span class="hljs-string">atom]</span>
    <span class="hljs-attr">vocabulary:</span> <span class="hljs-string">[html]</span>
    <span class="hljs-attr">term:</span> <span class="hljs-string">[html,</span> <span class="hljs-string">atom]</span></code></pre>
<h2 id="post-process">Post-process</h2>
<p>Vous pouvez étendre les capacités de Cecil avec un <a href="/fr/developers/extend/#post-processeur-de-rendu">post-processeur de sortie</a> pour modifier les fichiers de sortie après leur génération.</p>
<hr>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/configuration/cache/</id>
    <title>Cache</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/configuration/cache/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Cache</h1>
<p>Options de cache.</p>
<h2 id="cache-enabled">cache.enabled</h2>
<p>Le cache est activé par défaut (<code translate="no">true</code>), mais vous pouvez le désactiver avec :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">cache:</span>
  <span class="hljs-attr">enabled:</span> <span class="hljs-literal">false</span></code></pre>
<aside class="note note-warning"><p>Il n’est pas recommandé de désactiver le cache pour des raisons de performance.</p></aside>
<h2 id="cache-dir">cache.dir</h2>
<p>Répertoire où les fichiers de cache sont stockés (<code translate="no">.cache</code> par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">cache:</span>
  <span class="hljs-attr">dir:</span> <span class="hljs-string">'.cache'</span></code></pre>
<aside class="note note-info"><p>Le répertoire de cache est relatif au répertoire du site, mais vous pouvez utiliser un chemin absolu : cela peut être utile pour stocker le cache dans un répertoire partagé.</p></aside>
<h2 id="cache-assets">cache.assets</h2>
<p>Options du cache des ressources.</p>
<h3 id="cache-assets-ttl">cache.assets.ttl</h3>
<p>Temps de vie du cache des ressources en secondes (<code translate="no">null</code> par défaut = aucune expiration).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">cache:</span>
  <span class="hljs-attr">assets:</span>
    <span class="hljs-attr">ttl:</span> <span class="hljs-string">~</span></code></pre>
<h3 id="cache-assets-remote-ttl">cache.assets.remote.ttl</h3>
<p>Temps de vie du cache des ressources distantes en secondes (7 jours par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">cache:</span>
  <span class="hljs-attr">assets:</span>
    <span class="hljs-attr">remotes:</span>
      <span class="hljs-attr">ttl:</span> <span class="hljs-number">604800</span> <span class="hljs-comment"># 7 jours</span></code></pre>
<h2 id="cache-templates">cache.templates</h2>
<p>Désactive le cache des templates avec <code translate="no">false</code> (<code translate="no">true</code> par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">cache:</span>
  <span class="hljs-attr">templates:</span> <span class="hljs-literal">true</span></code></pre>
<aside class="note note-info"><p>Voir la <a href="/fr/templates/cache/">documentation du cache des templates</a> pour plus de détails.</p></aside>
<h2 id="cache-translations">cache.translations</h2>
<p>Désactive le cache des traductions avec <code translate="no">false</code> (<code translate="no">true</code> par défaut).</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">cache:</span>
  <span class="hljs-attr">translations:</span> <span class="hljs-literal">true</span></code></pre>
<hr>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/configuration/serveur/</id>
    <title>Serveur et optimisation</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/configuration/serveur/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Serveur et optimisation</h1>
<h2 id="serveur">Serveur</h2>
<h3 id="server-headers">server.headers</h3>
<p>Vous pouvez définir des <a href="https://developer.mozilla.org/docs/Glossary/Response_header" target="_blank" rel="noopener noreferrer">en-têtes HTTP</a> personnalisés, utilisés par le serveur d’aperçu local.</p>
<aside class="note note-warning"><p>Depuis la version <ins>8.38.0</ins>, l’option <code translate="no">headers</code> a été déplacée dans la section <code translate="no">server.headers</code>.</p></aside>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">server:</span>
  <span class="hljs-attr">headers:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">path:</span> <span class="hljs-string">&lt;path&gt;</span> <span class="hljs-comment"># chemin relatif, préfixé par un slash. Prend en charge le joker "*".</span>
      <span class="hljs-attr">headers:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">&lt;key&gt;</span>
          <span class="hljs-attr">value:</span> <span class="hljs-string">"&lt;value&gt;"</span></code></pre>
<aside class="note note-tip"><p>C’est utile pour tester une <a href="https://developer.mozilla.org/docs/Web/HTTP/CSP" target="_blank" rel="noopener noreferrer">Content Security Policy</a> ou <code translate="no">Cache-Control</code> personnalisée.</p></aside>
<p><em>Exemple :</em></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">server:</span>
  <span class="hljs-attr">headers:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">path:</span> <span class="hljs-string">/*</span>
      <span class="hljs-attr">headers:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">X-Frame-Options</span>
          <span class="hljs-attr">value:</span> <span class="hljs-string">"SAMEORIGIN"</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">X-XSS-Protection</span>
          <span class="hljs-attr">value:</span> <span class="hljs-string">"1; mode=block"</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">X-Content-Type-Options</span>
          <span class="hljs-attr">value:</span> <span class="hljs-string">"nosniff"</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">Content-Security-Policy</span>
          <span class="hljs-attr">value:</span> <span class="hljs-string">"default-src 'self'; object-src 'self'; img-src 'self'"</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">Strict-Transport-Security</span>
          <span class="hljs-attr">value:</span> <span class="hljs-string">"max-age=31536000; includeSubDomains; preload"</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">path:</span> <span class="hljs-string">/assets/*</span>
      <span class="hljs-attr">headers:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">Cache-Control</span>
          <span class="hljs-attr">value:</span> <span class="hljs-string">"public, max-age=31536000"</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">path:</span> <span class="hljs-string">/foo.html</span>
      <span class="hljs-attr">headers:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">Foo</span>
          <span class="hljs-attr">value:</span> <span class="hljs-string">"bar"</span></code></pre>
<hr>
<h2 id="optimisation">Optimisation</h2>
<p>Les options d’optimisation permettent d’activer la compression des fichiers de sortie : HTML, CSS, JavaScript et images.</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">optimize:</span>
  <span class="hljs-attr">enabled:</span> <span class="hljs-literal">false</span>     <span class="hljs-comment"># active l’optimisation des fichiers (`false` par défaut)</span>
  <span class="hljs-attr">html:</span>
    <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>    <span class="hljs-comment"># active l’optimisation des fichiers HTML</span>
    <span class="hljs-attr">ext:</span> <span class="hljs-string">[html,</span> <span class="hljs-string">htm]</span>   <span class="hljs-comment"># extensions de fichiers prises en charge</span>
  <span class="hljs-attr">css:</span>
    <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>    <span class="hljs-comment"># active l’optimisation des fichiers CSS</span>
    <span class="hljs-attr">ext:</span> <span class="hljs-string">[css]</span>         <span class="hljs-comment"># extensions de fichiers prises en charge</span>
  <span class="hljs-attr">js:</span>
    <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>    <span class="hljs-comment"># active l’optimisation des fichiers JavaScript</span>
    <span class="hljs-attr">ext:</span> <span class="hljs-string">[js]</span>          <span class="hljs-comment"># extensions de fichiers prises en charge</span>
  <span class="hljs-attr">images:</span>
    <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>    <span class="hljs-comment"># active l’optimisation des fichiers images</span>
    <span class="hljs-attr">ext:</span> <span class="hljs-string">[jpeg,</span> <span class="hljs-string">jpg,</span> <span class="hljs-string">png,</span> <span class="hljs-string">gif,</span> <span class="hljs-string">webp,</span> <span class="hljs-string">svg,</span> <span class="hljs-string">avif]</span> <span class="hljs-comment"># extensions de fichiers prises en charge</span></code></pre>
<p>Cette option est désactivée par défaut et peut être activée via :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">optimize:</span> <span class="hljs-literal">true</span></code></pre>
<p>Une fois l’option globale activée, les 4 types de fichiers seront traités.<br>
Il est possible de désactiver chacun d’eux via <code translate="no">enabled: false</code> et de modifier l’extension des fichiers traités via <code translate="no">ext</code>.</p>
<aside class="note note-tip"><p>Il est également possible d’activer cette option via la CLI lors de l’utilisation des commandes "build" et "serve" avec l’option <code translate="no">--optimize</code>.</p></aside>
<aside class="note note-important"><p>Le compresseur d’<strong>images</strong> utilisera les binaires suivants s’ils sont présents sur le système : <a href="https://github.com/tjko/jpegoptim" target="_blank" rel="noopener noreferrer">JpegOptim</a>, <a href="http://optipng.sourceforge.net/" target="_blank" rel="noopener noreferrer">Optipng</a>, <a href="https://pngquant.org/" target="_blank" rel="noopener noreferrer">Pngquant 2</a>, <a href="https://github.com/svg/svgo" target="_blank" rel="noopener noreferrer">SVGO</a>, <a href="http://www.lcdf.org/gifsicle/" target="_blank" rel="noopener noreferrer">Gifsicle</a>, <a href="https://developers.google.com/speed/webp/docs/cwebp" target="_blank" rel="noopener noreferrer">cwebp</a> et <a href="https://github.com/AOMediaCodec/libavif" target="_blank" rel="noopener noreferrer">avifenc</a>.</p></aside>
<hr>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/configuration/surcharge/</id>
    <title>Surcharge de configuration</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/configuration/surcharge/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Surcharge de configuration</h1>
<h2 id="variables-d-environnement">Variables d’environnement</h2>
<p>La configuration peut être surchargée via des <a href="https://en.wikipedia.org/wiki/Environment_variable" target="_blank" rel="noopener noreferrer">variables d’environnement</a>.</p>
<p>Au démarrage, Cecil essaie également de charger un fichier <code translate="no">.env</code> depuis le chemin du site courant (le répertoire de travail actuel, ou l’argument <code translate="no">&lt;path&gt;</code> s’il est fourni).</p>
<ul>
<li>Si le fichier <code translate="no">.env</code> n’existe pas, Cecil continue normalement.</li>
<li>Les variables déjà définies par le shell/système sont conservées.</li>
</ul>
<p>Chaque nom de variable d’environnement doit être préfixé par <code translate="no">CECIL_</code> et la clé de configuration doit être en majuscules.</p>
<p>Par exemple, la commande suivante définit le <code translate="no">baseurl</code> du site :</p>
<pre><code class="language-bash hljs bash" translate="no"><span class="hljs-built_in">export</span> CECIL_BASEURL=<span class="hljs-string">"https://example.com/"</span></code></pre>
<p>Vous pouvez stocker la même valeur dans un fichier <code translate="no">.env</code> à la racine du projet :</p>
<pre><code class="language-dotenv" translate="no">CECIL_BASEURL="https://example.com/"
CECIL_TITLE="Mon site Cecil"</code></pre>
<h2 id="option-cli">Option CLI</h2>
<p>Vous pouvez combiner plusieurs fichiers de configuration avec l’option <code translate="no">--config</code> (priorité de gauche à droite) :</p>
<pre><code class="language-bash hljs bash" translate="no">php cecil.phar --config config-1.yml,config-2.yml</code></pre>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/assets/fournisseurs-cdn/</id>
    <title>Fournisseurs de CDN</title>
    <published>2023-10-23T00:00:00+00:00</published>
    <updated>2026-10-02T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/assets/fournisseurs-cdn/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Fournisseurs de CDN</h1>
<p>Exemples de configuration de fournisseurs de CDN pour les <a href="/fr/configuration/assets/#assets-images-cdn"><code translate="no">options de configuration</code></a>.</p>
<h2 id="cloudinary">Cloudinary</h2>
<p><a href="https://cloudinary.com" target="_blank" rel="noopener noreferrer">https://cloudinary.com</a></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">assets:</span>
  <span class="hljs-attr">images:</span>
    <span class="hljs-attr">cdn:</span>
      <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">account:</span> <span class="hljs-string">'xxxx'</span>
      <span class="hljs-attr">url:</span> <span class="hljs-string">'https://res.cloudinary.com/%account%/image/fetch/c_limit,w_%width%,q_%quality%,f_%format%,d_default/%image_url%'</span></code></pre>
<h2 id="cloudimage">Cloudimage</h2>
<p><a href="https://www.cloudimage.io" target="_blank" rel="noopener noreferrer">https://www.cloudimage.io</a></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">assets:</span>
  <span class="hljs-attr">images:</span>
    <span class="hljs-attr">cdn:</span>
      <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">account:</span> <span class="hljs-string">'xxxx'</span>
      <span class="hljs-attr">url:</span> <span class="hljs-string">'https://%account%.cloudimg.io/%image_url%?w=%width%&amp;q=%quality%&amp;force_format=%format%'</span></code></pre>
<h2 id="twicpics">TwicPics</h2>
<p><a href="https://www.twicpics.com" target="_blank" rel="noopener noreferrer">https://www.twicpics.com</a></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">assets:</span>
  <span class="hljs-attr">images:</span>
    <span class="hljs-attr">cdn:</span>
      <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">account:</span> <span class="hljs-string">'xxxx'</span>
      <span class="hljs-attr">canonical:</span> <span class="hljs-literal">false</span>
      <span class="hljs-attr">remote:</span> <span class="hljs-literal">false</span>
      <span class="hljs-attr">url:</span> <span class="hljs-string">'https://%account%.twic.pics/%image_url%?twic=v1/resize=%width%/quality=%quality%/output=%format%'</span></code></pre>
<p><code translate="no">Source URL</code> : URL de base de votre site.</p>
<h2 id="imgix">imgix</h2>
<p><a href="https://imgix.com" target="_blank" rel="noopener noreferrer">https://imgix.com</a></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">assets:</span>
  <span class="hljs-attr">images:</span>
    <span class="hljs-attr">cdn:</span>
      <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">account:</span> <span class="hljs-string">'xxxx'</span>
      <span class="hljs-attr">canonical:</span> <span class="hljs-literal">false</span>
      <span class="hljs-attr">remote:</span> <span class="hljs-literal">false</span>
      <span class="hljs-attr">url:</span> <span class="hljs-string">'https://%account%.imgix.net/%image_url%?w=%width%&amp;q=%quality%&amp;fm=%format%'</span></code></pre>
<p><code translate="no">Base URL</code> : URL de base de votre site.</p>
<h2 id="netlify-image-cdn">Netlify Image CDN</h2>
<p><a href="https://docs.netlify.com/image-cdn/overview/" target="_blank" rel="noopener noreferrer">https://docs.netlify.com/image-cdn/overview/</a></p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-attr">assets:</span>
  <span class="hljs-attr">images:</span>
    <span class="hljs-attr">cdn:</span>
      <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">canonical:</span> <span class="hljs-literal">false</span>
      <span class="hljs-attr">url:</span> <span class="hljs-string">'/.netlify/images?url=%image_url%&amp;w=%width%&amp;fm=%format%'</span></code></pre>
<h3 id="execution-en-local">Exécution en local</h3>
<h4>Installer Netlify CLI</h4>
<pre><code class="language-bash hljs bash" translate="no">npm install netlify-cli -g
netlify link</code></pre>
<p><code translate="no">netlify.toml</code> :</p>
<pre><code class="language-yaml hljs yaml" translate="no"><span class="hljs-string">[dev]</span>
  <span class="hljs-string">targetPort</span> <span class="hljs-string">=</span> <span class="hljs-number">8000</span></code></pre>
<h4>Démarrer le serveur local</h4>
<pre><code class="language-bash hljs bash" translate="no">php cecil.phar serve &amp; netlify dev</code></pre>
<p>Ouvrez <a href="http://localhost:8888" target="_blank" rel="noopener noreferrer">http://localhost:8888</a></p>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/bien-demarrer/demarrage-rapide/</id>
    <title>Démarrage rapide</title>
    <published>2021-11-03T00:00:00+00:00</published>
    <updated>2026-10-02T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/bien-demarrer/demarrage-rapide/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Démarrage rapide</h1>
<h2 id="creer-un-site-web">Créer un site web</h2>
<p>Vous pouvez créer un nouveau site web en quelques minutes.</p>
<p>Suivez les étapes ci-dessous pour créer votre premier site web Cecil.</p>
<p><a href="https://cecilapp.github.io/skeleton/" target="_blank" rel="noopener noreferrer"><picture>
<source media="(prefers-color-scheme: dark)" type="image/avif" srcset="/thumbnails/480x/docs/cecil-newsite.dark.19f0a851a99b34775f44b67c805a0815.avif 480w, /thumbnails/768x/docs/cecil-newsite.dark.19f0a851a99b34775f44b67c805a0815.avif 768w, /docs/cecil-newsite.dark.19f0a851a99b34775f44b67c805a0815.avif 1007w" sizes="100vw">
<source media="(prefers-color-scheme: dark)" type="image/webp" srcset="/thumbnails/480x/docs/cecil-newsite.dark.19f0a851a99b34775f44b67c805a0815.webp 480w, /thumbnails/768x/docs/cecil-newsite.dark.19f0a851a99b34775f44b67c805a0815.webp 768w, /docs/cecil-newsite.dark.19f0a851a99b34775f44b67c805a0815.webp 1007w" sizes="100vw">
<source media="(prefers-color-scheme: dark)" srcset="/thumbnails/480x/docs/cecil-newsite.dark.19f0a851a99b34775f44b67c805a0815.png 480w, /thumbnails/768x/docs/cecil-newsite.dark.19f0a851a99b34775f44b67c805a0815.png 768w, /docs/cecil-newsite.dark.19f0a851a99b34775f44b67c805a0815.png 1007w" sizes="100vw">
<source type="image/avif" srcset="/thumbnails/480x/docs/cecil-newsite.94982e8ace758b40e6ff753807bdb42b.avif 480w, /thumbnails/768x/docs/cecil-newsite.94982e8ace758b40e6ff753807bdb42b.avif 768w, /docs/cecil-newsite.94982e8ace758b40e6ff753807bdb42b.avif 1007w" width="1007" height="607" sizes="100vw">
<source type="image/webp" srcset="/thumbnails/480x/docs/cecil-newsite.94982e8ace758b40e6ff753807bdb42b.webp 480w, /thumbnails/768x/docs/cecil-newsite.94982e8ace758b40e6ff753807bdb42b.webp 768w, /docs/cecil-newsite.94982e8ace758b40e6ff753807bdb42b.webp 1007w" width="1007" height="607" sizes="100vw">
<img src="/docs/cecil-newsite.94982e8ace758b40e6ff753807bdb42b.png" alt="Example de nouveau site" loading="lazy" decoding="async" class="dark:brightness-90" width="1007" height="607" style=";max-width:100%;height:auto;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEj0lEQVR4nN1b0ZKDIAxMHP//H+9HLvcg0QQCRATE2xmLrQghy4ZIW/z5+SEAgN/fXyAio6SjpKPk4wQRUCgBIJyDBgIgIiAibNvmOBA23AA3hA3xaKJSJh02IX/f0Q0Cd1ezxzTLgb3tNgAAShxvkjEYZPbnMcLyGBmORHW9nWwfmglRjmCVvALZ8x1n2ffFBCOOJ0HigUJAhyl10g85d6yrjOATYYodVm08IwTGkVF3wf9SBuMRIQQI5wDF6Uj8V2UwDELYs5h8alb1MCGyrMMD9bmP0Zvrs/+pDIYghPM5AiA8/ZwlGVE4CMuTCUN9cXiJOZtIkzr4ijLIkHVOPftVIZhBePKRdzDKOaYKu354iUipEiO45lcUrz6sqYyYJCZol0YgXOI4P1B3HRV0kPIRghlCcsSo/I1iQ54oo+T095TB2PV11OZsod/zwEtJkWEehcin2SIpFK8WlEi27javMqoNdUVOGYxLIUEZtn0IiAREmozoKSSLM8yEUGcSgSjCU2h3mjLuYIwyGJdC1NqBR4/hOBZUUgvr3YjL7cpSkSKmw7kFg3DYkMpSt6vwTWUwToUcixqAzJgQECgoA4EuH4nSAzxLvEq8Sukdq4+zb7Kv614kvqMMxs6TTxPBbgC+AgSoHAFgu6AEuQLw7ql1tYaYjHjF+aIyGPrBEMMsRIQrCzzmZ0xGK1TaWsytU+gJkp7LmvjYUt2rTxliyjV2v8MlEWWABCKGsNVpd0Tk1WmK7c+fUpWkdfyt9kWrMg+FKE+jLjhuI3VRyNULyjfFlq1JUFPJczvnKoMhHgz18njGaQ5jYg3phgdKqakkp5zReLpmqb0snqg6oyG5tdV9gCWl1MgvqaTdTqkMzkCjGpR6oleykN9+P0c4YY4VlZJHSSVzd6b6ZXN7rIxrmlEyorEDFMnrjY5yKjFDmYdktWbE18Ypg5EqZKYyrL49nwmUyFCrI97Osl3o/Zyzs4HUJwAPWvTv3WI/OJZRVobRz6D5einEkUJ1dXYJDYOtpcZJ8w8dOmoHIHlSf+r0aaQ5cfopyCZeIlVgeFEZjKYfOazmdImibXSpozVCj94byxLS6vSVyQKAbAxTa88LymBUFVJy8MrOrymlJAvr0qxdY3fI8jh/ZYJyUNkYGXtik7P/hJA4bYxLy+mrEvHULit8TVvUvRuHJWLA2cYKqO0Wy3ozoRRSU4c1CDmQFcnoZdMsYvaWLfUvEmNhJWUwdu7c2gfyqkSer0hGj7VkFm6vIVb9rxDjwVvKYDStId4t7y8R8zYRjO2JIXjz/E1Q5lgNyRrSgppKViHlC7j9YHgnfK2IVe1iNC/qMXJqWNUBKI6VsFtMtKjEun9lxISsQsxeCjke50t8IWRJWISgccxE8svFpwbw/SsrxMoCS0qZ/mCYCzEeQ+I6UxXSoZMcIUlIm/0FVfWvd07IZrqppLMzSip4e01xfUFlkZUz+P531Q1D7+itXFaY62L49yGef/jwr7zvhLCyOpyjGjj4rMPHdemCUyH3zfyCOp40P+w79ZKzrf/M9cP7Knmxqyz+AEm28LzQnWd/AAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:center;background-size:cover;" srcset="/thumbnails/480x/docs/cecil-newsite.94982e8ace758b40e6ff753807bdb42b.png 480w, /thumbnails/768x/docs/cecil-newsite.94982e8ace758b40e6ff753807bdb42b.png 768w, /docs/cecil-newsite.94982e8ace758b40e6ff753807bdb42b.png 1007w" sizes="100vw">
</picture></a></p>
<aside class="note note-info"><p>Démo du résultat attendu : <a href="https://cecilapp.github.io/skeleton/" target="_blank" rel="noopener noreferrer">https://cecilapp.github.io/skeleton/</a>.</p></aside>
<h3 id="prerequis">Prérequis</h3>
<ul>
<li><a href="https://php.net/manual/fr/install.php" target="_blank" rel="noopener noreferrer">PHP</a> 8.3+</li>
<li>Terminal (une compréhension de base du <a href="https://fr.wikipedia.org/wiki/%C3%89mulateur_de_terminal" target="_blank" rel="noopener noreferrer">terminal</a>)</li>
<li>Éditeur de texte, comme <a href="https://code.visualstudio.com" target="_blank" rel="noopener noreferrer">VS Code</a> et/ou <a href="https://typora.io" target="_blank" rel="noopener noreferrer">Typora</a></li>
</ul>
<h3 id="1-telecharger-cecil">1. Télécharger Cecil</h3>
<p>Téléchargez <code translate="no">cecil.phar</code> depuis votre terminal:</p>
<pre><code class="language-bash hljs bash" translate="no">curl -LO https://cecil.app/cecil.phar</code></pre>
<p>Vous pouvez également <a href="https://cecil.app/download/">télécharger Cecil manuellement</a>, ou utiliser :</p>
<ul>
<li><a href="https://brew.sh" target="_blank" rel="noopener noreferrer">Homebrew</a>: <code translate="no">brew install cecilapp/tap/cecil</code></li>
<li><a href="https://scoop.sh" target="_blank" rel="noopener noreferrer">Scoop</a>: <code translate="no">scoop install https://cecil.app/scoop/cecil.json</code></li>
</ul>
<h3 id="2-creer-un-nouveau-site">2. Créer un nouveau site</h3>
<p>Créez un répertoire pour le site Web (ex : <code translate="no">&lt;monsiteweb&gt;</code>), placez y <code translate="no">cecil.phar</code>, puis exécutez la commande <code translate="no">new:site</code> :</p>
<pre><code class="language-bash hljs bash" translate="no">php cecil.phar new:site</code></pre>
<h3 id="3-ajouter-une-page">3. Ajouter une page</h3>
<p>Exécutez la commande <code translate="no">new:page</code> :</p>
<pre><code class="language-bash hljs bash" translate="no">php cecil.phar new:page</code></pre>
<p>Vous pouvez maintenant modifier la page nouvellement créée avec votre éditeur Markdown : <code translate="no">&lt;monsiteweb&gt;/pages/&lt;nouvelle-page&gt;.md</code>.</p>
<aside class="note note-tip"><p>Nous vous recommandons d’utiliser <a href="https://www.typora.io" target="_blank" rel="noopener noreferrer">Typora</a> pour éditer vos fichiers Markdown.</p></aside>
<h3 id="4-verifier-l-apercu">4. Vérifier l’aperçu</h3>
<p>Exécutez la commande suivante pour créer un aperçu du site Web :</p>
<pre><code class="language-bash hljs bash" translate="no">php cecil.phar serve</code></pre>
<p>Naviguez ensuite sur <code translate="no">http://localhost:8000</code>.</p>
<aside class="note note-info"><p>La commande <code translate="no">serve</code> démarre un serveur HTTP local et un observateur : si un fichier (une page, un template ou la config) est modifié, la page active du navigateur est automatiquement rechargée.</p></aside>
<h3 id="5-generer-et-deployer">5. Générer et déployer</h3>
<p>Quand vous êtes satisfait du résultat, vous pouvez générer le site afin de le déployer sur le Web.</p>
<p>Exécutez la commande suivante pour générer le site :</p>
<pre><code class="language-bash hljs bash" translate="no">php cecil.phar build</code></pre>
<p>Vous pouvez maintenant copier le contenu du répertoire <code translate="no">_site</code> sur un serveur Web 🎉</p>
<hr>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/bien-demarrer/kits-de-demarrage/</id>
    <title>Kits de démarrage</title>
    <published>2021-11-03T00:00:00+00:00</published>
    <updated>2026-10-02T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/bien-demarrer/kits-de-demarrage/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Kits de démarrage</h1>
<p>Pour démarrer rapidement, utilisez l’un des <a href="/fr/kits-de-demarrage/">kits de démarrage</a> Cecil prêts à l’emploi :</p>
<ul>
<li><a href="https://github.com/Cecilapp/the-butler#readme" target="_blank" rel="noopener noreferrer">The Butler</a> : starter blog prêt à publier.</li>
<li><a href="https://github.com/Cecilapp/Links#readme" target="_blank" rel="noopener noreferrer">Links</a> : alternative open source à Linktree.</li>
<li><a href="https://github.com/Cecilapp/photo-stream#readme" target="_blank" rel="noopener noreferrer">Photo Stream</a> : flux photo auto-hébergé minimaliste.</li>
<li><a href="https://github.com/Cecilapp/statidocs#readme" target="_blank" rel="noopener noreferrer">Statidocs</a> : site de documentation prêt à l’emploi.</li>
</ul>
<p><a href="https://github.com/Cecilapp/the-butler#readme" target="_blank" rel="noopener noreferrer"><picture>
<source type="image/avif" srcset="/thumbnails/480x/docs/cecil-newblog.c85c682e3bcb416589e2bc2bbcc2cfca.avif 480w, /thumbnails/768x/docs/cecil-newblog.c85c682e3bcb416589e2bc2bbcc2cfca.avif 768w, /docs/cecil-newblog.c85c682e3bcb416589e2bc2bbcc2cfca.avif 1014w" width="1014" height="713" sizes="100vw">
<source type="image/webp" srcset="/thumbnails/480x/docs/cecil-newblog.c85c682e3bcb416589e2bc2bbcc2cfca.webp 480w, /thumbnails/768x/docs/cecil-newblog.c85c682e3bcb416589e2bc2bbcc2cfca.webp 768w, /docs/cecil-newblog.c85c682e3bcb416589e2bc2bbcc2cfca.webp 1014w" width="1014" height="713" sizes="100vw">
<img src="/docs/cecil-newblog.c85c682e3bcb416589e2bc2bbcc2cfca.png" alt="Exemple de starter blog" loading="lazy" decoding="async" class="dark:brightness-90" width="1014" height="713" style=";max-width:100%;height:auto;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAOtUlEQVR4nNWc63rjNg5AD0A5bb92v2nfoO//gptYIrA/AJKQ7Ex3urOtywxDWbFuPMSV1Mjvv//u/IVFVbndbvz444/8/PPP/Otf/+LLr7/y22+/8duvv/Jrtl++fOHLly/88ssv/PTTT7y9vdFao7WN1hQRRVUAQQREBBEByrYIEjvOLZL/oh3ngLq9zjX/sjYZm7XzvOxwfO5wB3fD3XEzzB0zm9Ut/wbo9+jk71L8cVy4+6nm3vzq2OfzcC/n8NiRfXJpT7/rOR9v5XzOsp+vwbhsn640b3ZWL/u3h174O4pzuqnTgxYg5o44CI65oMRIDDmZp5qf/dNWkHmVIQmOe/5VZII4bz8dN/UxLlDqYFlw/VIrmNcAMooXKBcQAcMRNzBB1bJjBXFAfG5L7Ij2pK5SVQmISx5zhsVXt6fCu9725RkGlSqZPqFUaX9NCUkSU6GUG5961wwxA1FcDDdN2+HZ0bK2yU4fNmLaFJ3ARCpMcn/cjTj4pODLjgxJmb9iY477B5U1nsfPUBjP98ISMsfMuHGYkjGMIGYBAzAdxnt1/AMMWMZdzsZ/wpQBRUICBx1nyYMMEINYueFqHy77/BmUWfPvryghY4RVWzdAdDO6GTq8EekYROdNT2oAgdltMmCAiD4BImiqNUnpKkcXKXjmZV3crYtduUrMSQNMyVgD72UkpHoq6yYDRrUdPdWVmqWaESRd3tFLU91ULBOAJxRHKxBNtSVSjj+fp+48Sci3PGTdSM/QrUgMryYh5V5Phtycbs5hDuZod8BCo4TOeuisNYizk0UiZklJ0JQWFUFtSc06VgqUSylSWPd9XooKLYZchst+Go0vICG1VNfQCCnpHjDUHO+GYiH6Ci7p8Fa1IrV/RqAoUzJCOmxuLwmhBI15jmlDqj6S0+VOZerJsySlQh2+RW7Hw8o0JKsTXgJICjGOY05IhsPhzuGhrswcwcK+GLhIHifLI+Ki+2WpJEXO6moCukrIAiH1Bk/xzoN+y3YMABgDQoS89mplnitd+QGIv1tCpqcxXMFqzEM6dgt9q93ABTMwcUwEYyiAS7mM1uHiagEUUNLGrK+vw70C8NmJ8+8P1xowqlcX12wCbWwDTUhA67yS0P9mCSmykVAMpnTs5kh3ejfAcBNMnC4aai1k5hz1Akt3r3aBuXyeaoTp4Q7EMjrMy4imgJO8piwHQyRsm4oiKjQRmiqbCJsKW8LZChQd55Y/kJCaWDt149fyB/9l8Sc1pINpO/Z0dbUb7oYJdFE6zsGCN0CO85YnmADW86zYZbrBFCi+Rq0SmYE1klfnjfPnSWKvRNIT1bRRypb1ppJV2RRMhKYsieFTlfU8e3ryo0d+55J3+l+K49nBy5hP6RDD1OgChziHC0fC6M50Ah7vZej6qpaqKuM84glvaABQdxTLURyfp9TkeRHBMwvgoiAjE91CMppyU+XWlB+a8qbOWxNchVuxf5kwOAOpQVOt8dUVcZ4ysKfczJ8BMaRj1LOre3THMEw7uzgHyu7M2t3pMFXeWXWdsDwAmRAYBpYJQnAahnq2GG2AKUBcQjJWbQGkNZo2bk15a40fNqVbw5qHnLlEDStPkyuQU8C05hueAsmcvpstVfEnoMwO9DOUYUM83d2OcZiwC9zduTvcHXZ3jiElJbD87E7OYNa+AWJKSEpGSxgNY8u2FSCSQEwaljBcGmhDm7E149YaP2zO4Q1zJ5SUI5sSvh9zEkSRBWS6h6oFSEk5IGl8Q2XJgDHyTN8A5dRpfoYy1NBh4f5aNw43dhU+gA8XPsz5cLhbADmGd3Y997zaY0wh+bG6uKGuQD06vrmxecC40dkSjOJoBhaO0qUllIZrQ7QhbWNrxttmHBaeI97i/IRhb3jYD18x0AbPVJXS2gIzdK0DbuFyTmNmHQh39Fug1J47qS2GhICY07uzu3E34R14d3g3eDfnbrBnzNJHQMnVlvhpW8ouKbCGytIE0fCA4cbNjTc6NwkoTRYQQzFpdBomGyYG6mhztuYxsPJ6Oj2tMPBdhD5d4nj27ew365SQWTPVMIi4WIp4GXW5H84zb9/A5ASle/rlBt2cHedDjA+Hf1vU976AHKm6lgt8nhlcUlJGwCmuSK8qDXpzZ0sgNw+VaXRMOl1SbRUJMXEOnC7FNBg0E3p6YqrGdnTeVHhT5TCna0y0eapcBbYFA0RL0k0KEJUiIcQVJw6fascMROyb7ckDFAIKKSn7gOLGhwnv5rx3+Og+7ciRLrOXn8czP1Ndsa1pR9oEYtw8HIqIeDqI4RguAS4kxMMdBw4RLO2KpKpDjdaNrRtvTWMAZY7O/HFQbqdgKaVkQNFiR0bQ5MqMYqvOCTDpAvLtRr56SMZSkd3hAHbCq7qbcTf4SJV1/wTI2cRHPcM4A5rqCmik04Jl7GHT7VWJQNHTADlOFw93HKfndSP/5qg6ew9vcYHw5YhcXMNtBk4TTIGjpSUEQ1zDkJPOQR2VKXZh5J+rr8v1/xCQEaMvDL1PiTk8YOzpbfUCZBx9BRJQ/HKVFX8IQ+2t74aHFR3dcVrauTFAh916VvFQpyO2MvMZ/H7WB1uFMQ11iT9GmqG6ilq+66qoe2RfNSQjFgbIJ5f878sAMqL37pJtSESHHJUBzT+BUOtlCcVsa6Q+YHRqhzPreDSHeG5fanIClWeQWDCe3R7Dy8oOPqUQSlsDqrkrJUc9ok7xqKoBo67W+F/LSZ15gcSq9pXjPz/rasfvoS6rC23D5R/fG4cKJSA9/3BqL1euvsWlbNdvPY4nzxUalyMl3YlLBvU8Z/3/gTIlh9Vx3+casrovxcBZ7VB4TsRiU0qgdL2ni/jn7mojDxWYqZDrMhwf882fXUPmr0v7/WBc2yfS/p2KlN9KKCyZkhKqR+YM4Ix9HBBHdKWUznEOxUbXK53L5u6z604L0kpaBFjzBpfvjhUUz7vt/1e+Hwh5+CSZlwibMsLGMd8fKnLcxZyTGaO1ZIuf1wr8sWyeJ4km0iAi8qCTT6n4Am6tUT3DOUN69bI66QQj9zphF1cm4WwfjJgaGFnfWNA30vWjPs69PCtbTaGPnFTt/CEND0DgtHD4cR3ut0Xtf32R07aQU6yQcx6ChHIKW2ExbnuqI/VhvQKYKbiGOyAS8YeO3BjEPh7V11WEtqvRdXd677NjxQxTncHj+M6AMmCcW14cRi1LLgJKgJHhzLiACW4RS2AxWaYWjnYUxdVBBWmGqCFuU1LWrGCJLD65mxOQusB4fJbM7F5nD+sa1ZmOH6rMvj198teX5XyMnzGaq5Tg+ayWWe3eceuY9TXqREAVadHxqCLa0M1QjzmVk7TwGGKMO5pu7+jAYUMmjOvMYflubZ+/OvCKpXqBSzqGZKisqF2GB5vTAPQD7wfWD+g99BgjJmvIFn6wioI2pD+DkdO1ctFWQ2Vdb3eqqicgrkDq9uuDgMfxOGDItB9LbfmE4d2w3vHjgH2HYwc7wEItoTFlq5aL+ETx1sA2xPoy8u4zU365DYYd+3SRQwXzRx39+iBquUqGsNZNRdZ3wBCPWVHvHT92uO/4fof9jvc95oKcyFi0jZZAmii+NTg26LcJrs7HT3vCickfLwP6Z3X218ozVaUBQWTBkDDmM69lPVTUHjDs4wPfP/Djjvcc/apo2/CeQFSxbcNvHazHaxQWqy4f76Iaevm712X9+XL1GL8+bD6xG1Kkw1ktuczTOt4P/NjxfcfuH9jHO3Z/x/c73o8pIW274R72t22N2+2GHUdIl4XPXFXW4zKk+PyPAPIsKfPMS/n60bEdHaC5inCsJJSy1CciC9xw69APbN+xlI7+8Y59/Ds+9yM6Whvt1nFAtbHdNvrxFjD7kI4RC1QoQ0Lknychz2BUF/VZkrFG2+OBRXSu81VymWca9OYgpKFOF9eOAzt2bP/guAeQ/vEeQI4DcFQbbh0RaK3R325xTD9wSwnJvPsjjLPE/GOAwBnAtQJz0dk5woCakQ4YWgx5iT985K9sqaseQPq+0/cP+j3B3D9CZRFSEWCUvt3o+x4gM2Zxt3SRVzpUquv7T5OQ64iKZTSs2TuIXNLpu2UGdKqqnKIuEjLjgjFyZyDYE8qOHzt23LF9px93+h7V+xHqrW1x/W3DMk6ZMIa6oq4RLpIh52d7eSBTPUnUsRa2ETfvxIP46ftj2T8FxCctlDd3AXy+ZOq9Zz2y7lOFed+nhADQWnxOCPEfBdiSjjJFOJMew9dNGl+NQ16hnGD4WtbfxNkkpAICzvx+AaEX6SAN+pyyZs1rDD0XWWxDrIP3aK1HZN57BoQ9YguzOEyj08cLOPIEQlVVFHU1rjue9WWBjEG0VvqF8d3UuTn0NBxVbUVWdcBYNoMC5ME380gcQiTTLTvT80UhrCM+qs1k4chjVedipNtX8vACI/ViSEidvFqu7+sDmVIBm5Gr/sZSobWCAwYQmepNsiUlxROIIwGCTBoKsVhB1sRwLvFGiXmf4Ra30ZFDzQjzbaymY/nUuAcpg2R0vl8gnOtLAXl2gy6CakhHU2HDuREQlLWKYxp8WW8rzeRoDss1ZZRBuAumMW9jEhiQtSBVc55QJaYaxrnRWAMdoz62W9N4/UCVTeNeW4FSpXdISbVjYwi+DBC5bA/9Gp2QRlzghsyYQ2Wsm12jrkl5ZWx2QPzVKHPjngu0DbqkUZfzypE223CpNU8qqnjT7FjJVw+UrbX5gs4mOtfszncZ+XqFFwIyysktzA+hsoTmQlNny45V97mQOWB4MfzrncIhHZa1eyxW6ASM2Ru57UOFEVBDSmPU0xRpinsBsilta/nfRwWcNqVkZJEf50Dk9NTRvgSQhxuUBWS8vjwCuJYdb0r8JzRCzkHEvPUmzPf4htoamtskYIhANynTmrnQj/EqW0igSW5LBJAuimvWpqBLQlRbWaRe4pzpXHBSTlViankJILUsD4Xlqk49HFOrmrknl2LQZb1vMZwAHe6tLDuDgLukEQ/191V1IqUdgFWIZZplwOjZZq3t8hxIeaYrlPj9H6oxhUTjWngBAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:center;background-size:cover;" srcset="/thumbnails/480x/docs/cecil-newblog.c85c682e3bcb416589e2bc2bbcc2cfca.png 480w, /thumbnails/768x/docs/cecil-newblog.c85c682e3bcb416589e2bc2bbcc2cfca.png 768w, /docs/cecil-newblog.c85c682e3bcb416589e2bc2bbcc2cfca.png 1014w" sizes="100vw">
</picture></a></p>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://cecil.app/fr/documentation/configuration/codes-de-locale/</id>
    <title>Codes de locale</title>
    <published>2020-12-19T00:00:00+00:00</published>
    <updated>2026-10-02T00:00:00+00:00</updated>
    <link href="https://cecil.app/fr/documentation/configuration/codes-de-locale/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h1>Codes de locale</h1>
<p>Codes de locale disponibles (<code translate="no">language_COUNTRY</code>) utilisés par l’option <a href="/fr/documentation/languages/#languages"><code translate="no">languages</code></a>.</p>
<table>
<thead>
<tr>
<th>Locale</th>
<th>Code</th>
</tr>
</thead>
<tbody>
<tr>
<td>Albanais (Albanie)</td>
<td>sq_AL</td>
</tr>
<tr>
<td>Albanais</td>
<td>sq</td>
</tr>
<tr>
<td>Arabe (Algérie)</td>
<td>ar_DZ</td>
</tr>
<tr>
<td>Arabe (Bahreïn)</td>
<td>ar_BH</td>
</tr>
<tr>
<td>Arabe (Égypte)</td>
<td>ar_EG</td>
</tr>
<tr>
<td>Arabe (Irak)</td>
<td>ar_IQ</td>
</tr>
<tr>
<td>Arabe (Jordanie)</td>
<td>ar_JO</td>
</tr>
<tr>
<td>Arabe (Koweït)</td>
<td>ar_KW</td>
</tr>
<tr>
<td>Arabe (Liban)</td>
<td>ar_LB</td>
</tr>
<tr>
<td>Arabe (Libye)</td>
<td>ar_LY</td>
</tr>
<tr>
<td>Arabe (Maroc)</td>
<td>ar_MA</td>
</tr>
<tr>
<td>Arabe (Oman)</td>
<td>ar_OM</td>
</tr>
<tr>
<td>Arabe (Qatar)</td>
<td>ar_QA</td>
</tr>
<tr>
<td>Arabe (Arabie saoudite)</td>
<td>ar_SA</td>
</tr>
<tr>
<td>Arabe (Soudan)</td>
<td>ar_SD</td>
</tr>
<tr>
<td>Arabe (Syrie)</td>
<td>ar_SY</td>
</tr>
<tr>
<td>Arabe (Tunisie)</td>
<td>ar_TN</td>
</tr>
<tr>
<td>Arabe (Émirats arabes unis)</td>
<td>ar_AE</td>
</tr>
<tr>
<td>Arabe (Yémen)</td>
<td>ar_YE</td>
</tr>
<tr>
<td>Arabe</td>
<td>ar</td>
</tr>
<tr>
<td>Biélorusse (Biélorussie)</td>
<td>be_BY</td>
</tr>
<tr>
<td>Biélorusse</td>
<td>be</td>
</tr>
<tr>
<td>Bulgare (Bulgarie)</td>
<td>bg_BG</td>
</tr>
<tr>
<td>Bulgare</td>
<td>bg</td>
</tr>
<tr>
<td>Catalan (Espagne)</td>
<td>ca_ES</td>
</tr>
<tr>
<td>Catalan</td>
<td>ca</td>
</tr>
<tr>
<td>Chinois (Chine)</td>
<td>zh_CN</td>
</tr>
<tr>
<td>Chinois (Hong Kong)</td>
<td>zh_HK</td>
</tr>
<tr>
<td>Chinois (Singapour)</td>
<td>zh_SG</td>
</tr>
<tr>
<td>Chinois (Taïwan)</td>
<td>zh_TW</td>
</tr>
<tr>
<td>Chinois</td>
<td>zh</td>
</tr>
<tr>
<td>Croate (Croatie)</td>
<td>hr_HR</td>
</tr>
<tr>
<td>Croate</td>
<td>hr</td>
</tr>
<tr>
<td>Tchèque (République tchèque)</td>
<td>cs_CZ</td>
</tr>
<tr>
<td>Tchèque</td>
<td>cs</td>
</tr>
<tr>
<td>Danois (Danemark)</td>
<td>da_DK</td>
</tr>
<tr>
<td>Danois</td>
<td>da</td>
</tr>
<tr>
<td>Néerlandais (Belgique)</td>
<td>nl_BE</td>
</tr>
<tr>
<td>Néerlandais (Pays-Bas)</td>
<td>nl_NL</td>
</tr>
<tr>
<td>Néerlandais</td>
<td>nl</td>
</tr>
<tr>
<td>Anglais (Australie)</td>
<td>en_AU</td>
</tr>
<tr>
<td>Anglais (Canada)</td>
<td>en_CA</td>
</tr>
<tr>
<td>Anglais (Inde)</td>
<td>en_IN</td>
</tr>
<tr>
<td>Anglais (Irlande)</td>
<td>en_IE</td>
</tr>
<tr>
<td>Anglais (Malte)</td>
<td>en_MT</td>
</tr>
<tr>
<td>Anglais (Nouvelle-Zélande)</td>
<td>en_NZ</td>
</tr>
<tr>
<td>Anglais (Philippines)</td>
<td>en_PH</td>
</tr>
<tr>
<td>Anglais (Singapour)</td>
<td>en_SG</td>
</tr>
<tr>
<td>Anglais (Afrique du Sud)</td>
<td>en_ZA</td>
</tr>
<tr>
<td>Anglais (Royaume-Uni)</td>
<td>en_GB</td>
</tr>
<tr>
<td>Anglais (États-Unis)</td>
<td>en_US</td>
</tr>
<tr>
<td>Anglais</td>
<td>en</td>
</tr>
<tr>
<td>Estonien (Estonie)</td>
<td>et_EE</td>
</tr>
<tr>
<td>Estonien</td>
<td>et</td>
</tr>
<tr>
<td>Finnois (Finlande)</td>
<td>fi_FI</td>
</tr>
<tr>
<td>Finnois</td>
<td>fi</td>
</tr>
<tr>
<td>Français (Belgique)</td>
<td>fr_BE</td>
</tr>
<tr>
<td>Français (Canada)</td>
<td>fr_CA</td>
</tr>
<tr>
<td>Français (France)</td>
<td>fr_FR</td>
</tr>
<tr>
<td>Français (Luxembourg)</td>
<td>fr_LU</td>
</tr>
<tr>
<td>Français (Suisse)</td>
<td>fr_CH</td>
</tr>
<tr>
<td>Français</td>
<td>fr</td>
</tr>
<tr>
<td>Allemand (Autriche)</td>
<td>de_AT</td>
</tr>
<tr>
<td>Allemand (Allemagne)</td>
<td>de_DE</td>
</tr>
<tr>
<td>Allemand (Luxembourg)</td>
<td>de_LU</td>
</tr>
<tr>
<td>Allemand (Suisse)</td>
<td>de_CH</td>
</tr>
<tr>
<td>Allemand</td>
<td>de</td>
</tr>
<tr>
<td>Grec (Chypre)</td>
<td>el_CY</td>
</tr>
<tr>
<td>Grec (Grèce)</td>
<td>el_GR</td>
</tr>
<tr>
<td>Grec</td>
<td>el</td>
</tr>
<tr>
<td>Hébreu (Israël)</td>
<td>iw_IL</td>
</tr>
<tr>
<td>Hébreu</td>
<td>iw</td>
</tr>
<tr>
<td>Hindi (Inde)</td>
<td>hi_IN</td>
</tr>
<tr>
<td>Hongrois (Hongrie)</td>
<td>hu_HU</td>
</tr>
<tr>
<td>Hongrois</td>
<td>hu</td>
</tr>
<tr>
<td>Islandais (Islande)</td>
<td>is_IS</td>
</tr>
<tr>
<td>Islandais</td>
<td>is</td>
</tr>
<tr>
<td>Indonésien (Indonésie)</td>
<td>in_ID</td>
</tr>
<tr>
<td>Indonésien</td>
<td>in</td>
</tr>
<tr>
<td>Irlandais (Irlande)</td>
<td>ga_IE</td>
</tr>
<tr>
<td>Irlandais</td>
<td>ga</td>
</tr>
<tr>
<td>Italien (Italie)</td>
<td>it_IT</td>
</tr>
<tr>
<td>Italien (Suisse)</td>
<td>it_CH</td>
</tr>
<tr>
<td>Italien</td>
<td>it</td>
</tr>
<tr>
<td>Japonais (Japon)</td>
<td>ja_JP</td>
</tr>
<tr>
<td>Japonais (Japon,JP)</td>
<td>ja_JP_JP</td>
</tr>
<tr>
<td>Japonais</td>
<td>ja</td>
</tr>
<tr>
<td>Coréen (Corée du Sud)</td>
<td>ko_KR</td>
</tr>
<tr>
<td>Coréen</td>
<td>ko</td>
</tr>
<tr>
<td>Letton (Lettonie)</td>
<td>lv_LV</td>
</tr>
<tr>
<td>Letton</td>
<td>lv</td>
</tr>
<tr>
<td>Lituanien (Lituanie)</td>
<td>lt_LT</td>
</tr>
<tr>
<td>Lituanien</td>
<td>lt</td>
</tr>
<tr>
<td>Macédonien (Macédoine)</td>
<td>mk_MK</td>
</tr>
<tr>
<td>Macédonien</td>
<td>mk</td>
</tr>
<tr>
<td>Malais (Malaisie)</td>
<td>ms_MY</td>
</tr>
<tr>
<td>Malais</td>
<td>ms</td>
</tr>
<tr>
<td>Maltais (Malte)</td>
<td>mt_MT</td>
</tr>
<tr>
<td>Maltais</td>
<td>mt</td>
</tr>
<tr>
<td>Norvégien (Norvège)</td>
<td>no_NO</td>
</tr>
<tr>
<td>Norvégien (Norvège, Nynorsk)</td>
<td>no_NO_NY</td>
</tr>
<tr>
<td>Norvégien</td>
<td>no</td>
</tr>
<tr>
<td>Polonais (Pologne)</td>
<td>pl_PL</td>
</tr>
<tr>
<td>Polonais</td>
<td>pl</td>
</tr>
<tr>
<td>Portugais (Brésil)</td>
<td>pt_BR</td>
</tr>
<tr>
<td>Portugais (Portugal)</td>
<td>pt_PT</td>
</tr>
<tr>
<td>Portugais</td>
<td>pt</td>
</tr>
<tr>
<td>Roumain (Roumanie)</td>
<td>ro_RO</td>
</tr>
<tr>
<td>Roumain</td>
<td>ro</td>
</tr>
<tr>
<td>Russe (Russie)</td>
<td>ru_RU</td>
</tr>
<tr>
<td>Russe</td>
<td>ru</td>
</tr>
<tr>
<td>Serbe (Bosnie-Herzégovine)</td>
<td>sr_BA</td>
</tr>
<tr>
<td>Serbe (Monténégro)</td>
<td>sr_ME</td>
</tr>
<tr>
<td>Serbe (Serbie et Monténégro)</td>
<td>sr_CS</td>
</tr>
<tr>
<td>Serbe (Serbie)</td>
<td>sr_RS</td>
</tr>
<tr>
<td>Serbe</td>
<td>sr</td>
</tr>
<tr>
<td>Slovaque (Slovaquie)</td>
<td>sk_SK</td>
</tr>
<tr>
<td>Slovaque</td>
<td>sk</td>
</tr>
<tr>
<td>Slovène (Slovénie)</td>
<td>sl_SI</td>
</tr>
<tr>
<td>Slovène</td>
<td>sl</td>
</tr>
<tr>
<td>Espagnol (Argentine)</td>
<td>es_AR</td>
</tr>
<tr>
<td>Espagnol (Bolivie)</td>
<td>es_BO</td>
</tr>
<tr>
<td>Espagnol (Chili)</td>
<td>es_CL</td>
</tr>
<tr>
<td>Espagnol (Colombie)</td>
<td>es_CO</td>
</tr>
<tr>
<td>Espagnol (Costa Rica)</td>
<td>es_CR</td>
</tr>
<tr>
<td>Espagnol (République dominicaine)</td>
<td>es_DO</td>
</tr>
<tr>
<td>Espagnol (Équateur)</td>
<td>es_EC</td>
</tr>
<tr>
<td>Espagnol (Salvador)</td>
<td>es_SV</td>
</tr>
<tr>
<td>Espagnol (Guatemala)</td>
<td>es_GT</td>
</tr>
<tr>
<td>Espagnol (Honduras)</td>
<td>es_HN</td>
</tr>
<tr>
<td>Espagnol (Mexique)</td>
<td>es_MX</td>
</tr>
<tr>
<td>Espagnol (Nicaragua)</td>
<td>es_NI</td>
</tr>
<tr>
<td>Espagnol (Panama)</td>
<td>es_PA</td>
</tr>
<tr>
<td>Espagnol (Paraguay)</td>
<td>es_PY</td>
</tr>
<tr>
<td>Espagnol (Pérou)</td>
<td>es_PE</td>
</tr>
<tr>
<td>Espagnol (Porto Rico)</td>
<td>es_PR</td>
</tr>
<tr>
<td>Espagnol (Espagne)</td>
<td>es_ES</td>
</tr>
<tr>
<td>Espagnol (États-Unis)</td>
<td>es_US</td>
</tr>
<tr>
<td>Espagnol (Uruguay)</td>
<td>es_UY</td>
</tr>
<tr>
<td>Espagnol (Venezuela)</td>
<td>es_VE</td>
</tr>
<tr>
<td>Espagnol</td>
<td>es</td>
</tr>
<tr>
<td>Suédois (Suède)</td>
<td>sv_SE</td>
</tr>
<tr>
<td>Suédois</td>
<td>sv</td>
</tr>
<tr>
<td>Thaï (Thaïlande)</td>
<td>th_TH</td>
</tr>
<tr>
<td>Thaï (Thaïlande,TH)</td>
<td>th_TH_TH</td>
</tr>
<tr>
<td>Thaï</td>
<td>th</td>
</tr>
<tr>
<td>Turc (Turquie)</td>
<td>tr_TR</td>
</tr>
<tr>
<td>Turc</td>
<td>tr</td>
</tr>
<tr>
<td>Ukrainien (Ukraine)</td>
<td>uk_UA</td>
</tr>
<tr>
<td>Ukrainien</td>
<td>uk</td>
</tr>
<tr>
<td>Vietnamien (Vietnam)</td>
<td>vi_VN</td>
</tr>
<tr>
<td>Vietnamien</td>
<td>vi</td>
</tr>
</tbody>
</table>]]>
    </content>
  </entry>
</feed>
