Bonjour,
Ma question initiale était :
J'aimerais créer un nouveau filtre à inclure dans mon fichier mes_fonctions.php3 . Ce nouveau filtre, nommé par exemple « |texte_tronque », aura pour but de:
1- tronquer le texte d'un article à 500 caractères (sans coupure de mot, donc ça peut dépasser un peu cette limite) ;
2- si le texte comporte moins de 500 caractères alors, il l'affiche au complet ;
3- si le texte comporte plus de 500 caractères, alors il affiche les 500 premiers caractères (ou un peu plus pour ne pas qu'il y ait une coupure de mot) et place après le texte la mention [Lire la suite] avec un vers l'article complet (i.e. #URL_ARTICLE). En bref, c'est un avant-goût de l'article, mais sans devoir écrire un descriptif pour l'article.
Merci à Sylvain et à Bernard pour leur réponse. Toutefois, vos deux possibilités soulèvent quelques interrogations sur lesquelles vous pourrez (ou d'autres qui le savent) très certainement me répondre sans difficulté.
1- La solution de Sylvain : utiliser #INTRODUCTION qui retourne les 600 premiers caractères
Super Sylvain. Bien que cette balise soit utilisée dans les squelettes de SPIP et présente dans la documentation, elle m'avait échappée. Oups ! Les trois points (...) ne s'affichent à la fin que si le texte a dû être coupé. C'est exactement le comportement que je recherche, mais est-il possible de modifier l'affichage (...) par (lire la suite) avec un lien vers l'article?
Note : Je sais déjà qu'il serait beaucoup plus facile de créer simplement un lien sur le titre dans le genre
<BOUCLE_lien(ARTICLES)>
<a href="#URL_ARTICLE">#TITRE</a>
</BOUCLE_lien>
2- La solution de Bernard Martin-Rabaud
Il suffit simplement de changer 60 par 500 dans tronquer_titre(). Et
éventuellement changer "(...)" par ce que tu veux dans couper_texte()
Merci Bernard. Finalement, c'est exactement la première portion du script php que j'avais déjà ciblé sur spip_contrib. Par contre, est-ce que je peux inclure une boucle SPIP pour remplacer "(...)" ? En d'autres mots, peut-on mélanger dans le script code SPIP et code PHP, comme dans l'exemple tentative ci-dessous sans causer de problème?
// on retourne la partie de $texte jusqu'avant cet espace
if (is_integer($pos) && $pos) return substr($texte, 0, $limite+$pos) . "<BOUCLE_lien(ARTICLES)>
<a href="#URL_ARTICLE">(Lire la suite)</a> </BOUCLE_lien>";
// sinon (pas d'espace après $limite caractères ou juste après $limite caractères) on retourne le texte
else return $texte;
}
Attention : Il ne s'agit que du bout de code pertinent à ma question. Le code initial complet se trouve en fin de courriel.
Cette façon de faire peut-elle conduire à un problème technique? Est-ce conseillé ou non?
Ce filtre est compatible v1.3. Evidemment avec les versions suivantes tu
peux utiliser un filtre avec variables.
Euh, pardons pour ma «non» connaissance de cela, mais comment récupérer la variable xyz inscrite dans le filtre ( p.e. |coupe_texte_xyz ) pour quelle soit utilisée par le script écrit dans mes_fonctions.php3 en tant que la valeur de $limite?
Merci à l'avance de m'éclairer
Patrick
-----------------------------------------------------------------------------
Code complet proposé par Bernard à partir de celui retrouvé sur spip-contrib.
Voici le filtre qui ne coupe que le texte
// tronque un titre à 60 caractères, sans coupure de mot
function tronquer_titre($texte) {
return couper_texte($texte, 60);
}
// coupe une chaîne à $limite caractères, sans coupure de mot
// (un mot est considéré comme un groupe de caractères séparé par des
espaces)
function couper_texte($texte, $limite) {
// la longueur du texte est <= $limite, on retourne le texte entier
if (strlen($texte) <= $limite) return $texte;
// on fait la coupure avant le 1e espace après $limite caractères
$texte = nl2br($texte);
$pos = strpos(substr($texte, $limite), " ");
// s'il y a un espace après $limite caractères ou juste après $limite
caractères
// on retourne la partie de $texte jusqu'avant cet espace
if (is_integer($pos) && $pos) return substr($texte, 0, $limite+$pos) . "
(...)";
// sinon (pas d'espace après $limite caractères ou juste après $limite
caractères) on retourne le texte
else return $texte;
}