Introduction à la contrib pour Spip 1.8.3
Cette méthode [2] ne touche pas au noyau de Spip. Si, à première vue, elle semble compliquée, c’est parce que l’installation touche à plusieurs fichiers :
- ecrire/mes_options.php3 (script pour transformer les liens) ;
- mes_javascripts.js (script pour décoder les liens) ;
- commat.gif (image d’une arobase) ;
- création d’une squelette « version imprimable » ;
- squelette(s) (ajouter 2 lignes : inclusion de mes_javascripts.js et lien pour appeler la version imprimable).
Ces 5 étapes sont décrites en détail plus bas.
Description
La page à l’écran
Un raccourci e-mail [->quelquun@autre.part.org]
est d’habitude converti en HTML de la façon suivante :<a href="mailto:quelquun@autre.part.org" class="spip_out">quelquun@autre.part.org</a>
— ce qui laisse le champ ouvert pour les robots spam.
Intercepté par le code que nous mettons dans mes_options.php3
ce lien va être réécrit pour devenir :
<a href="#" title="quelquun..åt..autre.part.org" onClick="location.href = dolink(this.title); return false;">[Email]</a>
Il n’y a plus d’arobase ni de « mailto» pour orienter les robots. Lorsque le visiteur clique sur le lien c’est le JavaScript onClick
qui est exécuté. Ce script reconstitue le lien.
Et si le visiteur n’a pas JavaScript ? (Il s’agit vraiment de très peu de personnes.) C’est certain : ils ne pourront pas utiliser le lien. Ils peuvent pourtant lire l’adresse en survolant le lien avec la souris. Pour aider ceux qui ont ce problème, je mets un mot explicatif sur la page « technique » du site :
Parce que le spam est devenu un problème grandissant, nous sommes très prudents dans la manière de mettre publiquement à disposition des adresses e-mail. Celles-ci ne figurent pas sur les pages de ce site, mais sont créées uniquement au moment où le visiteur clique sur un lien. Les visiteurs qui n’ont pas Javascript ou un programme e-mail ne pourront pas utiliser le lien. Cependant, quand le curseur passe sur le lien, un « infobulle » apparaît avec l’adresse e-mail (sous une forme difficile à lire pour les robots spam, mais dont la plupart des visiteurs pourront faire usage).
La version imprimable
Cela ne sert à rien d’imprimer une page d’informations avec les adresses e-mail cachées. Cette page, par exemple, ne vaudrait pas grand-chose reproduite sur du papier.
Pour la version imprimable donc (cliquer sur le lien « version imprimable ») on transforme le lien autrement. On rend l’adresse e-mail visible (dans le cas où elle a été cachée derrière le lien) en remplaçant l’arobase avec une petite image d’arobase. L’adresse s’imprime donc sur papier, mais il n’y pas de lien cliquable à l’écran de cette version imprimable. Tant qu’on y est, on fait la même chose pour les liens web. [3]
Installation
1. Le script principal
Dans un fichier mes_options.php3 (à créer, si tu n’en a pas déjà, dans le répertoire /ecrire) ajouter cette fonction [4] :
<?php
function apres_propre($texte) {
// Antispam
// Dernière mise à jour : 1/12/2005
//
// Variables qui peuvent être modifiées à volonté mais si $arobase est modifiée
// if faut aussi modifier la fonction JavaScript "dolink"
$arobase = '..åt..'; // tip visible OnMouseOver
$affichage = '[Email]'; // affichage par défaut d'un lien mail sans texte
// *** pour version imprimable
if ($_GET['printver']) {
$masque = '<img src="IMG/commat.gif" alt="" width="13" height="13" style="vertical-align: middle;" />';
preg_match_all('/<a[\\s]{1}[^>]*href=["\']?([^>\\s"\']+)["\']?[^>]*>([^<]*)<\\/a>/is', $texte, $found);
$total = count($found[0]);
for($i=0; $i < $total; $i++) {
if (preg_match("/^mailto:(.*)/",$found[1][$i],$link)) {
// *** alors il s'agit d'un lien email
$href = $link[1];
} else {
// *** c'est une adresse web
$href = $found[1][$i];
}
$linktext = $found[2][$i];
// *** si le texte du lien contient déjà l'adresse ou s'il s'agit d'une
// *** ancre locale on peut jeter l'adresse.
if ($linktext == $href || strpos($href,"#") === 0) { $href = "";}
// *** sinon l'ajouter entre crochets.
if ($href > "") { $href = "[". trim(str_replace("@", $masque,$href)) ."]";}
if (preg_match("/\s*\S+[\w_-]@[\w_-]\S+\s*/",$linktext)) {
// *** attention : détecter précisément une adresse mail pour éviter de
// *** corrompre des raccourcis comme [<imgXX>->quelquun@nullepart.net]
// *** où Spip code la première partie dans un format
// *** comme : @@SPIP_SOURCEPROPRE2@@
$linktext = trim(str_replace("@", $masque,$linktext)." ".$href);
} else {
$linktext = trim($linktext." ".$href);
}
$texte = str_replace($found[0][$i], $linktext, $texte);
}
} else {
// *** pour la page à l'écran
// *** agir seulement sur les emails
preg_match_all("/[\"\']mailto:([^@\"']*)@([^\"']*)[\"\']/",$texte,$found);
$total = count($found[0]);
for($i=0; $i < $total; $i++) {
// *** extraire les deux parties de l' adresse (avant et après l'arobase)
// *** et réécrire le lien
$part1 = $found[1][$i];
$part2 = $found[2][$i];
$newstr ='"#" title="' . $part1 . $arobase . $part2 . '" onClick="location.href = dolink(this.title); return false;"';
$texte = str_replace($found[0][$i], $newstr, $texte);
}
// *** si le texte d'un lien contient une adresse email, le remplacer par le texte choisi
preg_match_all("/>\s*\S+[\w_-]@[\w_-]\S+\s*<\/a/",$texte,$found);
$total = count($found[0]);
for($i=0; $i < $total; $i++) {
$texte = str_replace($found[0][$i],">$affichage</a",$texte);
}
}
return $texte;
}
?>
2. Le JavaScript qui recrée le lien
Mettre cette fonction dans un fichier mes_javascripts.js
[5] annexe qui sera reliée depuis vos squelettes :
function dolink(ad){
link = 'mailto:' + ad.replace(/\.\..+t\.\./,"@");
return link;
}
3. L’image de l’arobase (pour version imprimable)
Placer l’image de l’arobase (commat.gif) [6] dans le répertoire /IMG
.
4. Squelette « version imprimable »
Créer un couple de fichiers pour le squelette de version imprimable (imprim.php3
et imprim.html
). Pour ce qui concerne l’antispam ce squelette n’a besoin de rien en particulier.
5. Dans tes squelettes [7]
- Dans la partie <head>
de ton squelette, mettre la ligne [8] :
<script type="text/javascript" src="mes_javascripts.js"></script>
- Ajouter un lien qui appellera l’article avec le squelette de « version imprimable ». Par exemple :
<a href="imprim.php3?id_article=#ID_ARTICLE" target="_blank" onClick="javascript:window.open('imprim.php3?id_article=#ID_ARTICLE&printver=1', 'print_version', 'scrollbars=yes, resizable=yes, menubar=yes, width=740, height=580'); return false;"><:ver_imprimer:></a>
Note : Cette méthode va attraper presque tous les adresses e-mail : celles résultantes d’un raccourci SPIP, comme celles entrées à la main en HTML [9]. Pour une sécurité plus grande, il est possible d’ajouter le filtre
|antispam
à toutes les balises qui sont susceptibles de contenir des adresses e-mail, et ceci aussi bien dans le squelette normal que dans le squelette « imprim.html ». Par exemple,[(#TEXTE|antispam)]
. Ce filtre inclus dans SPIP transforme toutes les arobases en une série aléatoire de 3 caractères.
Fichiers à télécharger
Dans le fichier ci-joint se trouvent les fichiers avec tout le code noté ci-dessus.
Pour mieux comprendre ou améliorer le système
Regarder les lignes marquées par des commentaires avec trois étoiles *** dans le fichier mes_options.php3
et dans le squelette article.html
.
Discussions par date d’activité
13 discussions
Bonjour, et merci pour cette contrib tres utile.
Une question :
Est il possible (et souhaitable ?) de remplacer les textes de liens contenant une adresse toto@toto.net par une ’fausse adresse’ de type « toto(image gif)toto.net » comme pour l’impresion, plutot que par « [email] » ?
Et si oui, comment ? (je suis une brel en php, et je n’ai pas bien reussis, en essayant de copier du code depuis la version imprimable...)
Je crois que ce serait bien pour les queleques utilisateurs ayant désactiver javascript.
Merci
Jerome
Si je me rappelle bien j’avais pensé à cela. Mais comme il s’agit d’un lien, cela devient compliqué lorsqu’on veut faire changer l’apparence du texte « onMouseover ». Il faut alors deux images... En fait, si je ne me trompe pas, il faut du JavaScript. Alors on se retrouve dans la situation de mettre quelque chose pour ceux qui n’ont pas du JavaScript, mais ce quelque chose requiert du JavaScript.
Répondre à ce message
J’ai corrigé le script principal aujourd’hui : Cyril Quemeras m’a fait remarquer que le script mangeait les images des raccourcis comme :
[<img41>->http://www.medicalistes.org/]
.Répondre à ce message
Salut,
Merci pour ce script indispensable.
Je l’ai installé sur mon site et ça marche impec pour les articles.
En revanche, les adresses des auteurs de messages dans le forum restent exposées.
Voir le lien.
Oups !
Le formulaire de ce forum présente une case pour un lien http, mais ce qu’on y met n’apparaît pas.
Voici le lien : http://www.protestanet.be/sp/article19.html#forum
Sa-Cha.
Oui. Comme j’ai dit dans la contrib, je ne me suis occupé que du texte dans les articles.
Pour les balises dont le texte ne passe pas par la fonction « propre » de Spip, j’imagine que tu pourrais appeler le script en utilisant un filtre sur une balise.
Paolo
Salut,
Oui, j’ai bien lu ta restriction, mais je suis incapable d’aller plus loin que de localiser l’endroit où ça se passe.
C’est ici :
Et je ne sais pas par quoi remplacer ce « mailto: » codé en dur dans le squelette.
Bien à toi.
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 : |