Nos objectifs
Nous nous donnons trois objectifs dans le cadre de cet article [1].
- Gérer la « fonction » des auteurs : des secrétaires rédaction et des traducteurs. [2] Différentes personnes contribuent au produit fini qu’est un article publié sur un site web. Nous identifions trois fonctions essentielles dans ce processus [3] : l’auteur, qui écrit l’article, le secrétaire de rédaction (ou éditeur), qui assure l’aspect technique de la mise en ligne et le traducteur [4]. Ce constat - qui tient de l’évidence dans la plupart des cas - peut cependant être perdu de vue quand on a recourt à un outil de publication collaborative comme SPIP.
- Des « secrétaires de rédaction ». Selon la définition que nous avons donnée du « secrétaire de rédaction » (ou « éditeur »), le site public ne rendra compte que des auteurs des textes et laissera ce qui concerne les secrétaires de rédaction à la gestion éditoriale interne du site. Une même identité dans SPIP ne pourra donc à la fois publier ses propres articles et encoder des articles écrits par d’autres.
On pourrait se contenter de ne pas conserver de liaison entre un article et la personne qui l’a mis en ligne, ce qui résoudrait le problème. Il nous semble pourtant que, dès que plusieurs personnes travaillent ensemble sur un même site web, il devient utile de conserver une telle liaison : pour permettre au « secrétaire » de revenir sur ses articles par exemple, ou pour permettre à l’administrateur du site de connaître l’activité de publication des différents secrétaires.
- Des traducteurs. Selon la même logique, nous souhaitons identifier le traducteur d’un article en le séparant clairement du ou des auteurs. Pour chaque article, nous souhaitons par exemple obtenir sur le site public un rendu de la forme suivante [5] :
Titre
jeudi 3 mars 2000,
par Boule et Bill,
traduit par Machin
- Permettre le classement alphabétique des auteurs. Par défaut, SPIP ne propose qu’un seul champ pour l’encodage des articles. Cela implique qu’il vous sera impossible de classer vos auteurs par ordre alphabétique si vous les encodez selon une forme
Prénom Nom
Inversément, si vous les encodez sous la forme :
Nom Prénom
vous pourrez les classer par ordre alphabétique mais l’affichage public sera détérioré. Nous proposons ici une méthode permettant de classer des auteurs tout en conservant la maîtrise de leur affichage.
- Uniformiser l’affichage et le rendre plus joli. Pour chaque article, nous souhaitons que la liste des auteurs soit présentée :
- par ordre alphébétique des noms de famille,
- précédée du mot "par",
- en séparant les noms par des virgules, sauf les deux derniers qui seront séparés par le mot "et",
- en affichant les prénoms en minuscules avec la première lettre en majuscule et les nom de familles en petites majuscules (« small caps ») avec la première lettre en majuscule.
Un exemple de ce que donnent les propositions faites dans ce texte est disponible sur le site http://tchouktchouk.eu.org/, une revue de presse ferroviaire [6]. Les squelettes de ce site sont librement consultables à l’adresse http://tchouktchouk.eu.org/skel/.
Avant d’en venir à la réalisation des objectifs proposés, il n’est pas inutile de souligner que la perspective dans laquelle est traitée, dans ce texte, la question de l’affichage des auteurs correspond sans doute un peu plus directement à un usage particulier de SPIP qui est par exemple celui fait par revue papier mettant ses articles sur le web : celui dans lequel une ou un nombre réduit de personnes font le travail de mettre en ligne des articles signés par un grand nombre d’auteurs (ceux-ci ne réalisant pas le travail d’encodage de leur(s) articles(s) ; ceci par opposition avec l’usage « natif » de spip qui est le webzine collaboratif, pour lequel un certain nombre de propositions faites ici sont sans doute peu pertinentes.
1. Des secrétaires de rédaction et des traducteurs
Par convention, nous allons encoder d’une façon particulière le nom des secrétaires de rédaction (dont la fonction a été définie plus haut) et celui des traducteurs : nous ferons respectivement précéder leur nom d’un « @
» et d’un « #
» [7], ce qui nous permettra aussi de les lister facilement dans l’interface privée [8].
En ajoutant un critère dans nos boucles AUTEURS
, nous pourrons sélectionner le type d’auteurs que nous voulons afficher. Par exemple, le critère {nom!==^@}
(littéralement : « ne commençant pas par "@" ») inséré dans tous les boucles AUTEURS
du site permettra d’éviter qu’il soit fait mention de nos secrétaires de rédaction sur le site public. Pour afficher les traducteurs d’un article, nous utiliserons le critère {nom==^#}
, etc.
Ainsi, la boucle suivante affiche les auteurs de l’article (et pas les traducteurs ni les secrétaires de rédaction).
<BOUCLE_signature(AUTEURS){id_article}{par nom}{nom!==^@}{nom!==^#}{", "}>#NOM</BOUCLE_signature>
Autre exemple, la boucle suivante affiche les traducteurs d’un article.
<BOUCLE_signature(AUTEURS){id_article}{par nom}{nom==^#}{", "}>#NOM</BOUCLE_signature>
2. Gérer le classement alphabétique
Par convention, nous supposons que nos les noms de nos auteurs sont composés d’un prénom (ou plusieurs) et d’un nom de famille. Nous considérons en outre que c’est en fonction de ce nom de famille qu’un classement alphabétique des auteurs est le plus pertinent. Nous supposons enfin qu’il est préférable de citer une personne en commençant par son prénom. Ces considérations culturelles étant acquises, nous pouvons passer à la mise en oeuvre.
La manière la plus facile d’ordonner une liste de données, c’est de s’adresser au système de gestion de la base de données. Par conséquent, les données doient y être stockées dans un format qui le permet sans trop se compliquer la vie. Autrement dit, notre champ « nom » doit commencer par le nom de famille.
Nous décidons donc, par convention, d’encoder systématiquement les noms de nos auteurs en commençant par le nom suivi d’une astérisque ("*
« ) puis du prénom et autres titres, seconds prénoms,... Ainsi, le nom »naturel" d’un auteur :
Pdt. William J. Clinton
devient, selon notre nouvelle norme d’encodage :
Clinton*Pdt. William J.
A moins que vous n’ayez de raison particulière de le faire (autre usage de la base de données), il n’est pas essentiel d’insister ici sur l’usage des majuscules et minuscules : nous harmoniserons tout cela lors de l’étape de l’affichage.
Dans l’espace privé de notre site, les articles de cet auteur seront attribués à l’auteur Clinton*William J.
; cela n’est pas forcément très élégant, mais tout de même parfaitement lisible.
Avantage immédiat, dans la liste des auteurs, nous récupérons un classement alphabétique parfait, de la forme :
Bush*George W.
Clinton*Hillary
Clinton*William J.
Sur le site public, une boucle AUTEURS
classée {par nom}
fournira donc un classement alphabétique correct (basé sur le nom de famille).
Pour remettre l’affichage « à l’endroit » sur le site public, il suffira d’utiliser un filtre - nous allons le créer tout de suite et l’appeler prenom_nom
- que nous appliquerons à la balise #NOM :
[(#NOM|prenom_nom)]
Tant qu’à faire, nous écrivons deux autres filtres pour afficher respectivement le nom ou le prénom seul. Nous obtenons donc trois filtres (et quelques fonctions subordonnées), à placer dans le fichier mes_fonctions.php3
(ou dans un autre fichier que vous chargerez dans mes_fonctions.php3
avec l’instruction require
) :
Notez que chacune des trois fonctions renvoie des chaînes nettoyées des « @-
» (ou « @_
» ou « @
» ou « @
») ainsi que des « #-
» (ou « #_
» ou « #
» ou « #
») qui les précèdent éventuellement. Cela permet d’utiliser le nom d’un secrétaire de rédaction ou d’un traducteur sur le site public sans se préoccuper de l’affichage [9].
Enfin, s’il n’y a pas de « *
» dans la chaîne :
- la fonction
prenom()
ne renvoie rien ; - la fonction
nom()
renvoie la chaîne sans rien changer (par exemple un pseudo) ; - la fonction
prenom_nom()
renvoie la chaîne sans rien changer ;
Cela permet d’introduire un peu de souplesse et d’afficher correctement le nom d’Aristote, d’Alain, du vengeur masqué ou de n’importe que pseudo, lesquels ne sont pas, contrairement à nos prémisses, composés d’un prénom suivi d’un nom [10].
3. Mise en forme
Ces trois fonctions, qu’il vous suffit d’ajouter dans votre fichier mes_fonctions.php3
[11] vont nous permettre de citer nos auteurs de façon beaucoup plus fine.
Par exemple, la ligne suivante, insérée dans un squelette, nous renverra le prénom suivi du nom, ce dernier étant mis en forme selon la classe CSS .nom
.
[(#NOM|prenom) ][<span class="nom">(#NOM|nom)</span>]
Cela nous permet, par exemple, d’afficher le nom en petites majuscules (small caps), simplement en le précisant dans la feuille de style [12] de la façon suivante :
.nom {
font-variant: small-caps;
}
Pour terminer, notez que ces filtres tels qu’ils sont proposés ici harmonisent l’affichage selon la norme suivante :
- prenom()
renvoie le prénom après l’avoir passé en minuscules puis avoir transformé en majuscule l’initiale de chaque mot (ainsi que l’initiale de chaque partie d’un mot composé).
- nom()
fait de même... avec le nom.
- prenom_nom()
concatène les résultats obtenus par prenom()
et par nom()
(séparés par un espace insécable) après avoir passé le nom en majuscules (ce qui par exemple utile pour me champ titre d’une page html où il n’est pas possible de créer des petites majuscules).
Par exemple, si la valeur de notre champ #NOM est « durant-DUBOIS*dr. anne-sophie », placé dans un squelette, le code
[(#NOM|prenom) ][(#NOM|nom)]
[13]
renverra
Dr. Anne-Sophie Durant-Dubois
tandis que le code
[(#NOM|prenom) ][(#NOM|majuscules|nom)]
[14]
renverra
Dr. Anne-Sophie DURANT-DUBOIS
Comme nous le disions plus haut, tout ceci nous permet de ne pas trop nous soucier de la précision de l’encodage des noms des auteurs : le rendu public sera de toute façon homogène.
4. Rendre la liste des auteurs plus jolie
Pour terminer, plutôt que comme une simple liste de noms séparés par des virgules, nous allons afficher la liste de nos auteurs sous la forme :
par Albert Durant, Claude Dubois et Jean Dupont
Une petite fonction php va nous y aider :
<?
/*
* Fonction auteur_et_auteur()
*
* Auteur : Philippe Rivière <fil@rezo.net>
*
* Copyright : GNU Public Licence
*
* Rajouter un "et" à la place de la virgule entre les deux derniers
* auteurs d'une liste
*
*/
function auteur_et_auteur($texte) {
return ereg_replace(", ([^,]*)$"," et \\1",$texte);
}
?>
Attention, cette fonction doit être placée dans le squelette (et non dans le fichier mes_fonctions.php3
ou ailleurs) : il doit en effet s’exécuter à chaque lecture de la page (et non uniquement lors du calcul de la page).
Si vous utilisez plusieurs boucles AUTEURS
dans un même squelette, veillez à ne pas répéter la fonction auteur_et_auteur
plusieurs fois, sans quoi vous aurez une erreur php [15].
Bref, voici les quelques lignes qui, placées dans un squelette, répondent à notre objectif initial [16] [17] :
<? $tous_auteurs = auteur_et_auteur('<BOUCLE_signature(AUTEURS){id_article}{par nom}{nom!==^@} {", "}>[(#NOM|prenom|texte_script) ][<span class="nom">(#NOM|nom|texte_script)</span>]</BOUCLE_signature>');
if ($tous_auteurs) echo " par ".$tous_auteurs;
?>
Nous avons bien renvoyé la liste des auteurs :
- classée par ordre alphébétique des noms de famille,
- précédée du mot « par »,
- en séparant les noms par des virgules, sauf les deux derniers qui seront séparés par le mot « et »,
- en affichant les prénoms en minuscules avec la première lettre en majuscule et les nom de familles en petites majuscules avec la première lettre en majuscule.
Encore une boucle pour le plaisir, voici l’affichage des auteurs et des traducteurs d’un article :
<?
# On récupère les auteurs
$tous_auteurs = auteur_et_auteur('<BOUCLE_signature(AUTEURS) {id_article}{par nom}{nom!==^@}{nom!==^#}{", "}>[(#NOM|prenom|texte_script) ][<span class="nom">(#NOM|nom|texte_script)</span>]</BOUCLE_signature>');
# On les affiche
if ($tous_auteurs) echo "par ".$tous_auteurs;
# On récupère les traducteurs
$tous_auteurs_trad = auteur_et_auteur('<BOUCLE_signature_trad(AUTEURS) {id_article} {par nom} {nom==^#} {", "}>[(#NOM|prenom|texte_script) ][<span class="nom">(#NOM|nom|texte_script)</span>]</BOUCLE_signature_trad>');
# On les affiche
if ($tous_auteurs_trad) echo ", traduit par ".$tous_auteurs_trad;
?>
Discussions par date d’activité
8 discussions
Bonjour,
Cette merveilleuse contrib pose un problème au passage à PHP 7 car elle contient la fonction « ereg_replace » qui a été supprimée.
Pour éviter d’avoir de gros messages d’erreur sur votre site au passage à PHP 7, il faudra donc la remplacer par « preg_replace » ou « str_replace ». Comme proposé par michel_leble ici : https://forum.spip.net/fr_275665.html?debut_forums=%40275667#forum275674
Répondre à ce message
Bonjour,
dans mon champ « pseudo ou nom » de spip, j’ai « prénom nom ».
Je souhaiterai n’afficher QUE le nom, donc soit le dernier mot, soit le second mot, soit ce qu’il y a après l’espace « ».
j’ai testé vos fonctions en les modifiant selon mes envies mais je n’ai pas réussi à réaliser ce que je veux.
Pouvez vous m’indiquer la procédure à suivre ?
Répondre à ce message
Bonjour,
J’ai peut-être mal lu, mais existe-t-il un plugin depuis cette contrib (déjà ancienne), pour classer les auteurs par ordre alphabétique du nom ?
Cordialement,
Allo ? Yakelkun ?
Répondre à ce message
Bonjour,
Bravo pour cette contrib très pratique qui marchait très bien...
Je viens de passer en SPIP 1.8.2.d et malheureusement voilà ce qui s’affiche sur la page :
span style=’text-transform : uppercase’ span style=’text-transform : uppercase’ xavier span style=’text-transform : uppercase’ span style=’text-transform : uppercase’ span transform : uppercase’ style=’text-transform : transform : uppercase’ uppercase’ dupond’
au lieu de : Xavier DUPOND
avec le code qui va bien dans le squelette (ca marchait très bien en 1.8.1)
Ce problème est il arrivé à d’autres, existe’il un « patch »
Merci
Curieux. J’utilise cette contrib sur une petite dizaine de sites web (tous sous 1.8.2) sans aucun problème.
Peux-tu me donner l’url de la page où se passe le problème, ainsi que l’url du squelette ?
J’ai le même problème avec 1.8.2d
Bonjour,
Je répond à mon message n° 4.
J’ai trouvé une solution qui consiste à changer l’option par défaut proposé pour la fonction « harmonise_nom » dans le fichier mes_fonctions.php3.
J’ai utilisé la deuxième option (Ne rien faire) et là ca fonctionne sous SPIP 1.8.2.d.
Le troisième choix fonctionne aussi, mais pas les 1er et 4es.
Il semble que la fonction « ucwords_amelioree » pose problème sous 1.8.2.d ?
Un avis là dessus ?
Merci
Emmanuel GOBIER
J’ai le même problème avec SPIP 1.9.2
je précise que je règle le problème de la même façon dans 1.9.2c :
Répondre à ce message
bonjour
contrib installé sur un site 1.9.2c -ça marche très bien
mais, là je voudrais ajouter le critère tout pour que tous les auteurs s’affichent dans la liste même s’ils n’ont pas publié d’articles... et du coup ça ne marche plus...
j’ai l’impression que du coup ça affiche la liste des auteurs par leur login... ce qui est un peu bizarre
est-ce que j’ai raté quelquechose ?
voilà la boucle qui marche :
(#NOM(#NOM
et la boucle qui marche plus :
(#NOM(#NOM
merci de votre aide
aud
Répondre à ce message
Une remarque en passant : je me demande s’il ne vaudrait pas mieux promouvoir une autre syntaxe, plus intuitive que l’étoile, pour séparer le nom et le prénom, à savoir :
Nom, Prénom
L’idée m’est venu en lisant http://digital-web.com/articles/wri... : l’idéal est quand même d’avoir des champs lisibles aussi bien par les humains que par les machines.
Répondre à ce message
Une erreur se produise lorsque j’utilise « ’ » dans un nom ou prénom, ça devient « &8217; » après l’utilisation du filtre |prenom_nom ou |nom.
e.g.
John O’Farrell->John O&8217;Farrell
Dlawer Ala’Aldeen->Dlawer Ala&8217;Aldeen
Effectivement. Le problème est connu (et on le retrouve à d’autres endroits dans spip).
Une solution, pas hyper-élégante, mais qui fonctionne, consiste à remplacer la fonction
harmonise_noms
par la suivante :super avec cette contrib mes auteurs sont joliment classés par nom de famille.
J’ai appliqué le patch pour les apostrophes mais il me les remplace par \
ex : Machin D’HIVER
devient Machin D\HIVER
C’est une erreur dans les expressions régulières.
Il suffit de rajouter un
^
au début de chaque expression régulière.Ceci :
à la place de ceci :
François
Répondre à ce message
D’après moi, il y a une paranthèse en trop juste après
</BOUCLE_signature>
dans cette boucle :Sinon bravo et merci pour votre contribution.
C’est exact. Je vais demander à pouvoir corriger cela.
Merci de votre attention
ok, c’est corrigé
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 :
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 : |