Un glossaire automatique

Le but est d’obtenir un glossaire automatique de différents termes, gérant notamment la reconnaissance par expressions régulières.

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 genre case $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...

L’expression régulière qui sert à remplacer dans tout le texte sauf dans les balises HTML provient de http://fr.php.net/preg_replace. Elle semble correcte et meilleure que celle que j’utilisais au début.

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

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.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom