[
  {
    "id": "fr\/documentation",
    "page": " > Documentation",
    "title": "Documentation",
    "description": "Documentation du g\u00e9n\u00e9rateur de site statique Cecil.",
    "content": "Documentation du g\u00e9n\u00e9rateur de site statique Cecil.",
    "href": "fr\/documentation\/"  },
  {
    "id": "fr\/documentation\/assets\/images#image-srcset",
    "page": "Assets > Images",
    "title": "image_srcset",
    "description": "Construit l'attribut HTML img srcset (responsive) d'un \u00e9l\u00e9ment d'image.",
    "content": "Construit l'attribut HTML img srcset (responsive) d'un \u00e9l\u00e9ment d'image.\n{{ image_srcset(asset) }}\nExemples\u00a0:\n{% set asset = asset(image_path) %}\n<img src=\"{{ url(asset) }}\" width=\"{{ asset.width }}\" height=\"{{ asset.height }}\" alt=\"\" class=\"asset\" srcset=\"{{ image_srcset(asset) }}\" sizes=\"{{ image_sizes('asset') }}\">",
    "href": "fr\/documentation\/assets\/images\/#image-srcset"  },
  {
    "id": "fr\/documentation\/assets\/images#image-sizes",
    "page": "Assets > Images",
    "title": "image_sizes",
    "description": "Renvoie l'attribut HTML img sizes bas\u00e9 sur un nom de classe CSS.\nIl doit \u00eatre utilis\u00e9 conjointement avec la fonction image_srcset.",
    "content": "Renvoie l'attribut HTML img sizes bas\u00e9 sur un nom de classe CSS.\nIl doit \u00eatre utilis\u00e9 conjointement avec la fonction image_srcset.\n{{ image_sizes('class') }}\nExemples\u00a0:\n{% set asset = asset(image_path) %}\n<img src=\"{{ url(asset) }}\" width=\"{{ asset.width }}\" height=\"{{ asset.height }}\" alt=\"\" class=\"asset\" srcset=\"{{ image_srcset(asset) }}\" sizes=\"{{ image_sizes('asset') }}\">",
    "href": "fr\/documentation\/assets\/images\/#image-sizes"  },
  {
    "id": "fr\/documentation\/assets\/images#image-from-website",
    "page": "Assets > Images",
    "title": "image_from_website",
    "description": "Construit l'\u00e9l\u00e9ment HTML img \u00e0 partir d'une URL de site Web en extrayant son image d'illustration.\nRetourne null si aucune image n'est trouv\u00e9e.",
    "content": "Construit l'\u00e9l\u00e9ment HTML img \u00e0 partir d'une URL de site Web en extrayant son image d'illustration.\nRetourne null si aucune image n'est trouv\u00e9e.\n{{ image_from_website('url', {attributs}, {options}) }}\nL'image est recherch\u00e9e dans le HTML de la page avec les fallbacks suivants, le premier candidat pouvant \u00eatre t\u00e9l\u00e9charg\u00e9 en tant qu'image est utilis\u00e9\u00a0:\nOpen Graph\u00a0: og:image:secure_url, og:image, og:image:url\nTwitter\u00a0: twitter:image, twitter:image:src\n<link rel=\"image_src\">\nMicrodata\u00a0: itemprop=\"image\"\nJSON-LD\u00a0: propri\u00e9t\u00e9 image\nPremi\u00e8re <img> de <article>, <main> ou <body>\n<link rel=\"apple-touch-icon\">\n<link rel=\"icon\">\nLes URL relatives sont r\u00e9solues par rapport \u00e0 <base href> ou \u00e0 l'URL de la page.\nL'URL de l'image trouv\u00e9e et l'image t\u00e9l\u00e9charg\u00e9e sont mises en cache (voir cache.assets.remote.ttl).\nOptions\u00a0:\nfallback\u00a0: chemin (ou URL) de l'image utilis\u00e9e si aucune image n'est trouv\u00e9e\nautres options de image (ex.\u00a0: responsive, formats)\nExemples\u00a0:\n{{ image_from_website('https:\/\/example.com\/page-with-image.html') }}\n{# avec une image de fallback #}\n{{ image_from_website('https:\/\/example.com\/', {alt: 'Illustration'}, {fallback: 'images\/default.png'}) }}",
    "href": "fr\/documentation\/assets\/images\/#image-from-website"  },
  {
    "id": "fr\/documentation\/assets\/images#resize",
    "page": "Assets > Images",
    "title": "resize",
    "description": "Redimensionne une image \u00e0 une largeur (en pixels) ou\/et une hauteur (en pixels) sp\u00e9cifi\u00e9e.",
    "content": "Redimensionne une image \u00e0 une largeur (en pixels) ou\/et une hauteur (en pixels) sp\u00e9cifi\u00e9e.\nSi seule la largeur est sp\u00e9cifi\u00e9e, la hauteur est calcul\u00e9e pour conserver le rapport hauteur\/largeur\nSi seule la hauteur est sp\u00e9cifi\u00e9e, la largeur est calcul\u00e9e pour conserver le rapport hauteur\/largeur\nSi la largeur et la hauteur sont sp\u00e9cifi\u00e9es, l'image est redimensionn\u00e9e pour s'adapter aux dimensions donn\u00e9es, l'image est recadr\u00e9e et centr\u00e9e si n\u00e9cessaire\nSi Remove_animation est vrai, toute animation dans l'image (par exemple, GIF) sera supprim\u00e9e\n{{ asset(image_path)|resize(width: width, height: height, remove_animation: bool) }}\nLe fichier original n'est pas modifi\u00e9 et la version redimensionn\u00e9e est enregistr\u00e9e sous \/thumbnails\/<width>x<height>\/image.jpg.\nLes fichiers ICO sont support\u00e9s : la plus grande ic\u00f4ne est redimensionn\u00e9e et enregistr\u00e9e dans un fichier ICO \u00e0 ic\u00f4ne unique (compress\u00e9e en PNG). Les ic\u00f4nes stock\u00e9es en BMP avec une profondeur de couleur autre que 24 ou 32 bits n\u00e9cessitent l'extension PHP Imagick : \u00e0 d\u00e9faut, le fichier ICO original est conserv\u00e9 et un avertissement est journalis\u00e9.\nExemples\u00a0:\n{{ asset(page.image)|resize(300) }}\n{# equivalent to: #}\n{{ asset(page.image)|resize(width: 300) }}\n{# resizes to 300px width, height auto-calculated to preserve aspect ratio #}\n{{ asset(page.image)|resize(height: 200) }}\n{# resizes to 300px width and 200px height, and crops if necessary #}\n{{ asset(page.image)|resize(300, 200) }}\n{# removes any animation from the image #}\n{{ asset(page.image)|resize(width: 1200, height: 630, remove_animation: true) }}",
    "href": "fr\/documentation\/assets\/images\/#resize"  },
  {
    "id": "fr\/documentation\/assets\/images#cover",
    "page": "Assets > Images",
    "title": "cover",
    "description": "Redimensionne une image \u00e0 une largeur et une hauteur sp\u00e9cifi\u00e9es, en la recadrant si n\u00e9cessaire.",
    "content": "Redimensionne une image \u00e0 une largeur et une hauteur sp\u00e9cifi\u00e9es, en la recadrant si n\u00e9cessaire.\nLe filtre cover est obsol\u00e8te depuis la version 8.77 et sera supprim\u00e9 dans les versions futures. Utilisez plut\u00f4t le filtre resize, avec les param\u00e8tres de largeur et de hauteur.\n{{ asset(image_path)|cover(width, height) }}\nExemple:\n{{ asset(page.image)|cover(1200, 630) }}",
    "href": "fr\/documentation\/assets\/images\/#cover"  },
  {
    "id": "fr\/documentation\/assets\/images#maskable",
    "page": "Assets > Images",
    "title": "maskable",
    "description": "Ajoute un remplissage, en pourcentages, \u00e0 une image pour la rendre masquable.",
    "content": "Ajoute un remplissage, en pourcentages, \u00e0 une image pour la rendre masquable.\n{{ asset(image_path)|maskable(padding) }}\nExemple:\n{{ asset('icon.png')|maskable }}",
    "href": "fr\/documentation\/assets\/images\/#maskable"  },
  {
    "id": "fr\/documentation\/assets\/images#webp",
    "page": "Assets > Images",
    "title": "webp",
    "description": "Convertit une image au format WebP.",
    "content": "Convertit une image au format WebP.\nExemple:\n<picture>\n    <source type=\"image\/webp\" srcset=\"{{ asset(image_path)|webp }}\">\n    <img src=\"{{ url(asset(image_path)) }}\" width=\"{{ asset(image_path).width }}\" height=\"{{ asset(image_path).height }}\" alt=\"\">\n<\/picture>",
    "href": "fr\/documentation\/assets\/images\/#webp"  },
  {
    "id": "fr\/documentation\/assets\/images#avif",
    "page": "Assets > Images",
    "title": "avif",
    "description": "Convertit une image au format AVIF.",
    "content": "Convertit une image au format AVIF.\nExemple:\n<picture>\n    <source type=\"image\/avif\" srcset=\"{{ asset(image_path)|avif }}\">\n    <img src=\"{{ url(asset(image_path)) }}\" width=\"{{ asset(image_path).width }}\" height=\"{{ asset(image_path).height }}\" alt=\"\">\n<\/picture>",
    "href": "fr\/documentation\/assets\/images\/#avif"  },
  {
    "id": "fr\/documentation\/assets\/images#lqip",
    "page": "Assets > Images",
    "title": "lqip",
    "description": "Renvoie un espace r\u00e9serv\u00e9 pour une image de faible qualit\u00e9 (100 x 100 px, flou \u00e0 50 %) comme URL de donn\u00e9es.",
    "content": "Renvoie un espace r\u00e9serv\u00e9 pour une image de faible qualit\u00e9 (100 x 100 px, flou \u00e0 50 %) comme URL de donn\u00e9es.\n{{ asset(image_path)|lqip }}",
    "href": "fr\/documentation\/assets\/images\/#lqip"  },
  {
    "id": "fr\/documentation\/assets\/images#dominant-color",
    "page": "Assets > Images",
    "title": "dominant_color",
    "description": "Renvoie la couleur hexad\u00e9cimale dominante d'une image.",
    "content": "Renvoie la couleur hexad\u00e9cimale dominante d'une image.\n{{ asset(image_path)|dominant_color }}",
    "href": "fr\/documentation\/assets\/images\/#dominant-color"  },
  {
    "id": "fr\/documentation\/commands\/new-site",
    "page": "Commandes > new:site",
    "title": "new:site",
    "description": "Cr\u00e9e un nouveau site.",
    "content": "Cr\u00e9e un nouveau site.\nDescription:\n  Creates a new website\nUsage:\n  new:site [options] [--] [<path>]\nArguments:\n  path                  Use the given path as working directory\nOptions:\n  -f, --force           Override directory if it already exists\n      --demo            Add demo content (pages, templates and assets)\n  -h, --help            Display help for the given command. When no command is given display help for the list command\n  -q, --quiet           Do not output any message\n  -V, --version         Display this application version\n      --ansi|--no-ansi  Force (or disable --no-ansi) ANSI output\n  -n, --no-interaction  Do not ask any interactive question\n  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug\nHelp:\n  The new:site command creates a new website in the current directory, or in <path> if provided.\n  If you run this command without any options, it will ask you for the website title, baseline, base URL, description, etc.\ncecil.phar new:site\n    cecil.phar new:site path\/to\/the\/working\/directory\nTo create a new website with demo content, run:\ncecil.phar new:site --demo\nTo override an existing website, run:\ncecil.phar new:site --force",
    "href": "fr\/documentation\/commandes\/new-site\/"  },
  {
    "id": "fr\/documentation\/configuration\/site#title",
    "page": "Configuration > Options du site",
    "title": "title",
    "description": "Titre principal du site.",
    "content": "Titre principal du site.\ntitle: \"<site title>\"",
    "href": "fr\/documentation\/configuration\/site\/#title"  },
  {
    "id": "fr\/documentation\/configuration\/site#baseline",
    "page": "Configuration > Options du site",
    "title": "baseline",
    "description": "Description courte (~ 20 caract\u00e8res).",
    "content": "Description courte (~ 20 caract\u00e8res).\nbaseline: \"<baseline>\"",
    "href": "fr\/documentation\/configuration\/site\/#baseline"  },
  {
    "id": "fr\/documentation\/configuration\/site#baseurl",
    "page": "Configuration > Options du site",
    "title": "baseurl",
    "description": "URL de base.",
    "content": "URL de base.\nbaseurl: <url>\nExemple :\nbaseurl: http:\/\/localhost:8000\/\nbaseurl doit se terminer par un slash final (\/).",
    "href": "fr\/documentation\/configuration\/site\/#baseurl"  },
  {
    "id": "fr\/documentation\/configuration\/site#canonicalurl",
    "page": "Configuration > Options du site",
    "title": "canonicalurl",
    "description": "Si la valeur est true, la fonction url() renverra l\u2019URL absolue (false par d\u00e9faut).",
    "content": "Si la valeur est true, la fonction url() renverra l\u2019URL absolue (false par d\u00e9faut).\ncanonicalurl: <true|false> # false by default",
    "href": "fr\/documentation\/configuration\/site\/#canonicalurl"  },
  {
    "id": "fr\/documentation\/configuration\/site#description",
    "page": "Configuration > Options du site",
    "title": "description",
    "description": "Description du site (~ 250 caract\u00e8res).",
    "content": "Description du site (~ 250 caract\u00e8res).\ndescription: \"<description>\"",
    "href": "fr\/documentation\/configuration\/site\/#description"  },
  {
    "id": "fr\/documentation\/configuration\/site#menus",
    "page": "Configuration > Options du site",
    "title": "menus",
    "description": "Les menus sont utilis\u00e9s pour cr\u00e9er des liens de navigation dans les templates.",
    "content": "Les menus sont utilis\u00e9s pour cr\u00e9er des liens de navigation dans les templates.\nUn menu est compos\u00e9 d\u2019un identifiant unique et des propri\u00e9t\u00e9s des entr\u00e9es (nom, URL, poids).\nmenus:\n  <name>:\n    - id: <unique-id>   # unique identifier (required)\n      name: \"<name>\"    # name displayed in templates\n      url: <url>        # relative or absolute URL\n      weight: <integer> # integer value used to sort entries (lighter first)\nExemple :\nmenus:\n  main:\n    - id: about\n      name: \"About\"\n      url: \/about\/\n      weight: 1\n  footer:\n    - id: author\n      name: The author\n      url: https:\/\/arnaudligny.fr\n      weight: 99\nUn menu main est cr\u00e9\u00e9 automatiquement avec l\u2019entr\u00e9e de la page d\u2019accueil et toutes les entr\u00e9es de sections (Voir la gestion du contenu).\nUne page peut \u00eatre ajout\u00e9e \u00e0 un menu en d\u00e9finissant la variable menu dans son front matter.",
    "href": "fr\/documentation\/configuration\/site\/#menus"  },
  {
    "id": "fr\/documentation\/configuration\/site#surcharger-une-entree",
    "page": "Configuration > Options du site",
    "title": "Surcharger une entr\u00e9e",
    "description": "Une entr\u00e9e de menu de page peut \u00eatre surcharg\u00e9e : utilisez l\u2019ID de la page comme id.",
    "content": "Une entr\u00e9e de menu de page peut \u00eatre surcharg\u00e9e : utilisez l\u2019ID de la page comme id.\nExemple :\nmenus:\n  main:\n    - id: index\n      name: \"My amazing homepage!\"\n      weight: 1",
    "href": "fr\/documentation\/configuration\/site\/#surcharger-une-entree"  },
  {
    "id": "fr\/documentation\/configuration\/site#desactiver-une-entree",
    "page": "Configuration > Options du site",
    "title": "D\u00e9sactiver une entr\u00e9e",
    "description": "Une entr\u00e9e de menu peut \u00eatre d\u00e9sactiv\u00e9e avec enabled: false.",
    "content": "Une entr\u00e9e de menu peut \u00eatre d\u00e9sactiv\u00e9e avec enabled: false.\nExemple :\nmenus:\n  main:\n    - id: about\n      enabled: false",
    "href": "fr\/documentation\/configuration\/site\/#desactiver-une-entree"  },
  {
    "id": "fr\/documentation\/configuration\/site#taxonomies",
    "page": "Configuration > Options du site",
    "title": "taxonomies",
    "description": "Liste des vocabulaires, associant une valeur au pluriel \u00e0 une valeur au singulier.",
    "content": "Liste des vocabulaires, associant une valeur au pluriel \u00e0 une valeur au singulier.\ntaxonomies:\n  <plural>: <singular>\nExemple :\ntaxonomies:\n  categories: category\n  tags: tag\nVous pouvez ensuite utiliser ces vocabulaires dans le front matter de votre contenu.\nDepuis la version 8.37.0, les vocabulaires par d\u00e9faut category et tag ont \u00e9t\u00e9 supprim\u00e9s. Vous devez les d\u00e9finir dans le fichier de configuration si vous souhaitez les utiliser.\nUn vocabulaire peut \u00eatre d\u00e9sactiv\u00e9 avec la valeur sp\u00e9ciale disabled. Exemple : tags: disabled.",
    "href": "fr\/documentation\/configuration\/site\/#taxonomies"  },
  {
    "id": "fr\/documentation\/configuration\/site#theme",
    "page": "Configuration > Options du site",
    "title": "theme",
    "description": "Th\u00e8me \u00e0 utiliser, ou liste de th\u00e8mes.",
    "content": "Th\u00e8me \u00e0 utiliser, ou liste de th\u00e8mes.\ntheme: <theme> # theme name\n# or\ntheme:\n  - <theme1> # theme name\n  - <theme2>\nLe premier th\u00e8me surcharge les suivants, et ainsi de suite.\nExemples :\ntheme: hyde\ntheme:\n  - serviceworker\n  - hyde\nVoir les th\u00e8mes sur GitHub ou la section th\u00e8mes du site.",
    "href": "fr\/documentation\/configuration\/site\/#theme"  },
  {
    "id": "fr\/documentation\/configuration\/site#date",
    "page": "Configuration > Options du site",
    "title": "date",
    "description": "Format de date et fuseau horaire.",
    "content": "Format de date et fuseau horaire.\ndate:\n  format: <format>     # date format (optional, `F j, Y` by default)\n  timezone: <timezone> # date timezone (optional, local time zone by default)\nformat : sp\u00e9cificateur de format de date PHP\ntimezone : voir les fuseaux horaires\nExemple :\ndate:\n  format: 'j F, Y'\n  timezone: 'Europe\/Paris'",
    "href": "fr\/documentation\/configuration\/site\/#date"  },
  {
    "id": "fr\/documentation\/configuration\/site#metatags",
    "page": "Configuration > Options du site",
    "title": "metatags",
    "description": "Les metatags sont des aides SEO et r\u00e9seaux sociaux qui peuvent \u00eatre inject\u00e9es automatiquement dans le <head>, via le template partials\/metatags.html.twig.",
    "content": "Les metatags sont des aides SEO et r\u00e9seaux sociaux qui peuvent \u00eatre inject\u00e9es automatiquement dans le <head>, via le template partials\/metatags.html.twig.\nCe template ajoute les balises meta suivantes :\nTitre de page + titre du site, ou titre du site + baseline du site\nDescription de la page\/du site\nMots-cl\u00e9s de la page\/du site\nAuteur de la page\/du site\nDirectives des robots des moteurs de recherche (robots)\nLiens de favicon\nLiens de navigation (premier, pr\u00e9c\u00e9dent, suivant, dernier)\nURL canonique\nLiens alternatifs (ex. : flux RSS, autres langues)\nLiens rel=me\nOpen Graph\nIdentifiant de profil Facebook\nTwitter\/X Card\nFediverse tag\nDublin Core\nStructured data (JSON-LD)",
    "href": "fr\/documentation\/configuration\/site\/#metatags"  },
  {
    "id": "fr\/documentation\/configuration\/site#options-metatags",
    "page": "Configuration > Options du site",
    "title": "options metatags",
    "description": "Cecil utilise le front matter de la page pour alimenter les meta tags, avec repli sur les options du site si n\u00e9cessaire.",
    "content": "Cecil utilise le front matter de la page pour alimenter les meta tags, avec repli sur les options du site si n\u00e9cessaire.\ntitle: \"Page\/Site title\"              # used by title meta\ndescription: \"Page\/Site description\"  # used by description meta\ntags: [tag1, tag2]                    # used by keywords meta\nkeywords: [keyword1, keyword2]        # obsolete\nauthor:                               # used by author meta\n  name: <name>                          # author name\n  url: <url>                            # author URL\n  email: <email>                        # author email\nimage: image.jpg                      # used by Open Graph and social networks cards\ncanonical:                            # used to override the generated canonical URL\n  url: <URL>                            # absolute URL\n  title: \"<URL title>\"                  # optional canonical title\nsocial:                               # used by social networks meta\n  twitter:                              # used by Twitter\/X Card\n    url: <URL>                            # used for `rel=me` link\n    site: username                        # site username\n    creator: username                     # page author username\n  mastodon:                             # used by Mastodon meta\n    url: <URL>                            # used for `rel=me` link\n    creator: handle                       # page author account\n  facebook:                             # used by Facebook meta\n    url: <URL>                            # used for `rel=me` link\n    id: 123456789                         # Facebook profile ID\n    username: username                    # page author username\nSi besoin, title et image peuvent \u00eatre surcharg\u00e9s :\n{{ include('partials\/metatags.html.twig', {title: 'Custom title', image: og_image}) }}",
    "href": "fr\/documentation\/configuration\/site\/#options-metatags"  },
  {
    "id": "fr\/documentation\/configuration\/site#configuration-metatags",
    "page": "Configuration > Options du site",
    "title": "configuration metatags",
    "description": "",
    "content": "metatags:\n  title:                   # title options\n    divider: \" &middot; \"    # string between page title and site title\n    only: false              # displays page title only (`false` by default)\n    pagination:              # pagination options\n      shownumber: true         # displays page number in title (`true` by default)\n      label: \"Page %s\"         # how to display page number (`Page %s` by default)\n  robots: \"index,follow\"   # web crawlers directives (`index,follow` by default)\n  favicon:                 # favicon options\n    enabled: true            # includes favicon (`true` by default)\n    image: favicon.png       # path to favicon image\n    sizes:                   # sizes by device\n      - \"icon\": [32, 57, 76, 96, 128, 192, 228]  # web browsers\n      - \"shortcut icon\": [196]                   # Android\n      - \"apple-touch-icon\": [120, 152, 180]      # iOS\n  navigation: true         # includes previous and next links (`true` by default)\n  image: true              # includes image (`true` by default)\n  og: true                 # includes Open Graph meta tags (`true` by default)\n  articles: \"blog\"         # articles' section (`blog` by default)\n  twitter: true            # includes Twitter\/X Card meta tags (`true` by default)\n  mastodon: true           # includes Mastodon meta tags (`true` by default)\n  dc: false                # includes Dublin Core meta tags (`false` by default)\n  data: false              # includes JSON-LD structured data (`false` by default)",
    "href": "fr\/documentation\/configuration\/site\/#configuration-metatags"  },
  {
    "id": "fr\/documentation\/configuration\/site#debug",
    "page": "Configuration > Options du site",
    "title": "debug",
    "description": "Active le mode debug, utilis\u00e9 pour afficher des informations de d\u00e9bogage comme des journaux tr\u00e8s verbeux, le dump Twig, le profileur Twig, le sourcemap SCSS, etc.",
    "content": "Active le mode debug, utilis\u00e9 pour afficher des informations de d\u00e9bogage comme des journaux tr\u00e8s verbeux, le dump Twig, le profileur Twig, le sourcemap SCSS, etc.\ndebug: true\nIl existe deux autres fa\u00e7ons d\u2019activer le mode debug :\nEx\u00e9cuter une commande avec l\u2019option -vvv\nD\u00e9finir la variable d\u2019environnement CECIL_DEBUG \u00e0 true",
    "href": "fr\/documentation\/configuration\/site\/#debug"  },
  {
    "id": "fr\/documentation\/content\/pages",
    "page": "Contenu > Pages et sections",
    "title": "Pages et sections",
    "description": "Une page est un fichier compos\u00e9 d\u2019un front matter et d\u2019un body.",
    "content": "Une page est un fichier compos\u00e9 d\u2019un front matter et d\u2019un body.",
    "href": "fr\/documentation\/contenu\/pages\/"  },
  {
    "id": "fr\/documentation\/content\/pages#front-matter",
    "page": "Contenu > Pages et sections",
    "title": "Front matter",
    "description": "Le front matter est une collection de variables (au format cl\u00e9\/valeur) entour\u00e9e par ---.",
    "content": "Le front matter est une collection de variables (au format cl\u00e9\/valeur) entour\u00e9e par ---.\nExemple :\n---\ntitle: \"The title\"\ndate: 2019-02-21\ntags: [tag 1, tag 2]\ncustomvar: \"Value of customvar\"\n---\nVous pouvez aussi utiliser <!-- --> ou +++ comme s\u00e9parateur.",
    "href": "fr\/documentation\/contenu\/pages\/#front-matter"  },
  {
    "id": "fr\/documentation\/content\/pages#corps-body",
    "page": "Contenu > Pages et sections",
    "title": "Corps (body)",
    "description": "Le body est le contenu principal d\u2019une page ; il peut \u00eatre \u00e9crit en Markdown ou en texte brut.",
    "content": "Le body est le contenu principal d\u2019une page ; il peut \u00eatre \u00e9crit en Markdown ou en texte brut.\nExemple :\n# Header\n[toc]\n## Sub-Header 1\nLorem ipsum dolor [sit amet](https:\/\/example.com), consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n<!-- excerpt -->\nUt enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n## Sub-Header 2\n![Description](\/image.jpg \"Title\")\n## Sub-Header 3\n:::tip\nThis is advice.\n:::",
    "href": "fr\/documentation\/contenu\/pages\/#corps-body"  },
  {
    "id": "fr\/documentation\/content\/pages#prefixe-de-fichier",
    "page": "Contenu > Pages et sections",
    "title": "Pr\u00e9fixe de fichier",
    "description": "Le nom de fichier peut contenir un pr\u00e9fixe pour d\u00e9finir les variables date ou weight de la page (utilis\u00e9 par sortby).",
    "content": "Le nom de fichier peut contenir un pr\u00e9fixe pour d\u00e9finir les variables date ou weight de la page (utilis\u00e9 par sortby).\nS\u00e9parateurs de pr\u00e9fixe par d\u00e9faut : _ et -.\nVous pouvez les personnaliser avec l\u2019option pages.prefix.separator.",
    "href": "fr\/documentation\/contenu\/pages\/#prefixe-de-fichier"  },
  {
    "id": "fr\/documentation\/content\/pages#date",
    "page": "Contenu > Pages et sections",
    "title": "date",
    "description": "Le date prefix est utilis\u00e9 pour d\u00e9finir la date de la page et doit \u00eatre un format de date valide (c.-\u00e0-d. : \u00ab YYYY-MM-DD \u00bb).",
    "content": "Le date prefix est utilis\u00e9 pour d\u00e9finir la date de la page et doit \u00eatre un format de date valide (c.-\u00e0-d. : \u00ab YYYY-MM-DD \u00bb).\nExemple :\nDans \u00ab 2019-04-23_My blog post.md \u00bb :\nle pr\u00e9fixe est \u00ab 2019-04-23 \u00bb\nla date de la page est \u00ab 2019-04-23 \u00bb\nle title de la page est \u00ab My blog post \u00bb",
    "href": "fr\/documentation\/contenu\/pages\/#date"  },
  {
    "id": "fr\/documentation\/content\/pages#weight",
    "page": "Contenu > Pages et sections",
    "title": "weight",
    "description": "Le weight prefix est utilis\u00e9 pour d\u00e9finir l\u2019ordre de tri de la page et doit \u00eatre une valeur enti\u00e8re valide.",
    "content": "Le weight prefix est utilis\u00e9 pour d\u00e9finir l\u2019ordre de tri de la page et doit \u00eatre une valeur enti\u00e8re valide.\nExemple :\nDans \u00ab 1_The first project.md \u00bb :\nle pr\u00e9fixe est \u00ab 1 \u00bb\nle weight de la page est \u00ab 1 \u00bb\nle title de la page est \u00ab The first project \u00bb",
    "href": "fr\/documentation\/contenu\/pages\/#weight"  },
  {
    "id": "fr\/documentation\/content\/pages#section",
    "page": "Contenu > Pages et sections",
    "title": "Section",
    "description": "Certaines variables d\u00e9di\u00e9es peuvent \u00eatre utilis\u00e9es dans une Section personnalis\u00e9e (c.-\u00e0-d. : <section>\/index.md).",
    "content": "Certaines variables d\u00e9di\u00e9es peuvent \u00eatre utilis\u00e9es dans une Section personnalis\u00e9e (c.-\u00e0-d. : <section>\/index.md).",
    "href": "fr\/documentation\/contenu\/pages\/#section"  },
  {
    "id": "fr\/documentation\/content\/pages#sortby",
    "page": "Contenu > Pages et sections",
    "title": "sortby",
    "description": "L\u2019ordre des pages dans une Section peut \u00eatre modifi\u00e9.",
    "content": "L\u2019ordre des pages dans une Section peut \u00eatre modifi\u00e9.\nValeurs disponibles :\ndate: plus r\u00e9centes en premier\ntitle: ordre alphab\u00e9tique\nweight: plus l\u00e9ger en premier\nExemple :\n---\nsortby: title\n---\nMore options:\n---\nsortby:\n  variable: date    # \"date\", \"updated\", \"title\" or \"weight\"\n  desc_title: false # used with \"date\" or \"updated\" variable value to sort by desc title order if items have the same date\n  reverse: false    # reversed if true\n---",
    "href": "fr\/documentation\/contenu\/pages\/#sortby"  },
  {
    "id": "fr\/documentation\/content\/pages#pagination",
    "page": "Contenu > Pages et sections",
    "title": "pagination",
    "description": "La configuration globale de pagination est utilis\u00e9e par d\u00e9faut, mais vous pouvez la modifier pour une Section donn\u00e9e.",
    "content": "La configuration globale de pagination est utilis\u00e9e par d\u00e9faut, mais vous pouvez la modifier pour une Section donn\u00e9e.\nExemple :\n---\npagination:\n  max: 5\n  path: \"page\"\n---\nLa pagination peut \u00eatre d\u00e9sactiv\u00e9e pour une Section :\n---\npagination: false\n---",
    "href": "fr\/documentation\/contenu\/pages\/#pagination"  },
  {
    "id": "fr\/documentation\/content\/pages#cascade",
    "page": "Contenu > Pages et sections",
    "title": "cascade",
    "description": "Toutes les variables de cascade sont ajout\u00e9es au front matter de toutes les sous-pages.",
    "content": "Toutes les variables de cascade sont ajout\u00e9es au front matter de toutes les sous-pages.\nExemple :\n---\ncascade:\n  banner: image.jpg\n---\nLes variables existantes ne sont pas \u00e9cras\u00e9es.",
    "href": "fr\/documentation\/contenu\/pages\/#cascade"  },
  {
    "id": "fr\/documentation\/content\/pages#circular",
    "page": "Contenu > Pages et sections",
    "title": "circular",
    "description": "D\u00e9finissez circular \u00e0 true pour activer la navigation circulaire avec page.<prev\/next>.",
    "content": "D\u00e9finissez circular \u00e0 true pour activer la navigation circulaire avec page.<prev\/next>.\nAvec des sous-sections, seule la valeur circular de la Section de premier niveau est utilis\u00e9e.\nExemple :\n---\ncircular: true\n---",
    "href": "fr\/documentation\/contenu\/pages\/#circular"  },
  {
    "id": "fr\/documentation\/content\/pages#sous-section",
    "page": "Contenu > Pages et sections",
    "title": "Sous-section",
    "description": "Un dossier imbriqu\u00e9 qui contient explicitement un fichier index.md devient une sous-section de sa Section parente.",
    "content": "Un dossier imbriqu\u00e9 qui contient explicitement un fichier index.md devient une sous-section de sa Section parente.\n<monsiteweb>\n\u2514\u2500 pages\n   \u2514\u2500 blog                 <- Section\n      \u251c\u2500 index.md\n      \u251c\u2500 post-1.md         <- Page de la Section \u00ab blog \u00bb\n      \u2514\u2500 2024              <- Sous-section (contient un \u00ab index.md \u00bb)\n         \u251c\u2500 index.md\n         \u2514\u2500 post-2.md      <- Page de la Section \u00ab blog \u00bb *et* de la sous-section \u00ab blog\/2024 \u00bb\nUne sous-section :\nest une Section (m\u00eame type, m\u00eames variables et m\u00eame r\u00e9solution de gabarit) accessible \u00e0 sa propre URL (ex. : \/blog\/2024\/)\nest rendue avec les gabarits de ses Sections parentes si elle n'a pas les siens (ex. : blog\/list.html.twig)\npeut \u00eatre imbriqu\u00e9e \u00e0 n'importe quelle profondeur (ex. : blog\/2024\/06\/)\nliste ses propres pages, et ses pages appartiennent aussi \u00e0 chacune de leurs Sections parentes\nn'est pas list\u00e9e dans sa Section parente\nest plac\u00e9e dans la navigation page.<prev\/next> de sa Section parente (selon son sortby), suivie de ses propres pages\nUn dossier imbriqu\u00e9 sans fichier index.md n'est pas une sous-section : ses pages appartiennent simplement \u00e0 la Section parente.",
    "href": "fr\/documentation\/contenu\/pages\/#sous-section"  },
  {
    "id": "fr\/documentation\/content\/pages#page-d-accueil",
    "page": "Contenu > Pages et sections",
    "title": "Page d'accueil",
    "description": "Comme une autre section, la Page d'accueil prend en charge la configuration sortby et pagination.",
    "content": "Comme une autre section, la Page d'accueil prend en charge la configuration sortby et pagination.",
    "href": "fr\/documentation\/contenu\/pages\/#page-d-accueil"  },
  {
    "id": "fr\/documentation\/content\/pages#pagesfrom",
    "page": "Contenu > Pages et sections",
    "title": "pagesfrom",
    "description": "D\u00e9finissez un nom de Section valide dans pagesfrom pour utiliser la collection de pages de cette Section dans la Page d'accueil.",
    "content": "D\u00e9finissez un nom de Section valide dans pagesfrom pour utiliser la collection de pages de cette Section dans la Page d'accueil.\nExemple :\n---\npagesfrom: blog\n---",
    "href": "fr\/documentation\/contenu\/pages\/#pagesfrom"  },
  {
    "id": "fr\/documentation\/deploy\/jamstack-platforms#netlify",
    "page": "D\u00e9ployer > Plateformes Jamstack",
    "title": "Netlify",
    "description": "",
    "content": "Une puissante plateforme serverless avec un flux de travail intuitif bas\u00e9 sur Git. D\u00e9ploiements automatis\u00e9s, aper\u00e7us partageables, et bien plus encore.\n\u27a1\ufe0f https:\/\/www.netlify.com\nnetlify.toml:\n[build]\n  publish = \"_site\"\n  command = \"curl -sSOL https:\/\/cecil.app\/build.sh && bash .\/build.sh\"\n[context.production.environment]\n  CECIL_ENV = \"production\"\n[context.deploy-preview.environment]\n  CECIL_ENV = \"preview\"\nDocumentation officielle",
    "href": "fr\/documentation\/deployer\/plateformes-jamstack\/#netlify"  },
  {
    "id": "fr\/documentation\/deploy\/jamstack-platforms#vercel",
    "page": "D\u00e9ployer > Plateformes Jamstack",
    "title": "Vercel",
    "description": "",
    "content": "Vercel associe une excellente exp\u00e9rience d\u00e9veloppeur \u00e0 une attention obsessionnelle port\u00e9e aux performances c\u00f4t\u00e9 utilisateur final.\n\u27a1\ufe0f https:\/\/vercel.com\nvercel.json:\n{\n  \"buildCommand\": \"curl -sSOL https:\/\/cecil.app\/build.sh && bash .\/build.sh\",\n  \"outputDirectory\": \"_site\"\n}\nDocumentation officielle",
    "href": "fr\/documentation\/deployer\/plateformes-jamstack\/#vercel"  },
  {
    "id": "fr\/documentation\/deploy\/jamstack-platforms#statichost",
    "page": "D\u00e9ployer > Plateformes Jamstack",
    "title": "statichost",
    "description": "",
    "content": "H\u00e9bergement moderne de sites statiques avec des serveurs europ\u00e9ens et absolument aucune collecte de donn\u00e9es personnelles !\n\u27a1\ufe0f https:\/\/statichost.eu\nstatichost.yml:\nimage: wordpress:cli-php8.4\ncommand: curl -sSOL https:\/\/cecil.app\/build.sh && bash .\/build.sh\npublic: _site\nDocumentation officielle",
    "href": "fr\/documentation\/deployer\/plateformes-jamstack\/#statichost"  },
  {
    "id": "fr\/documentation\/deploy\/jamstack-platforms#cloudflare-pages",
    "page": "D\u00e9ployer > Plateformes Jamstack",
    "title": "Cloudflare Pages",
    "description": "",
    "content": "Cloudflare Pages ne prend plus en charge PHP.\nCloudflare Pages est une plateforme JAMstack qui permet aux d\u00e9veloppeurs frontend de collaborer et de d\u00e9ployer des sites web.\n\u27a1\ufe0f https:\/\/pages.cloudflare.com\nConfigurations de build :\nPr\u00e9r\u00e9glage de framework : None\nCommande de build : curl -sSOL https:\/\/cecil.app\/build.sh && bash .\/build.sh\nR\u00e9pertoire de sortie du build : _site\nDocumentation officielle",
    "href": "fr\/documentation\/deployer\/plateformes-jamstack\/#cloudflare-pages"  },
  {
    "id": "fr\/documentation\/deploy\/jamstack-platforms#render",
    "page": "D\u00e9ployer > Plateformes Jamstack",
    "title": "Render",
    "description": "",
    "content": "Render ne prend plus en charge PHP.\nRender est un cloud unifi\u00e9 pour cr\u00e9er et ex\u00e9cuter toutes vos applications et tous vos sites web, avec certificats TLS gratuits, CDN global, r\u00e9seaux priv\u00e9s et d\u00e9ploiements automatiques depuis Git.\n\u27a1\ufe0f https:\/\/render.com\nrender.yaml:\npreviewsEnabled: true\nservices:\n  - type: web\n    name: Cecil\n    env: static\n    buildCommand: curl -sSOL https:\/\/cecil.app\/build.sh && bash .\/build.sh\n    staticPublishPath: _site\n    pullRequestPreviewsEnabled: true\nDocumentation officielle",
    "href": "fr\/documentation\/deployer\/plateformes-jamstack\/#render"  },
  {
    "id": "fr\/documentation\/developers\/extend",
    "page": "D\u00e9veloppeurs > \u00c9tendre",
    "title": "\u00c9tendre",
    "description": "Comme Cecil repose sur PHP, il est facile d'en \u00e9tendre les capacit\u00e9s.",
    "content": "Comme Cecil repose sur PHP, il est facile d'en \u00e9tendre les capacit\u00e9s.",
    "href": "fr\/documentation\/developpeurs\/etendre\/"  },
  {
    "id": "fr\/documentation\/developers\/extend#generateur-de-pages",
    "page": "D\u00e9veloppeurs > \u00c9tendre",
    "title": "G\u00e9n\u00e9rateur de pages",
    "description": "Un g\u00e9n\u00e9rateur permet de cr\u00e9er des pages sans fichiers Markdown (avec des donn\u00e9es provenant d'une API ou d'une base de donn\u00e9es, par exemple), ou de modifier des pages existantes.",
    "content": "Un g\u00e9n\u00e9rateur permet de cr\u00e9er des pages sans fichiers Markdown (avec des donn\u00e9es provenant d'une API ou d'une base de donn\u00e9es, par exemple), ou de modifier des pages existantes.\nCr\u00e9ez simplement une nouvelle classe PHP dans l'espace de noms Cecil\\Generator, puis ajoutez le nom de la classe \u00e0 la liste pages.generators.\nExemple:\n\/extensions\/Cecil\/Generator\/DummyPage.php\n<?php\nnamespace Cecil\\Generator;\nuse Cecil\\Collection\\Page\\Page;\nuse Cecil\\Collection\\Page\\Type;\nclass DummyPage extends AbstractGenerator implements GeneratorInterface\n{\n    public function generate(): void\n    {\n        \/\/ create a new page $page, then add it to the site collection\n        $page = (new Page('my-page'))\n            ->setType(Type::PAGE->value)\n            ->setPath('mypage')\n            ->setBodyHtml('<p>My page body<\/p>')\n            ->setVariable('language', 'en')\n            ->setVariable('title', 'My page')\n            ->setVariable('date', now())\n            ->setVariable('menu', ['main' => ['weight' => 99]]);\n        $this->generatedPages->add($page);\n    }\n}\n\/extensions\/Cecil\/Generator\/Database.php\n<?php\nnamespace Cecil\\Generator;\nuse Cecil\\Collection\\Page\\Page;\nuse Cecil\\Collection\\Page\\Type;\nclass Database extends AbstractGenerator implements GeneratorInterface\n{\n    public function generate(): void\n    {\n        \/\/ create pages from a SQLite database\n        $db = new SQLite3('database.sqlite');\n        $statement = $db->prepare('SELECT * FROM blog');\n        $result = $statement->execute();\n        while ($row = $result->fetchArray(SQLITE3_ASSOC)) {\n            $page = (new Page($row['page-id']))\n                ->setType(Type::PAGE->value)\n                ->setPath($row['path'])\n                ->setBodyHtml($row['html'])\n                ->setVariable('title', $row['title'])\n                ->setVariable('date', $row['date']);\n            $this->generatedPages->add($page);\n        }\n        $result->finalize();\n        $db->close();\n    }\n}\nconfiguration\npages:\n  generators:\n    # priority: class name\n    99: Cecil\\Generator\\DummyPage\n    35: Cecil\\Generator\\Database",
    "href": "fr\/documentation\/developpeurs\/etendre\/#generateur-de-pages"  },
  {
    "id": "fr\/documentation\/developers\/extend#extension-twig",
    "page": "D\u00e9veloppeurs > \u00c9tendre",
    "title": "Extension Twig",
    "description": "Vous pouvez ajouter des fonctions et des filtres personnalis\u00e9s :",
    "content": "Vous pouvez ajouter des fonctions et des filtres personnalis\u00e9s :\ncr\u00e9ez une extension Twig dans l'espace de noms Cecil\\Renderer\\Extension\najoutez le fichier PHP dans le r\u00e9pertoire extensions\najoutez le nom de la classe \u00e0 la configuration\nExemple:\n\/extensions\/Cecil\/Renderer\/Extension\/MyTwigExtension.php\n<?php\nnamespace Cecil\\Renderer\\Extension;\nclass MyTwigExtension extends \\Twig\\Extension\\AbstractExtension\n{\n    public function getFilters()\n    {\n        \/\/ add a new filter named 'md5'\n        return [\n            new \\Twig\\TwigFilter('md5', 'md5'),\n        ];\n    }\n}\nconfiguration\nlayouts:\n  extensions:\n    MyExtension: Cecil\\Renderer\\Extension\\MyTwigExtension",
    "href": "fr\/documentation\/developpeurs\/etendre\/#extension-twig"  },
  {
    "id": "fr\/documentation\/developers\/extend#post-processeur-de-rendu",
    "page": "D\u00e9veloppeurs > \u00c9tendre",
    "title": "Post-processeur de rendu",
    "description": "Vous pouvez post-traiter le rendu des pages.",
    "content": "Vous pouvez post-traiter le rendu des pages.\nCr\u00e9ez simplement une nouvelle classe PHP dans l'espace de noms Cecil\\Renderer\\PostProcessor et ajoutez le nom de la classe \u00e0 la liste output.postprocessors.\nExemple:\n\/extensions\/Cecil\/Renderer\/PostProcessor\/MyProcessor.php\n<?php\nnamespace Cecil\\Renderer\\PostProcessor;\nuse Cecil\\Collection\\Page\\Page;\nclass MyProcessor extends AbstractPostProcessor\n{\n    public function process(Page $page, string $output, string $format): string\n    {\n        \/\/ add a meta tag to the head of the HTML output\n        if ($format == 'html') {\n            if (!preg_match('\/<meta name=\"test\".*\/i', $output)) {\n                $meta = \\sprintf('<meta name=\"test\" content=\"Test\">');\n                $output = preg_replace_callback('\/([[:blank:]]*)(<\\\/head>)\/i', function ($matches) use ($meta) {\n                    return str_repeat($matches[1] ?: ' ', 2) . $meta . \"\\n\" . $matches[1] . $matches[2];\n                }, $output);\n            }\n        }\nreturn $output;\n    }\n}\nconfiguration\noutput:\n  postprocessors:\n    MyProcessor: Cecil\\Renderer\\PostProcessor\\MyProcessor",
    "href": "fr\/documentation\/developpeurs\/etendre\/#post-processeur-de-rendu"  },
  {
    "id": "fr\/documentation\/getting-started\/quick-start#creer-un-site-web",
    "page": "Bien d\u00e9marrer > D\u00e9marrage rapide",
    "title": "Cr\u00e9er un site web",
    "description": "Vous pouvez cr\u00e9er un nouveau site web en quelques minutes.",
    "content": "Vous pouvez cr\u00e9er un nouveau site web en quelques minutes.\nSuivez les \u00e9tapes ci-dessous pour cr\u00e9er votre premier site web Cecil.\nD\u00e9mo du r\u00e9sultat attendu : https:\/\/cecilapp.github.io\/skeleton\/.",
    "href": "fr\/documentation\/bien-demarrer\/demarrage-rapide\/#creer-un-site-web"  },
  {
    "id": "fr\/documentation\/getting-started\/quick-start#prerequis",
    "page": "Bien d\u00e9marrer > D\u00e9marrage rapide",
    "title": "Pr\u00e9requis",
    "description": "",
    "content": "PHP 8.3+\nTerminal (une compr\u00e9hension de base du terminal)\n\u00c9diteur de texte, comme VS Code et\/ou Typora",
    "href": "fr\/documentation\/bien-demarrer\/demarrage-rapide\/#prerequis"  },
  {
    "id": "fr\/documentation\/getting-started\/quick-start#1-telecharger-cecil",
    "page": "Bien d\u00e9marrer > D\u00e9marrage rapide",
    "title": "1. T\u00e9l\u00e9charger Cecil",
    "description": "T\u00e9l\u00e9chargez cecil.phar depuis votre terminal:",
    "content": "T\u00e9l\u00e9chargez cecil.phar depuis votre terminal:\ncurl -LO https:\/\/cecil.app\/cecil.phar\nVous pouvez \u00e9galement t\u00e9l\u00e9charger Cecil manuellement, ou utiliser :\nHomebrew: brew install cecilapp\/tap\/cecil\nScoop: scoop install https:\/\/cecil.app\/scoop\/cecil.json",
    "href": "fr\/documentation\/bien-demarrer\/demarrage-rapide\/#1-telecharger-cecil"  },
  {
    "id": "fr\/documentation\/getting-started\/quick-start#2-creer-un-nouveau-site",
    "page": "Bien d\u00e9marrer > D\u00e9marrage rapide",
    "title": "2. Cr\u00e9er un nouveau site",
    "description": "Cr\u00e9ez un r\u00e9pertoire pour le site Web (ex : <monsiteweb>), placez y cecil.phar, puis ex\u00e9cutez la commande new:site :",
    "content": "Cr\u00e9ez un r\u00e9pertoire pour le site Web (ex : <monsiteweb>), placez y cecil.phar, puis ex\u00e9cutez la commande new:site :\nphp cecil.phar new:site",
    "href": "fr\/documentation\/bien-demarrer\/demarrage-rapide\/#2-creer-un-nouveau-site"  },
  {
    "id": "fr\/documentation\/getting-started\/quick-start#3-ajouter-une-page",
    "page": "Bien d\u00e9marrer > D\u00e9marrage rapide",
    "title": "3. Ajouter une page",
    "description": "Ex\u00e9cutez la commande new:page :",
    "content": "Ex\u00e9cutez la commande new:page :\nphp cecil.phar new:page\nVous pouvez maintenant modifier la page nouvellement cr\u00e9\u00e9e avec votre \u00e9diteur Markdown : <monsiteweb>\/pages\/<nouvelle-page>.md.\nNous vous recommandons d\u2019utiliser Typora pour \u00e9diter vos fichiers Markdown.",
    "href": "fr\/documentation\/bien-demarrer\/demarrage-rapide\/#3-ajouter-une-page"  },
  {
    "id": "fr\/documentation\/getting-started\/quick-start#4-verifier-l-apercu",
    "page": "Bien d\u00e9marrer > D\u00e9marrage rapide",
    "title": "4. V\u00e9rifier l\u2019aper\u00e7u",
    "description": "Ex\u00e9cutez la commande suivante pour cr\u00e9er un aper\u00e7u du site Web :",
    "content": "Ex\u00e9cutez la commande suivante pour cr\u00e9er un aper\u00e7u du site Web :\nphp cecil.phar serve\nNaviguez ensuite sur http:\/\/localhost:8000.\nLa commande serve d\u00e9marre un serveur HTTP local et un observateur : si un fichier (une page, un template ou la config) est modifi\u00e9, la page active du navigateur est automatiquement recharg\u00e9e.",
    "href": "fr\/documentation\/bien-demarrer\/demarrage-rapide\/#4-verifier-l-apercu"  },
  {
    "id": "fr\/documentation\/getting-started\/quick-start#5-generer-et-deployer",
    "page": "Bien d\u00e9marrer > D\u00e9marrage rapide",
    "title": "5. G\u00e9n\u00e9rer et d\u00e9ployer",
    "description": "Quand vous \u00eates satisfait du r\u00e9sultat, vous pouvez g\u00e9n\u00e9rer le site afin de le d\u00e9ployer sur le Web.",
    "content": "Quand vous \u00eates satisfait du r\u00e9sultat, vous pouvez g\u00e9n\u00e9rer le site afin de le d\u00e9ployer sur le Web.\nEx\u00e9cutez la commande suivante pour g\u00e9n\u00e9rer le site :\nphp cecil.phar build\nVous pouvez maintenant copier le contenu du r\u00e9pertoire _site sur un serveur Web \ud83c\udf89",
    "href": "fr\/documentation\/bien-demarrer\/demarrage-rapide\/#5-generer-et-deployer"  },
  {
    "id": "fr\/documentation\/getting-started",
    "page": " > Bien d\u00e9marrer",
    "title": "Bien d\u00e9marrer",
    "description": "Cecil est une application en ligne de commande, propuls\u00e9e par PHP, qui fusionne des fichiers textes plats (\u00e9crit en Markdown), des images et des templates Twig afin de g\u00e9n\u00e9rer un site statique.",
    "content": "Cecil est une application en ligne de commande, propuls\u00e9e par PHP, qui fusionne des fichiers textes plats (\u00e9crit en Markdown), des images et des templates Twig afin de g\u00e9n\u00e9rer un site statique.",
    "href": "fr\/documentation\/bien-demarrer\/"  },
  {
    "id": "fr\/documentation\/templates\/lookup-rules#types-de-templates",
    "page": "Templates > Organisation et r\u00e8gles de recherche",
    "title": "Types de templates",
    "description": "Il existe trois types de templates, layouts, components et autres templates\u00a0: layouts sont utilis\u00e9s pour afficher les pages, et chacun d'eux peut inclure des templates et components.",
    "content": "Il existe trois types de templates, layouts, components et autres templates\u00a0: layouts sont utilis\u00e9s pour afficher les pages, et chacun d'eux peut inclure des templates et components.",
    "href": "fr\/documentation\/templates\/regles-de-recherche\/#types-de-templates"  },
  {
    "id": "fr\/documentation\/templates\/lookup-rules#convention-de-nommage",
    "page": "Templates > Organisation et r\u00e8gles de recherche",
    "title": "Convention de nommage",
    "description": "Les fichiers templates sont stock\u00e9s dans le r\u00e9pertoire layouts\/ et doivent \u00eatre nomm\u00e9s selon la convention suivante\u00a0:",
    "content": "Les fichiers templates sont stock\u00e9s dans le r\u00e9pertoire layouts\/ et doivent \u00eatre nomm\u00e9s selon la convention suivante\u00a0:\nlayouts\/(<section>\/)<type>|<layout>.<format>(.<language>).twig\n<section> (facultatif)\nLa section de la page (ex.\u00a0: blog).\n<type>\nLe type de page\u00a0: home (ou index) pour homepage, list pour list, page pour page, etc. (Voir R\u00e8gles de recherche pour plus de d\u00e9tails).\n<layout> (facultatif)\nLe nom de la layout personnalis\u00e9e d\u00e9fini dans le front-matter de la page (par exemple\u00a0: layout: my-layout).\n<format>\nLe format de sortie de la page rendue (par exemple\u00a0: html, rss, json, xml, etc.).\n<language> (facultatif)\nLa langue de la page (ex. : fr).\nExemples\u00a0:\nlayouts\/home.html.twig       # `type` est \"homepage\"\nlayouts\/page.html.twig       # `type` est \"page\"\nlayouts\/page.html.fr.twig    # `type` est \"page\" et `language` est \"fr\"\nlayouts\/my-layout.html.twig  # `layout` est \"my-layout\"\nlayouts\/blog\/list.html.twig  # `section` est \"blog\"\nlayouts\/blog\/list.rss.twig   # `section` est \"blog\" et `format` est \"rss\"\n<mon-site>\n\u251c\u2500 ...\n\u251c\u2500 layouts\n|  \u251c\u2500 index.html.twig      # Utilis\u00e9 par le type \"homepage\"\n|  \u251c\u2500 list.html.twig       # Utilis\u00e9 par les types \"homepage\" et \"section\"\n|  \u251c\u2500 list.rss.twig        # Utilis\u00e9 par les types \"homepage\" et \"section\", pour le format de sortie RSS\n|  \u251c\u2500 page.html.twig       # Utilis\u00e9 par le type \"page\"\n|  \u251c\u2500 taxonomy\n|  |  \u251c\u2500 tags.html.twig    # Utilis\u00e9 par le type \"vocabulary\" de `tags` (liste des termes)\n|  |  \u2514\u2500 tag.html.twig     # Utilis\u00e9 par le type \"term\" de `tags` (liste des pages)\n|  \u251c\u2500 my-layout.html.twig  # Utilis\u00e9 par les pages avec `layout: my-layout` dans le front-matter\n|  \u251c\u2500 ...\n|  \u2514\u2500 partials\n|     \u251c\u2500 footer.html.twig  # Template inclus\n|     \u2514\u2500 ...\n\u2514\u2500 themes                  # Layouts et templates des th\u00e8mes\n   \u2514\u2500 ...",
    "href": "fr\/documentation\/templates\/regles-de-recherche\/#convention-de-nommage"  },
  {
    "id": "fr\/documentation\/templates\/lookup-rules#templates-integres",
    "page": "Templates > Organisation et r\u00e8gles de recherche",
    "title": "Templates int\u00e9gr\u00e9s",
    "description": "Cecil est livr\u00e9 avec un ensemble de templates int\u00e9gr\u00e9s.",
    "content": "Cecil est livr\u00e9 avec un ensemble de templates int\u00e9gr\u00e9s.\nSi vous avez besoin de modifier des templates int\u00e9gr\u00e9s, vous pouvez facilement les extraire via la commande suivante : ils seront copi\u00e9s dans le r\u00e9pertoire layouts de votre site.\nphp cecil.phar util:templates:extract",
    "href": "fr\/documentation\/templates\/regles-de-recherche\/#templates-integres"  },
  {
    "id": "fr\/documentation\/templates\/lookup-rules#regles-de-recherche",
    "page": "Templates > Organisation et r\u00e8gles de recherche",
    "title": "R\u00e8gles de recherche",
    "description": "Dans la plupart des cas vous n'avez pas besoin de pr\u00e9ciser la layout : Cecil s\u00e9lectionne la layout la plus appropri\u00e9e, en fonction du type de la page.",
    "content": "Dans la plupart des cas vous n'avez pas besoin de pr\u00e9ciser la layout : Cecil s\u00e9lectionne la layout la plus appropri\u00e9e, en fonction du type de la page.\nPar exemple, la sortie HTML de home page (index.md) sera rendue\u00a0:\navec my-layout.html.twig si la variable layout est d\u00e9finie sur \"my-layout\" (dans le pr\u00e9ambule)\nsinon, avec index.html.twig si le fichier existe\nsinon, avec home.html.twig si le fichier existe\nsinon, avec list.html.twig si le fichier existe\nToutes les r\u00e8gles sont d\u00e9taill\u00e9es ci-dessous, pour chaque type de page, par ordre de priorit\u00e9.",
    "href": "fr\/documentation\/templates\/regles-de-recherche\/#regles-de-recherche"  },
  {
    "id": "fr\/documentation\/templates\/lookup-rules#type-homepage",
    "page": "Templates > Organisation et r\u00e8gles de recherche",
    "title": "Type homepage",
    "description": "",
    "content": "<layout>.<format>.twig\nindex.<format>.twig\nhome.<format>.twig\nlist.<format>.twig\n_default\/<layout>.<format>.twig\n_default\/index.<format>.twig\n_default\/home.<format>.twig\n_default\/list.<format>.twig\n_default\/page.<format>.twig",
    "href": "fr\/documentation\/templates\/regles-de-recherche\/#type-homepage"  },
  {
    "id": "fr\/documentation\/templates\/lookup-rules#type-page",
    "page": "Templates > Organisation et r\u00e8gles de recherche",
    "title": "Type page",
    "description": "",
    "content": "<section>\/<layout>.<format>.twig\n<layout>.<format>.twig\n<section>\/page.<format>.twig\n_default\/<layout>.<format>.twig\npage.<format>.twig\n_default\/page.<format>.twig",
    "href": "fr\/documentation\/templates\/regles-de-recherche\/#type-page"  },
  {
    "id": "fr\/documentation\/templates\/lookup-rules#type-section",
    "page": "Templates > Organisation et r\u00e8gles de recherche",
    "title": "Type section",
    "description": "",
    "content": "<layout>.<format>.twig\n<section>\/index.<format>.twig\n<section>\/list.<format>.twig\nsection\/<section>.<format>.twig\n<parent>\/index.<format>.twig, <parent>\/list.<format>.twig et section\/<parent>.<format>.twig, pour chaque section parente d\u2019une sous-section (la plus proche en premier)\n_default\/section.<format>.twig\nlist.<format>.twig\n_default\/list.<format>.twig\nLa <section> d\u2019une sous-section est son chemin complet (ex. : blog\/2024), et une sous-section se replie sur les templates de ses sections parentes : si blog\/2024\/list.html.twig n\u2019existe pas, la sous-section blog\/2024 est rendue avec blog\/list.html.twig.",
    "href": "fr\/documentation\/templates\/regles-de-recherche\/#type-section"  },
  {
    "id": "fr\/documentation\/templates\/lookup-rules#type-vocabulary",
    "page": "Templates > Organisation et r\u00e8gles de recherche",
    "title": "Type vocabulary",
    "description": "",
    "content": "taxonomy\/<plural>.<format>.twig\nvocabulary.<format>.twig\n_default\/vocabulary.<format>.twig",
    "href": "fr\/documentation\/templates\/regles-de-recherche\/#type-vocabulary"  },
  {
    "id": "fr\/documentation\/templates\/lookup-rules#type-term",
    "page": "Templates > Organisation et r\u00e8gles de recherche",
    "title": "Type term",
    "description": "",
    "content": "taxonomy\/<plural>\/<term>.<format>.twig\ntaxonomy\/<singular>.<format>.twig\nterm.<format>.twig\n_default\/term.<format>.twig\n_default\/list.<format>.twig\nLe template du vocabulaire est nomm\u00e9 d\u2019apr\u00e8s le pluriel (ex. : taxonomy\/categories.html.twig pour \/categories\/), tandis que le template d\u2019un terme est nomm\u00e9 d\u2019apr\u00e8s le singulier (ex. : taxonomy\/category.html.twig pour \/categories\/data-sovereignty\/).\n<term> est le nom du terme \u00ab slugifi\u00e9 \u00bb : un template d\u00e9di\u00e9 au terme \u00ab Data Sovereignty \u00bb du vocabulaire categories est taxonomy\/categories\/data-sovereignty.html.twig.\nLa plupart de ces layouts sont disponibles par d\u00e9faut, voir templates int\u00e9gr\u00e9s.",
    "href": "fr\/documentation\/templates\/regles-de-recherche\/#type-term"  },
  {
    "id": "fr\/documentation\/templates\/reference\/functions",
    "page": "Templates > Fonctions et filtres > Fonctions",
    "title": "Fonctions",
    "description": "",
    "content": "Fonctions peut \u00eatre appel\u00e9e pour g\u00e9n\u00e9rer du contenu. Les fonctions sont appel\u00e9es par leur nom suivi de parenth\u00e8ses (()) et peuvent avoir des arguments.",
    "href": "fr\/documentation\/templates\/reference\/fonctions\/"  },
  {
    "id": "fr\/documentation\/templates\/reference\/functions#url",
    "page": "Templates > Fonctions et filtres > Fonctions",
    "title": "url",
    "description": "Cr\u00e9e une URL valide pour une page, une entr\u00e9e de menu, un actif, un ID de page ou un chemin.",
    "content": "Cr\u00e9e une URL valide pour une page, une entr\u00e9e de menu, un actif, un ID de page ou un chemin.\n{{ url(value, {options}) }}\nOptions\nDescriptif\nTapez\nPar d\u00e9faut\ncanonique\nPr\u00e9fixez l'URL avec baseurl ou utilisez canonical.url s'il existe.\nbool\u00e9en\nfalse\nformats\nD\u00e9finit la page format de sortie (par exemple\u00a0: json).\ncha\u00eene\nhtml\nlangue\nD\u00e9finit la page langue (ex.\u00a0: fr).\ncha\u00eene\nnul\nExemples\u00a0:\n{# page #}\n{{ url(page) }}\n{{ url(page, {canonical: true}) }}\n{{ url(page, {format: json}) }}\n{{ url(page, {language: fr}) }}\n{# menu entry #}\n{{ url(site.menus.main.about) }}\n{# asset #}\n{{ url(asset('styles.css')) }}\n{# page ID #}\n{{ url('page-id') }}\n{# path #}\n{{ url('about-me\/') }}\n{{ url('tags\/' ~ tag) }}\nPour plus de commodit\u00e9, la fonction url est \u00e9galement disponible sous forme de filtre\u00a0:\n{# page #}\n{{ page|url }}\n{{ page|url({canonical: true, format: json, language: fr}) }}\n{# asset #}\n{{ asset('styles.css')|url }}\nLorsque la valeur est une cha\u00eene, url() la \u00ab slugifie \u00bb pour trouver un ID de page correspondant (ex. : url('tags\/My Tag') retourne l\u2019URL de la page tags\/my-tag). Si aucune page ne correspond, la cha\u00eene est conserv\u00e9e comme chemin, avec les caract\u00e8res invalides (ex. : espaces) encod\u00e9s.",
    "href": "fr\/documentation\/templates\/reference\/fonctions\/#url"  },
  {
    "id": "fr\/documentation\/templates\/reference\/functions#html",
    "page": "Templates > Fonctions et filtres > Fonctions",
    "title": "html",
    "description": "Cr\u00e9e un \u00e9l\u00e9ment HTML \u00e0 partir d'un actif (ou d'un tableau d'actifs avec des attributs personnalis\u00e9s).",
    "content": "Cr\u00e9e un \u00e9l\u00e9ment HTML \u00e0 partir d'un actif (ou d'un tableau d'actifs avec des attributs personnalis\u00e9s).\n{{ html(asset, {attributes}, {options}) }}\n{# dedicated functions for each common type of asset #}\n{{ css(asset) }}\n{{ js(asset) }}\n{{ image(asset) }}\n{{ audio(asset) }}\n{{ video(asset) }}\nOptions\nDescriptif\nTapez\nattributs\nAjoute le couple name=\"value\" \u00e0 l'\u00e9l\u00e9ment HTML.\ntableau\noptions\n{preload: boolean}\u00a0: pr\u00e9chargements.Pour les images\u00a0:{formats: array}\u00a0: ajoute des formats alternatifs.{responsive: bool|string}\u00a0: ajoute des images r\u00e9actives (bas\u00e9es sur width ou des pixels density).{placeholder: string} : remplit l'arri\u00e8re-plan de l'image avant son chargement (color ou lqip).\ntableau\nDepuis la version 8.42.0, la fonction html remplace le filtre html obsol\u00e8te.\nVous pouvez d\u00e9finir un comportement global par d\u00e9faut des options d'images (formats, responsive et placeholder) via la configuration des layouts.\nLorsque layouts.images.dark_suffix est configur\u00e9 (par exemple .dark), Cecil recherche automatiquement une variante sombre de chaque image (par exemple photo.dark.jpg aux c\u00f4t\u00e9s de photo.jpg) et g\u00e9n\u00e8re un \u00e9l\u00e9ment <picture> avec un <source media=\"(prefers-color-scheme: dark)\">.\nDe la m\u00eame mani\u00e8re, lorsque layouts.images.mobile_suffix est configur\u00e9 (par exemple .mobile), Cecil recherche une variante mobile de chaque image (par exemple photo.mobile.jpg) et ajoute un <source> avec la media query layouts.images.mobile_media_query. Si une variante sombre de l\u2019image mobile existe (par exemple photo.mobile.dark.jpg), elle est utilis\u00e9e sur mobile en mode sombre.\nExemples\u00a0:\n{# CSS with an attribute #}\n{{ html(asset('print.css'), {media: 'print'}) }}\n{# CSS with an attribute and an option #}\n{{ html(asset('styles.css'), {title: 'Main theme'}, {preload: true}) }}\n{# Array of assets with media query #}\n{{ html([\n  {asset: asset('css\/style.css')},\n  {asset: asset('css\/style-dark.css'), attributes: {media: '(prefers-color-scheme: dark)'}}\n]) }}\n{# JavaScript #}\n{{ html(asset('script.js')) }}\n{# image without specific attributes nor options #}\n{{ html(asset('image.png')) }}\n{# image with specific attributes, responsive images and alternative formats #}\n{{ html(asset('image.jpg'), {alt: 'Description', loading: 'lazy'}, {responsive: true, formats: ['avif', 'webp']}) }}\n{# image with responsive pixels density images #}\n{{ html(asset('image.jpg'), options={responsive: 'density'}, attributes={width: 256}) }}\n{# image with a Low-Quality Image Placeholder #}\n{{ html(asset('image.jpg'), {alt: 'Description', loading: 'lazy'}, {placeholder: 'lqip'}) }}\n{# Audio #}\n{{ html(asset('audio.mp3')) }}\n{# Video #}\n{{ html(asset('video.mp4')) }}\nPour plus de commodit\u00e9, la fonction html reste disponible en tant que filtre (mais est consid\u00e9r\u00e9e comme obsol\u00e8te)\u00a0:\n{{ asset|html({attributes}, {options}) }}",
    "href": "fr\/documentation\/templates\/reference\/fonctions\/#html"  },
  {
    "id": "fr\/documentation\/templates\/reference\/functions#readtime",
    "page": "Templates > Fonctions et filtres > Fonctions",
    "title": "readtime",
    "description": "D\u00e9termine le temps de lecture d'un texte, en minutes.",
    "content": "D\u00e9termine le temps de lecture d'un texte, en minutes.\n{{ readtime(value) }}\nExemple:\n{{ readtime(page.content) }} min",
    "href": "fr\/documentation\/templates\/reference\/fonctions\/#readtime"  },
  {
    "id": "fr\/documentation\/templates\/reference\/functions#hash",
    "page": "Templates > Fonctions et filtres > Fonctions",
    "title": "hash",
    "description": "Calcule le hachage d'un objet, d'un tableau ou d'une cha\u00eene avec un algorithme donn\u00e9.",
    "content": "Calcule le hachage d'un objet, d'un tableau ou d'une cha\u00eene avec un algorithme donn\u00e9.\n{{ hash(value, algorithm) }}\nalgorithm peut \u00eatre n'importe quel algorithme pris en charge par la fonction hash() de PHP (par exemple : md5, sha256, etc.). La valeur par d\u00e9faut est xxh128.\nExemple:\n{{ hash('my string', 'sha256') }}",
    "href": "fr\/documentation\/templates\/reference\/fonctions\/#hash"  },
  {
    "id": "fr\/documentation\/templates\/reference\/functions#cache-key",
    "page": "Templates > Fonctions et filtres > Fonctions",
    "title": "cache_key",
    "description": "Calcule une cl\u00e9 de cache pour fragments cache en fonction d'un nom et d'une valeur facultative.",
    "content": "Calcule une cl\u00e9 de cache pour fragments cache en fonction d'un nom et d'une valeur facultative.\n{% cache cache_key(name, value) %}\n  {# cacheable content #}\n{% endcache %}\nLa fonction ajoute un hachage de la valeur (peut \u00eatre une cha\u00eene, un tableau ou un objet) au nom (ainsi que la langue actuelle et l'ID de build pour \u00eatre s\u00fbr que la cl\u00e9 de cache g\u00e9n\u00e9r\u00e9e est unique), donc si la valeur est modifi\u00e9e, la cl\u00e9 de cache est \u00e9galement modifi\u00e9e et le cache est automatiquement vid\u00e9.",
    "href": "fr\/documentation\/templates\/reference\/fonctions\/#cache-key"  },
  {
    "id": "fr\/documentation\/templates\/reference\/functions#getenv",
    "page": "Templates > Fonctions et filtres > Fonctions",
    "title": "getenv",
    "description": "Obtient la valeur d'une variable d'environnement \u00e0 partir de sa cl\u00e9.",
    "content": "Obtient la valeur d'une variable d'environnement \u00e0 partir de sa cl\u00e9.\n{{ getenv(var) }}\nExemple:\n{{ getenv('VAR') }}",
    "href": "fr\/documentation\/templates\/reference\/fonctions\/#getenv"  },
  {
    "id": "fr\/documentation\/templates\/reference\/functions#dump",
    "page": "Templates > Fonctions et filtres > Fonctions",
    "title": "dump",
    "description": "La fonction dump affiche les informations sur une variable de mod\u00e8le. Ceci est surtout utile pour d\u00e9boguer un mod\u00e8le qui ne se comporte pas comme pr\u00e9vu en introspectant ses variables\u00a0:",
    "content": "La fonction dump affiche les informations sur une variable de mod\u00e8le. Ceci est surtout utile pour d\u00e9boguer un mod\u00e8le qui ne se comporte pas comme pr\u00e9vu en introspectant ses variables\u00a0:\n{{ dump(user) }}\nLe debug mode doit \u00eatre activ\u00e9.",
    "href": "fr\/documentation\/templates\/reference\/fonctions\/#dump"  },
  {
    "id": "fr\/documentation\/templates\/reference\/functions#d",
    "page": "Templates > Fonctions et filtres > Fonctions",
    "title": "d",
    "description": "La fonction d() est la version HTML de dump() et utilise le Symfony VarDumper Component en arri\u00e8re-plan.",
    "content": "La fonction d() est la version HTML de dump() et utilise le Symfony VarDumper Component en arri\u00e8re-plan.\n{{ d(variable, {theme: light}) }}\nSi variable n'est pas fourni, la fonction renvoie le contexte Twig actuel\nLes th\u00e8mes disponibles sont \u00ab clair \u00bb (par d\u00e9faut) et \u00ab sombre \u00bb\nLe debug mode doit \u00eatre activ\u00e9.",
    "href": "fr\/documentation\/templates\/reference\/fonctions\/#d"  },
  {
    "id": "fr\/documentation\/assets\/processing#fingerprint",
    "page": "Assets > CSS, JavaScript et traitements",
    "title": "fingerprint",
    "description": "Ajoutez l'empreinte digitale du contenu du fichier au nom du fichier.",
    "content": "Ajoutez l'empreinte digitale du contenu du fichier au nom du fichier.\n{{ asset(path)|fingerprint }}\n{{ path|fingerprint }}\nExemples\u00a0:\n{{ asset('styles.css')|fingerprint }}",
    "href": "fr\/documentation\/assets\/traitements\/#fingerprint"  },
  {
    "id": "fr\/documentation\/assets\/processing#minify",
    "page": "Assets > CSS, JavaScript et traitements",
    "title": "minify",
    "description": "R\u00e9duire un fichier CSS ou JavaScript.",
    "content": "R\u00e9duire un fichier CSS ou JavaScript.\n{{ asset(path)|minify }}\nExemples\u00a0:\n{{ asset('styles.css')|minify }}\n{{ asset('scripts.js')|minify }}",
    "href": "fr\/documentation\/assets\/traitements\/#minify"  },
  {
    "id": "fr\/documentation\/assets\/processing#minify-css",
    "page": "Assets > CSS, JavaScript et traitements",
    "title": "minify_css",
    "description": "R\u00e9duire une cha\u00eene CSS.",
    "content": "R\u00e9duire une cha\u00eene CSS.\n{{ variable|minify_css }}\n{% apply minify_css %}\n{# CSS here #}\n{% endapply %}\nExemples\u00a0:\n{% set styles = 'some CSS here' %}\n{{ styles|minify_css }}\n<style>\n{% apply minify_css %}\n  html {\n    background-color: #fcfcfc;\n    color: #444;\n  }\n{% endapply %}\n<\/style>",
    "href": "fr\/documentation\/assets\/traitements\/#minify-css"  },
  {
    "id": "fr\/documentation\/assets\/processing#minify-js",
    "page": "Assets > CSS, JavaScript et traitements",
    "title": "minify_js",
    "description": "R\u00e9duire une cha\u00eene JavaScript.",
    "content": "R\u00e9duire une cha\u00eene JavaScript.\n{{ variable|minify_js }}\n{% apply minify_js %}\n{# JavaScript here #}\n{% endapply %}\nExemples\u00a0:\n{% set script = 'some JavaScript here' %}\n{{ script|minify_js }}\n<script>\n{% apply minify_js %}\n  var test = 'test';\n  console.log(test);\n{% endapply %}\n<\/script>",
    "href": "fr\/documentation\/assets\/traitements\/#minify-js"  },
  {
    "id": "fr\/documentation\/assets\/processing#scss-to-css",
    "page": "Assets > CSS, JavaScript et traitements",
    "title": "scss_to_css",
    "description": "Compile une cha\u00eene Sass en CSS.",
    "content": "Compile une cha\u00eene Sass en CSS.\n{{ variable|scss_to_css }}\n{% apply scss_to_css %}\n{# SCSS here #}\n{% endapply %}\nAlias\u00a0: sass_to_css.\nExemples\u00a0:\n{% set scss = 'some SCSS here' %}\n{{ scss|scss_to_css }}\n<style>\n{% apply scss_to_css %}\n  $color: #fcfcfc;\n  div {\n    color: lighten($color, 20%);\n  }\n{% endapply %}\n<\/style>",
    "href": "fr\/documentation\/assets\/traitements\/#scss-to-css"  },
  {
    "id": "fr\/documentation\/assets\/processing#to-css",
    "page": "Assets > CSS, JavaScript et traitements",
    "title": "to_css",
    "description": "Compile un fichier Sass en CSS.",
    "content": "Compile un fichier Sass en CSS.\n{{ asset(path)|to_css }}\n{{ path|to_css }}\nExemples\u00a0:\n{{ asset('styles.scss')|to_css }}",
    "href": "fr\/documentation\/assets\/traitements\/#to-css"  },
  {
    "id": "fr\/documentation\/assets\/processing#inline",
    "page": "Assets > CSS, JavaScript et traitements",
    "title": "inline",
    "description": "Affiche le contenu d'un Asset.",
    "content": "Affiche le contenu d'un Asset.\n{{ asset(path)|inline }}\nExemple:\n{{ asset('styles.css')|inline }}",
    "href": "fr\/documentation\/assets\/traitements\/#inline"  },
  {
    "id": "fr\/documentation\/assets\/processing#dataurl",
    "page": "Assets > CSS, JavaScript et traitements",
    "title": "dataurl",
    "description": "Renvoie l'URL de donn\u00e9es d'un actif.",
    "content": "Renvoie l'URL de donn\u00e9es d'un actif.\n{{ asset(path)|dataurl }}\n{{ asset(image_path)|dataurl }}",
    "href": "fr\/documentation\/assets\/traitements\/#dataurl"  },
  {
    "id": "fr\/documentation\/commands\/new-page",
    "page": "Commandes > new:page",
    "title": "new:page",
    "description": "Cr\u00e9e une nouvelle page.",
    "content": "Cr\u00e9e une nouvelle page.\nDescription:\n  Creates a new page\nUsage:\n  new:page [options] [--] [<path>]\nArguments:\n  path                        Use the given path as working directory\nOptions:\n      --name=NAME             Page path name\n      --slugify|--no-slugify  Slugify file name (or disable --no-slugify)\n  -p, --prefix                Prefix the file name with the current date (`YYYY-MM-DD`)\n  -f, --force                 Override the file if already exist\n  -o, --open                  Open editor automatically\n      --editor=EDITOR         Editor to use with open option\n  -h, --help                  Display help for the given command. When no command is given display help for the list command\n  -q, --quiet                 Do not output any message\n  -V, --version               Display this application version\n      --ansi|--no-ansi        Force (or disable --no-ansi) ANSI output\n  -n, --no-interaction        Do not ask any interactive question\n  -v|vv|vvv, --verbose        Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug\nHelp:\n  The new:page command creates a new page file.\n  If you run this command without any options, it will ask you for the page name and other options.\ncecil.phar new:page\n    cecil.phar new:page --name=path\/to\/a-page.md\n    cecil.phar new:page --name=path\/to\/A Page.md --slugify\nTo create a new page with a date prefix (i.e: `YYYY-MM-DD`), run:\ncecil.phar new:page --prefix\nTo create a new page and open it with an editor, run:\ncecil.phar new:page --open --editor=editor\nTo override an existing page, run:\ncecil.phar new:page --force",
    "href": "fr\/documentation\/commandes\/new-page\/"  },
  {
    "id": "fr\/documentation\/commands\/new-page#modeles-de-page",
    "page": "Commandes > new:page",
    "title": "Mod\u00e8les de page",
    "description": "Vous pouvez d\u00e9finir vos propres mod\u00e8les pour vos nouvelles pages dans le r\u00e9pertoire models :",
    "content": "Vous pouvez d\u00e9finir vos propres mod\u00e8les pour vos nouvelles pages dans le r\u00e9pertoire models :\nLe nom doit \u00eatre bas\u00e9 sur le nom de la section (par exemple : blog.md)\nLe mod\u00e8le par d\u00e9faut doit \u00eatre nomm\u00e9 default.md (pour les pages racine ou les sections de pages sans mod\u00e8le)\nDeux variables dynamiques sont disponibles :\n%title% : le nom du fichier\n%date% : la date actuelle",
    "href": "fr\/documentation\/commandes\/new-page\/#modeles-de-page"  },
  {
    "id": "fr\/documentation\/commands\/new-page#ouvrir-avec-votre-editeur",
    "page": "Commandes > new:page",
    "title": "Ouvrir avec votre \u00e9diteur",
    "description": "Avec l\u2019option --open, l\u2019\u00e9diteur s\u2019ouvrira automatiquement. Utilisez donc la cl\u00e9 editor dans votre fichier de configuration pour d\u00e9finir l\u2019\u00e9diteur par d\u00e9faut (par exemple : editor: typora).",
    "content": "Avec l\u2019option --open, l\u2019\u00e9diteur s\u2019ouvrira automatiquement. Utilisez donc la cl\u00e9 editor dans votre fichier de configuration pour d\u00e9finir l\u2019\u00e9diteur par d\u00e9faut (par exemple : editor: typora).",
    "href": "fr\/documentation\/commandes\/new-page\/#ouvrir-avec-votre-editeur"  },
  {
    "id": "fr\/documentation\/configuration\/languages#language",
    "page": "Configuration > Langues",
    "title": "language",
    "description": "Langue principale, d\u00e9finie par son code.",
    "content": "Langue principale, d\u00e9finie par son code.\nlanguage: <code> # unique code (`en` by default)\nPar d\u00e9faut, seuls les chemins des pages des autres langues sont pr\u00e9fix\u00e9s par leur code de langue, mais vous pouvez pr\u00e9fixer le chemin des pages de la langue principale avec l\u2019option suivante :\n#language: <code>\nlanguage:\n  code: <code>\n  prefix: true\nQuand prefix est d\u00e9fini \u00e0 true, un alias est automatiquement cr\u00e9\u00e9 pour la page d\u2019accueil afin de rediriger de \/ vers \/<code>\/.",
    "href": "fr\/documentation\/configuration\/langues\/#language"  },
  {
    "id": "fr\/documentation\/configuration\/languages#languages",
    "page": "Configuration > Langues",
    "title": "languages",
    "description": "Options des langues disponibles, utilis\u00e9es pour la localisation des pages et des templates.",
    "content": "Options des langues disponibles, utilis\u00e9es pour la localisation des pages et des templates.\nlanguages:\n  - code: <code>          # unique code (e.g.: `en`, `fr`, 'en-US', `fr-CA`)\n    name: <name>          # human readable name (e.g.: `Fran\u00e7ais`)\n    locale: <locale>      # locale code (`language_COUNTRY`, e.g.: `en_US`, `fr_FR`, `fr_CA`)\n    enabled: <true|false> # enabled or not (`true` by default)\nExemple :\nlanguage: en\nlanguages:\n  - code: en\n    name: English\n    locale: en_US\n  - code: fr\n    name: Fran\u00e7ais\n    locale: fr_FR\nUne liste des codes de locale est disponible si n\u00e9cessaire.",
    "href": "fr\/documentation\/configuration\/langues\/#languages"  },
  {
    "id": "fr\/documentation\/configuration\/languages#localiser",
    "page": "Configuration > Langues",
    "title": "Localiser",
    "description": "Pour localiser des options de configuration, vous devez les stocker sous la cl\u00e9 config de la langue.",
    "content": "Pour localiser des options de configuration, vous devez les stocker sous la cl\u00e9 config de la langue.\nExemple :\ntitle: \"Cecil in english\"\nlanguages:\n  - code: en\n    name: English\n    locale: en_US\n  - code: fr\n    name: Fran\u00e7ais\n    locale: fr_FR\n    config:\n      title: \"Cecil en fran\u00e7ais\"\nDans les templates, vous pouvez acc\u00e9der \u00e0 une option avec {{ site.<option> }}, par exemple {{ site.title }}.\nSi une option n\u2019est pas disponible dans la langue actuelle (ex. : fr), elle revient \u00e0 la valeur globale (ex. : en).",
    "href": "fr\/documentation\/configuration\/langues\/#localiser"  },
  {
    "id": "fr\/documentation\/content\/front-matter",
    "page": "Contenu > Front matter",
    "title": "Front matter",
    "description": "Le front matter peut contenir des variables personnalis\u00e9es appliqu\u00e9es \u00e0 la page courante.",
    "content": "Le front matter peut contenir des variables personnalis\u00e9es appliqu\u00e9es \u00e0 la page courante.\nIl doit se trouver au tout d\u00e9but du fichier et \u00eatre un YAML valide.",
    "href": "fr\/documentation\/contenu\/front-matter\/"  },
  {
    "id": "fr\/documentation\/content\/front-matter#variables-predefinies",
    "page": "Contenu > Front matter",
    "title": "Variables pr\u00e9d\u00e9finies",
    "description": "",
    "content": "Variable\nDescription\nValeur par d\u00e9faut\nExemple\ntitle\nTitre\nNom de fichier sans extension.\nPost 1\nlayout\nTemplate\nVoir Lookup rules.\n404\ndate\nDate de cr\u00e9ation\nDate de cr\u00e9ation du fichier (objet PHP DateTime).\n2019\/04\/15\nsection\nSection\nSection de la page.\nblog\npath\nChemin\nPath de la page.\nblog\/post-1\nslug\nSlug\nSlug de la page.\npost-1\npublished\nPubli\u00e9 ou non\ntrue.\nfalse\ndraft\nBrouillon ou non\nfalse.\ntrue\nToutes les variables pr\u00e9d\u00e9finies peuvent \u00eatre surcharg\u00e9es, sauf section.",
    "href": "fr\/documentation\/contenu\/front-matter\/#variables-predefinies"  },
  {
    "id": "fr\/documentation\/content\/front-matter#updated",
    "page": "Contenu > Front matter",
    "title": "updated",
    "description": "La variable updated sert \u00e0 d\u00e9finir la date de derni\u00e8re modification d\u2019une page.",
    "content": "La variable updated sert \u00e0 d\u00e9finir la date de derni\u00e8re modification d\u2019une page.\nExemple :\n---\nupdated: 2026-02-02\n---\nAvant la version 8.80.1, la variable updated \u00e9tait une variable pr\u00e9d\u00e9finie. Elle est d\u00e9sormais optionnelle (et doit \u00eatre d\u00e9finie dans le front matter pour \u00eatre utilis\u00e9e).",
    "href": "fr\/documentation\/contenu\/front-matter\/#updated"  },
  {
    "id": "fr\/documentation\/content\/front-matter#menu",
    "page": "Contenu > Front matter",
    "title": "menu",
    "description": "Une page peut \u00eatre ajout\u00e9e \u00e0 un menu.",
    "content": "Une page peut \u00eatre ajout\u00e9e \u00e0 un menu.\nLe nom de l\u2019entr\u00e9e est le title de la page et l\u2019URL est le path de la page.\nLa m\u00eame page peut \u00eatre ajout\u00e9e \u00e0 plusieurs menus, et la position de chaque entr\u00e9e peut \u00eatre d\u00e9finie avec la cl\u00e9 weight (la plus faible en premier). La cl\u00e9 name peut \u00eatre utilis\u00e9e pour personnaliser le nom de l\u2019entr\u00e9e par menu.\nExemples :\n---\nmenu: main\n---\n---\nmenu: [main, navigation] # same page in multiple menus\n---\n---\nmenu:\n  main:\n    weight: 10\n  navigation:\n    weight: 20\n---\n---\ntitle: 'Notre expertise'\nmenu:\n  main:\n    weight: 15\n  footer:\n    weight: 15\n    name: \"Expertise\" # personnalise le nom de l'entr\u00e9e dans ce menu\n---",
    "href": "fr\/documentation\/contenu\/front-matter\/#menu"  },
  {
    "id": "fr\/documentation\/content\/front-matter#taxonomie",
    "page": "Contenu > Front matter",
    "title": "Taxonomie",
    "description": "La taxonomie permet de connecter, relier et classer le contenu de votre site Web.\nDans Cecil, ces termes sont regroup\u00e9s dans des vocabulaires.",
    "content": "La taxonomie permet de connecter, relier et classer le contenu de votre site Web.\nDans Cecil, ces termes sont regroup\u00e9s dans des vocabulaires.\nLes vocabulaires sont d\u00e9clar\u00e9s dans la Configuration.\nVocabulaire\nUne cat\u00e9gorisation du contenu (ex. : tags, categories, etc.).\nTerme\nUn terme est un \u00e9l\u00e9ment d\u2019un vocabulaire (ex. : D\u00e9veloppement, PHP, etc.).\nExemple :\n---\ntags: [\"D\u00e9veloppement\", \"PHP\"]\n---\nCecil g\u00e9n\u00e8re ensuite, pour chaque vocabulaire :\nune page listant ses termes, ex. : \/tags\/\nune page par terme listant ses pages, ex. : \/tags\/developpement\/ et \/tags\/php\/\nVoir les r\u00e8gles de recherche des templates et les variables de taxonomie pour personnaliser ces pages.",
    "href": "fr\/documentation\/contenu\/front-matter\/#taxonomie"  },
  {
    "id": "fr\/documentation\/content\/front-matter#planification",
    "page": "Contenu > Front matter",
    "title": "Planification",
    "description": "Planifie la publication des pages.",
    "content": "Planifie la publication des pages.\nExemple :\nLa page sera publi\u00e9e si la date courante est >= 2023-02-07 :\nschedule:\n  publish: 2023-02-07\nCette page est publi\u00e9e si la date courante est <= 2022-04-28 :\nschedule:\n  expiry: 2022-04-28",
    "href": "fr\/documentation\/contenu\/front-matter\/#planification"  },
  {
    "id": "fr\/documentation\/content\/front-matter#redirect",
    "page": "Contenu > Front matter",
    "title": "redirect",
    "description": "Comme son nom l\u2019indique, la variable redirect sert \u00e0 rediriger une page vers une URL d\u00e9di\u00e9e.",
    "content": "Comme son nom l\u2019indique, la variable redirect sert \u00e0 rediriger une page vers une URL d\u00e9di\u00e9e.\nExemple :\n---\nredirect: \"https:\/\/arnaudligny.fr\"\n---\nLa redirection fonctionne avec le template redirect.html.twig.",
    "href": "fr\/documentation\/contenu\/front-matter\/#redirect"  },
  {
    "id": "fr\/documentation\/content\/front-matter#alias",
    "page": "Contenu > Front matter",
    "title": "alias",
    "description": "Un alias est une redirection vers la page courante.",
    "content": "Un alias est une redirection vers la page courante.\nExemple :\n---\ntitle: \"About\"\nalias:\n  - contact\n---\nDans l\u2019exemple pr\u00e9c\u00e9dent, contact\/ redirige vers about\/.",
    "href": "fr\/documentation\/contenu\/front-matter\/#alias"  },
  {
    "id": "fr\/documentation\/content\/front-matter#output",
    "page": "Contenu > Front matter",
    "title": "output",
    "description": "D\u00e9finit le format de sortie de la page.",
    "content": "D\u00e9finit le format de sortie de la page.\nLes formats disponibles sont : html, atom, rss, json, xml, etc.\nVous pouvez d\u00e9finir un ou plusieurs formats dans un tableau.\nIl n\u2019est pas obligatoire de d\u00e9finir un format de sortie, mais si vous le faites, il doit correspondre \u00e0 l\u2019un des formats disponibles d\u00e9finis dans la Configuration.\nExemple :\n---\noutput: [html, atom]\n---",
    "href": "fr\/documentation\/contenu\/front-matter\/#output"  },
  {
    "id": "fr\/documentation\/content\/front-matter#external",
    "page": "Contenu > Front matter",
    "title": "external",
    "description": "Une page avec une variable external tente de r\u00e9cup\u00e9rer le contenu de la ressource cibl\u00e9e.",
    "content": "Une page avec une variable external tente de r\u00e9cup\u00e9rer le contenu de la ressource cibl\u00e9e.\nExemple :\n---\nexternal: \"https:\/\/raw.githubusercontent.com\/Cecilapp\/Cecil\/main\/README.md\"\n---",
    "href": "fr\/documentation\/contenu\/front-matter\/#external"  },
  {
    "id": "fr\/documentation\/content\/front-matter#excluded",
    "page": "Contenu > Front matter",
    "title": "excluded",
    "description": "D\u00e9finissez excluded \u00e0 true pour masquer une page des pages de liste (c.-\u00e0-d. : Home page, Section, Sitemap, etc.).",
    "content": "D\u00e9finissez excluded \u00e0 true pour masquer une page des pages de liste (c.-\u00e0-d. : Home page, Section, Sitemap, etc.).\nExemple :\n---\nexcluded: true\n---\nexcluded est diff\u00e9rent de published : une page exclue est publi\u00e9e, mais masqu\u00e9e des pages de liste.\nDepuis la version 8.49.0, l\u2019ancienne variable exclude a \u00e9t\u00e9 remplac\u00e9e par excluded.",
    "href": "fr\/documentation\/contenu\/front-matter\/#excluded"  },
  {
    "id": "fr\/documentation\/content",
    "page": " > Contenu",
    "title": "Contenu",
    "description": "Il existe diff\u00e9rents types de contenu dans Cecil :",
    "content": "Il existe diff\u00e9rents types de contenu dans Cecil :\nPages\nLes pages constituent le contenu principal du site, r\u00e9dig\u00e9 en Markdown.\nLes pages doivent \u00eatre organis\u00e9es de mani\u00e8re \u00e0 refl\u00e9ter le site Web g\u00e9n\u00e9r\u00e9.\nLes pages peuvent \u00eatre organis\u00e9es en Sections (dossiers racine) (ex. : \u00ab Blog \u00bb, \u00ab Projet \u00bb, etc.).\nAssets\nLes assets sont des fichiers transform\u00e9s (c.-\u00e0-d. : images redimensionn\u00e9es, Sass compil\u00e9, scripts minifi\u00e9s, etc.) avec la fonction de template asset().\nStatic files\nLes fichiers statiques sont copi\u00e9s tels quels dans le site g\u00e9n\u00e9r\u00e9 (ex. : static\/fichier.pdf -> fichier.pdf).\nData files\nLes fichiers de donn\u00e9es sont des collections de variables personnalis\u00e9es, expos\u00e9es dans les templates via site.data.",
    "href": "fr\/documentation\/contenu\/"  },
  {
    "id": "fr\/documentation\/deploy\/continuous-deployment#github-pages",
    "page": "D\u00e9ployer > Build et d\u00e9ploiement continus",
    "title": "GitHub Pages",
    "description": "",
    "content": "Des sites web pour vous et vos projets, h\u00e9berg\u00e9s directement depuis votre d\u00e9p\u00f4t GitHub. Il suffit de modifier, pousser, et vos changements sont en ligne.\n\u27a1\ufe0f https:\/\/pages.github.com\n.github\/workflows\/build-and-deploy.yml:\nname: Build and deploy to GitHub Pages\non:\n  push:\n    branches: [master, main]\n  workflow_dispatch:\nconcurrency:\n  group: pages\n  cancel-in-progress: true\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout source\n        uses: actions\/checkout@v6\n      - name: Restore Cecil cache\n        uses: actions\/cache\/restore@v5\n        with:\n          path: .\/.cache\n          key: cecil-cache-\n          restore-keys: |\n            cecil-cache-\n      - name: Build site\n        uses: Cecilapp\/Cecil-Action@v4\n      - name: Save Cecil cache\n        uses: actions\/cache\/save@v5\n        with:\n          path: .\/.cache\n          key: cecil-cache-${{ hashFiles('.\/.cache\/**\/*') }}\n  deploy:\n    needs: build\n    permissions:\n      pages: write\n      id-token: write\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    runs-on: ubuntu-latest\n    steps:\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions\/deploy-pages@v5\nDocumentation officielle",
    "href": "fr\/documentation\/deployer\/deploiement-continu\/#github-pages"  },
  {
    "id": "fr\/documentation\/deploy\/continuous-deployment#gitlab-ci",
    "page": "D\u00e9ployer > Build et d\u00e9ploiement continus",
    "title": "GitLab CI",
    "description": "",
    "content": "Avec GitLab Pages, vous pouvez publier des sites web statiques directement depuis un d\u00e9p\u00f4t GitLab.\n\u27a1\ufe0f https:\/\/about.gitlab.com\/solutions\/continuous-integration\/\n.gitlab-ci.yml:\nimage: wordpress:cli-php8.4\ntest:\n  stage: test\n  variables:\n    CECIL_OUTPUT_DIR: test\n  script:\n    - curl -sSOL https:\/\/cecil.app\/build.sh && bash .\/build.sh\n  artifacts:\n    paths:\n     - test\n  except:\n   - master\npages:\n  stage: deploy\n  variables:\n    CECIL_ENV: production\n    CECIL_OUTPUT_DIR: public\n  script:\n    - curl -sSOL https:\/\/cecil.app\/build.sh && bash .\/build.sh\n  artifacts:\n    paths:\n      - public\n  only:\n    - master\ncache:\n  paths:\n    - composer-cache\/\n    - vendor\/\n    - .cache\/\nDocumentation officielle",
    "href": "fr\/documentation\/deployer\/deploiement-continu\/#gitlab-ci"  },
  {
    "id": "fr\/documentation\/developers\/library",
    "page": "D\u00e9veloppeurs > Biblioth\u00e8que",
    "title": "Biblioth\u00e8que",
    "description": "Cecil propose une API PHP simple pour g\u00e9n\u00e9rer votre site web.",
    "content": "Cecil propose une API PHP simple pour g\u00e9n\u00e9rer votre site web.\nVous pouvez consulter la documentation de l'API pour plus de d\u00e9tails.",
    "href": "fr\/documentation\/developpeurs\/bibliotheque\/"  },
  {
    "id": "fr\/documentation\/developers\/library#installation",
    "page": "D\u00e9veloppeurs > Biblioth\u00e8que",
    "title": "Installation",
    "description": "",
    "content": "composer require cecil\/cecil",
    "href": "fr\/documentation\/developpeurs\/bibliotheque\/#installation"  },
  {
    "id": "fr\/documentation\/developers\/library#support-de-libvips",
    "page": "D\u00e9veloppeurs > Biblioth\u00e8que",
    "title": "Support de libvips",
    "description": "Pour traiter les images avec libvips (optionnel), installez le driver libvips dans votre projet :",
    "content": "Pour traiter les images avec libvips (optionnel), installez le driver libvips dans votre projet :\ncomposer require intervention\/image-driver-vips\nCe driver n\u00e9cessite libvips install\u00e9 sur le syst\u00e8me et l\u2019extension PHP FFI activ\u00e9e.\nSans lui, Cecil utilise Imagick ou GD \u00e0 la place.",
    "href": "fr\/documentation\/developpeurs\/bibliotheque\/#support-de-libvips"  },
  {
    "id": "fr\/documentation\/developers\/library#construction",
    "page": "D\u00e9veloppeurs > Biblioth\u00e8que",
    "title": "Construction",
    "description": "Construisez un nouveau site web avec une configuration personnalis\u00e9e :",
    "content": "Construisez un nouveau site web avec une configuration personnalis\u00e9e :\nrequire_once 'vendor\/autoload.php';\nuse Cecil\\Builder;\n$config = [\n    'title'   => \"My website\",\n    'baseurl' => 'https:\/\/domain.tld\/',\n];\nBuilder::create($config)->build();\nexec('php -S localhost:8000 -t _site'); \/\/ pr\u00e9visualisation locale\nLe param\u00e8tre principal de la m\u00e9thode create doit \u00eatre un array PHP ou une instance de Cecil\\Config.",
    "href": "fr\/documentation\/developpeurs\/bibliotheque\/#construction"  },
  {
    "id": "fr\/documentation\/developers\/library#diagnostic",
    "page": "D\u00e9veloppeurs > Biblioth\u00e8que",
    "title": "Diagnostic",
    "description": "Vous pouvez aussi ex\u00e9cuter les v\u00e9rifications doctor via des services de domaine d\u00e9di\u00e9s, sans utiliser les commandes CLI.",
    "content": "Vous pouvez aussi ex\u00e9cuter les v\u00e9rifications doctor via des services de domaine d\u00e9di\u00e9s, sans utiliser les commandes CLI.\n<?php\nrequire_once 'vendor\/autoload.php';\nuse Cecil\\Builder;\nuse Cecil\\Doctor\\SeoDoctor;\nuse Cecil\\Doctor\\SiteDoctor;\n$builder = Builder::create(require 'config.php')\n    ->setSourceDir(__DIR__)\n    ->setDestinationDir(__DIR__);\n$siteDoctor = new SiteDoctor();\n$diagnosis = $siteDoctor->diagnose($builder, __DIR__, ['cecil.yml']);\n$seoDoctor = new SeoDoctor();\n$seoAudit = $seoDoctor->audit($builder, [\n    'page' => '',\n    'include_virtual' => false,\n]);\nvar_dump($diagnosis['errors'], $seoAudit['summary']);",
    "href": "fr\/documentation\/developpeurs\/bibliotheque\/#diagnostic"  },
  {
    "id": "fr\/documentation\/getting-started\/installation",
    "page": "Bien d\u00e9marrer > Installation",
    "title": "Installation",
    "description": "Cecil est distribu\u00e9 sous la forme d\u2019un unique fichier ex\u00e9cutable, cecil.phar, qui fonctionne partout o\u00f9 PHP est install\u00e9.",
    "content": "Cecil est distribu\u00e9 sous la forme d\u2019un unique fichier ex\u00e9cutable, cecil.phar, qui fonctionne partout o\u00f9 PHP est install\u00e9.",
    "href": "fr\/documentation\/bien-demarrer\/installation\/"  },
  {
    "id": "fr\/documentation\/getting-started\/installation#prerequis",
    "page": "Bien d\u00e9marrer > Installation",
    "title": "Pr\u00e9requis",
    "description": "",
    "content": "PHP 8.3+\nExtensions PHP : fileinfo, gd et mbstring\nV\u00e9rifiez votre version de PHP et les extensions charg\u00e9es :\nphp -v\nphp -m",
    "href": "fr\/documentation\/bien-demarrer\/installation\/#prerequis"  },
  {
    "id": "fr\/documentation\/getting-started\/installation#extensions-optionnelles",
    "page": "Bien d\u00e9marrer > Installation",
    "title": "Extensions optionnelles",
    "description": "",
    "content": "Extension\nUsage\nintl\nLocalisation des dates avec d\u2019autres locales que en (am\u00e9liore les performances sinon).\nimagick\nTraitement des images, pr\u00e9f\u00e9r\u00e9 \u00e0 GD si disponible.\nffi\nTraitement des images avec libvips (n\u00e9cessite une installation via Composer).",
    "href": "fr\/documentation\/bien-demarrer\/installation\/#extensions-optionnelles"  },
  {
    "id": "fr\/documentation\/getting-started\/installation#telecharger-le-phar",
    "page": "Bien d\u00e9marrer > Installation",
    "title": "T\u00e9l\u00e9charger le PHAR",
    "description": "T\u00e9l\u00e9chargez cecil.phar depuis votre terminal :",
    "content": "T\u00e9l\u00e9chargez cecil.phar depuis votre terminal :\ncurl -LO https:\/\/cecil.app\/cecil.phar\nPuis ex\u00e9cutez-le avec PHP :\nphp cecil.phar --version\nVous pouvez \u00e9galement t\u00e9l\u00e9charger une version sp\u00e9cifique ou la version d\u2019aper\u00e7u.",
    "href": "fr\/documentation\/bien-demarrer\/installation\/#telecharger-le-phar"  },
  {
    "id": "fr\/documentation\/getting-started\/installation#installation-globale",
    "page": "Bien d\u00e9marrer > Installation",
    "title": "Installation globale",
    "description": "Installer Cecil globalement permet d\u2019ex\u00e9cuter la commande cecil depuis n\u2019importe quel dossier, au lieu de php cecil.phar.",
    "content": "Installer Cecil globalement permet d\u2019ex\u00e9cuter la commande cecil depuis n\u2019importe quel dossier, au lieu de php cecil.phar.",
    "href": "fr\/documentation\/bien-demarrer\/installation\/#installation-globale"  },
  {
    "id": "fr\/documentation\/getting-started\/installation#macos-et-linux",
    "page": "Bien d\u00e9marrer > Installation",
    "title": "macOS et Linux",
    "description": "Avec Homebrew :",
    "content": "Avec Homebrew :\nbrew install cecilapp\/tap\/cecil\nOu manuellement, en d\u00e9pla\u00e7ant le PHAR dans un dossier de votre PATH :\nmv cecil.phar \/usr\/local\/bin\/cecil\nchmod +x \/usr\/local\/bin\/cecil",
    "href": "fr\/documentation\/bien-demarrer\/installation\/#macos-et-linux"  },
  {
    "id": "fr\/documentation\/getting-started\/installation#windows",
    "page": "Bien d\u00e9marrer > Installation",
    "title": "Windows",
    "description": "Avec Scoop :",
    "content": "Avec Scoop :\nscoop install https:\/\/cecil.app\/scoop\/cecil.json\nOu manuellement :\nD\u00e9placez cecil.phar dans un dossier d\u00e9di\u00e9 tel que C:\\bin\nRenommez cecil.phar en cecil\nAjoutez ;C:\\bin \u00e0 votre variable d\u2019environnement PATH\nCr\u00e9ez un \u00ab wrapping batch script \u00bb \u00e0 c\u00f4t\u00e9",
    "href": "fr\/documentation\/bien-demarrer\/installation\/#windows"  },
  {
    "id": "fr\/documentation\/getting-started\/installation#phive",
    "page": "Bien d\u00e9marrer > Installation",
    "title": "PHIVE",
    "description": "Avec PHIVE (The PHAR Installation and Verification Environment) :",
    "content": "Avec PHIVE (The PHAR Installation and Verification Environment) :\nphive install cecil",
    "href": "fr\/documentation\/bien-demarrer\/installation\/#phive"  },
  {
    "id": "fr\/documentation\/getting-started\/installation#composer",
    "page": "Bien d\u00e9marrer > Installation",
    "title": "Composer",
    "description": "Avec Composer :",
    "content": "Avec Composer :\ncomposer global require cecil\/cecil\nAssurez-vous que le dossier des binaires globaux de Composer est dans votre PATH. Ex\u00e9cutez composer global config bin-dir --absolute pour l\u2019obtenir.\nPour utiliser Cecil comme d\u00e9pendance d\u2019un projet PHP, voir Biblioth\u00e8que.",
    "href": "fr\/documentation\/bien-demarrer\/installation\/#composer"  },
  {
    "id": "fr\/documentation\/getting-started\/installation#verifier-l-installation",
    "page": "Bien d\u00e9marrer > Installation",
    "title": "V\u00e9rifier l\u2019installation",
    "description": "",
    "content": "cecil --version\nEx\u00e9cutez cecil list pour afficher les commandes disponibles.",
    "href": "fr\/documentation\/bien-demarrer\/installation\/#verifier-l-installation"  },
  {
    "id": "fr\/documentation\/getting-started\/installation#mise-a-jour",
    "page": "Bien d\u00e9marrer > Installation",
    "title": "Mise \u00e0 jour",
    "description": "Mettez \u00e0 jour Cecil vers la derni\u00e8re version selon votre m\u00e9thode d\u2019installation :",
    "content": "Mettez \u00e0 jour Cecil vers la derni\u00e8re version selon votre m\u00e9thode d\u2019installation :\n# PHAR\nphp cecil.phar self-update\n# Homebrew\nbrew upgrade cecilapp\/tap\/cecil\n# Scoop\nscoop update cecil\n# PHIVE\nphive update cecil\n# Composer\ncomposer global update cecil\/cecil\nLa commande self-update (PHAR uniquement) accepte \u00e9galement les options suivantes :\n--rollback : revient \u00e0 la version pr\u00e9c\u00e9demment install\u00e9e\n--stable : force la mise \u00e0 jour vers la derni\u00e8re version stable\n--preview : force la mise \u00e0 jour vers la derni\u00e8re version instable\nLe journal des modifications de chaque version est disponible sur GitHub.",
    "href": "fr\/documentation\/bien-demarrer\/installation\/#mise-a-jour"  },
  {
    "id": "fr\/documentation\/getting-started\/installation#command-not-found-cecil",
    "page": "Bien d\u00e9marrer > Installation",
    "title": "command not found: cecil",
    "description": "Le dossier d\u2019installation n\u2019est pas dans votre PATH : ajoutez-le, ou ex\u00e9cutez Cecil avec php cecil.phar depuis le dossier contenant le PHAR.",
    "content": "Le dossier d\u2019installation n\u2019est pas dans votre PATH : ajoutez-le, ou ex\u00e9cutez Cecil avec php cecil.phar depuis le dossier contenant le PHAR.",
    "href": "fr\/documentation\/bien-demarrer\/installation\/#command-not-found-cecil"  },
  {
    "id": "fr\/documentation\/getting-started\/installation#erreur-de-version-ou-d-extension-php",
    "page": "Bien d\u00e9marrer > Installation",
    "title": "Erreur de version ou d\u2019extension PHP",
    "description": "Le PHP utilis\u00e9 en ligne de commande peut diff\u00e9rer de celui attendu (plusieurs versions install\u00e9es) : v\u00e9rifiez-le avec php -v et php --ini, puis activez les extensions manquantes dans le fichier php.ini charg\u00e9.",
    "content": "Le PHP utilis\u00e9 en ligne de commande peut diff\u00e9rer de celui attendu (plusieurs versions install\u00e9es) : v\u00e9rifiez-le avec php -v et php --ini, puis activez les extensions manquantes dans le fichier php.ini charg\u00e9.",
    "href": "fr\/documentation\/bien-demarrer\/installation\/#erreur-de-version-ou-d-extension-php"  },
  {
    "id": "fr\/documentation\/getting-started\/installation#diagnostiquer-un-site",
    "page": "Bien d\u00e9marrer > Installation",
    "title": "Diagnostiquer un site",
    "description": "Une fois un site cr\u00e9\u00e9, ex\u00e9cutez la commande doctor pour diagnostiquer sa configuration.",
    "content": "Une fois un site cr\u00e9\u00e9, ex\u00e9cutez la commande doctor pour diagnostiquer sa configuration.",
    "href": "fr\/documentation\/bien-demarrer\/installation\/#diagnostiquer-un-site"  },
  {
    "id": "fr\/documentation\/templates\/variables",
    "page": "Templates > Variables",
    "title": "Variables",
    "description": "",
    "content": "L'application transmet des variables aux templates pour manipulation dans le mod\u00e8le. Les variables peuvent \u00e9galement avoir des attributs ou des \u00e9l\u00e9ments auxquels vous pouvez acc\u00e9der.\nUtilisez un point (.) pour acc\u00e9der aux attributs d'une variable\u00a0: {{ foo.bar }}\nVous pouvez utiliser des variables de diff\u00e9rentes port\u00e9es\u00a0: site, page, cecil.",
    "href": "fr\/documentation\/templates\/variables\/"  },
  {
    "id": "fr\/documentation\/templates\/variables#site",
    "page": "Templates > Variables",
    "title": "site",
    "description": "La variable site contient des variables int\u00e9gr\u00e9es et celles d\u00e9finies dans la configuration.",
    "content": "La variable site contient des variables int\u00e9gr\u00e9es et celles d\u00e9finies dans la configuration.\nVariables\nDescriptif\nsite.pages\nCollection de toutes les pages, dans la langue actuelle.\nsite.allpages\nCollection de toutes les pages, dans toutes les langues.\nsite.page(id)\nUne page avec l'ID donn\u00e9.\nsite.taxonomies\nRecueil de vocabulaires.\nsite.home\nID de la page d'accueil.\nsite.time\nActuel Timestamp.\nsite.debug\n\u00c9tat du mode d\u00e9bogage (true ou false).\nsite.build\nID de build actuel.\nExemple:\ntitle: \"My amazing website!\"\nPeut \u00eatre affich\u00e9 dans un mod\u00e8le avec\u00a0:\n{{ site.title }}\nUtilisez la m\u00e9thode showable sur la collection de pages pour renvoyer uniquement les pages publi\u00e9es et non les pages virtuelles\/redirectes\/exclues.\nExemple:\n{% for page in site.pages.showable %}\n  <a href=\"{{ url(page) }}\">{{ page.title }}<\/a>\n{% endfor %}\nDans certains cas, vous pouvez rencontrer des conflits entre la configuration et les variables int\u00e9gr\u00e9es (ex.\u00a0: pages.default configuration), vous pouvez donc utiliser config.<variable> (avec <variable> est le nom\/chemin de la variable) pour acc\u00e9der directement \u00e0 la configuration brute.\nExemple:\n{{ config.pages.default.sitemap.priority }}",
    "href": "fr\/documentation\/templates\/variables\/#site"  },
  {
    "id": "fr\/documentation\/templates\/variables#site-menus",
    "page": "Templates > Variables",
    "title": "site.menus",
    "description": "Bouclez sur site.menus.<menu> pour obtenir chaque entr\u00e9e de la collection <menu> (par exemple\u00a0: main).",
    "content": "Bouclez sur site.menus.<menu> pour obtenir chaque entr\u00e9e de la collection <menu> (par exemple\u00a0: main).\nVariables\nDescriptif\n<entry>.name\nNom de l'entr\u00e9e.\n<entry>.url\nURL d'entr\u00e9e.\n<entry>.weight\nPoids d'entr\u00e9e (utile pour trier les entr\u00e9es de menu).\nExemple:\n<nav>\n  <ol>\n  {% for entry in site.menus.main|sort_by_weight %}\n    <li><a href=\"{{ url(entry.url) }}\" data-weight=\"{{ entry.weight }}\">{{ entry.name }}<\/a><\/li>\n  {% endfor %}\n  <\/ol>\n<\/nav>",
    "href": "fr\/documentation\/templates\/variables\/#site-menus"  },
  {
    "id": "fr\/documentation\/templates\/variables#site-language",
    "page": "Templates > Variables",
    "title": "site.language",
    "description": "Informations sur la langue actuelle.",
    "content": "Informations sur la langue actuelle.\nVariables\nDescriptif\nsite.language\nCode de langue (ex.\u00a0: en).\nsite.language.name\nNom de la langue (par exemple\u00a0: English).\nsite.language.locale\nLangue code local (par exemple\u00a0: en_US).\nsite.language.weight\nPosition de la langue dans la liste languages.\nVous pouvez r\u00e9cup\u00e9rer name, locale et weight d'un langage sp\u00e9cifique en passant son code en param\u00e8tre.\npar exemple\u00a0: site.language.name('fr').",
    "href": "fr\/documentation\/templates\/variables\/#site-language"  },
  {
    "id": "fr\/documentation\/templates\/variables#site-static",
    "page": "Templates > Variables",
    "title": "site.static",
    "description": "La collection de fichiers statiques est accessible via site.static si le static load est activ\u00e9.",
    "content": "La collection de fichiers statiques est accessible via site.static si le static load est activ\u00e9.\nChaque fichier expose les propri\u00e9t\u00e9s suivantes\u00a0:\npath : chemin relatif (ex. : \/images\/img-1.jpg)\ndate\u00a0: date de cr\u00e9ation (timestamp)\nupdated : date de modification (timestamp)\nname : nom (ex. : img-1.jpg)\nbasename : nom sans extension (ex. : img-1)\next : poste (ex. : jpg)\ntype : type de m\u00e9dia (ex. : image)\nsubtype\u00a0: sous-type de m\u00e9dia (ex.\u00a0: image\/jpeg)\nexif\u00a0: donn\u00e9es EXIF \u200b\u200b\u200b\u200bde l'image (array)\naudio\u00a0: Mp3Info objet\nvideo\u00a0: tableau d'informations vid\u00e9o de base (dur\u00e9e en secondes, largeur et hauteur)",
    "href": "fr\/documentation\/templates\/variables\/#site-static"  },
  {
    "id": "fr\/documentation\/templates\/variables#site-data",
    "page": "Templates > Variables",
    "title": "site.data",
    "description": "Une collection de donn\u00e9es est accessible via site.data.<filename> (sans extension de fichier).",
    "content": "Une collection de donn\u00e9es est accessible via site.data.<filename> (sans extension de fichier).\nExemples\u00a0:\ndata\/authors.yml : site.data.authors\ndata\/authors.fr.yml : site.data.authors (si site.language = \"fr\")\ndata\/galleries\/gallery-1.json : site.data.galleries['gallery-1']",
    "href": "fr\/documentation\/templates\/variables\/#site-data"  },
  {
    "id": "fr\/documentation\/templates\/variables#page",
    "page": "Templates > Variables",
    "title": "page",
    "description": "La variable page contient les variables int\u00e9gr\u00e9es d'une page et celles d\u00e9finies dans le avant-plan.",
    "content": "La variable page contient les variables int\u00e9gr\u00e9es d'une page et celles d\u00e9finies dans le avant-plan.\nVariables\nDescriptif\nExemple\npage.id\nIdentifiant unique.\nblog\/post-1\npage.title\nNom du fichier (sans extension).\nPost 1\npage.date\nDate de cr\u00e9ation du fichier.\nDateHeure\npage.body\nCorps du fichier.\nMarquage\npage.content\nCorps du fichier converti en HTML.\nHTML\npage.section\nDossier racine du fichier (slugified).\nblog\npage.path\nChemin du fichier (slugified).\nblog\/post-1\npage.slug\nNom du fichier (slugified).\npost-1\npage.filepath\nChemin du syst\u00e8me de fichiers.\nBlog\/Post 1.md\npage.type\nhomepage, page, section, vocabulary ou term.\npage\npage.pages\nCollection de toutes les sous-pages.\nCollection\npage.translations\nCollection de pages traduites.\nCollection\nUtilisez la m\u00e9thode showable sur la collection de pages pour renvoyer uniquement les pages publi\u00e9es et non les pages virtuelles\/redirectes\/exclues.\nExemple:\n{% for page in page.pages.showable %}\n  <a href=\"{{ url(page) }}\">{{ page.title }}<\/a>\n{% endfor %}",
    "href": "fr\/documentation\/templates\/variables\/#page"  },
  {
    "id": "fr\/documentation\/templates\/variables#sections-imbriquees",
    "page": "Templates > Variables",
    "title": "Sections imbriqu\u00e9es",
    "description": "Dans un contexte de sections imbriqu\u00e9es, les propri\u00e9t\u00e9s page.parent, page.ancestors, page.sections et page.toplevel facilitent la construction de la navigation.",
    "content": "Dans un contexte de sections imbriqu\u00e9es, les propri\u00e9t\u00e9s page.parent, page.ancestors, page.sections et page.toplevel facilitent la construction de la navigation.\nVariables\nDescriptif\nExemple\npage.parent\nPage de la section parente (null si aucune).\nPage\npage.ancestors\nCollection des sections anc\u00eatres (la plus proche en premier).\nCollection\npage.sections\nCollection des sections descendantes imm\u00e9diates.\nCollection\npage.toplevel\ntrue si la page est une section de premier niveau.\nBoolean\nFil d'Ariane (de la page d'accueil \u00e0 la page courante) :\n<nav aria-label=\"breadcrumb\">\n  <ul>\n    <li><a href=\"{{ url(site.home) }}\">{{ site.title }}<\/a><\/li>\n    {% for section in page.ancestors|reverse %}\n    <li><a href=\"{{ url(section) }}\">{{ section.title }}<\/a><\/li>\n    {% endfor %}\n    {% if page.id != site.home %}\n    <li><a href=\"{{ url(page) }}\" aria-current=\"page\">{{ page.title }}<\/a><\/li>\n    {% endif %}\n  <\/ul>\n<\/nav>\nUn partial breadcrumb.html.twig pr\u00eat \u00e0 l'emploi est disponible :\n{{ include('partials\/breadcrumb.html.twig') }}\nMenu des sous-sections (sections descendantes imm\u00e9diates de la section courante) :\n{% if page.sections|length %}\n<ul>\n  {% for section in page.sections|sort_by_title %}\n  <li><a href=\"{{ url(section) }}\">{{ section.title }}<\/a><\/li>\n  {% endfor %}\n<\/ul>\n{% endif %}\nNavigation principale limit\u00e9e aux sections de premier niveau (depuis n'importe quelle page) :\n<nav>\n  {% for section in site.page(site.home).sections|sort_by_title %}\n  <a href=\"{{ url(section) }}\">{{ section.title }}<\/a>\n  {% endfor %}\n<\/nav>\nLien vers la section parente :\n{% if page.parent %}\n<a href=\"{{ url(page.parent) }}\">\u2190 {{ page.parent.title }}<\/a>\n{% endif %}",
    "href": "fr\/documentation\/templates\/variables\/#sections-imbriquees"  },
  {
    "id": "fr\/documentation\/templates\/variables#page-prev-next",
    "page": "Templates > Variables",
    "title": "page.<prev\/next>",
    "description": "Navigation entre les pages d'une m\u00eame Section, tri\u00e9es selon le sortby de la section (ordre chronologique pour les dates).",
    "content": "Navigation entre les pages d'une m\u00eame Section, tri\u00e9es selon le sortby de la section (ordre chronologique pour les dates).\nAvec des sous-sections, la navigation suit l'arbre des sections : les pages d'une Section de premier niveau et de toutes ses sous-sections sont encha\u00een\u00e9es, chaque sous-section (sa page d'index) \u00e9tant plac\u00e9e parmi les pages de sa Section parente et suivie de ses propres pages.\nVariables\nDescriptif\nExemple\npage.prev\nPage pr\u00e9c\u00e9dente.\nPage\npage.next\nPage suivante.\nPage\nExemple:\n<a href=\"{{ url(page.prev) }}\">{{ page.prev.title }}<\/a>",
    "href": "fr\/documentation\/templates\/variables\/#page-prev-next"  },
  {
    "id": "fr\/documentation\/templates\/variables#page-paginator",
    "page": "Templates > Variables",
    "title": "page.paginator",
    "description": "Paginator vous aide \u00e0 cr\u00e9er une navigation pour les pages de la liste : page d'accueil, sections et taxonomies.",
    "content": "Paginator vous aide \u00e0 cr\u00e9er une navigation pour les pages de la liste : page d'accueil, sections et taxonomies.\nVariables\nDescriptif\npage.paginator.pages\nCollection de pages.\npage.paginator.pages_total\nNombre total de pages.\npage.paginator.count\nNombre de pages du paginateur.\npage.paginator.current\nIndex de position de la page actuelle.\npage.paginator.links.first\nID de page de la premi\u00e8re page.\npage.paginator.links.prev\nID de page de la page pr\u00e9c\u00e9dente.\npage.paginator.links.self\nID de page de la page actuelle.\npage.paginator.links.next\nID de page de la page suivante.\npage.paginator.links.last\nID de page de la derni\u00e8re page.\npage.paginator.links.path\nID de page sans l'index de position.\n\u00c9tant donn\u00e9 que les entr\u00e9es de liens sont des ID de page, vous devez utiliser la fonction url() pour cr\u00e9er des liens fonctionnels.\npar exemple\u00a0: {{ url(page.paginator.links.next) }}\nExemple:\n{% if page.paginator %}\n<div>\n  {% if page.paginator.links.prev is defined %}\n  <a href=\"{{ url(page.paginator.links.prev) }}\">Previous<\/a>\n  {% endif %}\n  {% if page.paginator.links.next is defined %}\n  <a href=\"{{ url(page.paginator.links.next) }}\">Next<\/a>\n  {% endif %}\n<\/div>\n{% endif %}\nExemple:\n{% if page.paginator %}\n<div>\n  {% for paginator_index in 1..page.paginator.count %}\n    {% if paginator_index != page.paginator.current %}\n      {% if paginator_index == 1 %}\n  <a href=\"{{ url(page.paginator.links.first) }}\">{{ paginator_index }}<\/a>\n      {% else %}\n  <a href=\"{{ url(page.paginator.links.path ~ '\/' ~ paginator_index) }}\">{{ paginator_index }}<\/a>\n      {% endif %}\n    {% else %}\n  {{ paginator_index }}\n    {% endif %}\n  {% endfor %}\n<\/div>\n{% endif %}",
    "href": "fr\/documentation\/templates\/variables\/#page-paginator"  },
  {
    "id": "fr\/documentation\/templates\/variables#taxonomie",
    "page": "Templates > Variables",
    "title": "Taxonomie",
    "description": "Variables disponibles dans les templates vocabulary et term.",
    "content": "Variables disponibles dans les templates vocabulary et term.\nVocabulaire\nPage \/<plural>\/ (ex. : \/categories\/).\nVariables\nDescriptif\npage.plural\nNom de vocabulaire au pluriel.\npage.singular\nNom de vocabulaire au singulier.\npage.terms\nListe de termes (Collection).\nChaque terme de page.terms fournit term.id (identifiant du terme, ex. : categories\/php), term.name (nom du terme, ex. : PHP) et le nombre de ses pages avec term|length.\nTerme\nPage \/<plural>\/<term>\/ (ex. : \/categories\/php\/).\nVariables\nDescriptif\npage.title\nNom du terme.\npage.term\nIdentifiant du terme (ex. : categories\/php).\npage.plural\nNom de vocabulaire au pluriel.\npage.singular\nNom de vocabulaire au singulier.\npage.pages\nListe des pages dans ce terme, tri\u00e9es par date (Collection).\nExemple de taxonomie\nConfiguration :\ntaxonomies:\n  categories: category\nFront matter d\u2019une page :\n---\ncategories: [\"Data Sovereignty\"]\n---\nListe des termes (\/categories\/), dans layouts\/taxonomy\/categories.html.twig :\n{% extends 'page.html.twig' %}\n{% block content %}\n  <h1>{{ page.title }}<\/h1>\n  <ul>\n  {% for term in page.terms %}\n    <li><a href=\"{{ url(term.id) }}\">{{ term.name }}<\/a> ({{ term|length }})<\/li>\n  {% endfor %}\n  <\/ul>\n{% endblock %}\nListe des pages d\u2019un terme (\/categories\/data-sovereignty\/), dans layouts\/taxonomy\/category.html.twig :\n{% extends 'page.html.twig' %}\n{% block content %}\n  <h1>{{ page.title }}<\/h1>\n  {% for p in page.paginator.pages ?? page.pages %}\n    <article>\n      <h2><a href=\"{{ url(p) }}\">{{ p.title }}<\/a><\/h2>\n    <\/article>\n  {% endfor %}\n  <a href=\"{{ url(page.plural) }}\">Toutes les {{ page.plural }}<\/a>\n{% endblock %}\nLiens vers les termes de la page courante, dans un template de page :\n{% for category in page.categories ?? [] %}\n  <a href=\"{{ url('categories\/' ~ category) }}\">{{ category }}<\/a>\n{% endfor %}\nLa fonction url() \u00ab slugifie \u00bb la cha\u00eene fournie pour trouver la page correspondante : url('categories\/Data Sovereignty') retourne \/categories\/data-sovereignty\/.\nVous pouvez aussi utiliser le partial int\u00e9gr\u00e9 {{ include('partials\/terms-list.html.twig', {vocabulary: 'categories'}) }}.",
    "href": "fr\/documentation\/templates\/variables\/#taxonomie"  },
  {
    "id": "fr\/documentation\/templates\/variables#cecil",
    "page": "Templates > Variables",
    "title": "cecil",
    "description": "",
    "content": "Variables\nDescriptif\ncecil.url\nURL du site Cecil.\ncecil.version\nVersion actuelle de Cecil.\ncecil.poweredby\nImprimez Cecil v%s, avec %s est la version actuelle.",
    "href": "fr\/documentation\/templates\/variables\/#cecil"  },
  {
    "id": "fr\/documentation\/templates\/reference\/sorts",
    "page": "Templates > Fonctions et filtres > Tris",
    "title": "Tris",
    "description": "Tri des collections (de pages, menus ou taxonomies).",
    "content": "Tri des collections (de pages, menus ou taxonomies).",
    "href": "fr\/documentation\/templates\/reference\/tris\/"  },
  {
    "id": "fr\/documentation\/templates\/reference\/sorts#sort-by-title",
    "page": "Templates > Fonctions et filtres > Tris",
    "title": "sort_by_title",
    "description": "Trie une collection par titre (avec tri naturel).",
    "content": "Trie une collection par titre (avec tri naturel).\n{{ collection|sort_by_title }}\nExemple:\n{{ site.pages|sort_by_title }}",
    "href": "fr\/documentation\/templates\/reference\/tris\/#sort-by-title"  },
  {
    "id": "fr\/documentation\/templates\/reference\/sorts#sort-by-date",
    "page": "Templates > Fonctions et filtres > Tris",
    "title": "sort_by_date",
    "description": "Trie une collection par date (la plus r\u00e9cente en premier).",
    "content": "Trie une collection par date (la plus r\u00e9cente en premier).\n{{ collection|sort_by_date(variable='date', desc_title=false) }}\nExemple:\n{# sort by date #}\n{{ site.pages|sort_by_date }}\n{# sort by updated variable instead of date #}\n{{ site.pages|sort_by_date(variable='updated') }}\n{# sort items with the same date by desc title #}\n{{ site.pages|sort_by_date(desc_title=true) }}\n{# reverse sort #}\n{{ site.pages|sort_by_date|reverse }}",
    "href": "fr\/documentation\/templates\/reference\/tris\/#sort-by-date"  },
  {
    "id": "fr\/documentation\/templates\/reference\/sorts#sort-by-weight",
    "page": "Templates > Fonctions et filtres > Tris",
    "title": "sort_by_weight",
    "description": "Trie une collection par poids (le plus l\u00e9ger en premier).",
    "content": "Trie une collection par poids (le plus l\u00e9ger en premier).\n{{ collection|sort_by_weight }}\nExemple:\n{{ site.menus.main|sort_by_weight }}",
    "href": "fr\/documentation\/templates\/reference\/tris\/#sort-by-weight"  },
  {
    "id": "fr\/documentation\/templates\/reference\/sorts#sort",
    "page": "Templates > Fonctions et filtres > Tris",
    "title": "sort",
    "description": "Pour les cas plus complexes, vous devez utiliser le sort natif de Twig.",
    "content": "Pour les cas plus complexes, vous devez utiliser le sort natif de Twig.\nExemple:\n{% set files = site.static|sort((a, b) => a.date|date('U') < b.date|date('U')) %}",
    "href": "fr\/documentation\/templates\/reference\/tris\/#sort"  },
  {
    "id": "fr\/documentation\/assets\/cdn-providers",
    "page": "Assets > Fournisseurs de CDN",
    "title": "Fournisseurs de CDN",
    "description": "Exemples de configuration de fournisseurs de CDN pour les options de configuration.",
    "content": "Exemples de configuration de fournisseurs de CDN pour les options de configuration.",
    "href": "fr\/documentation\/assets\/fournisseurs-cdn\/"  },
  {
    "id": "fr\/documentation\/assets\/cdn-providers#cloudinary",
    "page": "Assets > Fournisseurs de CDN",
    "title": "Cloudinary",
    "description": "https:\/\/cloudinary.com",
    "content": "https:\/\/cloudinary.com\nassets:\n  images:\n    cdn:\n      enabled: true\n      account: 'xxxx'\n      url: 'https:\/\/res.cloudinary.com\/%account%\/image\/fetch\/c_limit,w_%width%,q_%quality%,f_%format%,d_default\/%image_url%'",
    "href": "fr\/documentation\/assets\/fournisseurs-cdn\/#cloudinary"  },
  {
    "id": "fr\/documentation\/assets\/cdn-providers#cloudimage",
    "page": "Assets > Fournisseurs de CDN",
    "title": "Cloudimage",
    "description": "https:\/\/www.cloudimage.io",
    "content": "https:\/\/www.cloudimage.io\nassets:\n  images:\n    cdn:\n      enabled: true\n      account: 'xxxx'\n      url: 'https:\/\/%account%.cloudimg.io\/%image_url%?w=%width%&q=%quality%&force_format=%format%'",
    "href": "fr\/documentation\/assets\/fournisseurs-cdn\/#cloudimage"  },
  {
    "id": "fr\/documentation\/assets\/cdn-providers#twicpics",
    "page": "Assets > Fournisseurs de CDN",
    "title": "TwicPics",
    "description": "https:\/\/www.twicpics.com",
    "content": "https:\/\/www.twicpics.com\nassets:\n  images:\n    cdn:\n      enabled: true\n      account: 'xxxx'\n      canonical: false\n      remote: false\n      url: 'https:\/\/%account%.twic.pics\/%image_url%?twic=v1\/resize=%width%\/quality=%quality%\/output=%format%'\nSource URL : URL de base de votre site.",
    "href": "fr\/documentation\/assets\/fournisseurs-cdn\/#twicpics"  },
  {
    "id": "fr\/documentation\/assets\/cdn-providers#imgix",
    "page": "Assets > Fournisseurs de CDN",
    "title": "imgix",
    "description": "https:\/\/imgix.com",
    "content": "https:\/\/imgix.com\nassets:\n  images:\n    cdn:\n      enabled: true\n      account: 'xxxx'\n      canonical: false\n      remote: false\n      url: 'https:\/\/%account%.imgix.net\/%image_url%?w=%width%&q=%quality%&fm=%format%'\nBase URL : URL de base de votre site.",
    "href": "fr\/documentation\/assets\/fournisseurs-cdn\/#imgix"  },
  {
    "id": "fr\/documentation\/assets\/cdn-providers#netlify-image-cdn",
    "page": "Assets > Fournisseurs de CDN",
    "title": "Netlify Image CDN",
    "description": "https:\/\/docs.netlify.com\/image-cdn\/overview\/",
    "content": "https:\/\/docs.netlify.com\/image-cdn\/overview\/\nassets:\n  images:\n    cdn:\n      enabled: true\n      canonical: false\n      url: '\/.netlify\/images?url=%image_url%&w=%width%&fm=%format%'",
    "href": "fr\/documentation\/assets\/fournisseurs-cdn\/#netlify-image-cdn"  },
  {
    "id": "fr\/documentation\/assets\/cdn-providers#execution-en-local",
    "page": "Assets > Fournisseurs de CDN",
    "title": "Ex\u00e9cution en local",
    "description": "",
    "content": "Installer Netlify CLI\nnpm install netlify-cli -g\nnetlify link\nnetlify.toml :\n[dev]\n  targetPort = 8000\nD\u00e9marrer le serveur local\nphp cecil.phar serve & netlify dev\nOuvrez http:\/\/localhost:8888",
    "href": "fr\/documentation\/assets\/fournisseurs-cdn\/#execution-en-local"  },
  {
    "id": "fr\/documentation\/commands\/serve",
    "page": "Commandes > serve",
    "title": "serve",
    "description": "Construit et sert le site en local.",
    "content": "Construit et sert le site en local.\nLe serveur web est con\u00e7u pour faciliter les tests d\u2019un site. Il n\u2019a pas vocation \u00e0 \u00eatre un serveur web complet et ne doit pas \u00eatre utilis\u00e9 sur un r\u00e9seau public.\nDescription:\n  Starts the built-in server\nUsage:\n  serve [options] [--] [<path>]\nArguments:\n  path                             Use the given path as working directory\nOptions:\n  -o, --open                       Open web browser automatically\n      --host=HOST                  Server host [default: \"localhost\"]\n      --port=PORT                  Server port [default: \"8000\"]\n  -w, --watch|--no-watch           Enable (or disable --no-watch) changes watcher (enabled by default)\n  -i, --incremental                Enable incremental builds (rebuild only changed pages)\n  -d, --drafts                     Include drafts\n      --optimize|--no-optimize     Enable (or disable --no-optimize) optimization of generated files\n  -c, --config=CONFIG              Set the path to extra config files (comma-separated)\n      --clear-cache[=CLEAR-CACHE]  Clear cache before build (optional cache key as regular expression) [default: false]\n  -p, --page=PAGE                  Build a specific page\n      --no-ignore-vcs              Changes watcher must not ignore VCS directories\n  -m, --metrics                    Show build metrics (duration and memory) of each step\n      --timeout=TIMEOUT            Sets the process timeout (max. runtime) in seconds [default: 7200]\n      --notify                     Send desktop notification on server start\n  -b, --background                 Run the server in the background\n  -h, --help                       Display help for the given command. When no command is given display help for the list command\n  -q, --quiet                      Do not output any message\n  -V, --version                    Display this application version\n      --ansi|--no-ansi             Force (or disable --no-ansi) ANSI output\n  -n, --no-interaction             Do not ask any interactive question\n  -v|vv|vvv, --verbose             Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug\nHelp:\n  The serve command starts the live-reloading-built-in web server.\ncecil.phar serve\n    cecil.phar serve path\/to\/the\/working\/directory\n    cecil.phar serve --open\n    cecil.phar serve --drafts\n    cecil.phar serve --no-watch\nTo speed up local development you can enable incremental builds with the --incremental option.\n  When content pages change, Cecil rebuilds just those pages.\n  When templates change, Cecil rebuilds only pages using those templates (including Twig dependencies such as extends\/include).\n  Any other change (data, config, static or asset file, or file deletion) triggers a full rebuild:\ncecil.phar serve --incremental\nYou can use a custom host and port by using the --host and --port options:\ncecil.phar serve --host=127.0.0.1 --port=8080\nTo build the website with an extra configuration file, you can use the --config option.\n  This is useful during local development to override some settings without modifying the main configuration:\ncecil.phar serve --config=config\/dev.yml\nTo start the server with changes watcher not ignoring VCS directories, run:\ncecil.phar serve --no-ignore-vcs\nTo define the process timeout (in seconds), run:\ncecil.phar serve --timeout=7200\nTo run the server in the background, run:\ncecil.phar serve --background\n    cecil.phar serve -b\nThen stop it with:\ncecil.phar serve:stop\nIn background mode, file changes are not watched automatically.",
    "href": "fr\/documentation\/commandes\/serve\/"  },
  {
    "id": "fr\/documentation\/commands\/serve#serve-background",
    "page": "Commandes > serve",
    "title": "serve:background",
    "description": "Alias de serve --background : d\u00e9marre le serveur int\u00e9gr\u00e9 en arri\u00e8re-plan sans occuper le terminal.",
    "content": "Alias de serve --background : d\u00e9marre le serveur int\u00e9gr\u00e9 en arri\u00e8re-plan sans occuper le terminal.\nDescription:\n  Starts the built-in server in the background (alias of `serve --background`)\nUsage:\n  serve:background [options] [--] [<path>]\nHelp:\n  The serve:background command starts the built-in web server in the background.\ncecil.phar serve:background\n    cecil.phar serve:background path\/to\/the\/working\/directory\nThis command is an alias of serve --background.\nStop the server with:\ncecil.phar serve:stop",
    "href": "fr\/documentation\/commandes\/serve\/#serve-background"  },
  {
    "id": "fr\/documentation\/commands\/serve#serve-log",
    "page": "Commandes > serve",
    "title": "serve:log",
    "description": "Affiche les logs combin\u00e9s du serveur et des erreurs, tri\u00e9s par date.",
    "content": "Affiche les logs combin\u00e9s du serveur et des erreurs, tri\u00e9s par date.\nDescription:\n  Shows combined server and error logs\nUsage:\n  serve:log [options] [--] [<path>]\nArguments:\n  path                  Use the given path as working directory\nOptions:\n  -l, --lines=LINES     Number of entries to display (default: 25)\nHelp:\n  The serve:log command displays entries from combined server and error logs, sorted by date.\ncecil.phar serve:log\n    cecil.phar serve:log path\/to\/the\/working\/directory\n    cecil.phar serve:log --lines=100\n    cecil.phar serve:log -l 100\nThis command shows logs from `.cecil\/errors.log` and `.cecil\/server.log`.\n  It is useful for debugging issues with your local development server.",
    "href": "fr\/documentation\/commandes\/serve\/#serve-log"  },
  {
    "id": "fr\/documentation\/configuration\/locale-codes",
    "page": "Configuration > Codes de locale",
    "title": "Codes de locale",
    "description": "Codes de locale disponibles (language_COUNTRY) utilis\u00e9s par l\u2019option languages.",
    "content": "Codes de locale disponibles (language_COUNTRY) utilis\u00e9s par l\u2019option languages.\nLocale\nCode\nAlbanais (Albanie)\nsq_AL\nAlbanais\nsq\nArabe (Alg\u00e9rie)\nar_DZ\nArabe (Bahre\u00efn)\nar_BH\nArabe (\u00c9gypte)\nar_EG\nArabe (Irak)\nar_IQ\nArabe (Jordanie)\nar_JO\nArabe (Kowe\u00eft)\nar_KW\nArabe (Liban)\nar_LB\nArabe (Libye)\nar_LY\nArabe (Maroc)\nar_MA\nArabe (Oman)\nar_OM\nArabe (Qatar)\nar_QA\nArabe (Arabie saoudite)\nar_SA\nArabe (Soudan)\nar_SD\nArabe (Syrie)\nar_SY\nArabe (Tunisie)\nar_TN\nArabe (\u00c9mirats arabes unis)\nar_AE\nArabe (Y\u00e9men)\nar_YE\nArabe\nar\nBi\u00e9lorusse (Bi\u00e9lorussie)\nbe_BY\nBi\u00e9lorusse\nbe\nBulgare (Bulgarie)\nbg_BG\nBulgare\nbg\nCatalan (Espagne)\nca_ES\nCatalan\nca\nChinois (Chine)\nzh_CN\nChinois (Hong Kong)\nzh_HK\nChinois (Singapour)\nzh_SG\nChinois (Ta\u00efwan)\nzh_TW\nChinois\nzh\nCroate (Croatie)\nhr_HR\nCroate\nhr\nTch\u00e8que (R\u00e9publique tch\u00e8que)\ncs_CZ\nTch\u00e8que\ncs\nDanois (Danemark)\nda_DK\nDanois\nda\nN\u00e9erlandais (Belgique)\nnl_BE\nN\u00e9erlandais (Pays-Bas)\nnl_NL\nN\u00e9erlandais\nnl\nAnglais (Australie)\nen_AU\nAnglais (Canada)\nen_CA\nAnglais (Inde)\nen_IN\nAnglais (Irlande)\nen_IE\nAnglais (Malte)\nen_MT\nAnglais (Nouvelle-Z\u00e9lande)\nen_NZ\nAnglais (Philippines)\nen_PH\nAnglais (Singapour)\nen_SG\nAnglais (Afrique du Sud)\nen_ZA\nAnglais (Royaume-Uni)\nen_GB\nAnglais (\u00c9tats-Unis)\nen_US\nAnglais\nen\nEstonien (Estonie)\net_EE\nEstonien\net\nFinnois (Finlande)\nfi_FI\nFinnois\nfi\nFran\u00e7ais (Belgique)\nfr_BE\nFran\u00e7ais (Canada)\nfr_CA\nFran\u00e7ais (France)\nfr_FR\nFran\u00e7ais (Luxembourg)\nfr_LU\nFran\u00e7ais (Suisse)\nfr_CH\nFran\u00e7ais\nfr\nAllemand (Autriche)\nde_AT\nAllemand (Allemagne)\nde_DE\nAllemand (Luxembourg)\nde_LU\nAllemand (Suisse)\nde_CH\nAllemand\nde\nGrec (Chypre)\nel_CY\nGrec (Gr\u00e8ce)\nel_GR\nGrec\nel\nH\u00e9breu (Isra\u00ebl)\niw_IL\nH\u00e9breu\niw\nHindi (Inde)\nhi_IN\nHongrois (Hongrie)\nhu_HU\nHongrois\nhu\nIslandais (Islande)\nis_IS\nIslandais\nis\nIndon\u00e9sien (Indon\u00e9sie)\nin_ID\nIndon\u00e9sien\nin\nIrlandais (Irlande)\nga_IE\nIrlandais\nga\nItalien (Italie)\nit_IT\nItalien (Suisse)\nit_CH\nItalien\nit\nJaponais (Japon)\nja_JP\nJaponais (Japon,JP)\nja_JP_JP\nJaponais\nja\nCor\u00e9en (Cor\u00e9e du Sud)\nko_KR\nCor\u00e9en\nko\nLetton (Lettonie)\nlv_LV\nLetton\nlv\nLituanien (Lituanie)\nlt_LT\nLituanien\nlt\nMac\u00e9donien (Mac\u00e9doine)\nmk_MK\nMac\u00e9donien\nmk\nMalais (Malaisie)\nms_MY\nMalais\nms\nMaltais (Malte)\nmt_MT\nMaltais\nmt\nNorv\u00e9gien (Norv\u00e8ge)\nno_NO\nNorv\u00e9gien (Norv\u00e8ge, Nynorsk)\nno_NO_NY\nNorv\u00e9gien\nno\nPolonais (Pologne)\npl_PL\nPolonais\npl\nPortugais (Br\u00e9sil)\npt_BR\nPortugais (Portugal)\npt_PT\nPortugais\npt\nRoumain (Roumanie)\nro_RO\nRoumain\nro\nRusse (Russie)\nru_RU\nRusse\nru\nSerbe (Bosnie-Herz\u00e9govine)\nsr_BA\nSerbe (Mont\u00e9n\u00e9gro)\nsr_ME\nSerbe (Serbie et Mont\u00e9n\u00e9gro)\nsr_CS\nSerbe (Serbie)\nsr_RS\nSerbe\nsr\nSlovaque (Slovaquie)\nsk_SK\nSlovaque\nsk\nSlov\u00e8ne (Slov\u00e9nie)\nsl_SI\nSlov\u00e8ne\nsl\nEspagnol (Argentine)\nes_AR\nEspagnol (Bolivie)\nes_BO\nEspagnol (Chili)\nes_CL\nEspagnol (Colombie)\nes_CO\nEspagnol (Costa Rica)\nes_CR\nEspagnol (R\u00e9publique dominicaine)\nes_DO\nEspagnol (\u00c9quateur)\nes_EC\nEspagnol (Salvador)\nes_SV\nEspagnol (Guatemala)\nes_GT\nEspagnol (Honduras)\nes_HN\nEspagnol (Mexique)\nes_MX\nEspagnol (Nicaragua)\nes_NI\nEspagnol (Panama)\nes_PA\nEspagnol (Paraguay)\nes_PY\nEspagnol (P\u00e9rou)\nes_PE\nEspagnol (Porto Rico)\nes_PR\nEspagnol (Espagne)\nes_ES\nEspagnol (\u00c9tats-Unis)\nes_US\nEspagnol (Uruguay)\nes_UY\nEspagnol (Venezuela)\nes_VE\nEspagnol\nes\nSu\u00e9dois (Su\u00e8de)\nsv_SE\nSu\u00e9dois\nsv\nTha\u00ef (Tha\u00eflande)\nth_TH\nTha\u00ef (Tha\u00eflande,TH)\nth_TH_TH\nTha\u00ef\nth\nTurc (Turquie)\ntr_TR\nTurc\ntr\nUkrainien (Ukraine)\nuk_UA\nUkrainien\nuk\nVietnamien (Vietnam)\nvi_VN\nVietnamien\nvi",
    "href": "fr\/documentation\/configuration\/codes-de-locale\/"  },
  {
    "id": "fr\/documentation\/content\/markdown",
    "page": "Contenu > Markdown",
    "title": "Markdown",
    "description": "Cecil prend en charge le format Markdown, ainsi que Markdown Extra.",
    "content": "Cecil prend en charge le format Markdown, ainsi que Markdown Extra.\nCecil fournit aussi des fonctionnalit\u00e9s suppl\u00e9mentaires pour enrichir votre contenu, voir ci-dessous.",
    "href": "fr\/documentation\/contenu\/markdown\/"  },
  {
    "id": "fr\/documentation\/content\/markdown#attributs",
    "page": "Contenu > Markdown",
    "title": "Attributs",
    "description": "Avec Markdown Extra, vous pouvez d\u00e9finir un id, une classe et des attributs personnalis\u00e9s sur certains \u00e9l\u00e9ments \u00e0 l\u2019aide d\u2019un bloc d\u2019attributs.\nPar exemple, placez le(s) attribut(s) souhait\u00e9(s) apr\u00e8s un en-t\u00eate, un bloc de code d\u00e9limit\u00e9, un lien ou une image en fin de ligne, entre accolades, comme ceci :",
    "content": "Avec Markdown Extra, vous pouvez d\u00e9finir un id, une classe et des attributs personnalis\u00e9s sur certains \u00e9l\u00e9ments \u00e0 l\u2019aide d\u2019un bloc d\u2019attributs.\nPar exemple, placez le(s) attribut(s) souhait\u00e9(s) apr\u00e8s un en-t\u00eate, un bloc de code d\u00e9limit\u00e9, un lien ou une image en fin de ligne, entre accolades, comme ceci :\n## En-t\u00eate {#id .class attribute=value}\nPour un \u00e9l\u00e9ment en ligne, comme un lien, vous devez utiliser un retour \u00e0 la ligne apr\u00e8s l\u2019accolade fermante :\nLorem ipsum [dolor](url){attribute=value} \nsit amet.",
    "href": "fr\/documentation\/contenu\/markdown\/#attributs"  },
  {
    "id": "fr\/documentation\/content\/markdown#liens",
    "page": "Contenu > Markdown",
    "title": "Liens",
    "description": "Vous pouvez cr\u00e9er un lien avec la syntaxe [Texte](url) ; url peut \u00eatre un chemin, un chemin relatif vers un fichier Markdown, une URL externe, etc.",
    "content": "Vous pouvez cr\u00e9er un lien avec la syntaxe [Texte](url) ; url peut \u00eatre un chemin, un chemin relatif vers un fichier Markdown, une URL externe, etc.\nExemple :\n[Link to a path](\/about\/)\n[Link to a Markdown file](\/fr\/a-propos\/)\n[Link to Cecil website](https:\/\/cecil.app)\nUn lien relatif vers un fichier Markdown est r\u00e9solu depuis le dossier du fichier courant (comme sur GitHub), puis remplac\u00e9 par l\u2019URL de la page cibl\u00e9e.",
    "href": "fr\/documentation\/contenu\/markdown\/#liens"  },
  {
    "id": "fr\/documentation\/content\/markdown#lien-vers-une-page",
    "page": "Contenu > Markdown",
    "title": "Lien vers une page",
    "description": "Vous pouvez facilement cr\u00e9er un lien vers une page avec la syntaxe [Titre de page](page:page-id).",
    "content": "Vous pouvez facilement cr\u00e9er un lien vers une page avec la syntaxe [Titre de page](page:page-id).\nExemple :\n[Link to a blog post](page:blog\/post-1)",
    "href": "fr\/documentation\/contenu\/markdown\/#lien-vers-une-page"  },
  {
    "id": "fr\/documentation\/content\/markdown#externe",
    "page": "Contenu > Markdown",
    "title": "Externe",
    "description": "Par d\u00e9faut, les liens externes ont la valeur suivante pour l\u2019attribut rel : noopener noreferrer.",
    "content": "Par d\u00e9faut, les liens externes ont la valeur suivante pour l\u2019attribut rel : noopener noreferrer.\nExemple :\n<a href=\"<url>\" rel=\"noopener noreferrer\">Link to another website<\/a>\nVous pouvez modifier ce comportement avec les options pages.body.links.external.",
    "href": "fr\/documentation\/contenu\/markdown\/#externe"  },
  {
    "id": "fr\/documentation\/content\/markdown#liens-integres",
    "page": "Contenu > Markdown",
    "title": "Liens int\u00e9gr\u00e9s",
    "description": "Vous pouvez laisser Cecil essayer de transformer un lien en contenu embarqu\u00e9 en utilisant l\u2019attribut {embed} ou en activant l\u2019option de configuration globale pages.body.links.embed.enabled \u00e0 true.",
    "content": "Vous pouvez laisser Cecil essayer de transformer un lien en contenu embarqu\u00e9 en utilisant l\u2019attribut {embed} ou en activant l\u2019option de configuration globale pages.body.links.embed.enabled \u00e0 true.\nSeuls les liens YouTube, Vimeo, Dailymotion et GitHub Gists sont pris en charge.\nExemple :\n[CECIL : LE g\u00e9n\u00e9rateur de SITES STATIQUES en PHP](https:\/\/www.youtube.com\/watch?v=ur8koU0iYvc){embed}\nLocal video\/audio files\nCecil peut aussi cr\u00e9er des \u00e9l\u00e9ments HTML vid\u00e9o et audio, selon l\u2019extension du fichier.\nExemple :\n[Video file](video.mp4){embed controls poster=\/images\/video-test.png}\n[Audio file](song.mp3){embed controls}\nEst converti en :\n<video src=\"\/video.mp4\" controls poster=\"\/images\/video-test.png\" style=\"max-width:100%;height:auto;\"><\/video>\n<audio src=\"\/song.mp3\" controls><\/audio>",
    "href": "fr\/documentation\/contenu\/markdown\/#liens-integres"  },
  {
    "id": "fr\/documentation\/content\/markdown#images",
    "page": "Contenu > Markdown",
    "title": "Images",
    "description": "Pour ajouter une image, utilisez un point d\u2019exclamation (!) suivi d\u2019une description alternative entre crochets ([]), puis du chemin ou de l\u2019URL de l\u2019image entre parenth\u00e8ses (()).\nVous pouvez facultativement ajouter un titre entre guillemets.",
    "content": "Pour ajouter une image, utilisez un point d\u2019exclamation (!) suivi d\u2019une description alternative entre crochets ([]), puis du chemin ou de l\u2019URL de l\u2019image entre parenth\u00e8ses (()).\nVous pouvez facultativement ajouter un titre entre guillemets.\n![Alternative description](\/image.jpg \"Image title\")\nLe chemin doit \u00eatre relatif \u00e0 la racine de votre site Web (ex. : \/image.jpg), mais Cecil est capable de normaliser un chemin relatif aux r\u00e9pertoires assets et static (ex. : ..\/..\/assets\/image.jpg).",
    "href": "fr\/documentation\/contenu\/markdown\/#images"  },
  {
    "id": "fr\/documentation\/content\/markdown#lazy-loading",
    "page": "Contenu > Markdown",
    "title": "Lazy loading",
    "description": "Cecil ajoute l\u2019attribut loading=\"lazy\" \u00e0 chaque image.",
    "content": "Cecil ajoute l\u2019attribut loading=\"lazy\" \u00e0 chaque image.\nExemple :\n![](\/image.jpg)\nEst converti en :\n<img src=\"\/image.jpg\" loading=\"lazy\">\nVous pouvez d\u00e9sactiver ce comportement avec l\u2019attribut {loading=eager} ou avec l\u2019option lazy.",
    "href": "fr\/documentation\/contenu\/markdown\/#lazy-loading"  },
  {
    "id": "fr\/documentation\/content\/markdown#decoding",
    "page": "Contenu > Markdown",
    "title": "Decoding",
    "description": "Cecil ajoute l\u2019attribut decoding=\"async\" \u00e0 chaque image.",
    "content": "Cecil ajoute l\u2019attribut decoding=\"async\" \u00e0 chaque image.\nExemple :\n![](\/image.jpg)\nEst converti en :\n<img src=\"\/image.jpg\" decoding=\"async\">\nVous pouvez d\u00e9sactiver ce comportement avec l\u2019attribut {decoding=auto} ou avec l\u2019option decoding.",
    "href": "fr\/documentation\/contenu\/markdown\/#decoding"  },
  {
    "id": "fr\/documentation\/content\/markdown#redimensionnement",
    "page": "Contenu > Markdown",
    "title": "Redimensionnement",
    "description": "Chaque image du body peut \u00eatre redimensionn\u00e9e automatiquement en d\u00e9finissant une largeur inf\u00e9rieure \u00e0 celle d\u2019origine, avec l\u2019attribut additionnel {width=X}.",
    "content": "Chaque image du body peut \u00eatre redimensionn\u00e9e automatiquement en d\u00e9finissant une largeur inf\u00e9rieure \u00e0 celle d\u2019origine, avec l\u2019attribut additionnel {width=X}.\nExemple :\n![](\/image.jpg){width=800}\nEst converti en :\n<img src=\"\/thumbnails\/800\/image.jpg\" width=\"800\" height=\"600\">\nLe ratio est conserv\u00e9 (l\u2019attribut height est calcul\u00e9 automatiquement), le fichier original n\u2019est pas modifi\u00e9 et la version redimensionn\u00e9e est stock\u00e9e dans \/thumbnails\/<width>\/.\nCette fonctionnalit\u00e9 n\u00e9cessite une biblioth\u00e8que de traitement d\u2019images : Imagick est utilis\u00e9 en priorit\u00e9 s\u2019il est disponible (et capable de lire le JPEG et le PNG), puis libvips (via l\u2019extension PHP FFI), et enfin GD en dernier recours ; sinon, elle ajoute seulement un attribut HTML width \u00e0 la balise img.\nLe support de libvips est optionnel et n\u2019est pas inclus dans cecil.phar. Pour l\u2019utiliser, Cecil doit \u00eatre install\u00e9 avec Composer et il faut :\nlibvips install\u00e9 sur le syst\u00e8me\nl\u2019extension PHP FFI activ\u00e9e\nle paquet intervention\/image-driver-vips install\u00e9 avec Cecil\nSi Cecil est une d\u00e9pendance de votre projet (voir Biblioth\u00e8que) :\ncomposer require intervention\/image-driver-vips\nSi Cecil est install\u00e9 globalement :\ncomposer global require cecil\/cecil intervention\/image-driver-vips",
    "href": "fr\/documentation\/contenu\/markdown\/#redimensionnement"  },
  {
    "id": "fr\/documentation\/content\/markdown#formats",
    "page": "Contenu > Markdown",
    "title": "Formats",
    "description": "Si l\u2019option formats est d\u00e9finie, des images alternatives sont cr\u00e9\u00e9es et ajout\u00e9es.",
    "content": "Si l\u2019option formats est d\u00e9finie, des images alternatives sont cr\u00e9\u00e9es et ajout\u00e9es.\nExemple :\n![](\/image.jpg)\nPeut \u00eatre converti en :\n<picture>\n  <source srcset=\"\/image.avif\" type=\"image\/avif\">\n  <source srcset=\"\/image.webp\" type=\"image\/webp\">\n  <img src=\"\/image.jpg\">\n<\/picture>\nVeuillez noter que tous les formats d\u2019image ne sont pas toujours inclus dans les extensions d\u2019image PHP.",
    "href": "fr\/documentation\/contenu\/markdown\/#formats"  },
  {
    "id": "fr\/documentation\/content\/markdown#responsive",
    "page": "Contenu > Markdown",
    "title": "Responsive",
    "description": "Si l\u2019option responsive est activ\u00e9e, alors toutes les images du body seront automatiquement rendues \u00ab responsive \u00bb.",
    "content": "Si l\u2019option responsive est activ\u00e9e, alors toutes les images du body seront automatiquement rendues \u00ab responsive \u00bb.\nExemple :\n![](\/image.jpg){width=800}\nsera converti en :\n<img src=\"\/thumbnails\/800\/image.jpg\" width=\"800\" height=\"600\"\n  srcset=\"\/thumbnails\/320\/image.jpg 320w,\n          \/thumbnails\/640\/image.jpg 640w,\n          \/thumbnails\/800\/image.jpg 800w\"\n  sizes=\"100vw\"\n>\nComme une image du body est convertie en Asset, les diff\u00e9rentes largeurs doivent \u00eatre d\u00e9finies dans la configuration des assets.\nL\u2019attribut sizes prend la valeur de l\u2019option de configuration assets.images.responsive.sizes.default, mais peut \u00eatre modifi\u00e9 en cr\u00e9ant une nouvelle entr\u00e9e nomm\u00e9e d\u2019apr\u00e8s une class ajout\u00e9e \u00e0 l\u2019image.\nExemple :\nassets:\n  images:\n    responsive:\n      sizes:\n        default: 100vw\n        my_class: \"(max-width: 800px) 768px, 1024px\"\n![](\/image.jpg){.my_class}\nVous pouvez combiner les options formats et responsive.",
    "href": "fr\/documentation\/contenu\/markdown\/#responsive"  },
  {
    "id": "fr\/documentation\/content\/markdown#css-class",
    "page": "Contenu > Markdown",
    "title": "CSS class",
    "description": "Vous pouvez d\u00e9finir une valeur par d\u00e9faut pour l\u2019attribut class de chaque image avec l\u2019option class.",
    "content": "Vous pouvez d\u00e9finir une valeur par d\u00e9faut pour l\u2019attribut class de chaque image avec l\u2019option class.",
    "href": "fr\/documentation\/contenu\/markdown\/#css-class"  },
  {
    "id": "fr\/documentation\/content\/markdown#caption",
    "page": "Contenu > Markdown",
    "title": "Caption",
    "description": "Le titre optionnel peut \u00eatre utilis\u00e9 pour cr\u00e9er automatiquement une l\u00e9gende (figcaption) en activant l\u2019option caption.",
    "content": "Le titre optionnel peut \u00eatre utilis\u00e9 pour cr\u00e9er automatiquement une l\u00e9gende (figcaption) en activant l\u2019option caption.\nExemple :\n![](\/images\/img.jpg \"Title\")\nEst converti en :\n<figure>\n  <img src=\"\/image.jpg\" title=\"Title\">\n  <figcaption>Title<\/figcaption>\n<\/figure>\nLa l\u00e9gende prend en charge le contenu Markdown.",
    "href": "fr\/documentation\/contenu\/markdown\/#caption"  },
  {
    "id": "fr\/documentation\/content\/markdown#image-localisee",
    "page": "Contenu > Markdown",
    "title": "Image localis\u00e9e",
    "description": "Pour les pages traduites, Cecil recherche d\u2019abord un fichier suffix\u00e9 par la langue lors de la r\u00e9solution des chemins d\u2019image Markdown.",
    "content": "Pour les pages traduites, Cecil recherche d\u2019abord un fichier suffix\u00e9 par la langue lors de la r\u00e9solution des chemins d\u2019image Markdown.\nExemple :\n![](\/images\/cecil-logo.png)\nAvec une page fran\u00e7aise (fr), Cecil essaie d\u2019abord \/images\/cecil-logo.fr.png, puis revient \u00e0 \/images\/cecil-logo.png.",
    "href": "fr\/documentation\/contenu\/markdown\/#image-localisee"  },
  {
    "id": "fr\/documentation\/content\/markdown#placeholder",
    "page": "Contenu > Markdown",
    "title": "Placeholder",
    "description": "Comme les images sont g\u00e9n\u00e9ralement des ressources plus lourdes et plus lentes, et qu\u2019elles ne bloquent pas le rendu, il est pr\u00e9f\u00e9rable de donner aux utilisateurs quelque chose \u00e0 voir pendant qu\u2019ils attendent leur chargement.",
    "content": "Comme les images sont g\u00e9n\u00e9ralement des ressources plus lourdes et plus lentes, et qu\u2019elles ne bloquent pas le rendu, il est pr\u00e9f\u00e9rable de donner aux utilisateurs quelque chose \u00e0 voir pendant qu\u2019ils attendent leur chargement.\nL\u2019attribut placeholder accepte 2 options :\ncolor: affiche un fond color\u00e9 (bas\u00e9 sur la couleur dominante de l\u2019image)\nlqip: Low-Quality Image Placeholder\nExemples :\n![](\/images\/img.jpg){placeholder=color}\n![](\/images\/img.jpg){placeholder=lqip}\nVous pouvez d\u00e9finir une valeur pour l\u2019attribut placeholder de chaque image avec l\u2019option placeholder.\nL\u2019option lqip n\u2019est pas compatible avec les GIF anim\u00e9s.",
    "href": "fr\/documentation\/contenu\/markdown\/#placeholder"  },
  {
    "id": "fr\/documentation\/content\/markdown#table-des-matieres",
    "page": "Contenu > Markdown",
    "title": "Table des mati\u00e8res",
    "description": "Vous pouvez ajouter une table des mati\u00e8res avec la syntaxe Markdown suivante :",
    "content": "Vous pouvez ajouter une table des mati\u00e8res avec la syntaxe Markdown suivante :\n[toc]\nPar d\u00e9faut, la ToC extrait les en-t\u00eates H2 et H3. Vous pouvez modifier ce comportement avec les options de body.",
    "href": "fr\/documentation\/contenu\/markdown\/#table-des-matieres"  },
  {
    "id": "fr\/documentation\/content\/markdown#extrait",
    "page": "Contenu > Markdown",
    "title": "Extrait",
    "description": "Un extrait peut \u00eatre d\u00e9fini dans le body avec l\u2019une des balises suivantes : excerpt ou break.",
    "content": "Un extrait peut \u00eatre d\u00e9fini dans le body avec l\u2019une des balises suivantes : excerpt ou break.\nExemple :\nIntroduction.\n<!-- excerpt -->\nMain content.\nUtilisez ensuite le filtre excerpt_html dans votre template.",
    "href": "fr\/documentation\/contenu\/markdown\/#extrait"  },
  {
    "id": "fr\/documentation\/content\/markdown#notes",
    "page": "Contenu > Markdown",
    "title": "Notes",
    "description": "Cr\u00e9ez un bloc de Note (info, astuce, important, etc.).",
    "content": "Cr\u00e9ez un bloc de Note (info, astuce, important, etc.).\nExemple :\n:::tip\n**Tip:** This is advice.\n:::\nEst converti en :\n<aside class=\"note note-tip\">\n  <p>\n    <strong>Tip:<\/strong> This is advice.\n  <\/p>\n<\/aside>\nTip: This is advice.\nAutres exemples :\nempty\ninfo\ntip\nimportant\nwarning\ncaution",
    "href": "fr\/documentation\/contenu\/markdown\/#notes"  },
  {
    "id": "fr\/documentation\/content\/markdown#coloration-syntaxique",
    "page": "Contenu > Markdown",
    "title": "Coloration syntaxique",
    "description": "La coloration syntaxique des blocs de code est activ\u00e9e par d\u00e9faut avec l\u2019option pages.body.highlight.",
    "content": "La coloration syntaxique des blocs de code est activ\u00e9e par d\u00e9faut avec l\u2019option pages.body.highlight.\nSi besoin, vous pouvez la d\u00e9sactiver avec :\npages:\n  body:\n    highlight: false\nExemple :\n```php\necho \"Hello world\";\n```\nEst rendu en :\necho \"Hello world\";\nVous pouvez personnaliser le style de coloration syntaxique en cr\u00e9ant votre propre th\u00e8me. Consultez le guide des th\u00e8mes de Highlight.js.",
    "href": "fr\/documentation\/contenu\/markdown\/#coloration-syntaxique"  },
  {
    "id": "fr\/documentation\/content\/markdown#texte-insere",
    "page": "Contenu > Markdown",
    "title": "Texte ins\u00e9r\u00e9",
    "description": "Repr\u00e9sente une plage de texte qui a \u00e9t\u00e9 ajout\u00e9e.",
    "content": "Repr\u00e9sente une plage de texte qui a \u00e9t\u00e9 ajout\u00e9e.\n++text++\nEst converti en :\n<ins>text<\/ins>",
    "href": "fr\/documentation\/contenu\/markdown\/#texte-insere"  },
  {
    "id": "fr\/documentation\/deploy\/static-hosting#surge",
    "page": "D\u00e9ployer > H\u00e9bergement statique",
    "title": "Surge",
    "description": "",
    "content": "Publier des projets web doit \u00eatre rapide, simple et peu risqu\u00e9. Surge est un service de publication de sites statiques pour les d\u00e9veloppeurs frontend, directement depuis la CLI.\n\u27a1\ufe0f https:\/\/surge.sh\nTerminal:\nnpm install -g surge\nsurge _site\/\nDocumentation officielle",
    "href": "fr\/documentation\/deployer\/hebergement-statique\/#surge"  },
  {
    "id": "fr\/documentation\/developers\/architecture#diagramme",
    "page": "D\u00e9veloppeurs > Architecture",
    "title": "Diagramme",
    "description": "",
    "content": "graph TD\n    %% Entr\u00e9e\n    CLI[\"bin\/cecil\\n(Point d'entr\u00e9e CLI)\"]\n    APP[\"Application\\n(Symfony Console)\"]\n    CMD[\"Commandes\\nbuild \/ serve \/ new:site\\nnew:page \/ clear \/ show:content\"]\nCLI --> APP --> CMD\n%% Orchestrateur\n    BUILDER[\"Builder\\n(Orchestrateur)\"]\n    CONFIG[\"Configuration\\n(config.yml + default.php\\n+ th\u00e8mes)\"]\n    CMD --> BUILDER\n    CONFIG --> BUILDER\n%% Pipeline\n    subgraph PIPELINE[\"Pipeline de g\u00e9n\u00e9ration (\u00e9tapes)\"]\n        S1[\"1. Pages\/Load\\n(Finder \u2192 fichiers Markdown)\"]\n        S2[\"2. Data\/Load\\n(fichiers YAML)\"]\n        S3[\"3. StaticFiles\/Load\\n(chargement des fichiers statiques)\"]\n        S4[\"4. Pages\/Create\\n(cr\u00e9ation des objets Page)\"]\n        S5[\"5. Pages\/Convert\\n(Markdown \u2192 HTML\\nfront matter)\"]\n        S6[\"6. Taxonomies\/Create\\n(cr\u00e9ation des taxonomies)\"]\n        S7[\"7. Pages\/Generate\\n(g\u00e9n\u00e9rateurs)\"]\n        S8[\"8. Menus\/Create\\n(cr\u00e9ation des menus)\"]\n        S9[\"9. StaticFiles\/Copy\\n(copie des fichiers statiques)\"]\n        S10[\"10. Pages\/Render\\n(rendu Twig)\"]\n        S11[\"11. Pages\/Save\\n(sauvegarde des pages)\"]\n        S12[\"12. Assets\/Save\\n(sauvegarde des assets)\"]\n        S13[\"13. Optimize\/*\\n(optimisation HTML\/CSS\/JS\/Images)\"]\nS1 --> S2 --> S3 --> S4 --> S5 --> S6 --> S7 --> S8 --> S9 --> S10 --> S11 --> S12 --> S13\n    end\nBUILDER --> PIPELINE\n%% Sous-syst\u00e8mes\n    subgraph COLLECTIONS[\"Collections\"]\n        PC[\"PagesCollection\\n(objets Page)\"]\n        TC[\"TaxonomiesCollection\\n(vocabulaires\/termes)\"]\n        MC[\"MenusCollection\"]\n    end\nsubgraph GENERATORS[\"G\u00e9n\u00e9rateurs (virtuels)\"]\n        GP[\"Pagination\"]\n        GT[\"Taxonomie\"]\n        GS[\"Section\"]\n        GR[\"Redirection\"]\n        GD[\"DefaultPages (accueil, 404)\"]\n    end\nsubgraph RENDERER[\"Rendu Twig\"]\n        TW[\"Moteur Twig\"]\n        EXT[\"Extensions\\n(Core, Content, Collection)\"]\n        PP[\"PostProcessors\\n(m\u00e9tadonn\u00e9es, extraits, liens)\"]\n        TH[\"Th\u00e8mes \/ Layouts\"]\n        TW --> EXT\n        TW --> PP\n        TH --> TW\n    end\nsubgraph ASSETS[\"Assets\"]\n        AL[\"Localisateur d'assets\"]\n        AC[\"Compilateur\\n(SCSS \u2192 CSS)\"]\n        AI[\"Processeur d'images\\n(responsive, WebP, AVIF)\"]\n        AO[\"Optimiseur\\n(minification CSS\/JS)\"]\n    end\nsubgraph OUTPUT[\"Sortie (_site\/)\"]\n        HTML[\"pages .html\"]\n        CSS2[\"assets CSS\/JS\"]\n        IMG[\"images\"]\n        SF[\"fichiers statiques\"]\n    end\nS4 --> PC\n    S6 --> TC\n    S8 --> MC\n    S7 --> GENERATORS\n    GENERATORS --> PC\n    S10 --> RENDERER\n    S12 --> ASSETS\nPC --> RENDERER\n    TC --> RENDERER\n    MC --> RENDERER\nRENDERER --> S11\n    S11 --> HTML\n    S12 --> CSS2\n    S12 --> IMG\n    S9 --> SF\n%% Entr\u00e9es\n    subgraph INPUT[\"Sources\"]\n        MD[\"content\/\\n(Markdown + front matter)\"]\n        DATA[\"data\/\\n(YAML)\"]\n        STATIC[\"static\/\"]\n        LAYOUTS[\"layouts\/\\n(mod\u00e8les Twig)\"]\n    end\nMD --> S1\n    DATA --> S2\n    STATIC --> S3\n    LAYOUTS --> TH",
    "href": "fr\/documentation\/developpeurs\/architecture\/#diagramme"  },
  {
    "id": "fr\/documentation\/developers\/architecture#legende-des-composants-cles",
    "page": "D\u00e9veloppeurs > Architecture",
    "title": "L\u00e9gende des composants cl\u00e9s",
    "description": "",
    "content": "Composant\nR\u00f4le\nBuilder\nOrchestrateur central, ex\u00e9cute les \u00e9tapes en s\u00e9quence\nConfig\nFusion de la configuration par d\u00e9faut + th\u00e8me + projet + CLI\nSteps\nPipeline modulaire (13 \u00e9tapes), chacune avec init() \/ canProcess() \/ process()\nCollections\nPages, Taxonomies, Menus \u2014 structures de donn\u00e9es centrales\nGenerators\nCr\u00e9ent des pages virtuelles (pagination, tags, redirections\u2026)\nRenderer (Twig)\nApplique les mod\u00e8les + extensions + post-traitements\nAssets\nCompile SCSS, optimise images, fingerprinte les fichiers",
    "href": "fr\/documentation\/developpeurs\/architecture\/#legende-des-composants-cles"  },
  {
    "id": "fr\/documentation\/getting-started\/directory-structure#arborescence-du-systeme-de-fichiers",
    "page": "Bien d\u00e9marrer > Structure des dossiers",
    "title": "Arborescence du syst\u00e8me de fichiers",
    "description": "Organisation des fichiers du projet.",
    "content": "Organisation des fichiers du projet.\n<monsiteweb>\n\u251c\u2500 pages\n|  \u251c\u2500 blog            <- Section\n|  |  \u251c\u2500 billet-1.md  <- Page dans Section\n|  |  \u2514\u2500 billet-2.md\n|  \u251c\u2500 projets\n|  |  \u2514\u2500 projet-a.md\n|  \u2514\u2500 about.md        <- Page racine\n\u251c\u2500 assets\n|  \u251c\u2500 styles.scss     <- Fichier d'asset\n|  \u2514\u2500 logo.png\n\u251c\u2500 static\n|  \u2514\u2500 fichier.pdf     <- Fichier statique\n\u2514\u2500 data\n   \u2514\u2500 auteurs.yml     <- Collection de donn\u00e9es",
    "href": "fr\/documentation\/bien-demarrer\/structure-des-dossiers\/#arborescence-du-systeme-de-fichiers"  },
  {
    "id": "fr\/documentation\/getting-started\/directory-structure#arborescence-du-site-genere",
    "page": "Bien d\u00e9marrer > Structure des dossiers",
    "title": "Arborescence du site g\u00e9n\u00e9r\u00e9",
    "description": "R\u00e9sultat de la g\u00e9n\u00e9ration.",
    "content": "R\u00e9sultat de la g\u00e9n\u00e9ration.\n<monsiteweb>\n\u2514\u2500 _site\n   \u251c\u2500 index.html               <- Page d'accueil g\u00e9n\u00e9r\u00e9e\n   \u251c\u2500 blog\/\n   |  \u251c\u2500 index.html            <- Liste des articles g\u00e9n\u00e9r\u00e9e\n   |  \u251c\u2500 billet-1\/index.html   <- Article de blog\n   |  \u2514\u2500 billet-2\/index.html\n   \u251c\u2500 projets\/\n   |  \u251c\u2500 index.html            <- Liste des projets g\u00e9n\u00e9r\u00e9e\n   |  \u2514\u2500 projet-a\/index.html   <- Projet individuel\n   \u251c\u2500 about\/index.html         <- Page \"\u00c0 propos\"\n   \u251c\u2500 styles.css\n   \u251c\u2500 logo.png\n   \u2514\u2500 fichier.pdf\nPar d\u00e9faut, chaque page est g\u00e9n\u00e9r\u00e9e sous la forme nomdufichier-sluglifi\u00e9\/index.html pour obtenir une \u00ab belle \u00bb URL comme https:\/\/monsiteweb.tld\/section\/nomdufichier-sluglifi\u00e9\/.\nPour obtenir une URL \u00ab ugly \u00bb (comme 404.html au lieu de 404\/), d\u00e9finissez uglyurl: true dans le front matter de la page.",
    "href": "fr\/documentation\/bien-demarrer\/structure-des-dossiers\/#arborescence-du-site-genere"  },
  {
    "id": "fr\/documentation\/getting-started\/directory-structure#routage-base-sur-les-fichiers",
    "page": "Bien d\u00e9marrer > Structure des dossiers",
    "title": "Routage bas\u00e9 sur les fichiers",
    "description": "Les fichiers Markdown du r\u00e9pertoire pages activent un routage bas\u00e9 sur les fichiers. Cela signifie que l\u2019ajout, par exemple, de pages\/mon-projet\/projet-a.md le rendra accessible \u00e0 l\u2019URL \/projet-a dans votre navigateur.",
    "content": "Les fichiers Markdown du r\u00e9pertoire pages activent un routage bas\u00e9 sur les fichiers. Cela signifie que l\u2019ajout, par exemple, de pages\/mon-projet\/projet-a.md le rendra accessible \u00e0 l\u2019URL \/projet-a dans votre navigateur.\nFichier :\n                   pages\/mon-projet\/projet-a.md\n                        \u2514\u2500\u2500\u2500\u2500\u2500 filepath \u2500\u2500\u2500\u2500\u2500\u2500\u2518\nURL :\n    \u250c\u2500\u2500\u2500\u2500\u2500 baseurl \u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500 path \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n     https:\/\/exemple.com\/mon-projet\/projet-a\/index.html\n                        \u2514\u2500 section \u2500\u2534\u2500 slug \u2500\u2500\u2518\nDeux types de pr\u00e9fixes peuvent modifier l\u2019URL, voir la section Pr\u00e9fixe de fichier ci-dessous.",
    "href": "fr\/documentation\/bien-demarrer\/structure-des-dossiers\/#routage-base-sur-les-fichiers"  },
  {
    "id": "fr\/documentation\/templates",
    "page": " > Templates",
    "title": "Templates",
    "description": "Cecil est aliment\u00e9 par le moteur de templates Twig, veuillez donc vous r\u00e9f\u00e9rer \u00e0 la documentation officielle pour savoir comment l'utiliser.",
    "content": "Cecil est aliment\u00e9 par le moteur de templates Twig, veuillez donc vous r\u00e9f\u00e9rer \u00e0 la documentation officielle pour savoir comment l'utiliser.",
    "href": "fr\/documentation\/templates\/"  },
  {
    "id": "fr\/documentation\/templates#exemple",
    "page": " > Templates",
    "title": "Exemple",
    "description": "",
    "content": "{# template d'exemple #}\n<h1>{{ page.title }} - {{ site.title }}<\/h1>\n<span>{{ page.date|date('j M Y') }}<\/span>\n<p>{{ page.content }}<\/p>\n<ul>\n{% for tag in page.tags %}\n  <li>{{ tag }}<\/li>\n{% endfor %}\n<\/ul>\n{# #}\u00a0: ajoute des commentaires\n{{ }}\u00a0: affiche le contenu des variables ou des expressions\n{% %}\u00a0: ex\u00e9cute des instructions, comme une boucle (for), une condition (if), etc.\n|filter()\u00a0: filtre ou formate le contenu",
    "href": "fr\/documentation\/templates\/#exemple"  },
  {
    "id": "fr\/documentation\/templates\/reference\/filters",
    "page": "Templates > Fonctions et filtres > Filtres",
    "title": "Filtres",
    "description": "Les variables peuvent \u00eatre modifi\u00e9es par filtres. Les filtres sont s\u00e9par\u00e9s de la variable par un symbole de barre verticale (|). Plusieurs filtres peuvent \u00eatre cha\u00een\u00e9s. La sortie d\u2019un filtre est appliqu\u00e9e au suivant.",
    "content": "Les variables peuvent \u00eatre modifi\u00e9es par filtres. Les filtres sont s\u00e9par\u00e9s de la variable par un symbole de barre verticale (|). Plusieurs filtres peuvent \u00eatre cha\u00een\u00e9s. La sortie d\u2019un filtre est appliqu\u00e9e au suivant.\n{{ page.title|truncate(25)|capitalize }}",
    "href": "fr\/documentation\/templates\/reference\/filtres\/"  },
  {
    "id": "fr\/documentation\/templates\/reference\/filters#filter-by",
    "page": "Templates > Fonctions et filtres > Filtres",
    "title": "filter_by",
    "description": "Filtre une collection de pages par nom\/valeur de variable.",
    "content": "Filtre une collection de pages par nom\/valeur de variable.\n{{ collection|filter_by(variable, value) }}\nExemple:\n{{ pages|filter_by('section', 'blog') }}",
    "href": "fr\/documentation\/templates\/reference\/filtres\/#filter-by"  },
  {
    "id": "fr\/documentation\/templates\/reference\/filters#filter",
    "page": "Templates > Fonctions et filtres > Filtres",
    "title": "filter",
    "description": "Pour les cas plus complexes, vous devez utiliser le filter natif de Twig.",
    "content": "Pour les cas plus complexes, vous devez utiliser le filter natif de Twig.\nExemple:\n{% pages|filter(p => p.virtual == false and p.id not in ['page-1', 'page-2']) %}",
    "href": "fr\/documentation\/templates\/reference\/filtres\/#filter"  },
  {
    "id": "fr\/documentation\/templates\/reference\/filters#markdown-to-html",
    "page": "Templates > Fonctions et filtres > Filtres",
    "title": "markdown_to_html",
    "description": "Convertit une cha\u00eene Markdown en HTML.",
    "content": "Convertit une cha\u00eene Markdown en HTML.\n{{ markdown|markdown_to_html }}\n{% apply markdown_to_html %}\n{# Markdown here #}\n{% endapply %}\nExemples\u00a0:\n{% set markdown = '**This is bold text**' %}\n{{ markdown|markdown_to_html }}\n{% apply markdown_to_html %}\n**This is bold text**\n{% endapply %}",
    "href": "fr\/documentation\/templates\/reference\/filtres\/#markdown-to-html"  },
  {
    "id": "fr\/documentation\/templates\/reference\/filters#toc",
    "page": "Templates > Fonctions et filtres > Filtres",
    "title": "toc",
    "description": "Extrait uniquement les en-t\u00eates correspondant au selectors donn\u00e9 (h2, h3, etc.), ou \u00e0 ceux d\u00e9finis dans la configuration pages.body.toc s'ils ne sont pas sp\u00e9cifi\u00e9s.\nLe param\u00e8tre format d\u00e9finit le format de sortie : html ou json.\nLe param\u00e8tre url est utilis\u00e9 pour cr\u00e9er des liens vers des titres.",
    "content": "Extrait uniquement les en-t\u00eates correspondant au selectors donn\u00e9 (h2, h3, etc.), ou \u00e0 ceux d\u00e9finis dans la configuration pages.body.toc s'ils ne sont pas sp\u00e9cifi\u00e9s.\nLe param\u00e8tre format d\u00e9finit le format de sortie : html ou json.\nLe param\u00e8tre url est utilis\u00e9 pour cr\u00e9er des liens vers des titres.\n{{ markdown|toc(format, selectors, url) }}\nExemples\u00a0:\n{{ page.body|toc }}\n{{ page.body|toc('html') }}\n{{ page.body|toc(selectors=['h2']) }}\n{{ page.body|toc(url=url(page)) }}",
    "href": "fr\/documentation\/templates\/reference\/filtres\/#toc"  },
  {
    "id": "fr\/documentation\/templates\/reference\/filters#json-decode",
    "page": "Templates > Fonctions et filtres > Filtres",
    "title": "json_decode",
    "description": "Convertit une cha\u00eene JSON en tableau.",
    "content": "Convertit une cha\u00eene JSON en tableau.\n{{ json|json_decode }}\nExemple:\n{% set json = '{\"foo\": \"bar\"}' %}\n{% set array = json|json_decode %}\n{{ array.foo }}",
    "href": "fr\/documentation\/templates\/reference\/filtres\/#json-decode"  },
  {
    "id": "fr\/documentation\/templates\/reference\/filters#yaml-parse",
    "page": "Templates > Fonctions et filtres > Filtres",
    "title": "yaml_parse",
    "description": "Convertit une cha\u00eene YAML en tableau.",
    "content": "Convertit une cha\u00eene YAML en tableau.\n{{ yaml|yaml_parse }}\nExemple:\n{% set yaml = 'key: value' %}\n{% set array = yaml|yaml_parse %}\n{{ array.key }}",
    "href": "fr\/documentation\/templates\/reference\/filtres\/#yaml-parse"  },
  {
    "id": "fr\/documentation\/templates\/reference\/filters#slugify",
    "page": "Templates > Fonctions et filtres > Filtres",
    "title": "slugify",
    "description": "Convertit une cha\u00eene en slug.",
    "content": "Convertit une cha\u00eene en slug.\n{{ string|slugify }}",
    "href": "fr\/documentation\/templates\/reference\/filtres\/#slugify"  },
  {
    "id": "fr\/documentation\/templates\/reference\/filters#u",
    "page": "Templates > Fonctions et filtres > Filtres",
    "title": "u",
    "description": "Le filtre u enveloppe un texte dans un objet Unicode (une instance Symfony UnicodeString) qui expose des m\u00e9thodes pour \u00ab manipuler \u00bb la cha\u00eene.",
    "content": "Le filtre u enveloppe un texte dans un objet Unicode (une instance Symfony UnicodeString) qui expose des m\u00e9thodes pour \u00ab manipuler \u00bb la cha\u00eene.\nExemple:\n{{ 'cecil_string with twig'|u.camel.title }}\nCecilStringAvecTwig",
    "href": "fr\/documentation\/templates\/reference\/filtres\/#u"  },
  {
    "id": "fr\/documentation\/templates\/reference\/filters#singular",
    "page": "Templates > Fonctions et filtres > Filtres",
    "title": "singular",
    "description": "Le filtre singular transforme un nom donn\u00e9 au pluriel en sa version singuli\u00e8re.",
    "content": "Le filtre singular transforme un nom donn\u00e9 au pluriel en sa version singuli\u00e8re.\n{{ string|singular(locale)}}\nExemple:\n{# English (en) rules are used by default #}\n{{ 'partitions'|singular }}\npartition\n{{ 'partitions'|singular('fr') }}\npartition",
    "href": "fr\/documentation\/templates\/reference\/filtres\/#singular"  },
  {
    "id": "fr\/documentation\/templates\/reference\/filters#plural",
    "page": "Templates > Fonctions et filtres > Filtres",
    "title": "plural",
    "description": "Le filtre plural transforme un nom donn\u00e9 au singulier en sa version plurielle.",
    "content": "Le filtre plural transforme un nom donn\u00e9 au singulier en sa version plurielle.\n{{ string|plural(locale)}}\nExemple:\n{# English (en) rules are used by default #}\n{{ 'animal'|plural }}\nanimaux\n{{ 'animal'|plural('fr') }}\nanimaux",
    "href": "fr\/documentation\/templates\/reference\/filtres\/#plural"  },
  {
    "id": "fr\/documentation\/templates\/reference\/filters#excerpt",
    "page": "Templates > Fonctions et filtres > Filtres",
    "title": "excerpt",
    "description": "Tronque une cha\u00eene et ajoute un suffixe.",
    "content": "Tronque une cha\u00eene et ajoute un suffixe.\n{{ string|excerpt(length, suffix) }}\nOptions\nDescriptif\nTapez\nPar d\u00e9faut\nlongueur\nTronque apr\u00e8s ce nombre de caract\u00e8res.\nentier\n450\nsuffixe\nAjoute des caract\u00e8res.\ncha\u00eene\n\u2026\nExemples\u00a0:\n{{ variable|excerpt }}\n{{ variable|excerpt(250, '...') }}",
    "href": "fr\/documentation\/templates\/reference\/filtres\/#excerpt"  },
  {
    "id": "fr\/documentation\/templates\/reference\/filters#excerpt-html",
    "page": "Templates > Fonctions et filtres > Filtres",
    "title": "excerpt_html",
    "description": "Lit les caract\u00e8res avant ou apr\u00e8s la balise <!-- excerpt --> ou <!-- break -->.\nVoir Documentation de contenu pour plus de d\u00e9tails.",
    "content": "Lit les caract\u00e8res avant ou apr\u00e8s la balise <!-- excerpt --> ou <!-- break -->.\nVoir Documentation de contenu pour plus de d\u00e9tails.\n{{ string|excerpt_html({separator, capture}) }}\nOptions\nDescriptif\nTapez\nPar d\u00e9faut\ns\u00e9parateur\nCha\u00eene \u00e0 utiliser comme s\u00e9parateur.\ncha\u00eene\nexcerpt|break\ncapturer\nPi\u00e8ce \u00e0 capturer, before ou after le s\u00e9parateur.\ncha\u00eene\nbefore\nExemples\u00a0:\n{{ variable|excerpt_html }}\n{{ variable|excerpt_html({separator: 'excerpt|break', capture: 'before'}) }}\n{{ variable|excerpt_html({capture: 'after'}) }}",
    "href": "fr\/documentation\/templates\/reference\/filtres\/#excerpt-html"  },
  {
    "id": "fr\/documentation\/templates\/reference\/filters#highlight",
    "page": "Templates > Fonctions et filtres > Filtres",
    "title": "highlight",
    "description": "Met en surbrillance une cha\u00eene de code avec highlight.php.",
    "content": "Met en surbrillance une cha\u00eene de code avec highlight.php.\n{{ code|highlight(language) }}\nExemples\u00a0:\n{{ '<?php echo $highlighted->value; ?>'|highlight('php') }}",
    "href": "fr\/documentation\/templates\/reference\/filtres\/#highlight"  },
  {
    "id": "fr\/documentation\/templates\/reference\/filters#preg-split",
    "page": "Templates > Fonctions et filtres > Filtres",
    "title": "preg_split",
    "description": "Divise une cha\u00eene en un tableau \u00e0 l'aide d'une expression r\u00e9guli\u00e8re.",
    "content": "Divise une cha\u00eene en un tableau \u00e0 l'aide d'une expression r\u00e9guli\u00e8re.\n{{ string|preg_split(pattern, limit) }}\nExemple:\n{% set headers = page.content|preg_split('\/<br[^>]*>\/') %}",
    "href": "fr\/documentation\/templates\/reference\/filtres\/#preg-split"  },
  {
    "id": "fr\/documentation\/templates\/reference\/filters#preg-match-all",
    "page": "Templates > Fonctions et filtres > Filtres",
    "title": "preg_match_all",
    "description": "Effectue une correspondance d'expression r\u00e9guli\u00e8re et renvoie le groupe pour toutes les correspondances.",
    "content": "Effectue une correspondance d'expression r\u00e9guli\u00e8re et renvoie le groupe pour toutes les correspondances.\n{{ string|preg_match_all(pattern, group) }}\nExemple:\n{% set tags = page.content|preg_match_all('\/<[^>]+>(.*)<\\\/[^>]+>\/') %}",
    "href": "fr\/documentation\/templates\/reference\/filtres\/#preg-match-all"  },
  {
    "id": "fr\/documentation\/templates\/reference\/filters#hex-to-rgb",
    "page": "Templates > Fonctions et filtres > Filtres",
    "title": "hex_to_rgb",
    "description": "Convertit une couleur hexad\u00e9cimale en RVB.",
    "content": "Convertit une couleur hexad\u00e9cimale en RVB.\n{{ color|hex_to_rgb }}",
    "href": "fr\/documentation\/templates\/reference\/filtres\/#hex-to-rgb"  },
  {
    "id": "fr\/documentation\/assets#asset",
    "page": " > Assets",
    "title": "asset",
    "description": "Un actif est une ressource utilisable dans des templates, comme CSS, JavaScript, image, audio, vid\u00e9o, etc.",
    "content": "Un actif est une ressource utilisable dans des templates, comme CSS, JavaScript, image, audio, vid\u00e9o, etc.\nLa fonction asset() cr\u00e9e un objet asset \u00e0 partir d'un chemin de fichier, d'un tableau de chemins de fichiers (bundle) ou d'une URL (fichier distant), et est trait\u00e9 (minifi\u00e9, empreinte digitale, etc.) selon la configuration.\nLes fichiers de ressources doivent \u00eatre stock\u00e9s dans le r\u00e9pertoire assets\/ (ou static\/).\n{{ asset(path, {options}) }}\nOptions\nDescriptif\nTapez\nPar d\u00e9faut\nnom de fichier\nEnregistrez le bundle sous un nom de fichier personnalis\u00e9.\ncha\u00eene\nstyles.css ou scripts.js\nignore_missing\nN'arr\u00eatez pas la construction si le fichier n'est pas trouv\u00e9.\nbool\u00e9en\nfalse\nempreinte digitale\nAjoutez un hachage de contenu au nom du fichier.\nbool\u00e9en\ntrue\nr\u00e9duire\nCompressez CSS ou JavaScript.\nbool\u00e9en\ntrue\noptimiser\nCompresser l'image.\nbool\u00e9en\nfalse\nrepli\nChargez un actif local si le fichier distant est introuvable.\ncha\u00eene\n``\nagent utilisateur\nCl\u00e9 de l'agent utilisateur (Voir Configuration des actifs).\ncha\u00eene\ndefault\nVous pouvez utiliser filters pour manipuler les actifs.\nVous n'avez pas besoin de vider le cache apr\u00e8s avoir modifi\u00e9 un actif : le cache est automatiquement vid\u00e9 lorsque le fichier est modifi\u00e9 ou lorsque le nom du fichier est chang\u00e9.\nExemples\u00a0:\n{# CSS #}\n{{ asset('styles.css') }}\n{# CSS bundle #}\n{{ asset(['poole.css', 'hyde.css'], {filename: styles.css}) }}\n{# JavaScript #}\n{{ asset('scripts.js') }}\n{# image #}\n{{ asset('image.jpeg') }}\n{# audio #}\n{{ asset('audio.mp3') }}\n{# video #}\n{{ asset('video.mp4') }}\n{# remote file #}\n{{ asset('https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/anchor-js\/4.3.1\/anchor.min.js', {minify: false}) }}\n{# with filter #}\n{{ asset('styles.css')|minify }}\n{{ asset('styles.scss')|to_css|minify }}",
    "href": "fr\/documentation\/assets\/#asset"  },
  {
    "id": "fr\/documentation\/assets#asset-attributes",
    "page": " > Assets",
    "title": "Asset attributes",
    "description": "Les ressources cr\u00e9\u00e9es avec la fonction asset() exposent certains attributs utiles.",
    "content": "Les ressources cr\u00e9\u00e9es avec la fonction asset() exposent certains attributs utiles.\nCommun:\nfile\u00a0: chemin du syst\u00e8me de fichiers\nmissing\u00a0: true si le fichier n'est pas trouv\u00e9 mais que le fichier manquant est autoris\u00e9\npath\u00a0: chemin public\next : extension de fichier\ntype : type de m\u00e9dia (ex. : image)\nsubtype\u00a0: sous-type de m\u00e9dia (ex.\u00a0: image\/jpeg)\nsize\u00a0: taille en octets\ncontent\u00a0: contenu du fichier\nhash\u00a0: hachage du contenu du fichier (md5)\ndataurl\u00a0: URL de donn\u00e9es encod\u00e9es en Base64\nintegrity\u00a0: hachage d'int\u00e9grit\u00e9\nT\u00e9l\u00e9commande:\nurl : URL du fichier distant\nPaquet:\nfiles\u00a0: tableau du chemin du syst\u00e8me de fichiers en cas de bundle\nImage:\nwidth\u00a0: largeur de l'image en pixels\nheight\u00a0: hauteur de l'image en pixels\nexif\u00a0: donn\u00e9es EXIF \u200b\u200bde l'image sous forme de tableau\nAudio\u00a0:\nduration\u00a0: dur\u00e9e en secondes.microsecondes\nbitrate\u00a0: d\u00e9bit en bps\nchannel\u00a0: 'st\u00e9r\u00e9o', 'dual_mono', 'joint_stereo' ou 'mono'\nVid\u00e9o:\nduration\u00a0: dur\u00e9e en secondes\nwidth : largeur en pixels\nheight : hauteur en pixels\nExemples\u00a0:\n{# image width in pixels #}\n{{ asset('image.png').width }}px\n{# photo's date in seconds #}\n{{ asset('photo.jpeg').exif.EXIF.DateTimeOriginal|date('U') }}\n{# audio duration in seconds #}\n{{ asset('song.mp3').duration|round }} s\n{# video duration in seconds #}\n{{ asset('movie.mp4').duration|round }} s\n{# file integrity hash #}\n{% set integrity = asset('styles.scss').integrity %}",
    "href": "fr\/documentation\/assets\/#asset-attributes"  },
  {
    "id": "fr\/documentation\/assets#integrity",
    "page": " > Assets",
    "title": "integrity",
    "description": "Cr\u00e9e le hachage (sha384) d'un fichier (\u00e0 partir d'un actif ou d'un chemin).",
    "content": "Cr\u00e9e le hachage (sha384) d'un fichier (\u00e0 partir d'un actif ou d'un chemin).\n{{ integrity(asset) }}\nUtilis\u00e9 pour SRI (Int\u00e9grit\u00e9 des sous-ressources).\nExemple:\n{{ integrity('styles.css') }}\n{# sha384-oGDH3qCjzMm\/vI+jF4U5kdQW0eAydL8ZqXjHaLLGduOsvhPRED9v3el\/sbiLa\/9g #}",
    "href": "fr\/documentation\/assets\/#integrity"  },
  {
    "id": "fr\/documentation\/commands\/build",
    "page": "Commandes > build",
    "title": "build",
    "description": "Construit le site.",
    "content": "Construit le site.\nDescription:\n  Builds the website\nUsage:\n  build [options] [--] [<path>]\nArguments:\n  path                               Use the given path as working directory\nOptions:\n  -d, --drafts                       Include drafts\n  -u, --baseurl=BASEURL              Set the base URL\n  -o, --output=OUTPUT                Set the output directory\n      --optimize|--no-optimize       Enable (or disable --no-optimize) optimization of generated files\n      --dry-run                      Build without saving\n  -c, --config=CONFIG                Set the path to extra config files (comma-separated)\n      --clear-cache[=CLEAR-CACHE]    Clear cache before build (optional cache key as regular expression) [default: false]\n  -p, --page=PAGE                    Build a specific page\n      --render-subset=RENDER-SUBSET  Render a subset of pages\n      --show-pages                   Show list of built pages in a table\n  -m, --metrics                      Show build metrics (duration and memory) of each step\n      --notify                       Send desktop notification on build completion\n  -h, --help                         Display help for the given command. When no command is given display help for the list command\n  -q, --quiet                        Do not output any message\n  -V, --version                      Display this application version\n      --ansi|--no-ansi               Force (or disable --no-ansi) ANSI output\n  -n, --no-interaction               Do not ask any interactive question\n  -v|vv|vvv, --verbose               Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug\nHelp:\n  The build command generates the website in the output directory.\ncecil.phar build\n    cecil.phar build path\/to\/the\/working\/directory\n    cecil.phar build --baseurl=https:\/\/example.com\/\n    cecil.phar build --output=_site\nTo build the website with optimization of generated files, you can use the --optimize option.\n  This is useful to reduce the size of the generated files and improve performance:\ncecil.phar build --optimize\n    cecil.phar build --no-optimize\nTo build the website without overwriting files in the output directory, you can use the --dry-run option.\n  This is useful to check what would be built without actually writing files:\ncecil.phar build --dry-run\nTo build the website with a specific subset of rendered pages, you can use the --render-subset option.\n  This is useful to build only a part of the website, for example, only \"hot\" pages or a specific section:\ncecil.phar build --render-subset=subset\nTo show build steps metrics, run:\ncecil.phar build --metrics",
    "href": "fr\/documentation\/commandes\/build\/"  },
  {
    "id": "fr\/documentation\/configuration\/pages#pages-dir",
    "page": "Configuration > Pages",
    "title": "pages.dir",
    "description": "R\u00e9pertoire source des pages (pages par d\u00e9faut).",
    "content": "R\u00e9pertoire source des pages (pages par d\u00e9faut).\npages:\n  dir: pages",
    "href": "fr\/documentation\/configuration\/pages\/#pages-dir"  },
  {
    "id": "fr\/documentation\/configuration\/pages#pages-ext",
    "page": "Configuration > Pages",
    "title": "pages.ext",
    "description": "Extensions des fichiers de pages.",
    "content": "Extensions des fichiers de pages.\npages:\n  ext: [md, markdown, mdown, mkdn, mkd, text, txt]",
    "href": "fr\/documentation\/configuration\/pages\/#pages-ext"  },
  {
    "id": "fr\/documentation\/configuration\/pages#pages-exclude",
    "page": "Configuration > Pages",
    "title": "pages.exclude",
    "description": "R\u00e9pertoires, chemins et noms de fichiers \u00e0 exclure (accepte les glob, les cha\u00eenes et les expressions r\u00e9guli\u00e8res).",
    "content": "R\u00e9pertoires, chemins et noms de fichiers \u00e0 exclure (accepte les glob, les cha\u00eenes et les expressions r\u00e9guli\u00e8res).\npages:\n  exclude: ['vendor', 'node_modules', '*.scss', '\/\\.bck$\/']",
    "href": "fr\/documentation\/configuration\/pages\/#pages-exclude"  },
  {
    "id": "fr\/documentation\/configuration\/pages#pages-prefix-separator",
    "page": "Configuration > Pages",
    "title": "pages.prefix.separator",
    "description": "Liste des caract\u00e8res utilis\u00e9s comme s\u00e9parateur entre un pr\u00e9fixe de nom de fichier (date ou weight) et le slug.",
    "content": "Liste des caract\u00e8res utilis\u00e9s comme s\u00e9parateur entre un pr\u00e9fixe de nom de fichier (date ou weight) et le slug.\npages:\n  prefix:\n    separator: ['-', '_']",
    "href": "fr\/documentation\/configuration\/pages\/#pages-prefix-separator"  },
  {
    "id": "fr\/documentation\/configuration\/pages#pages-sortby",
    "page": "Configuration > Pages",
    "title": "pages.sortby",
    "description": "M\u00e9thode de tri par d\u00e9faut des collections.",
    "content": "M\u00e9thode de tri par d\u00e9faut des collections.\npages:\n  sortby: date # `date`, `updated`, `title` ou `weight`\n  # ou\n  sortby:\n    variable: date    # `date`, `updated`, `title` ou `weight`\n    desc_title: false # tri par titre d\u00e9croissant\n    reverse: false    # inverse l\u2019ordre de tri",
    "href": "fr\/documentation\/configuration\/pages\/#pages-sortby"  },
  {
    "id": "fr\/documentation\/configuration\/pages#pages-pagination",
    "page": "Configuration > Pages",
    "title": "pages.pagination",
    "description": "La pagination est disponible pour les pages de liste (type homepage, section ou term).",
    "content": "La pagination est disponible pour les pages de liste (type homepage, section ou term).\npages:\n  pagination:\n    max: 5     # nombre maximum d\u2019entr\u00e9es par page\n    path: page # chemin de la page pagin\u00e9e",
    "href": "fr\/documentation\/configuration\/pages\/#pages-pagination"  },
  {
    "id": "fr\/documentation\/configuration\/pages#desactiver-la-pagination",
    "page": "Configuration > Pages",
    "title": "D\u00e9sactiver la pagination",
    "description": "La pagination peut \u00eatre d\u00e9sactiv\u00e9e :",
    "content": "La pagination peut \u00eatre d\u00e9sactiv\u00e9e :\npages:\n  pagination: false",
    "href": "fr\/documentation\/configuration\/pages\/#desactiver-la-pagination"  },
  {
    "id": "fr\/documentation\/configuration\/pages#pages-paths",
    "page": "Configuration > Pages",
    "title": "pages.paths",
    "description": "Applique un path personnalis\u00e9 \u00e0 toutes les pages d\u2019une section.",
    "content": "Applique un path personnalis\u00e9 \u00e0 toutes les pages d\u2019une section.\npages:\n  paths:\n    - section: <section\u2019s ID>\n      path: <path of pages>",
    "href": "fr\/documentation\/configuration\/pages\/#pages-paths"  },
  {
    "id": "fr\/documentation\/configuration\/pages#emplacements-des-variables-de-chemin",
    "page": "Configuration > Pages",
    "title": "Emplacements des variables de chemin",
    "description": "",
    "content": ":year\n:month\n:day\n:section\n:slug\nExemple :\npages:\n  paths:\n    - section: Blog\n      path: :section\/:year\/:month\/:day\/:slug # ex. : \/blog\/2020\/12\/01\/my-post\/\n# localized\nlanguages:\n  - code: fr\n    name: Fran\u00e7ais\n    locale: fr_FR\n    config:\n      pages:\n        paths:\n          - section: Blog\n            path: blogue\/:year\/:month\/:day\/:slug # ex. : \/blogue\/2020\/12\/01\/mon-billet\/",
    "href": "fr\/documentation\/configuration\/pages\/#emplacements-des-variables-de-chemin"  },
  {
    "id": "fr\/documentation\/configuration\/pages#pages-frontmatter",
    "page": "Configuration > Pages",
    "title": "pages.frontmatter",
    "description": "Format du front matter des pages (yaml par d\u00e9faut, accepte aussi ini, toml et json).",
    "content": "Format du front matter des pages (yaml par d\u00e9faut, accepte aussi ini, toml et json).\npages:\n  frontmatter: yaml",
    "href": "fr\/documentation\/configuration\/pages\/#pages-frontmatter"  },
  {
    "id": "fr\/documentation\/configuration\/pages#pages-body",
    "page": "Configuration > Pages",
    "title": "pages.body",
    "description": "Options du corps des pages.",
    "content": "Options du corps des pages.\nPour savoir comment ces options influencent votre contenu, voir la documentation Contenu > Markdown.",
    "href": "fr\/documentation\/configuration\/pages\/#pages-body"  },
  {
    "id": "fr\/documentation\/configuration\/pages#pages-body-toc",
    "page": "Configuration > Pages",
    "title": "pages.body.toc",
    "description": "En-t\u00eates utilis\u00e9s pour construire la table des mati\u00e8res ([h2, h3] par d\u00e9faut).",
    "content": "En-t\u00eates utilis\u00e9s pour construire la table des mati\u00e8res ([h2, h3] par d\u00e9faut).\npages:\n  body:\n    toc: [h2, h3]",
    "href": "fr\/documentation\/configuration\/pages\/#pages-body-toc"  },
  {
    "id": "fr\/documentation\/configuration\/pages#pages-body-highlight",
    "page": "Configuration > Pages",
    "title": "pages.body.highlight",
    "description": "Active la coloration syntaxique du code (true par d\u00e9faut).",
    "content": "Active la coloration syntaxique du code (true par d\u00e9faut).\npages:\n  body:\n    highlight: false # d\u00e9finissez \u00e0 false pour d\u00e9sactiver la coloration syntaxique",
    "href": "fr\/documentation\/configuration\/pages\/#pages-body-highlight"  },
  {
    "id": "fr\/documentation\/configuration\/pages#pages-body-images",
    "page": "Configuration > Pages",
    "title": "pages.body.images",
    "description": "Options de gestion des images.",
    "content": "Options de gestion des images.\npages:\n  body:\n    images:\n      formats: []       # ajoute des formats d\u2019image alternatifs comme `source` (ex. `[avif, webp]`, tableau vide par d\u00e9faut)\n      resize: 0         # redimensionne toutes les images \u00e0 <width> (en pixels, `0` pour d\u00e9sactiver)\n      responsive: false # ajoute des variantes responsives \u00e0 l\u2019attribut `srcset` (`false` par d\u00e9faut)\n      lazy: true        # ajoute l\u2019attribut `loading=\"lazy\"` (`true` par d\u00e9faut)\n      decoding: true    # ajoute l\u2019attribut `decoding=\"async\"` (`true` par d\u00e9faut)\n      caption: false    # place l\u2019image dans un \u00e9l\u00e9ment <figure> et ajoute une <figcaption> contenant le titre (`false` par d\u00e9faut)\n      placeholder: ''   # remplit l\u2019arri\u00e8re-plan de <img> avant le chargement ('color' ou 'lqip', vide par d\u00e9faut)\n      class: ''         # d\u00e9finit une classe par d\u00e9faut sur chaque image (vide par d\u00e9faut)\n      dark_suffix: ''   # suffixe de l\u2019image variante sombre (ex. `.dark`), d\u00e9sactiv\u00e9 par d\u00e9faut\n      mobile_suffix: '' # suffixe de l\u2019image variante mobile (ex. `.mobile`), d\u00e9sactiv\u00e9 par d\u00e9faut\n      mobile_media_query: '(max-width: 767px)' # media query de la `<source>` de la variante mobile\n      remote:           # traitement des images distantes (mettre \u00e0 `false` pour d\u00e9sactiver)\n        fallback:         # chemin de l\u2019image de secours, stock\u00e9e dans le r\u00e9pertoire assets (vide par d\u00e9faut)\nDepuis la version 8.41.0, l\u2019option pages.body.images.resize sert \u00e0 redimensionner les images \u00e0 une largeur pr\u00e9cise, et non plus \u00e0 activer la fonctionnalit\u00e9 de redimensionnement (activ\u00e9e syst\u00e9matiquement).\nLes options globales, comme les largeurs et tailles des images responsives, sont configurables dans la section assets.images.\nLes images distantes sont t\u00e9l\u00e9charg\u00e9es et converties en Assets pour \u00eatre manipul\u00e9es. Vous pouvez d\u00e9sactiver ce comportement en d\u00e9finissant l\u2019option pages.body.images.remote.enabled \u00e0 false.\nLorsque dark_suffix est d\u00e9fini (par ex. dark_suffix: .dark), Cecil cherche automatiquement une variante sombre de chaque image (par ex. photo.dark.jpg \u00e0 c\u00f4t\u00e9 de photo.jpg). Si elle est trouv\u00e9e, l\u2019image est entour\u00e9e d\u2019un \u00e9l\u00e9ment <picture> avec une balise <source media=\"(prefers-color-scheme: dark)\"> pour un basculement automatique clair\/sombre. Cela fonctionne avec formats et responsive.\nDe la m\u00eame mani\u00e8re, lorsque mobile_suffix est d\u00e9fini (par ex. mobile_suffix: .mobile), Cecil cherche une variante mobile de chaque image (par ex. photo.mobile.jpg \u00e0 c\u00f4t\u00e9 de photo.jpg) et ajoute une balise <source> avec la media query mobile_media_query ((max-width: 767px) par d\u00e9faut). Si dark_suffix est \u00e9galement d\u00e9fini, la variante sombre de l\u2019image mobile (par ex. photo.mobile.dark.jpg) est utilis\u00e9e sur mobile en mode sombre. Les sources mobiles sont plac\u00e9es avant les sources sombres, afin que la variante mobile soit prioritaire.",
    "href": "fr\/documentation\/configuration\/pages\/#pages-body-images"  },
  {
    "id": "fr\/documentation\/configuration\/pages#pages-body-links",
    "page": "Configuration > Pages",
    "title": "pages.body.links",
    "description": "Options de gestion des liens.",
    "content": "Options de gestion des liens.\npages:\n  body:\n    links:\n      embed:\n        enabled: false     # transforme les liens en contenu embarqu\u00e9 si possible (`false` par d\u00e9faut)\n        video: [mp4, webm] # extensions des fichiers vid\u00e9o\n        audio: [mp3]       # extensions des fichiers audio\n      external:\n        blank: false     # si `true`, ouvre le lien externe dans un nouvel onglet\n        noopener: true   # si `true`, ajoute `noopener` \u00e0 l\u2019attribut `rel`\n        noreferrer: true # si `true`, ajoute `noreferrer` \u00e0 l\u2019attribut `rel`\n        nofollow: false  # si `true`, ajoute `nofollow` \u00e0 l\u2019attribut `rel`",
    "href": "fr\/documentation\/configuration\/pages\/#pages-body-links"  },
  {
    "id": "fr\/documentation\/configuration\/pages#pages-body-excerpt",
    "page": "Configuration > Pages",
    "title": "pages.body.excerpt",
    "description": "Options de gestion des extraits.",
    "content": "Options de gestion des extraits.\npages:\n  body:\n    excerpt:\n      separator: excerpt|break # cha\u00eene utilis\u00e9e comme s\u00e9parateur (`excerpt|break` par d\u00e9faut)\n      capture: before          # partie \u00e0 capturer, `before` ou `after` le s\u00e9parateur (`before` par d\u00e9faut)",
    "href": "fr\/documentation\/configuration\/pages\/#pages-body-excerpt"  },
  {
    "id": "fr\/documentation\/configuration\/pages#pages-virtual",
    "page": "Configuration > Pages",
    "title": "pages.virtual",
    "description": "Les pages virtuelles sont la meilleure fa\u00e7on de cr\u00e9er des pages sans contenu (front matter uniquement).",
    "content": "Les pages virtuelles sont la meilleure fa\u00e7on de cr\u00e9er des pages sans contenu (front matter uniquement).\nElles consistent en une liste de pages avec un path et quelques variables de front matter.\nExemple :\npages:\n  virtual:\n    - path: code\n      redirect: https:\/\/github.com\/ArnaudLigny",
    "href": "fr\/documentation\/configuration\/pages\/#pages-virtual"  },
  {
    "id": "fr\/documentation\/configuration\/pages#pages-default",
    "page": "Configuration > Pages",
    "title": "pages.default",
    "description": "Les pages par d\u00e9faut sont des pages cr\u00e9\u00e9es automatiquement par Cecil (\u00e0 partir de mod\u00e8les int\u00e9gr\u00e9s) :",
    "content": "Les pages par d\u00e9faut sont des pages cr\u00e9\u00e9es automatiquement par Cecil (\u00e0 partir de mod\u00e8les int\u00e9gr\u00e9s) :\npages:\n  default:\n    index:\n      path: ''\n      title: Accueil\n      published: true\n    404:\n      path: 404\n      title: Page introuvable\n      layout: 404\n      uglyurl: true\n      published: true\n      excluded: true\n    robots:\n      path: robots\n      title: Robots.txt\n      layout: robots\n      output: txt\n      published: true\n      excluded: true\n      multilingual: false\n    sitemap:\n      path: sitemap\n      title: Plan de site XML\n      layout: sitemap\n      output: xml\n      changefreq: monthly\n      priority: 0.5\n      published: true\n      excluded: true\n      multilingual: false\n    xsl\/atom:\n      path: xsl\/atom\n      layout: feed\n      output: xsl\n      uglyurl: true\n      published: true\n      excluded: true\n    xsl\/rss:\n      path: xsl\/rss\n      layout: feed\n      output: xsl\n      uglyurl: true\n      published: false\n      excluded: true\nLa structure est presque identique \u00e0 celle de pages.virtual, \u00e0 l\u2019exception de la cl\u00e9 nomm\u00e9e.\nChaque page peut \u00eatre :\nd\u00e9sactiv\u00e9e : published: false\nexclue des pages de liste : excluded: true\nexclue de la localisation : multilingual: false\nDepuis la version 8.68.0, vous pouvez surcharger la page robots.txt par d\u00e9faut en cr\u00e9ant une page avec le m\u00eame path :\npages\/robots.md\n---\nlayout: robots\noutput: txt\n---\nUser-agent: AI-bot\nDisallow: \/",
    "href": "fr\/documentation\/configuration\/pages\/#pages-default"  },
  {
    "id": "fr\/documentation\/configuration\/pages#pages-generators",
    "page": "Configuration > Pages",
    "title": "pages.generators",
    "description": "Les g\u00e9n\u00e9rateurs servent \u00e0 Cecil pour cr\u00e9er des pages suppl\u00e9mentaires (par ex. sitemap, flux, pagination, etc.) \u00e0 partir de pages existantes, ou \u00e0 partir d\u2019autres sources comme le fichier de configuration ou des sources externes.",
    "content": "Les g\u00e9n\u00e9rateurs servent \u00e0 Cecil pour cr\u00e9er des pages suppl\u00e9mentaires (par ex. sitemap, flux, pagination, etc.) \u00e0 partir de pages existantes, ou \u00e0 partir d\u2019autres sources comme le fichier de configuration ou des sources externes.\nVoici la liste des g\u00e9n\u00e9rateurs fournis par Cecil, dans un ordre d\u00e9fini :\npages:\n  generators:\n    10: 'Cecil\\Generator\\DefaultPages'\n    20: 'Cecil\\Generator\\VirtualPages'\n    30: 'Cecil\\Generator\\ExternalBody'\n    40: 'Cecil\\Generator\\Section'\n    50: 'Cecil\\Generator\\Taxonomy'\n    60: 'Cecil\\Generator\\Homepage'\n    70: 'Cecil\\Generator\\Pagination'\n    80: 'Cecil\\Generator\\Alias'\n    90: 'Cecil\\Generator\\Redirect'\nVous pouvez \u00e9tendre Cecil avec un g\u00e9n\u00e9rateur de pages.",
    "href": "fr\/documentation\/configuration\/pages\/#pages-generators"  },
  {
    "id": "fr\/documentation\/configuration\/pages#pages-subsets",
    "page": "Configuration > Pages",
    "title": "pages.subsets",
    "description": "Les sous-ensembles servent \u00e0 rendre une partie de la collection de pages, selon un chemin, une langue ou un format de sortie sp\u00e9cifique, avec la commande :",
    "content": "Les sous-ensembles servent \u00e0 rendre une partie de la collection de pages, selon un chemin, une langue ou un format de sortie sp\u00e9cifique, avec la commande :\ncecil build --render-subset=<name>\npages:\n  subsets:\n    <name>:\n      path: <path> # chemin glob ou cha\u00eene (ex. `blog\/*`, `blog`)\n      language: <language> # code de langue (ex. `en`, `fr`)\n      output: <output> # format de sortie (ex. `html`, `atom`)\nExemple :\npages:\n  subsets:\n    blog_en:\n      path: blog\n      language: en\n      output: html\n    search_index:\n      path: '*'\n      output: json",
    "href": "fr\/documentation\/configuration\/pages\/#pages-subsets"  },
  {
    "id": "fr\/documentation\/content\/multilingual",
    "page": "Contenu > Multilingue",
    "title": "Multilingue",
    "description": "Si vos pages sont disponibles en plusieurs langues, il existe 2 fa\u00e7ons diff\u00e9rentes de le d\u00e9finir :",
    "content": "Si vos pages sont disponibles en plusieurs langues, il existe 2 fa\u00e7ons diff\u00e9rentes de le d\u00e9finir :",
    "href": "fr\/documentation\/contenu\/multilingue\/"  },
  {
    "id": "fr\/documentation\/content\/multilingual#via-le-nom-de-fichier",
    "page": "Contenu > Multilingue",
    "title": "Via le nom de fichier",
    "description": "C\u2019est la m\u00e9thode la plus courante pour traduire une page depuis la langue principale vers une autre langue.",
    "content": "C\u2019est la m\u00e9thode la plus courante pour traduire une page depuis la langue principale vers une autre langue.\nIl suffit de dupliquer la page de r\u00e9f\u00e9rence et de lui ajouter en suffixe le code de la langue cible (ex. : fr).\nExemple :\n\u251c\u2500 about.md    # the reference page\n\u2514\u2500 about.fr.md # the french version (`fr`)\nVous pouvez changer l\u2019URL de la page traduite avec la variable slug dans le front matter. Par exemple :\n---\nslug: a-propos\n---\n# about.md    -> \/about\/\n# about.fr.md -> \/fr\/a-propos\/",
    "href": "fr\/documentation\/contenu\/multilingue\/#via-le-nom-de-fichier"  },
  {
    "id": "fr\/documentation\/content\/multilingual#via-le-front-matter",
    "page": "Contenu > Multilingue",
    "title": "Via le front matter",
    "description": "Si vous souhaitez cr\u00e9er une page dans une langue autre que la langue principale, sans qu\u2019elle soit la traduction d\u2019une page existante, vous pouvez utiliser la variable language dans son front matter.",
    "content": "Si vous souhaitez cr\u00e9er une page dans une langue autre que la langue principale, sans qu\u2019elle soit la traduction d\u2019une page existante, vous pouvez utiliser la variable language dans son front matter.\nExemple :\n---\nlanguage: fr\n---",
    "href": "fr\/documentation\/contenu\/multilingue\/#via-le-front-matter"  },
  {
    "id": "fr\/documentation\/content\/multilingual#lier-les-pages-traduites",
    "page": "Contenu > Multilingue",
    "title": "Lier les pages traduites",
    "description": "Chaque page traduite r\u00e9f\u00e9rence les pages dans les autres langues.",
    "content": "Chaque page traduite r\u00e9f\u00e9rence les pages dans les autres langues.\nCette collection de pages est disponible dans les templates via la variable suivante :\n{{ page.translations }}\nLa variable langref est fournie par d\u00e9faut, mais vous pouvez la modifier dans le front matter :\n---\nlangref: my-page-ref\n---",
    "href": "fr\/documentation\/contenu\/multilingue\/#lier-les-pages-traduites"  },
  {
    "id": "fr\/documentation\/getting-started\/starter-kits",
    "page": "Bien d\u00e9marrer > Kits de d\u00e9marrage",
    "title": "Kits de d\u00e9marrage",
    "description": "Pour d\u00e9marrer rapidement, utilisez l\u2019un des kits de d\u00e9marrage Cecil pr\u00eats \u00e0 l\u2019emploi :",
    "content": "Pour d\u00e9marrer rapidement, utilisez l\u2019un des kits de d\u00e9marrage Cecil pr\u00eats \u00e0 l\u2019emploi :\nThe Butler : starter blog pr\u00eat \u00e0 publier.\nLinks : alternative open source \u00e0 Linktree.\nPhoto Stream : flux photo auto-h\u00e9berg\u00e9 minimaliste.\nStatidocs : site de documentation pr\u00eat \u00e0 l\u2019emploi.",
    "href": "fr\/documentation\/bien-demarrer\/kits-de-demarrage\/"  },
  {
    "id": "fr\/documentation\/templates\/components",
    "page": "Templates > Composants",
    "title": "Composants",
    "description": "Cecil fournit une logique de composants pour vous donner le pouvoir de cr\u00e9er des \"unit\u00e9s\" de templates r\u00e9utilisables.",
    "content": "Cecil fournit une logique de composants pour vous donner le pouvoir de cr\u00e9er des \"unit\u00e9s\" de templates r\u00e9utilisables.\nLa fonctionnalit\u00e9 des composants est fournie par l'extension de composants Twig cr\u00e9\u00e9e par Giorgio Pogliani.",
    "href": "fr\/documentation\/templates\/composants\/"  },
  {
    "id": "fr\/documentation\/templates\/components#syntaxe-des-composants",
    "page": "Templates > Composants",
    "title": "Syntaxe des composants",
    "description": "Les composants ne sont que des templates Twig stock\u00e9s dans le sous-r\u00e9pertoire components\/ et peuvent \u00eatre utilis\u00e9s n'importe o\u00f9 dans vos templates\u00a0:",
    "content": "Les composants ne sont que des templates Twig stock\u00e9s dans le sous-r\u00e9pertoire components\/ et peuvent \u00eatre utilis\u00e9s n'importe o\u00f9 dans vos templates\u00a0:\n{# \/components\/button.twig #}\n<button {{ attributes.merge({class: 'rounded px-4'}) }}>\n    {{ slot }}\n<\/button>\nLa variable slot correspond \u00e0 tout contenu que vous ajouterez entre la balise d'ouverture et la balise de fermeture.\nPour acc\u00e9der \u00e0 un composant vous devez utiliser la balise d\u00e9di\u00e9e x suivie de : et du nom de fichier de votre composant sans extension :\n{# \/index.twig #}\n{% x:button with {class: 'text-white'} %}\n    <strong>Click me<\/strong>\n{% endx %}\nIl rendra\u00a0:\n<button class=\"text-white rounded px-4\">\n    <strong>Click me<\/strong>\n<\/button>",
    "href": "fr\/documentation\/templates\/composants\/#syntaxe-des-composants"  },
  {
    "id": "fr\/documentation\/commands\/doctor",
    "page": "Commandes > doctor",
    "title": "doctor",
    "description": "Diagnostique le site courant et l'environnement Cecil.",
    "content": "Diagnostique le site courant et l'environnement Cecil.\nDescription:\n  Diagnoses the site configuration\nUsage:\n  doctor [options] [--] [<path>]\nArguments:\n  path                       Use the given path as working directory\nOptions:\n  -c, --config=CONFIG        Set the path to an extra configuration file\n  -h, --help                 Display help for the given command. When no command is given display help for the list command\n  -q, --quiet                Do not output any message\n  -V, --version              Display this application version\n      --ansi|--no-ansi       Force (or disable --no-ansi) ANSI output\n  -n, --no-interaction       Do not ask any interactive question\n  -v|vv|vvv, --verbose       Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug\nHelp:\n  The doctor command diagnoses the current site and Cecil environment.\ncecil.phar doctor\n    cecil.phar doctor path\/to\/the\/working\/directory\nTo inspect a site with an extra configuration file, run:\ncecil.phar doctor --config=config.yml",
    "href": "fr\/documentation\/commandes\/doctor\/"  },
  {
    "id": "fr\/documentation\/commands\/doctor#doctor-frontmatter",
    "page": "Commandes > doctor",
    "title": "doctor:frontmatter",
    "description": "Valide la syntaxe du front matter des pages.",
    "content": "Valide la syntaxe du front matter des pages.\nDescription:\n  Validates pages front matter syntax\nUsage:\n  doctor:frontmatter|doctor:fm [options] [--] [<path>]\nArguments:\n  path                  Use the given path as working directory\nOptions:\n  -c, --config=CONFIG   Set the path to an extra configuration file\n  -p, --page=PAGE       Validate a single page relative to the pages directory\n      --ansi|--no-ansi  Force (or disable --no-ansi) ANSI output\n  -n, --no-interaction  Do not ask any interactive question\n  -h, --help            Display help for the given command. When no command is given display help for the list command\n  -q, --quiet           Do not output any message\n  -V, --version         Display this application version\n  -v|vv|vvv             Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug",
    "href": "fr\/documentation\/commandes\/doctor\/#doctor-frontmatter"  },
  {
    "id": "fr\/documentation\/commands\/doctor#doctor-seo",
    "page": "Commandes > doctor",
    "title": "doctor:seo",
    "description": "Audite les pages HTML rendues pour d\u00e9tecter les probl\u00e8mes SEO courants.",
    "content": "Audite les pages HTML rendues pour d\u00e9tecter les probl\u00e8mes SEO courants.\nDescription:\n  Audits rendered HTML pages for common SEO issues\nUsage:\n  doctor:seo [options] [--] [<path>]\nArguments:\n  path                  Use the given path as working directory\nOptions:\n  -c, --config=CONFIG   Set the path to an extra configuration file\n  -p, --page=PAGE       Audit a single page relative to the pages directory\n      --format=FORMAT   Output format: text (default) or json\n      --feedback        Include findings with feedback level\n      --include-virtual Include virtual pages (paginated, taxonomies) in audit\nLa commande construit le site en mode dry-run, puis audite le HTML rendu avec un jeu de contr\u00f4les cibl\u00e9s : balise title, meta description, URL canonique, structure des titres, balises Open Graph, attributs alt des images et longueur estim\u00e9e du contenu.\nPar d\u00e9faut, les pages virtuelles (pagin\u00e9es, pages de taxonomie) sont exclues de l'audit. Utilisez --include-virtual pour les inclure.\nPar d\u00e9faut, les findings de niveau feedback ne sont pas list\u00e9s.\nUtilisez --feedback pour inclure les findings de niveau feedback en plus des autres findings.\nExportez les r\u00e9sultats en JSON pour l'int\u00e9gration CI en utilisant --format=json.",
    "href": "fr\/documentation\/commandes\/doctor\/#doctor-seo"  },
  {
    "id": "fr\/documentation\/commands\/doctor#configuration",
    "page": "Commandes > doctor",
    "title": "Configuration",
    "description": "Personnalisez les seuils d'audit et les contr\u00f4les activ\u00e9s dans votre fichier de configuration :",
    "content": "Personnalisez les seuils d'audit et les contr\u00f4les activ\u00e9s dans votre fichier de configuration :\ndoctor:\n  seo:\n    title: { min: 30, max: 60 }\n    description: { min: 120, max: 160 }\n    content: { min_words: 300 }\n    checks:\n      title: true\n      description: true\n      canonical: true\n      h1: true\n      og_tags: true\n      img_alt: true\n      content_length: true\n      lang_attribute: true",
    "href": "fr\/documentation\/commandes\/doctor\/#configuration"  },
  {
    "id": "fr\/documentation\/configuration\/data-static#donnees",
    "page": "Configuration > Donn\u00e9es et fichiers statiques",
    "title": "Donn\u00e9es",
    "description": "Emplacement des fichiers de donn\u00e9es et types d\u2019extensions pris en charge.",
    "content": "Emplacement des fichiers de donn\u00e9es et types d\u2019extensions pris en charge.\nFormats pris en charge : YAML, JSON, XML et CSV.",
    "href": "fr\/documentation\/configuration\/donnees-et-statiques\/#donnees"  },
  {
    "id": "fr\/documentation\/configuration\/data-static#data-dir",
    "page": "Configuration > Donn\u00e9es et fichiers statiques",
    "title": "data.dir",
    "description": "R\u00e9pertoire source des donn\u00e9es (data par d\u00e9faut).",
    "content": "R\u00e9pertoire source des donn\u00e9es (data par d\u00e9faut).\ndata:\n  dir: data",
    "href": "fr\/documentation\/configuration\/donnees-et-statiques\/#data-dir"  },
  {
    "id": "fr\/documentation\/configuration\/data-static#data-ext",
    "page": "Configuration > Donn\u00e9es et fichiers statiques",
    "title": "data.ext",
    "description": "Tableau des extensions de fichiers.",
    "content": "Tableau des extensions de fichiers.\ndata:\n  ext: [yaml, yml, json, xml, csv]",
    "href": "fr\/documentation\/configuration\/donnees-et-statiques\/#data-ext"  },
  {
    "id": "fr\/documentation\/configuration\/data-static#data-load",
    "page": "Configuration > Donn\u00e9es et fichiers statiques",
    "title": "data.load",
    "description": "Active la collection site.data (true par d\u00e9faut).",
    "content": "Active la collection site.data (true par d\u00e9faut).\ndata:\n  load: true",
    "href": "fr\/documentation\/configuration\/donnees-et-statiques\/#data-load"  },
  {
    "id": "fr\/documentation\/configuration\/data-static#fichiers-statiques",
    "page": "Configuration > Donn\u00e9es et fichiers statiques",
    "title": "Fichiers statiques",
    "description": "Gestion des fichiers statiques copi\u00e9s (PDF, polices, etc.).",
    "content": "Gestion des fichiers statiques copi\u00e9s (PDF, polices, etc.).\nVous devez placer les fichiers d\u2019assets, utilis\u00e9s par asset(), dans le r\u00e9pertoire assets afin d\u2019\u00e9viter des copies de fichiers inutiles.",
    "href": "fr\/documentation\/configuration\/donnees-et-statiques\/#fichiers-statiques"  },
  {
    "id": "fr\/documentation\/configuration\/data-static#static-dir",
    "page": "Configuration > Donn\u00e9es et fichiers statiques",
    "title": "static.dir",
    "description": "R\u00e9pertoire source des fichiers statiques (static par d\u00e9faut).",
    "content": "R\u00e9pertoire source des fichiers statiques (static par d\u00e9faut).\nstatic:\n  dir: static",
    "href": "fr\/documentation\/configuration\/donnees-et-statiques\/#static-dir"  },
  {
    "id": "fr\/documentation\/configuration\/data-static#static-target",
    "page": "Configuration > Donn\u00e9es et fichiers statiques",
    "title": "static.target",
    "description": "R\u00e9pertoire vers lequel les fichiers statiques sont copi\u00e9s (root par d\u00e9faut).",
    "content": "R\u00e9pertoire vers lequel les fichiers statiques sont copi\u00e9s (root par d\u00e9faut).\nstatic:\n  target: ''",
    "href": "fr\/documentation\/configuration\/donnees-et-statiques\/#static-target"  },
  {
    "id": "fr\/documentation\/configuration\/data-static#static-exclude",
    "page": "Configuration > Donn\u00e9es et fichiers statiques",
    "title": "static.exclude",
    "description": "Liste des fichiers exclus. Accepte les glob, les cha\u00eenes et les expressions r\u00e9guli\u00e8res.",
    "content": "Liste des fichiers exclus. Accepte les glob, les cha\u00eenes et les expressions r\u00e9guli\u00e8res.\nstatic:\n  exclude: ['sass', 'scss', '*.scss', 'package*.json', 'node_modules']\nSi vous utilisez Bootstrap Icons, vous pouvez exclure node_modules sauf node_modules\/bootstrap-icons avec une expression r\u00e9guli\u00e8re :\nexclude: ['sass', 'scss', '*.scss', 'package*.json', '#node_modules\/(?!bootstrap-icons)#']",
    "href": "fr\/documentation\/configuration\/donnees-et-statiques\/#static-exclude"  },
  {
    "id": "fr\/documentation\/configuration\/data-static#static-load",
    "page": "Configuration > Donn\u00e9es et fichiers statiques",
    "title": "static.load",
    "description": "Active la collection site.static (false par d\u00e9faut).",
    "content": "Active la collection site.static (false par d\u00e9faut).\nstatic:\n  load: false",
    "href": "fr\/documentation\/configuration\/donnees-et-statiques\/#static-load"  },
  {
    "id": "fr\/documentation\/configuration\/data-static#static-mounts",
    "page": "Configuration > Donn\u00e9es et fichiers statiques",
    "title": "static.mounts",
    "description": "Permet de copier des fichiers ou r\u00e9pertoires sp\u00e9cifiques vers une destination sp\u00e9cifique.",
    "content": "Permet de copier des fichiers ou r\u00e9pertoires sp\u00e9cifiques vers une destination sp\u00e9cifique.\nstatic:\n  mounts: []",
    "href": "fr\/documentation\/configuration\/donnees-et-statiques\/#static-mounts"  },
  {
    "id": "fr\/documentation\/configuration\/data-static#exemple-de-static",
    "page": "Configuration > Donn\u00e9es et fichiers statiques",
    "title": "exemple de static",
    "description": "",
    "content": "static:\n  dir: docs\n  target: docs\n  exclude: ['sass', '*.scss', '\/\\.bck$\/']\n  load: true\n  mounts:\n    - source\/path\/file.ext: dest\/path\/file.ext\n    - node_modules\/bootstrap-icons\/font\/fonts: fonts",
    "href": "fr\/documentation\/configuration\/donnees-et-statiques\/#exemple-de-static"  },
  {
    "id": "fr\/documentation\/configuration",
    "page": " > Configuration",
    "title": "Configuration",
    "description": "La configuration du site web est d\u00e9finie dans un fichier YAML nomm\u00e9 cecil.yml ou config.yml, stock\u00e9 \u00e0 la racine :",
    "content": "La configuration du site web est d\u00e9finie dans un fichier YAML nomm\u00e9 cecil.yml ou config.yml, stock\u00e9 \u00e0 la racine :\n<mywebsite>\n\u2514\u2500 cecil.yml\nCecil propose de nombreuses options de configuration, mais ses valeurs par d\u00e9faut sont souvent suffisantes. Un nouveau site ne n\u00e9cessite que ces param\u00e8tres :\ntitle: \"My new Cecil site\"\nbaseurl: https:\/\/mywebsite.com\/\ndescription: \"Site description\"\nLa documentation ci-dessous couvre toutes les options de configuration prises en charge par Cecil.",
    "href": "fr\/documentation\/configuration\/"  },
  {
    "id": "fr\/documentation\/content\/dynamic-content",
    "page": "Contenu > Contenu dynamique",
    "title": "Contenu dynamique",
    "description": "Vous pouvez cr\u00e9er du contenu dynamique dans une page en utilisant la fonction Twig template_from_string.",
    "content": "Vous pouvez cr\u00e9er du contenu dynamique dans une page en utilisant la fonction Twig template_from_string.\n{{ include(template_from_string(page.content, \"contenu dynamique pour la page \" ~ page.id)) }}\nAvec cette approche, vous pouvez utiliser n\u2019importe quelle variable de page dans le body de la page.\n--\nvar: 'value'\n---\nLa valeur de `var` est {{ page.var }}.",
    "href": "fr\/documentation\/contenu\/contenu-dynamique\/"  },
  {
    "id": "fr\/documentation\/templates\/localization",
    "page": "Templates > Localisation",
    "title": "Localisation",
    "description": "Cecil prend en charge traduction du texte et localisation de la date.",
    "content": "Cecil prend en charge traduction du texte et localisation de la date.",
    "href": "fr\/documentation\/templates\/localisation\/"  },
  {
    "id": "fr\/documentation\/templates\/localization#traduction-de-texte",
    "page": "Templates > Localisation",
    "title": "Traduction de texte",
    "description": "Utilise le trans tag ou filter pour traduire des textes dans des templates.",
    "content": "Utilise le trans tag ou filter pour traduire des textes dans des templates.\n{% trans with variables into locale %}{% endtrans %}\n{{ message|trans(variables = []) }}",
    "href": "fr\/documentation\/templates\/localisation\/#traduction-de-texte"  },
  {
    "id": "fr\/documentation\/templates\/localization#exemples",
    "page": "Templates > Localisation",
    "title": "Exemples",
    "description": "",
    "content": "{% trans %}Hello World!{% endtrans %}\n{{ message|trans }}\nInclure des variables\u00a0:\n{% trans with {'%name%': 'Arnaud'} %}Hello %name%!{% endtrans %}\n{{ message|trans({'%name%': 'Arnaud'}) }}\nForcer les param\u00e8tres r\u00e9gionaux\u00a0:\n{% trans into 'fr_FR' %}Hello World!{% endtrans %}\nPluraliser\u00a0:\n{% trans with {'%count%': 42}%}{0}I don't have apples|{1}I have one apple|]1,Inf[I have %count% apples{% endtrans %}",
    "href": "fr\/documentation\/templates\/localisation\/#exemples"  },
  {
    "id": "fr\/documentation\/templates\/localization#fichiers-de-traduction",
    "page": "Templates > Localisation",
    "title": "Fichiers de traduction",
    "description": "Les fichiers de traduction doivent \u00eatre nomm\u00e9s messages.<locale>.<extension> et stock\u00e9s dans le r\u00e9pertoire translations.\nLes extensions prises en charge sont d\u00e9finies pour chaque format de traduction dans layouts.translations.formats.",
    "content": "Les fichiers de traduction doivent \u00eatre nomm\u00e9s messages.<locale>.<extension> et stock\u00e9s dans le r\u00e9pertoire translations.\nLes extensions prises en charge sont d\u00e9finies pour chaque format de traduction dans layouts.translations.formats.\nLe code locale (ex. : fr_FR) d'une langue est d\u00e9fini dans les entr\u00e9es languages de la configuration.\nExemple:\n<mywebsite>\n\u2514\u2500 translations\n   \u251c\u2500 messages.fr_FR.mo   <- Machine Object format\n   \u2514\u2500 messages.fr_FR.yaml <- Yaml format\nVous pouvez facilement extraire les traductions de vos templates avec la commande suivante\u00a0:\nphp cecil.phar util:translations:extract --locale=<code> --show\nUtilisez --save \u00e0 la place (ou en plus) de --show pour enregistrer les traductions dans un fichier. L'option --locale est obligatoire. Le format de sortie par d\u00e9faut est yaml (utilisez --format=po pour le format gettext PO).\nPoedit est un \u00e9diteur de traduction simple et multiplateforme pour gettext (PO), et Poedit Pro prend en charge l'extraction de cha\u00eenes de traduction \u00e0 partir de templates pr\u00eats \u00e0 l'emploi.\nFaites attention au cache lorsque vous mettez \u00e0 jour les fichiers de traduction.\nLe cache peut \u00eatre vid\u00e9 avec la commande suivante\u00a0:\nphp cecil.phar cache:clear:translations`",
    "href": "fr\/documentation\/templates\/localisation\/#fichiers-de-traduction"  },
  {
    "id": "fr\/documentation\/templates\/localization#localisation-de-la-date",
    "page": "Templates > Localisation",
    "title": "Localisation de la date",
    "description": "Utilise le filtre Twig format_date pour localiser une date dans les templates.",
    "content": "Utilise le filtre Twig format_date pour localiser une date dans les templates.\n{{ page.date|format_date('long') }}\n{# September 30, 2022 #}\nLes valeurs prises en charge sont\u00a0: short, medium, long et full.\nSi vous souhaitez utiliser le filtre format_date avec des param\u00e8tres r\u00e9gionaux autres que \"en\", vous devez installer l'extension PHP internationale.",
    "href": "fr\/documentation\/templates\/localisation\/#localisation-de-la-date"  },
  {
    "id": "fr\/documentation\/commands",
    "page": " > Commandes",
    "title": "Commandes",
    "description": "Liste des commandes disponibles.",
    "content": "Liste des commandes disponibles.\nAvailable commands:\n  about                      Shows a short description about Cecil\n  build                      Builds the website\n  clear                      Removes all generated files\n  doctor                     Diagnoses the site configuration\n  edit                       [open] Open pages directory with the editor\n  help                       Display help for a command\n  serve                      Starts the built-in server\n cache\n  cache:clear                Removes all cache files\n  cache:clear:assets         Removes assets cache\n  cache:clear:templates      Removes templates cache\n  cache:clear:translations   Removes translations cache\n clear\n  clear:output               Removes output directory\n  clear:temporary            [clear:tmp] Removes temporary directory\n doctor\n  doctor:frontmatter         [doctor:fm] Validates pages front matter syntax\n  doctor:cache               Shows cache status\n  doctor:seo                 Audits rendered HTML pages for common SEO issues\n new\n  new:page                   Creates a new page\n  new:site                   Creates a new website\n serve\n  serve:background           Starts the built-in server in the background\n  serve:stop                 [stop] Stops the background server\n  serve:log                  Shows combined server and error logs\n show\n  show:config                Shows the configuration\n  show:content               Shows content as tree\n util\n  util:templates:extract     Extracts built-in templates\n  util:translations:extract  Extracts translations from templates",
    "href": "fr\/documentation\/commandes\/"  },
  {
    "id": "fr\/documentation\/configuration\/assets",
    "page": "Configuration > Assets",
    "title": "Assets",
    "description": "Gestion des ressources (images, fichiers CSS et JS).",
    "content": "Gestion des ressources (images, fichiers CSS et JS).",
    "href": "fr\/documentation\/configuration\/assets\/"  },
  {
    "id": "fr\/documentation\/configuration\/assets#assets-dir",
    "page": "Configuration > Assets",
    "title": "assets.dir",
    "description": "R\u00e9pertoire source des ressources (assets par d\u00e9faut).",
    "content": "R\u00e9pertoire source des ressources (assets par d\u00e9faut).\nassets:\n  dir: assets",
    "href": "fr\/documentation\/configuration\/assets\/#assets-dir"  },
  {
    "id": "fr\/documentation\/configuration\/assets#assets-target",
    "page": "Configuration > Assets",
    "title": "assets.target",
    "description": "R\u00e9pertoire o\u00f9 les fichiers de ressources distants et redimensionn\u00e9s sont enregistr\u00e9s (root par d\u00e9faut).",
    "content": "R\u00e9pertoire o\u00f9 les fichiers de ressources distants et redimensionn\u00e9s sont enregistr\u00e9s (root par d\u00e9faut).\nassets:\n  target: ''",
    "href": "fr\/documentation\/configuration\/assets\/#assets-target"  },
  {
    "id": "fr\/documentation\/configuration\/assets#assets-fingerprint",
    "page": "Configuration > Assets",
    "title": "assets.fingerprint",
    "description": "Active le fingerprinting (cache busting) pour les fichiers de ressources (true par d\u00e9faut).",
    "content": "Active le fingerprinting (cache busting) pour les fichiers de ressources (true par d\u00e9faut).\nassets:\n  fingerprint: true",
    "href": "fr\/documentation\/configuration\/assets\/#assets-fingerprint"  },
  {
    "id": "fr\/documentation\/configuration\/assets#assets-compile",
    "page": "Configuration > Assets",
    "title": "assets.compile",
    "description": "Active la compilation des fichiers Sass (true par d\u00e9faut). Voir la documentation de scssphp pour les d\u00e9tails des options.",
    "content": "Active la compilation des fichiers Sass (true par d\u00e9faut). Voir la documentation de scssphp pour les d\u00e9tails des options.\nassets:\n  compile:\n    style: expanded      # style de compilation (`expanded` ou `compressed`, `expanded` par d\u00e9faut)\n    import: [sass, scss] # liste des chemins import\u00e9s (`[sass, scss, node_modules]` par d\u00e9faut)\n    sourcemap: false     # active les sourcemaps en mode debug (`false` par d\u00e9faut)\n    variables: []        # liste de variables pr\u00e9configur\u00e9es (vide par d\u00e9faut)\nsourcemap sert \u00e0 d\u00e9boguer la compilation SCSS (mode debug requis).",
    "href": "fr\/documentation\/configuration\/assets\/#assets-compile"  },
  {
    "id": "fr\/documentation\/configuration\/assets#assets-minify",
    "page": "Configuration > Assets",
    "title": "assets.minify",
    "description": "Active la minification CSS et JS (true par d\u00e9faut).",
    "content": "Active la minification CSS et JS (true par d\u00e9faut).\nassets:\n  minify: true",
    "href": "fr\/documentation\/configuration\/assets\/#assets-minify"  },
  {
    "id": "fr\/documentation\/configuration\/assets#assets-images",
    "page": "Configuration > Assets",
    "title": "assets.images",
    "description": "Gestion des images.",
    "content": "Gestion des images.\nassets:\n  images:\n    optimize: false # active l\u2019optimisation d\u2019images avec JpegOptim, Optipng, Pngquant 2, SVGO 1, Gifsicle, cwebp, avifenc (`false` par d\u00e9faut)\n    quality: 75     # qualit\u00e9 d\u2019image pour `optimize` et `resize` (`75` par d\u00e9faut)\n    responsive:\n      widths: [480, 640, 768, 1024, 1366, 1600, 1920] # largeurs d\u2019image pour l\u2019attribut `srcset`\n      sizes:\n        default: '100vw' # attribut `sizes` par d\u00e9faut (`100vw` par d\u00e9faut)",
    "href": "fr\/documentation\/configuration\/assets\/#assets-images"  },
  {
    "id": "fr\/documentation\/configuration\/assets#assets-images-cdn",
    "page": "Configuration > Assets",
    "title": "assets.images.cdn",
    "description": "L\u2019URL des ressources image peut \u00eatre facilement remplac\u00e9e par une url de CDN fournie.",
    "content": "L\u2019URL des ressources image peut \u00eatre facilement remplac\u00e9e par une url de CDN fournie.\nassets:\n  images:\n    cdn:\n      enabled: false  # active Image CDN (`false` par d\u00e9faut)\n      canonical: true # `image_url` est canonique (au lieu d\u2019un chemin relatif) (`true` par d\u00e9faut)\n      remote: true    # prend aussi en charge les images non locales (`true` par d\u00e9faut)\n      account: 'xxxx' # compte du fournisseur\n      url: 'https:\/\/provider.tld\/%account%\/%image_url%?w=%width%&q=%quality%&format=%format%'\nurl est un mod\u00e8le qui contient des variables :\n%account% remplac\u00e9 par l\u2019option assets.images.cdn.account\n%image_url% remplac\u00e9 par l\u2019URL canonique de l\u2019image ou par path\n%width% remplac\u00e9 par la largeur de l\u2019image\n%quality% remplac\u00e9 par l\u2019option assets.images.quality\n%format% remplac\u00e9 par le format de l\u2019image\nVoir les fournisseurs CDN.",
    "href": "fr\/documentation\/configuration\/assets\/#assets-images-cdn"  },
  {
    "id": "fr\/documentation\/configuration\/assets#assets-remote-useragent",
    "page": "Configuration > Assets",
    "title": "assets.remote.useragent",
    "description": "User agent utilis\u00e9 pour t\u00e9l\u00e9charger les ressources distantes.",
    "content": "User agent utilis\u00e9 pour t\u00e9l\u00e9charger les ressources distantes.\nassets:\n  remote:\n    useragent:\n      default: <string> # user agent par d\u00e9faut\n      useragent1: <string>\n      useragent2: <string>",
    "href": "fr\/documentation\/configuration\/assets\/#assets-remote-useragent"  },
  {
    "id": "fr\/documentation\/templates\/cache",
    "page": "Templates > Cache",
    "title": "Cache",
    "description": "Cecil utilise un syst\u00e8me de cache pour acc\u00e9l\u00e9rer le processus de g\u00e9n\u00e9ration, il peut \u00eatre d\u00e9sactiv\u00e9 ou effac\u00e9.",
    "content": "Cecil utilise un syst\u00e8me de cache pour acc\u00e9l\u00e9rer le processus de g\u00e9n\u00e9ration, il peut \u00eatre d\u00e9sactiv\u00e9 ou effac\u00e9.\nIl existe trois types de cache dans le cas du rendu des templates : les templates eux-m\u00eames, assets et translations.",
    "href": "fr\/documentation\/templates\/cache\/"  },
  {
    "id": "fr\/documentation\/templates\/cache#vider-le-cache",
    "page": "Templates > Cache",
    "title": "Vider le cache",
    "description": "Vous pouvez vider le cache avec les commandes suivantes\u00a0:",
    "content": "Vous pouvez vider le cache avec les commandes suivantes\u00a0:\nphp cecil.phar cache:clear               # clear all caches\nphp cecil.phar cache:clear:assets        # clear assets cache\nphp cecil.phar cache:clear:templates     # clear templates cache\nphp cecil.phar cache:clear:translations  # clear translations cache\nEn 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).",
    "href": "fr\/documentation\/templates\/cache\/#vider-le-cache"  },
  {
    "id": "fr\/documentation\/templates\/cache#fragments-de-cache",
    "page": "Templates > Cache",
    "title": "Fragments de cache",
    "description": "Cecil fournit un moyen de mettre en cache des parties du rendu des templates pour \u00e9viter de restituer plusieurs fois le m\u00eame contenu partiel.",
    "content": "Cecil fournit un moyen de mettre en cache des parties du rendu des templates pour \u00e9viter de restituer plusieurs fois le m\u00eame contenu partiel.\nPour utiliser les fragments de cache, vous devez envelopper le contenu que vous souhaitez mettre en cache avec la balise cache.\n{% cache 'unique-key' %}\n  {# cacheable content #}\n{% endcache %}\nVous devez utiliser la fonction cache_key pour \u00eatre s\u00fbr d'avoir une cl\u00e9 de cache unique pour chaque contenu que vous souhaitez mettre en cache.\nLes fragments de cache sont persistants, donc si la cl\u00e9 de cache est trop g\u00e9n\u00e9rique, vous risquez de vous retrouver avec un mauvais contenu affich\u00e9.\nPour vider uniquement le cache des fragments, vous pouvez utiliser la commande suivante\u00a0:\nphp cecil.phar cache:clear:templates --fragments",
    "href": "fr\/documentation\/templates\/cache\/#fragments-de-cache"  },
  {
    "id": "fr\/documentation\/templates\/cache#desactiver-le-cache",
    "page": "Templates > Cache",
    "title": "D\u00e9sactiver le cache",
    "description": "Vous pouvez d\u00e9sactiver le cache avec la configuration.",
    "content": "Vous pouvez d\u00e9sactiver le cache avec la configuration.\nLa d\u00e9sactivation du cache peut ralentir le processus de g\u00e9n\u00e9ration, ce n'est donc pas recommand\u00e9.\nLors du d\u00e9veloppement local, si vous devez vider le cache avant chaque g\u00e9n\u00e9ration, vous pouvez utiliser l'option suivante\u00a0:\nphp cecil.phar serve --clear-cache          # clear all caches\nphp cecil.phar serve --clear-cache=<regex>  # clear cache for cache key matches with the regular expression <regex>\nExemple:\nphp cecil.phar serve --clear-cache=css  # clear cache for all CSS files",
    "href": "fr\/documentation\/templates\/cache\/#desactiver-le-cache"  },
  {
    "id": "fr\/documentation\/configuration\/layouts",
    "page": "Configuration > Layouts",
    "title": "Layouts",
    "description": "Options des templates.",
    "content": "Options des templates.",
    "href": "fr\/documentation\/configuration\/layouts\/"  },
  {
    "id": "fr\/documentation\/configuration\/layouts#layouts-dir",
    "page": "Configuration > Layouts",
    "title": "layouts.dir",
    "description": "R\u00e9pertoire source des templates (layouts par d\u00e9faut).",
    "content": "R\u00e9pertoire source des templates (layouts par d\u00e9faut).\nlayouts:\n  dir: layouts",
    "href": "fr\/documentation\/configuration\/layouts\/#layouts-dir"  },
  {
    "id": "fr\/documentation\/configuration\/layouts#layouts-autoescape",
    "page": "Configuration > Layouts",
    "title": "layouts.autoescape",
    "description": "Surcharge l\u2019option Twig autoescape (false par d\u00e9faut).",
    "content": "Surcharge l\u2019option Twig autoescape (false par d\u00e9faut).\nSi la valeur est null, Cecil applique une strat\u00e9gie bas\u00e9e sur l\u2019extension du nom de template :\n*.js.twig -> js\n*.css.twig -> css\n*.html.twig et *.twig -> html\ntoute autre extension -> false\nlayouts:\n  autoescape: false  # d\u00e9sactive l\u2019\u00e9chappement automatique (par d\u00e9faut)\n  #autoescape: null  # utilise la strat\u00e9gie automatique Cecil selon l\u2019extension du template\n  #autoescape: html\n  #autoescape: js",
    "href": "fr\/documentation\/configuration\/layouts\/#layouts-autoescape"  },
  {
    "id": "fr\/documentation\/configuration\/layouts#layouts-images",
    "page": "Configuration > Layouts",
    "title": "layouts.images",
    "description": "Options de gestion des images.",
    "content": "Options de gestion des images.\nlayouts:\n  images:\n    formats: []       # utilis\u00e9 par la fonction `html` : ajoute des formats d\u2019image alternatifs comme `source` (ex. `[avif, webp]`, tableau vide par d\u00e9faut)\n    responsive: false # utilis\u00e9 par la fonction `html` : ajoute des images responsives ('width' ou 'density', `false` par d\u00e9faut)\n    placeholder: ''   # utilis\u00e9 par la fonction `html` : remplit l\u2019arri\u00e8re-plan de l\u2019image avant son chargement (`color` ou `lqip`, d\u00e9sactiv\u00e9 par d\u00e9faut)\n    dark_suffix: ''   # suffixe de l\u2019image variante sombre (ex. `.dark`), d\u00e9sactiv\u00e9 par d\u00e9faut\n    mobile_suffix: '' # suffixe de l\u2019image variante mobile (ex. `.mobile`), d\u00e9sactiv\u00e9 par d\u00e9faut\n    mobile_media_query: '(max-width: 767px)' # media query de la `<source>` de la variante mobile",
    "href": "fr\/documentation\/configuration\/layouts\/#layouts-images"  },
  {
    "id": "fr\/documentation\/configuration\/layouts#layouts-translations",
    "page": "Configuration > Layouts",
    "title": "layouts.translations",
    "description": "Options de gestion des traductions.",
    "content": "Options de gestion des traductions.\nlayouts:\n  translations:\n    dir: translations # r\u00e9pertoire source des traductions (`translations` par d\u00e9faut)\n    formats:          # formats de traduction pris en charge\n      yaml:\n        loader: Symfony\\Component\\Translation\\Loader\\YamlFileLoader\n        ext: [yml, yaml]\n      mo:\n        loader: Symfony\\Component\\Translation\\Loader\\MoFileLoader\n        ext: [mo]\nChaque format de traduction d\u00e9finit :\nloader : classe du chargeur de traduction Symfony\next : une ou plusieurs extensions de fichier associ\u00e9es \u00e0 ce format",
    "href": "fr\/documentation\/configuration\/layouts\/#layouts-translations"  },
  {
    "id": "fr\/documentation\/configuration\/layouts#layouts-components",
    "page": "Configuration > Layouts",
    "title": "layouts.components",
    "description": "Options des composants de template.",
    "content": "Options des composants de template.\nlayouts:\n  components:\n    dir: components # r\u00e9pertoire source des composants (`components` par d\u00e9faut)\n    ext: twig       # extension des fichiers de composants (`twig` par d\u00e9faut)",
    "href": "fr\/documentation\/configuration\/layouts\/#layouts-components"  },
  {
    "id": "fr\/documentation\/configuration\/layouts#layouts-sections",
    "page": "Configuration > Layouts",
    "title": "layouts.sections",
    "description": "Associe une section aux layouts d\u2019une autre section : le nom associ\u00e9 est utilis\u00e9 \u00e0 la place de <section> par les r\u00e8gles de recherche de la section et de ses pages.",
    "content": "Associe une section aux layouts d\u2019une autre section : le nom associ\u00e9 est utilis\u00e9 \u00e0 la place de <section> par les r\u00e8gles de recherche de la section et de ses pages.\nlayouts:\n  sections:\n    news: blog # la section \u00ab news \u00bb est rendue avec `blog\/list.html.twig` et ses pages avec `blog\/page.html.twig`\nUne sous-section se replie d\u00e9j\u00e0 sur les layouts de ses sections parentes : aucune association n\u2019est n\u00e9cessaire pour cela.",
    "href": "fr\/documentation\/configuration\/layouts\/#layouts-sections"  },
  {
    "id": "fr\/documentation\/deploy",
    "page": " > D\u00e9ployer",
    "title": "D\u00e9ployer",
    "description": "Par d\u00e9faut, votre site statique est g\u00e9n\u00e9r\u00e9 dans le r\u00e9pertoire _site et peut \u00eatre d\u00e9ploy\u00e9 tel quel.",
    "content": "Par d\u00e9faut, votre site statique est g\u00e9n\u00e9r\u00e9 dans le r\u00e9pertoire _site et peut \u00eatre d\u00e9ploy\u00e9 tel quel.\nVous trouverez ci-dessous quelques recettes pour automatiser la g\u00e9n\u00e9ration et\/ou le d\u00e9ploiement d\u2019un site statique.",
    "href": "fr\/documentation\/deployer\/"  },
  {
    "id": "fr\/documentation\/templates\/extend#fonctions-et-filtres",
    "page": "Templates > \u00c9tendre",
    "title": "Fonctions et filtres",
    "description": "Vous pouvez ajouter des fonctions et des filtres personnalis\u00e9s avec une extension Twig.",
    "content": "Vous pouvez ajouter des fonctions et des filtres personnalis\u00e9s avec une extension Twig.",
    "href": "fr\/documentation\/templates\/etendre\/#fonctions-et-filtres"  },
  {
    "id": "fr\/documentation\/templates\/extend#theme",
    "page": "Templates > \u00c9tendre",
    "title": "Th\u00e8me",
    "description": "C'est simple de construire un th\u00e8me, il suffit de cr\u00e9er un dossier <theme> avec la structure suivante (comme un site web mais sans pages) :",
    "content": "C'est simple de construire un th\u00e8me, il suffit de cr\u00e9er un dossier <theme> avec la structure suivante (comme un site web mais sans pages) :\n<mywebsite>\n\u2514\u2500 themes\n   \u2514\u2500 <theme>\n      \u251c\u2500 config.yml\n      \u251c\u2500 assets\n      \u251c\u2500 layouts\n      \u251c\u2500 static\n      \u2514\u2500 translations",
    "href": "fr\/documentation\/templates\/etendre\/#theme"  },
  {
    "id": "fr\/documentation\/configuration\/output",
    "page": "Configuration > Sortie",
    "title": "Sortie",
    "description": "D\u00e9finit o\u00f9 et dans quel format les pages sont rendues.",
    "content": "D\u00e9finit o\u00f9 et dans quel format les pages sont rendues.",
    "href": "fr\/documentation\/configuration\/sortie\/"  },
  {
    "id": "fr\/documentation\/configuration\/output#output-dir",
    "page": "Configuration > Sortie",
    "title": "output.dir",
    "description": "R\u00e9pertoire o\u00f9 les fichiers de pages rendues sont enregistr\u00e9s (_site par d\u00e9faut).",
    "content": "R\u00e9pertoire o\u00f9 les fichiers de pages rendues sont enregistr\u00e9s (_site par d\u00e9faut).\noutput:\n  dir: _site",
    "href": "fr\/documentation\/configuration\/sortie\/#output-dir"  },
  {
    "id": "fr\/documentation\/configuration\/output#output-formats",
    "page": "Configuration > Sortie",
    "title": "output.formats",
    "description": "Liste de d\u00e9finition des formats de sortie, utilis\u00e9s pour rendre les pages (par ex. HTML, Atom, RSS, JSON, XML, etc.).",
    "content": "Liste de d\u00e9finition des formats de sortie, utilis\u00e9s pour rendre les pages (par ex. HTML, Atom, RSS, JSON, XML, etc.).\noutput:\n  formats:\n    - name: <name>            # nom du format, par ex. `html` (requis)\n      mediatype: <media type> # type MIME, ex. `text\/html` (facultatif)\n      subpath: <sub path>     # sous-chemin, ex. `amp` dans `path\/amp\/index.html` (facultatif)\n      filename: <file name>   # nom du fichier, ex. `index` dans `path\/index.html` (facultatif)\n      extension: <extension>  # extension du fichier, ex. `html` dans `path\/index.html` (requis)\n      exclude: [<variable>]   # n\u2019applique pas ce format aux pages identifi\u00e9es par les variables list\u00e9es, ex. `[redirect, paginated]` (facultatif)\nCes formats sont utilis\u00e9s dans la configuration output.pagetypeformats et dans la variable de page output.",
    "href": "fr\/documentation\/configuration\/sortie\/#output-formats"  },
  {
    "id": "fr\/documentation\/configuration\/output#formats-par-defaut",
    "page": "Configuration > Sortie",
    "title": "Formats par d\u00e9faut",
    "description": "Cecil fournit quelques formats par d\u00e9faut, qui peuvent \u00eatre surcharg\u00e9s dans le fichier de configuration : html (par d\u00e9faut), atom, rss, json, xml, txt, amp, js, webmanifest, xsl, jsonfeed, iframe, oembed.",
    "content": "Cecil fournit quelques formats par d\u00e9faut, qui peuvent \u00eatre surcharg\u00e9s dans le fichier de configuration : html (par d\u00e9faut), atom, rss, json, xml, txt, amp, js, webmanifest, xsl, jsonfeed, iframe, oembed.",
    "href": "fr\/documentation\/configuration\/sortie\/#formats-par-defaut"  },
  {
    "id": "fr\/documentation\/configuration\/output#output-pagetypeformats",
    "page": "Configuration > Sortie",
    "title": "output.pagetypeformats",
    "description": "Il n\u2019est pas n\u00e9cessaire de d\u00e9finir la variable output pour chaque page, car Cecil applique automatiquement les formats d\u00e9finis pour chaque type de page (homepage, page, section, vocabulary et term).",
    "content": "Il n\u2019est pas n\u00e9cessaire de d\u00e9finir la variable output pour chaque page, car Cecil applique automatiquement les formats d\u00e9finis pour chaque type de page (homepage, page, section, vocabulary et term).\noutput:\n  pagetypeformats:\n    page: [<format>]\n    homepage: [<format>]\n    section: [<format>]\n    vocabulary: [<format>]\n    term: [<format>]\nPlusieurs formats peuvent \u00eatre d\u00e9finis pour un m\u00eame type de page. Par exemple, le type de page section peut \u00eatre rendu automatiquement en HTML et Atom :\noutput:\n  pagetypeformats:\n    section: [html, atom]\nPour rendre une page, Cecil recherche un template nomm\u00e9 <layout>.<format>.twig (ex. page.html.twig).",
    "href": "fr\/documentation\/configuration\/sortie\/#output-pagetypeformats"  },
  {
    "id": "fr\/documentation\/configuration\/output#exemple-de-output",
    "page": "Configuration > Sortie",
    "title": "exemple de output",
    "description": "",
    "content": "output:\n  dir: _site\n  formats:\n    - name: html\n      mediatype: text\/html\n      filename: index\n      extension: html\n    - name: atom\n      mediatype: application\/xml\n      filename: atom\n      extension: xml\n      exclude: [redirect, paginated]\n  pagetypeformats:\n    page: [html]\n    homepage: [html, atom]\n    section: [html, atom]\n    vocabulary: [html]\n    term: [html, atom]",
    "href": "fr\/documentation\/configuration\/sortie\/#exemple-de-output"  },
  {
    "id": "fr\/documentation\/configuration\/output#post-process",
    "page": "Configuration > Sortie",
    "title": "Post-process",
    "description": "Vous pouvez \u00e9tendre les capacit\u00e9s de Cecil avec un post-processeur de sortie pour modifier les fichiers de sortie apr\u00e8s leur g\u00e9n\u00e9ration.",
    "content": "Vous pouvez \u00e9tendre les capacit\u00e9s de Cecil avec un post-processeur de sortie pour modifier les fichiers de sortie apr\u00e8s leur g\u00e9n\u00e9ration.",
    "href": "fr\/documentation\/configuration\/sortie\/#post-process"  },
  {
    "id": "fr\/documentation\/developers",
    "page": " > D\u00e9veloppeurs",
    "title": "D\u00e9veloppeurs",
    "description": "Pour les d\u00e9veloppeurs PHP : \u00e9tendez Cecil, utilisez-le comme biblioth\u00e8que et explorez son fonctionnement interne et la r\u00e9f\u00e9rence de l\u2019API.",
    "content": "Pour les d\u00e9veloppeurs PHP : \u00e9tendez Cecil, utilisez-le comme biblioth\u00e8que et explorez son fonctionnement interne et la r\u00e9f\u00e9rence de l\u2019API.",
    "href": "fr\/documentation\/developpeurs\/"  },
  {
    "id": "fr\/documentation\/configuration\/cache",
    "page": "Configuration > Cache",
    "title": "Cache",
    "description": "Options de cache.",
    "content": "Options de cache.",
    "href": "fr\/documentation\/configuration\/cache\/"  },
  {
    "id": "fr\/documentation\/configuration\/cache#cache-enabled",
    "page": "Configuration > Cache",
    "title": "cache.enabled",
    "description": "Le cache est activ\u00e9 par d\u00e9faut (true), mais vous pouvez le d\u00e9sactiver avec :",
    "content": "Le cache est activ\u00e9 par d\u00e9faut (true), mais vous pouvez le d\u00e9sactiver avec :\ncache:\n  enabled: false\nIl n\u2019est pas recommand\u00e9 de d\u00e9sactiver le cache pour des raisons de performance.",
    "href": "fr\/documentation\/configuration\/cache\/#cache-enabled"  },
  {
    "id": "fr\/documentation\/configuration\/cache#cache-dir",
    "page": "Configuration > Cache",
    "title": "cache.dir",
    "description": "R\u00e9pertoire o\u00f9 les fichiers de cache sont stock\u00e9s (.cache par d\u00e9faut).",
    "content": "R\u00e9pertoire o\u00f9 les fichiers de cache sont stock\u00e9s (.cache par d\u00e9faut).\ncache:\n  dir: '.cache'\nLe r\u00e9pertoire de cache est relatif au r\u00e9pertoire du site, mais vous pouvez utiliser un chemin absolu : cela peut \u00eatre utile pour stocker le cache dans un r\u00e9pertoire partag\u00e9.",
    "href": "fr\/documentation\/configuration\/cache\/#cache-dir"  },
  {
    "id": "fr\/documentation\/configuration\/cache#cache-assets",
    "page": "Configuration > Cache",
    "title": "cache.assets",
    "description": "Options du cache des ressources.",
    "content": "Options du cache des ressources.",
    "href": "fr\/documentation\/configuration\/cache\/#cache-assets"  },
  {
    "id": "fr\/documentation\/configuration\/cache#cache-assets-ttl",
    "page": "Configuration > Cache",
    "title": "cache.assets.ttl",
    "description": "Temps de vie du cache des ressources en secondes (null par d\u00e9faut = aucune expiration).",
    "content": "Temps de vie du cache des ressources en secondes (null par d\u00e9faut = aucune expiration).\ncache:\n  assets:\n    ttl: ~",
    "href": "fr\/documentation\/configuration\/cache\/#cache-assets-ttl"  },
  {
    "id": "fr\/documentation\/configuration\/cache#cache-assets-remote-ttl",
    "page": "Configuration > Cache",
    "title": "cache.assets.remote.ttl",
    "description": "Temps de vie du cache des ressources distantes en secondes (7 jours par d\u00e9faut).",
    "content": "Temps de vie du cache des ressources distantes en secondes (7 jours par d\u00e9faut).\ncache:\n  assets:\n    remotes:\n      ttl: 604800 # 7 jours",
    "href": "fr\/documentation\/configuration\/cache\/#cache-assets-remote-ttl"  },
  {
    "id": "fr\/documentation\/configuration\/cache#cache-templates",
    "page": "Configuration > Cache",
    "title": "cache.templates",
    "description": "D\u00e9sactive le cache des templates avec false (true par d\u00e9faut).",
    "content": "D\u00e9sactive le cache des templates avec false (true par d\u00e9faut).\ncache:\n  templates: true\nVoir la documentation du cache des templates pour plus de d\u00e9tails.",
    "href": "fr\/documentation\/configuration\/cache\/#cache-templates"  },
  {
    "id": "fr\/documentation\/configuration\/cache#cache-translations",
    "page": "Configuration > Cache",
    "title": "cache.translations",
    "description": "D\u00e9sactive le cache des traductions avec false (true par d\u00e9faut).",
    "content": "D\u00e9sactive le cache des traductions avec false (true par d\u00e9faut).\ncache:\n  translations: true",
    "href": "fr\/documentation\/configuration\/cache\/#cache-translations"  },
  {
    "id": "fr\/documentation\/configuration\/server#server-headers",
    "page": "Configuration > Serveur et optimisation",
    "title": "server.headers",
    "description": "Vous pouvez d\u00e9finir des en-t\u00eates HTTP personnalis\u00e9s, utilis\u00e9s par le serveur d\u2019aper\u00e7u local.",
    "content": "Vous pouvez d\u00e9finir des en-t\u00eates HTTP personnalis\u00e9s, utilis\u00e9s par le serveur d\u2019aper\u00e7u local.\nDepuis la version 8.38.0, l\u2019option headers a \u00e9t\u00e9 d\u00e9plac\u00e9e dans la section server.headers.\nserver:\n  headers:\n    - path: <path> # chemin relatif, pr\u00e9fix\u00e9 par un slash. Prend en charge le joker \"*\".\n      headers:\n        - key: <key>\n          value: \"<value>\"\nC\u2019est utile pour tester une Content Security Policy ou Cache-Control personnalis\u00e9e.\nExemple :\nserver:\n  headers:\n    - path: \/*\n      headers:\n        - key: X-Frame-Options\n          value: \"SAMEORIGIN\"\n        - key: X-XSS-Protection\n          value: \"1; mode=block\"\n        - key: X-Content-Type-Options\n          value: \"nosniff\"\n        - key: Content-Security-Policy\n          value: \"default-src 'self'; object-src 'self'; img-src 'self'\"\n        - key: Strict-Transport-Security\n          value: \"max-age=31536000; includeSubDomains; preload\"\n    - path: \/assets\/*\n      headers:\n        - key: Cache-Control\n          value: \"public, max-age=31536000\"\n    - path: \/foo.html\n      headers:\n        - key: Foo\n          value: \"bar\"",
    "href": "fr\/documentation\/configuration\/serveur\/#server-headers"  },
  {
    "id": "fr\/documentation\/configuration\/server#optimisation",
    "page": "Configuration > Serveur et optimisation",
    "title": "Optimisation",
    "description": "Les options d\u2019optimisation permettent d\u2019activer la compression des fichiers de sortie : HTML, CSS, JavaScript et images.",
    "content": "Les options d\u2019optimisation permettent d\u2019activer la compression des fichiers de sortie : HTML, CSS, JavaScript et images.\noptimize:\n  enabled: false     # active l\u2019optimisation des fichiers (`false` par d\u00e9faut)\n  html:\n    enabled: true    # active l\u2019optimisation des fichiers HTML\n    ext: [html, htm]   # extensions de fichiers prises en charge\n  css:\n    enabled: true    # active l\u2019optimisation des fichiers CSS\n    ext: [css]         # extensions de fichiers prises en charge\n  js:\n    enabled: true    # active l\u2019optimisation des fichiers JavaScript\n    ext: [js]          # extensions de fichiers prises en charge\n  images:\n    enabled: true    # active l\u2019optimisation des fichiers images\n    ext: [jpeg, jpg, png, gif, webp, svg, avif] # extensions de fichiers prises en charge\nCette option est d\u00e9sactiv\u00e9e par d\u00e9faut et peut \u00eatre activ\u00e9e via :\noptimize: true\nUne fois l\u2019option globale activ\u00e9e, les 4 types de fichiers seront trait\u00e9s.\nIl est possible de d\u00e9sactiver chacun d\u2019eux via enabled: false et de modifier l\u2019extension des fichiers trait\u00e9s via ext.\nIl est \u00e9galement possible d\u2019activer cette option via la CLI lors de l\u2019utilisation des commandes \"build\" et \"serve\" avec l\u2019option --optimize.\nLe compresseur d\u2019images utilisera les binaires suivants s\u2019ils sont pr\u00e9sents sur le syst\u00e8me : JpegOptim, Optipng, Pngquant 2, SVGO, Gifsicle, cwebp et avifenc.",
    "href": "fr\/documentation\/configuration\/serveur\/#optimisation"  },
  {
    "id": "fr\/documentation\/configuration\/override#variables-d-environnement",
    "page": "Configuration > Surcharge de configuration",
    "title": "Variables d\u2019environnement",
    "description": "La configuration peut \u00eatre surcharg\u00e9e via des variables d\u2019environnement.",
    "content": "La configuration peut \u00eatre surcharg\u00e9e via des variables d\u2019environnement.\nAu d\u00e9marrage, Cecil essaie \u00e9galement de charger un fichier .env depuis le chemin du site courant (le r\u00e9pertoire de travail actuel, ou l\u2019argument <path> s\u2019il est fourni).\nSi le fichier .env n\u2019existe pas, Cecil continue normalement.\nLes variables d\u00e9j\u00e0 d\u00e9finies par le shell\/syst\u00e8me sont conserv\u00e9es.\nChaque nom de variable d\u2019environnement doit \u00eatre pr\u00e9fix\u00e9 par CECIL_ et la cl\u00e9 de configuration doit \u00eatre en majuscules.\nPar exemple, la commande suivante d\u00e9finit le baseurl du site :\nexport CECIL_BASEURL=\"https:\/\/example.com\/\"\nVous pouvez stocker la m\u00eame valeur dans un fichier .env \u00e0 la racine du projet :\nCECIL_BASEURL=\"https:\/\/example.com\/\"\nCECIL_TITLE=\"Mon site Cecil\"",
    "href": "fr\/documentation\/configuration\/surcharge\/#variables-d-environnement"  },
  {
    "id": "fr\/documentation\/configuration\/override#option-cli",
    "page": "Configuration > Surcharge de configuration",
    "title": "Option CLI",
    "description": "Vous pouvez combiner plusieurs fichiers de configuration avec l\u2019option --config (priorit\u00e9 de gauche \u00e0 droite) :",
    "content": "Vous pouvez combiner plusieurs fichiers de configuration avec l\u2019option --config (priorit\u00e9 de gauche \u00e0 droite) :\nphp cecil.phar --config config-1.yml,config-2.yml",
    "href": "fr\/documentation\/configuration\/surcharge\/#option-cli"  }
]