Le 2 novembre 2007, par Thomas Houssin,
Cet article est une version simplifiée de la contribution initiale : il est conçu pour fournir un glossaire simple, permettant une reconnaissance des mots par expression régulière (ainsi insensibilité à la casse, permet de sélectionner une même définition pour des termes différents, etc). La définition d’un mot s’affiche lorsque l’on passe la souris au dessus, ou en lien hypertexte si la définition est trop longue. Il est intéressant de noter que le remplacement du terme n’a pas lieu si celui-ci se trouve dans un tag HTML, pour éviter par exemple de briser un lien hypertexte.
Pour un exemple d’article utilisant ce glossaire, consultez cet article.
Créez tout d’abord une rubrique glossaire, destinée à contenir les définitions. Créer les mots clés glossaire et glossaire_un : le premier indique que vous souhaitez afficher les définitions de tous les termes disponibles, le second indique de ne le faire que sur la première occurence de chaque terme.
Rajouter enfin la fonction glossaire ci-dessous au contenu de votre fichier mes_fonction.php3. Il vous suffit de reporter les numéros des mots clés dans la fonction glossaire, puis de remplacer dans votre squelette #TEXTE par (#TEXTE
Pour ajouter un nouveau terme au glossaire, il suffit de publier un nouvel article dans la rubrique concernée ; le texte de cet article constitue la définition du terme.
Le sur-titre de l’article définit le terme à reconnaître. Pour plus de détails sur l’utilisation d’expression régulières dans le surtitre, vous pouvez consulter cet article.
Voici la fonction à rajouter dans votre fichier mes_fonctions.php3, et à modifier.
function glossaire($chaine,$idarticle=0)
{
if(strlen($chaine) == 0) Return "";
if($idarticle == 0) Return "";
#Indiquez ici les numeros des mots clés glossaire et glossaire_un
#remplacement sur tout le texte ?
$motglossaire = 39;
$motglossaireun = 43;
//numéro de la rubrique contenant les definitions
$id_glossaire=36;
//longueur max pour utilisation de la balise <abbr>
$long_max = 95;
$printglossaire=0;
$r = spip_query("SELECT id_mot,id_article FROM spip_mots_articles WHERE id_article=$idarticle AND id_mot in ('$motglossaire','$motglossaireun')");
while($o = spip_fetch_array($r))
{
switch($o['id_mot'])
{
case $motglossaire: $rplct_unique = 0; $printglossaire=1; break;
case $motglossaireun: $rplct_unique = 1; $printglossaire=1; break;
}
}
#Quitte si pas de glossaire demandé
if($printglossaire)
{
#Récupération des mots et des définitions
$r = spip_query("SELECT id_article,surtitre,descriptif,texte FROM spip_articles WHERE statut='publie' AND id_rubrique='$id_glossaire'");
if( count($r))
{
#définition des remplacements
$indice=0;
$patterns[]="";
$replacements[]="";
while($o = spip_fetch_array($r))
{
$texte_temp = $o['texte'];
$patterns[$indice] = "#(?!<.*?)(".$o['surtitre'].")(?![^<>]*?>)#xsi" ;
$long_desc = strlen($texte_temp);
if( strlen($o['surtitre']) > 0 and $long_desc > 0)
{
if( $long_desc < $long_max)
{
$replacements[$indice] = "<abbr title=\"".$texte_temp."\">\\0</abbr>" ;
}
else
{
$replacements[$indice] = "<a href=\"spip.php?article".$o['id_article']."\">\\0</a>" ;
}
$indice ++;
}
}
#tri nécessaire
ksort($patterns);
ksort($replacements);
if($rplct_unique)
{
$chaine=preg_replace($patterns, $replacements, $chaine,1);
}
else
{
$chaine=preg_replace($patterns, $replacements, $chaine);
}
}
}
return $chaine;
}
N’hésitez pas à proposer des améliorations ou à signaler des erreurs…