Des infos et des articles sur un peu tous les sujets : sécurité informatique, linux, opensource, etc. Mais en tout cas, ca n’est pas un blog…
 

Un glossaire automatique

Le 2 novembre 2007, par Thomas Houssin,

Présentation

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.

Mise en place

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

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. 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.


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…

 

Poster un commentaire

Ce forum est modéré à priori : votre contribution n'apparaîtra qu'après avoir été validée par un administrateur du site.



Dans la même rubrique

Un glossaire automatique - gestion de multiples jeux de définitions
Un glossaire automatique

À propos de cet article

Dernière mise à jour le :
2 novembre 2007
Statistiques de l'article :
3623 visiteurs cumulés

Votre recherche

SPIP 1.9.2c [10268] | BliP 2.4 | XHTML 1.0 | CSS 2.0 | RSS 2.0 | Espace privé
Visiteurs par jour (cumul) : 14 (45866)