📘 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 :
- titre ;
- date ;
- catégorie ;
- ordre dans un menu ;
- image associée ;
- informations SEO ;
- paramètres d'affichage.
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 :
- Lire le fichier Markdown.
- Extraire le contenu de la balise
<script>. - 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 :
- les pages sont souvent éditées par plusieurs personnes ;
- les utilisateurs ne sont pas forcément informaticiens ;
- la simplicité est importante ;
- les données restent généralement simples.
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 :
- générer les menus ;
- classer les pages par catégorie ;
- afficher les dates ;
- créer des listes d'actualités ;
- gérer les images ;
- produire automatiquement des pages HTML.
Recommandation finale
Pour un CMS léger basé sur :
- PHP ;
- fichiers Markdown ;
- absence de base de données ;
- édition simple par des utilisateurs ;
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.