Un glossaire interne

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Fonctionnalité désormais intégrée au Couteau Suisse : disponible pour tout SPIP !
Votre site utilise un vocabulaire technique spécialisé, vous avez une tendance maladive à jargonner sans vous en rendre compte, voici une solution pour que votre prose reste néanmoins accessible au commun des mortels.

Quelques mots d’introduction

Ce glossaire présente les caractéristiques suivantes :

-  Il est interne. Ce glossaire ne fait pas appel à des ressources extérieures. Il exploite un glossaire interne au site (que nous allons créer en utilisant des brèves dans une rubrique dédiée). Il est donc typiquement dédié à des sites très spécialisés, dont le centre d’intérêt fait appel à un vocabulaire très spécifique. Par exemple, si vous créez un site parlant d’architecture antique, vous pourrez définir les mots métope, triglyphe ou architrave si vous craignez que vos visiteurs ignorent ce dont il s’agit.

-  Il est automatique. Contrairement au raccourci typographique existant actuellement dans SPIP qui renvoie vers Wikipedia (dont on apprécie ou non la qualité des articles ; perso : bof), qui demande une intervention humaine chaque fois qu’on veut créer un lien, le principe du présent script est d’automatiser le référencement. Concrètement, il prendra la forme d’un filtre (à ajouter dans mes_fonctions.php3) à appliquer sur chaque partie de texte où l’on souhaite voir se créer des liens vers le glossaire. Le filtre va parser le texte, y reconnaître les occurences des mots qu’il « connaît ».

Créer les données

Le contenu en lui-même du glossaire sera « physiquement » situé dans une rubrique, que nous appellerons, fort originallement, glossaire. Chaque entrée de notre petit dictionnaire prendra la forme d’une brève, le titre étant le mot lui-même (seul : sans article, pluriel particulier ou autres informations) ; le texte de la brève étant la définition du mot.

Le filtre

Et voici le code de la fonction

<?php

/*
 *   +----------------------------------+
 *    Nom du Filtre : Glossaire interne                                               
 *   +----------------------------------+
 *    Date : jeudi 11 septembre 2003
 *    Auteur :  François Schreuer <francois (sur) schreuer (point) org>
 *   +-------------------------------------+
 *    Fonctions de ce filtre :
 *    Gestion des liens vers un glossaire interne à un site
 *   +-------------------------------------+ 
 *  
 * Pour toute suggestion, remarque, proposition d'ajout
 * reportez-vous au forum de l'article :
 * http://www.spip-contrib.net/article241.html
*/

# Remplace seulement la première occurence. Mêmes arguments que str_replace
# Cette fonction est inspirée d'une fonction trouvée à l'adresse http://www.phpapps.org/index.php?action=sources&go=voir_source&id=174 (qui toutefois contenait un bug lorsque la chaîne recherchée ne se trouvait pas dans le texte
function first_replace($c,$r,$t)
{
	if(strstr($t,$c))
	{
		$d = str_replace(strstr($t,$c),"",$t);
		$f = strstr($t,$c);
		$f = substr($f,strlen($c));
		return $d . $r . $f;
	}
	else
		return $t;
}

# Crée des liens vers le glossaire
function lier_au_glossaire($texte)
{
	# Config
	# L'identifiant (id_rubrique) de la rubrique glossaire
	$id_rubrique = 2;
	# Limiter l'effet du filtre à la première occurence
	$eviter_doublons = 1; // 0 : afficher toutes les occurences

	# On checke si l'entrée est déjà présente dans la table
	# Mettre l'identifiant de la rubrique contenant le glos
	$r = spip_query("SELECT id_breve,titre FROM spip_breves WHERE statut='publie' AND id_rubrique='$id_rubrique'");

	while($o = spip_fetch_array($r))
	{
		if($eviter_doublons == 1)
		{
			$texte = first_replace("$o[titre]","<a href=\"breve.php3?id_breve=".$o[id_breve]."\" class=\"glossaire\">$o[titre]</a>",$texte);
		}
		else
		{
			$texte = str_replace("$o[titre]","<a href=\"breve.php3?id_breve=".$o[id_breve]."\" class=\"glossaire\">$o[titre]</a>",$texte);
		}
	}
	return $texte;
}

?>

N’oubliez pas de configurer le script :

-  en choisissant de remplacer toutes les occurences du mot (en attribuant la valeur 0 à la variable $eviter_doublons) ou uniquement la première (valeur 1). La fonction first_replace, donnée ici, est nécessaire si vous ne souhaitez afficher que la première occurence. Notez que ce option évitant les doublons ne fonctionne qu’au sein d’un seul champ : si plusieurs champs sur une même page utilisent le filtre, il est possible qu’un même mot soit lié au glossaire plusieurs fois.

-  en précisant l’id_rubrique de la rubrique contenant le glossaire ;

-  en configurant correctement l’URL. Si vous utilisez les réécritures Apache (rewrite rules), remplacez l’expression breve.php3?id_breve=".$o[id_breve]." par breve".$o[id_breve].".html

-  en configurant le CSS (ici, j’ai nommé la classe définissant les liens .glossaire mais vous pouvez évidemment changer tout cela).

Appeler la fonction

La fonction s’appelle comme tout autre filtre de SPIP. Par exemple :

[(#TEXTE|lier_au_glossaire)]

Pour ceux qui veulent voir à quoi ça ressemble, un exemple présentant l’utilisation de quelques entrées du glossaire est visible sur http://tchouktchouk.eu.org/article128.html (il s’agit d’un site qui parle de trains).

Quelques mots encore

-  Ce filtre requiert pas mal de capacité de calcul de la part du serveur, il est donc fortement conseillé de procéder à quelques tests avant de l’utiliser sur votre site. Quoi qu’il en soit, l’utiliser avec parcimonie et/ou dans des squelettes dont la durée de conservation dans le cache est longue.

-  Pour que les pages ne deviennent pas illisibles sous la profusion de liens, il me semble préférable, dans la mise en page, d’opter pour un mode d’affichage discret : en ce qui me concerne, j’utilise des liens non soulignés de la même couleur que le texte. Ils ne deviennent visibles qu’au passage de la souris.

-  On utilise ici des brèves pour stocker les entrées du glossaire : on pourrait aussi réserver un groupe de mots-clés à cet usage. Ca ne change pas grand-chose. A vous de voir la manière dont vous préférer opérer.

Pour la suite

Pour ceux qui auraient envie de poursuivre le travail entamé ici, voici quelques idées :

-  Il faudrait réfléchir à la question des formes modifiées des mots du glossaire (conjugaisons d’un verbe, pluriel d’un nom), qui ne sont pas reconnues actuellement. Il en va de même pour les mots qui acceptent indifférement plusieurs orthographes et autres problèmes du même accabit (on ne parle même pas ici du multilinguisme).

-  Il serait intéressant d’écrire une option permettant l’affichage des définitions en javascript : au passage de la souris sur une occurence d’un mot connu, une petite boîte contenant la description du mot s’afficherait.

-  Enfin, il serait utile d’interfacer cette fonction avec inc-urls-dist.php3 pour faire en sorte que l’écriture des URL se fasse correctement (en mode « standard » ou en mode « html ») sans qu’une intervention soit nécessaire dans le code.

Voir l’intégration dans le Le Couteau Suisse : Un glossaire interne pour vos sites !

Discussion

14 discussions

  • 1

    comment peut on faire pour que la recherche des mots ne soit pas sensible aux majuscules ou minuscules dans les mots dans le titre de la brève

    Répondre à ce message

  • 2

    Ce filtre marche impec dans mes articles sauf pour un petit détail, et il me
    semble l’avoir déjà vu mentionné quelque part, mais où ??!! Le petit détail
    en question : comment éviter que le filtre s’applique aux titres ou
    descriptifs des documents insérés dans le corps de mon article ?

    Voilà les boucles en question dans le squelette de ma page article.html :

    <BOUCLE_principale(ARTICLES){id_article}{doublons}>
    
    <h2><b>[(#TITRE|majuscules|supprimer_numero)]</b></h2>
    
    <h3>[(#SOUSTITRE)]</h3>
    
    <p>[(#TEXTE*|decouper_en_page|propre|justifier|lier_au_glossaire|limit_image
    s_size{450,0,0})]</p>
    
    <B_doc>
    
    <BOUCLE_doc(DOCUMENTS){id_article}{mode=document}{doublons}>
    
     [<a href="#URL_DOCUMENT" target="_blank">#LOGO_DOCUMENT</a><br>
     <a href="#URL_DOCUMENT" target="_blank">#TITRE</a><br>
     #DESCRIPTIF<br>
     (doc. #TYPE_DOCUMENT - (#TAILLE|taille_en_octets))<br>]<br>
    
     </BOUCLE_doc>
    
    </B_doc>
    
    <//B_doc>
    
    </BOUCLE_principale>

    Dans mon squelette, comme vous pouvez le voir, j’ai prévu une boucle pour
    afficher les documents si le rédacteur n’utilise pas le raccourci SPIP pour
    insérer le document dans le corps de son article, et dans ce cas pas de
    problèmes...

    Mais si le rédacteur ajoute manuellement <docXX|center> par exemple entre
    les deux premiers paragraphes de son article, le filtre lier_au_glossaire
    appliqué au #TEXTE de l’article va tenter de transformer en lien un terme du
    glossaire, s’il est utilisé par exemple dans le titre du document inséré...
    et du coup, l’affichage du document est tout cassé - lien dans un lien, et
    autres problèmes d’imbrication...

    • les mots qui manquent dans le dernier paragraphe de mon message précédent...

      « Mais si le rédacteur ajoute manuellement UN DOCUMENT avec le raccourci typo de SPIP <docXX|center> par exemple entre les deux premiers paragraphes de son article, le filtre lier_au_glossaire appliqué à l’élément #TEXTE de l’article va tenter de transformer en lien un terme du glossaire, s’il est utilisé par exemple dans le titre du document inséré... et du coup, l’affichage du document est tout cassé - lien dans un lien, et autres problèmes d’imbrication... »

    • Bonjour,

      Je viens seulement de voir ton message (il se trouve justement que mon mail était down quand tu l’as posté). Sorry du délai.

      Je n’ai pas de réponse à cette question comme ça. Je vais y réfléchir. Je crois qu’il est possible avec les expressions régulières d’interdire la création d’un lien quand le texte à lier est déjà situé entre deux balises <a></a>.

      Tu vois d’autres cas que le lien dans un lien à éviter ?

      Je compte publier une deuxième version de cette contrib d’ici peu (genre dans un mois). J’essaierai d’y intégrer une solution à ton problème (et aussi de créer une insensibilité à la casse et quelques autres trucs du genre).

    Répondre à ce message

  • 2

    la meme chose en plus complet je trouve, dispo ici :

    http://spipage.levillage.org/article.php3?id_article=70

    voir vers la fin de l’article à def auto de mots clefs

    • pourquoi se compliquer il suffit de créer un groupe de mot clés que vous appelez glossaire et vous lier les mots clés à l’article, ensuite une toute petite boucle qui rappelle le glossaire et les termes que vous voulez définir.

    • Euh oui. Mais ce n’est pas la même chose. L’idée dans le cas proposé ici est de créer un fonction automatique, ne demandant pas d’intervention humaine dans l’article lui-même.

      Cela dit, il serait sans doute intéressant de prévoir la possibilité de renvoyer la liste des mots du glossaire à définir (en vue d’afficher leurs définitions dans une colonne comme sur l’exemple que tu donnes) plutôt que de créer des liens dans le texte.

      J’y pense pour une prochaine version.

    Répondre à ce message

  • 1

    J’aimerais utiliser ce script pour intégrer les acronymes et sigles d’acro-ecole (sur free.fr) dans les sites sous BioSPIP. Mais je me pose un problème : il peut y avoir plusieurs occurences concernant un même sigle.

    Que faut-il mieux faire : garder l’architecture actuelle qui est autant de breves qu’il y a de sigles même identiques mais avec définitions différentes et adapter le filtre de glossaire interne ou modifier toute l’énorme table contenant les sigles en mettant toutes les définitions différentes d’un même sigle dans la même breve ?

    • François Schreuer

      Aie. J’avais pas envisagé la question de la polysémie des termes du glossaire.

      Le plus simple semble être de mettre toutes les définitions d’un même terme dans la même brève (comme dans un dictionnaire).

      Autrement, on entre dans une usine à gaz : soit on identifie les entrées du glossaire autrement que par leur nom (un identifiant unique,...), soit on doit rentrer dans un trip « intelligence artificielle » et essayer de déterminer quelle entrée est la meilleure en fonction du contexte.

      Bref, comme ça je vois pas. Mais je vais essayer d’y réfléchir.

    Répondre à ce message

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