📘 Gestion des métadonnées dans des pages Markdown

Introduction

Pour un site basé sur des fichiers Markdown, il est souvent nécessaire d'ajouter des informations complémentaires à chaque page :

Ces informations sont appelées métadonnées.

Dans un CMS utilisant uniquement des fichiers (/pages/*.md) sans base de données, plusieurs solutions sont possibles.


1. Solution classique : commentaire HTML avec format INI

Une première méthode consiste à placer les métadonnées dans un commentaire HTML au début du fichier Markdown.

Exemple :

<!--
titre=Conseil municipal
date=2026-08-02
categorie=Vie municipale
ordre=10
image=conseil.jpg
-->

Puis le contenu Markdown :

# Conseil municipal

La prochaine réunion aura lieu...

Avantages

✅ Très simple à comprendre
✅ Facile à modifier
✅ Lisible par une personne non spécialisée
✅ Facile à extraire avec PHP

Inconvénients

❌ Peu structuré
❌ Difficile à faire évoluer vers des données complexes
❌ Mélange commentaire HTML et données


2. Solution avec une balise <script>

Une autre possibilité consiste à utiliser une balise HTML <script> comme conteneur de données.

La balise <script> ne sert pas uniquement à JavaScript.

Si son attribut type indique un contenu non exécutable, elle devient simplement une zone de stockage.


3. Utilisation de <script type="text/plain">

Cette solution permet de conserver le format INI tout en utilisant une structure HTML propre.

Exemple :

<script type="text/plain" id="metadata">
titre=Conseil municipal
date=2026-08-02
categorie=Vie municipale
ordre=10
image=conseil.jpg
visible=true
</script>

Le contenu Markdown suit normalement :

# Conseil municipal

La prochaine réunion aura lieu...

Lecture avec PHP

Le principe est :

  1. Lire le fichier Markdown.
  2. Extraire le contenu de la balise <script>.
  3. Transformer le texte INI en tableau PHP.

Exemple :

function lireMetadata($fichier)
{
    $contenu=file_get_contents($fichier);

    preg_match(
        '#<script type="text/plain" id="metadata">(.*?)</script>#s',
        $contenu,
        $resultat
    );

    if(empty($resultat[1]))
        return [];

    return parse_ini_string(trim($resultat[1]));
}

Utilisation :

$meta=lireMetadata("pages/conseil.md");

echo $meta['titre'];
echo $meta['date'];

4. Organisation avec des sections INI

Le format INI permet également d'organiser les données en groupes.

Exemple :

[page]
titre=Conseil municipal
date=2026-08-02
ordre=10

[menu]
categorie=Vie municipale
icone=🏛️

[seo]
description=Informations sur le conseil municipal
robots=index

Lecture PHP :

$meta=parse_ini_string($texte,true);

Le deuxième paramètre true demande à PHP de conserver les sections.

Résultat :

[
    "page"=>[
        "titre"=>"Conseil municipal",
        "date"=>"2026-08-02"
    ],
    "menu"=>[
        "categorie"=>"Vie municipale"
    ]
]

5. Solution avec JSON

Une autre possibilité est d'utiliser :

<script type="application/json" id="metadata">
{
    "titre":"Conseil municipal",
    "date":"2026-08-02",
    "categorie":"Vie municipale"
}
</script>

Lecture PHP :

preg_match(
    '#<script type="application/json" id="metadata">(.*?)</script>#s',
    $contenu,
    $resultat
);

$meta=json_decode(
    trim($resultat[1]),
    true
);

Comparaison INI et JSON

Critère INI JSON
Facilité d'écriture ⭐⭐⭐⭐⭐ ⭐⭐⭐
Lecture par un débutant ⭐⭐⭐⭐⭐ ⭐⭐⭐
Lecture PHP ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
Données complexes ⭐⭐⭐ ⭐⭐⭐⭐⭐
Listes et tableaux Limité Très bon
Risque d'erreur Faible Plus élevé

Pourquoi choisir INI dans un site communal ?

Dans un site de mairie :

Exemple adapté :

titre=Travaux de voirie
date=2026-08-02
categorie=Actualités
image=travaux.jpg
ordre=20
visible=true

Cette écriture est immédiatement compréhensible.


Exemple complet d'une page Markdown

Fichier :

pages/actualites/travaux.md

Contenu :

<script type="text/plain" id="metadata">
titre=Travaux de voirie
date=2026-08-02
categorie=Actualités
ordre=20
image=travaux.jpg
visible=true
</script>

Puis :

# Travaux de voirie

Des travaux auront lieu dans la commune
à partir du mois de septembre.

Intégration dans un CMS PHP

Une fonction unique peut gérer toutes les pages :

function lireMetadata($fichier)
{
    $texte=file_get_contents($fichier);

    preg_match(
        '#<script type="text/plain" id="metadata">(.*?)</script>#s',
        $texte,
        $m
    );

    return empty($m[1])
        ? []
        : parse_ini_string(trim($m[1]),true);
}

Ensuite le CMS peut :


Recommandation finale

Pour un CMS léger basé sur :

la solution recommandée est :

🥇 INI dans une balise <script type="text/plain">

Avantages :

✅ simple à écrire
✅ simple à modifier
✅ très lisible
✅ lecture PHP native avec parse_ini_string()
✅ compatible avec Markdown
✅ évolutif grâce aux sections INI

Le JSON reste une excellente solution technique, mais il est surtout adapté aux applications où les données sont plus complexes et manipulées principalement par des programmes.