Aller au contenu
openplate

L'application

Pages de contenu

Les pages légales sous forme de fichiers markdown que tu montes (CONTENT_DIR) : le dossier, le format des fichiers, ce qui est refusé, et les sections nommées des deux pages de boutons légaux

Cette page est traduite automatiquement à partir de la documentation en anglais.

openplate charge les pages légales depuis des fichiers markdown que tu montes dans le conteneur. Le dépôt ne contient aucun texte légal en propre. Tu rédiges les conditions, la politique de confidentialité, les mentions légales, et les pages des deux boutons légaux. Ils décrivent ton instance et te désignent comme exploitant.

L'activer

Définis CONTENT_DIR vers un dossier que l'application peut lire :

sh
CONTENT_DIR=/srv/openplate-content

Avec un conteneur, monte le dossier en lecture seule et fais pointer la variable vers le point de montage :

yaml
services:
  openplate:
    environment:
      CONTENT_DIR: /content
    volumes:
      - ./content:/content:ro

Une valeur qui ne désigne aucun dossier bloque le démarrage. Un montage échoué se voit immédiatement. L'application ne peut pas démarrer et ressembler à une instance dépourvue de pages légales.

Quand CONTENT_DIR n'est pas défini

C'est la valeur par défaut, et elle convient à une instance familiale qui ne vend rien.

  • Chaque route de contenu renvoie une 404 : /terms, /privacy, /privacy/website, /imprint, /withdrawal, /kuendigung, /kuendigung/bestaetigt, /widerrufen et /widerrufen/bestaetigt.
  • Le pied de page public affiche seulement Source, Licence et Préférences. Les cinq liens légaux (Confidentialité, Conditions, Mentions légales et les deux boutons légaux) ne s'affichent pas.
  • Paramètres, À propos ne comporte pas de groupe Mentions légales. Avec le dossier monté, cette page liste les cinq mêmes liens sous un titre Mentions légales, de sorte qu'une personne connectée, qui ne voit aucun pied de page, accède quand même aux mentions légales.
  • La note qu'un visiteur non connecté voit sur une page personnelle renvoie vers l'accueil et la connexion, sans lien vers les mentions légales ni la confidentialité.
  • Le formulaire d'infolettre, si tu l'as activé, supprime sa ligne sur la confidentialité.

Les liens réapparaissent dès que le dossier contient un imprint.md, dans la langue du lecteur ou en anglais. Les mentions légales servent de contrôle, car la loi allemande les impose à toute instance qui publie l'une des autres.

Le dossier

<CONTENT_DIR>/
  en/
    terms.md
    privacy.md
    imprint.md
    ...
  de/
    terms.md
    ...

Un dossier par langue : en, de, fr, it, es ou tr. Un fichier par page, nommé d'après son slug :

SlugChemin dans l'application
terms/terms
privacy/privacy
privacy-website/privacy/website
imprint/imprint
withdrawal/withdrawal
kuendigung/kuendigung
kuendigung-bestaetigt/kuendigung/bestaetigt
widerrufen/widerrufen
widerrufen-bestaetigt/widerrufen/bestaetigt

Une page manquante dans la langue du lecteur est servie en anglais. Une page absente aussi en anglais renvoie une 404. L'application lit uniquement ces slugs. Elle ne construit jamais un chemin à partir d'une URL.

L'application lit chaque fichier à la demande et garde la page analysée en mémoire. Elle relit le fichier dès que sa date de modification ou sa taille change. Une modification d'un fichier monté s'affiche dès la requête suivante, sans redémarrage.

Le format de fichier

UTF-8, fins de ligne LF, aucun marqueur d'ordre des octets. Chaque fichier commence exactement par ces métadonnées initiales :

---
title: Terms of service
updated: 2026-09-21
---

title est le titre de la page. updated est une date calendaire, et l'application l'affiche sous le titre sous la forme « Dernière mise à jour », dans la langue du lecteur. Ne répète ni l'un ni l'autre dans le corps du texte.

Le corps du texte utilise ce sous-ensemble et rien d'autre :

  • Titres ## et ###. # correspond au titre de la page et ne s'écrit jamais.
  • Paragraphes, séparés par une ligne vide.
  • Listes avec - ou 1. , à un seul niveau, sans indentation.
  • **strong** et *emphasis*.
  • Liens [text](target). La cible est un chemin dans l'application (/imprint), https://, mailto: ou tel:. Un chemin dans l'application s'ouvre sans rechargement.
  • Un saut de ligne forcé : une barre oblique inverse comme dernier caractère d'une ligne, suivie de la ligne suivante du même paragraphe. Utilise-le pour une adresse postale.
  • Une liste de définitions : une ligne de terme suivie d'une ou plusieurs lignes : definition, sans ligne vide entre les entrées.
  • Un échappement : une barre oblique inverse devant \, *, [ ou ] rend le caractère littéral.

Les paragraphes situés avant le premier titre constituent le chapeau de la page et s'affichent en plus grand.

Ce qui est refusé

Tout code HTML brut (un < suivi d'une lettre, /, ! ou ?), les références de caractères HTML comme &amp;, les images, les tableaux, le code, les blocs de citation, les titres # ou ####, les listes imbriquées ou indentées, ainsi que tout espace réservé {{.

Un fichier qui ne respecte pas le format est refusé, non réparé. L'application consigne chaque problème avec son numéro de ligne, une seule fois par version du fichier. La page renvoie un code 503 avec l'écran d'erreur neutre. Une page juridique qui supprimerait silencieusement un tableau, ou qui afficherait une balise sous forme de texte, publierait un document que personne n'a rédigé. Corrige le fichier, et la requête suivante l'affichera.

Sections nommées

Deux pages conservent un formulaire dans le code de l'application : /kuendigung (résilier un contrat) et /widerrufen (se rétracter d'un contrat). Leurs pages de confirmation conservent le reçu dans le code. Les libellés du formulaire, les boutons, les messages de validation et les lignes du reçu font partie intégrante de l'application. Le texte qui les entoure provient du fichier. Une section nommée contient chaque élément que l'application place autour du formulaire :

:::section unavailable
Text of the section, in the same subset.
:::

Chacune de ces pages doit contenir exactement les sections ci-dessous, une seule fois chacune. Une section manquante ou en trop est refusée comme n'importe quelle autre erreur.

SlugSectionEmplacement où l'application l'affiche
kuendigung(corps)Le chapeau, au-dessus du formulaire de résiliation.
kuendigungunavailableÀ la place du formulaire lorsque CORE_URL n'est pas défini, et sous le bouton d'envoi lorsqu'une soumission ne parvient pas à joindre le service de déclaration.
kuendigung-bestaetigt(corps)Généralement vide.
kuendigung-bestaetigtmail-noticeAprès les lignes du reçu, avant le bouton d'impression.
widerrufen(corps)Le chapeau, au-dessus du formulaire de rétractation.
widerrufenunavailableComme pour kuendigung.
widerrufen-bestaetigt(corps)Généralement vide.
widerrufen-bestaetigtmail-noticeComme pour kuendigung-bestaetigt.

Toutes les autres pages ne comportent aucune section : leur corps entier constitue la page.

Le titre de kuendigung correspond à l'intitulé exigé par la loi allemande pour cette page, et il en va de même pour widerrufen. Le pied de page et les boutons d'envoi de l'application portent eux-mêmes les libellés de bouton prévus par la loi.

Où les instances d'openplate récupèrent leurs fichiers

Les instances hébergées montent des fichiers conservés dans un dépôt privé, à raison d'une arborescence par instance. Ce dépôt valide chaque fichier par rapport à ce format avant son déploiement. Une page refusée est détectée avant même d'atteindre un serveur.

Modifier cette page sur GitHub