Présentation
J’ai commencé à coder ce petit glossaire car je n’étais pas satisfait de ceux que j’avais pu trouver auparavant. Ce que je désirais :
- 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)
- 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.
- pouvoir gérer plusieurs ensembles de définitions, avec des définitions différentes pour le même mot.
L’intérêt est de pouvoir utiliser un jeu de définitions ou un autre suivant le public auquel s’adresse l’article (langue, niveau technique, etc). Dans mon cas, le glossaire est utilisé sur un site de jeux de rôle, et nous avions donc besoin d’une définition pour les joueurs et une pour les maîtres, chacun ne devant lire que celle le concernant.
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.
Mise en place
- Créez tout d’abord une rubrique glossaire, et une sous rubrique par jeu de définitions (par exemple utilisateurs débutants, utilisateurs avancés, etc).
- Créez ensuite le groupe de mots clés Audience, et créez-y un mot-clé pour chaque sous rubrique créée auparavant.
- 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|glossaire{#ID_ARTICLE})]
Utilisation
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. On y indiquera le code HTML des caractères spéciaux (è
pour è, etc). Pour plus de détails sur l’utilisation d’expression régulières dans le surtitre, vous pouvez consulter cet article.
Le code
Voici la fonction à rajouter dans votre fichier mes_fonctions.php3, et à modifier.
la fonction glossaire :
/*
* +----------------------------------+
* Nom du Filtre : Glossaire
* +----------------------------------+
* Publié le 30/11/2004
* Par Thomas Houssin <Thomas point Houssin at gmail.com>
*/
function glossaire($chaine,$idarticle=0)
{
if(strlen($chaine) == 0) Return "";
if($idarticle == 0) Return "";
#Indiquez ici les numeros des mots clés correspondant à chaque audience.
$motcleA1 = 34;
$motcleA2 = 44;
#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 de l'audience correspondante.
$glossaireA1=36;
$glossaireA2=35;
//définitions par défaut
$id_glossaire = $glossaireA2;
//longueur max pour utilisation de la balise <abbr>
$long_max = 95;
$printglossaire=0;
$r = spip_query("SELECT * FROM spip_mots_articles WHERE id_article=$idarticle AND id_mot in ('$motcleA1','$motcleA2','$motglossaire','$motglossaireun')");
while($o = spip_fetch_array($r))
{
switch($o['id_mot'])
{
case $motcleA1: $id_glossaire = $glossaireA1; break;
case $motcleA2: $id_glossaire = $glossaireA2; break;
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[]="";
$trans = get_html_translation_table(HTML_ENTITIES);
$trans["<"] = "<";
$trans[">"] = ">";
$trans["&"] = "&";
$trans["\""] = "\"";
$trans["'"] = "'";
$chaine = strtr($chaine, $trans);
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=\"article.php3?id_article=$o[0]\">\\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;
}
- Pour gérer deux ensembles de définition, reportez les identifiants des mots-clés et des rubriques contenant les définitions dans le code de cette fonction.
- Pour ne gérer qu’un ensemble de définition, le plus simple est d’indiquer dans le code ci-dessus que le deuxième jeu de définition n’existe pas ; pour cela, modifier
#Indiquez ici les numeros des mots clés correspondant à chaque audience. $motcleA1 = 34; $motcleA2 = 44;
en
#Indiquez ici les numeros des mots clés correspondant à chaque audience. $motcleA1 = 34; $motcleA2 = 0;
- Pour au contraire en gérer plus de deux, rajouter des entrées du type
$motcléA3=xx
dans les définitions, et des lignes du genrecase $motcleA3: $id_glossaire = $glossaireA3; break;
au niveau de l’instruction switch.
On aura par exemple, pour 3 ensembles d’entrées :[...] #Indiquez ici les numeros des mots clés correspondant à chaque audience. $motcleA1 = 34; $motcleA2 = 44; $motcleA3 = 47; #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 de l'audience correspondante. $glossaireA1=36; $glossaireA2=35; $glossaireA3=37; [...] while($o = spip_fetch_array($r)) { switch($o['id_mot']) { case $motcleA1: $id_glossaire = $glossaireA1; break; case $motcleA2: $id_glossaire = $glossaireA2; break; case $motcleA3: $id_glossaire = $glossaireA3; break; case $motglossaire: $rplct_unique = 0; $printglossaire=1; break; case $motglossaireun: $rplct_unique = 1; $printglossaire=1; break; } }
N’hésitez pas à proposer des améliorations ou à signaler des erreurs...
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Suivre les commentaires : |