Filtre spécial : tronquer le texte

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;
}

Patrick Moisan ---->

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?

Pour tes 2 questions je dirais : le plus simple serait de faire afficher ton
introduction (ou ton texte tronqué) et de rajouter ton lien à la suite dans
le squelette, du genre
<BOUCLE_articleintro(ARTICLES){id_article}>
[(#TEXTE|tronquer)] <a href="#URL_ARTICLE">[lire la suite]</a>
</BOUCLE_articleintro>

pourquoi ne pas faire simple parfois...

------------oO0o0Oo----------
::: DoriaN
::: http://www.3studio.org :::

Le problème avec cette approche est que, dans ce cas, le lien s'affichera même si le texte est déjà complètement affiché...

Le lundi, 20 jan 2003, à 19:33 America/Montreal, oOo-- DoriaN --oOo a écrit :

Patrick Moisan ---->

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?

Pour tes 2 questions je dirais : le plus simple serait de faire afficher ton
introduction (ou ton texte tronqué) et de rajouter ton lien à la suite dans
le squelette, du genre
<BOUCLE_articleintro(ARTICLES){id_article}>
[(#TEXTE|tronquer)] <a href="#URL_ARTICLE">[lire la suite]</a>
</BOUCLE_articleintro>

pourquoi ne pas faire simple parfois...

------------oO0o0Oo----------
::: DoriaN
::: http://www.3studio.org :::

>// 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;
}

Ben non. Tu fais simplement dans ton squelette :

{(#TEXTE|tronquer_titre)]<a href="#URL_ARTICLE">(Lire la suite)</a>

où tronquer_titre est le filtre qui coupe le texte

Bernard Martin-Rabaud
martinrabo@wanadoo.fr

-----Message d'origine-----
De : spip-bounces@rezo.net [mailto:spip-bounces@rezo.net]De la part de
Patrick Moisan
Envoyé : mardi 21 janvier 2003 00:28
À : Sylvain
Cc : spip@rezo.net
Objet : Re: [Spip] Filtre spécial : tronquer le texte

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?

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;
}

_______________________________________________
liste spip
spip@rezo.net - désabonnement : spip-off@rezo.net
Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Documentation de SPIP : http://www.uzine.net/spip

Je sais cela, mais de cette manière le lien s'affichera même si le texte est déjà écrit au complet sur la page (par exemple si la longueur du texte est plus petite que la longueur définie par |tronquer_titre). A moins que je ne comprenne pas bien ?

Je voudrais que le texte (lire la suite) avec lien vers l'article ne s'affiche que si le texte a dû être tronqué.

Par exemple, sur le site http://www.japanim.net/rubrique.php3?id_rubrique=2 (beau design de site) aller voir plus bas dans la page à la brève «Soirée Nomade». Le lien y est présent même si le texte y est complètement affiché. Je voudrais éviter cela si c'est possible.

Anyway, si personne n'a de réponse, je vais me résigner à utiliser la solution plus courante sur les sites SPIP qui consiste à créer le lien directement sur le titre plutôt que d'utiliser (lire la suite). Ne vous en faites pas, après ce mail je ne relancerai pas de nouveau ce problème sur la liste des utilisateurs. Mais, étant «persévérant», j'aimerais bien trouver une solution :slight_smile:

Le mardi, 21 jan 2003, à 02:56 America/Montreal, Bernard Martin-Rabaud a écrit :

Ben non. Tu fais simplement dans ton squelette :

{(#TEXTE|tronquer_titre)]<a href="#URL_ARTICLE">(Lire la suite)</a>

où tronquer_titre est le filtre qui coupe le texte

Bernard Martin-Rabaud
martinrabo@wanadoo.fr

-----Message d'origine-----
De : spip-bounces@rezo.net [mailto:spip-bounces@rezo.net]De la part de
Patrick Moisan
Envoyé : mardi 21 janvier 2003 00:28
À : Sylvain
Cc : spip@rezo.net
Objet : Re: [Spip] Filtre spécial : tronquer le texte

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?

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;
}

_______________________________________________
liste spip
spip@rezo.net - désabonnement : spip-off@rezo.net
Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Documentation de SPIP : http://www.uzine.net/spip

Eh bien tu crées 2 filtres avec toujours le texte comme argument :
- le 1er (avant le lien) affiche le texte tronqué, s'il est tronqué, sinon
il n'affiche rien
- le 2ème (dans le lien) affiche "(Lire la suite)" si le texte est tronqué,
sinon il affiche le texte entier

Bernard Martin-Rabaud
martinrabo@wanadoo.fr

-----Message d'origine-----
De : Patrick Moisan [mailto:moisanpa@fse.ulaval.ca]
Envoyé : mardi 21 janvier 2003 18:07
À : Bernard Martin-Rabaud
Cc : Sylvain; spip@rezo.net
Objet : Re: [Spip] Filtre spécial : tronquer le texte

Je sais cela, mais de cette manière le lien s'affichera même si le
texte est déjà écrit au complet sur la page (par exemple si la longueur
du texte est plus petite que la longueur définie par |tronquer_titre).
A moins que je ne comprenne pas bien ?

Je voudrais que le texte (lire la suite) avec lien vers l'article ne
s'affiche que si le texte a dû être tronqué.

Par exemple, sur le site
http://www.japanim.net/rubrique.php3?id_rubrique=2 (beau design de
site) aller voir plus bas dans la page à la brève «Soirée Nomade». Le
lien y est présent même si le texte y est complètement affiché. Je
voudrais éviter cela si c'est possible.

Anyway, si personne n'a de réponse, je vais me résigner à utiliser la
solution plus courante sur les sites SPIP qui consiste à créer le lien
directement sur le titre plutôt que d'utiliser (lire la suite). Ne vous
en faites pas, après ce mail je ne relancerai pas de nouveau ce
problème sur la liste des utilisateurs. Mais, étant «persévérant»,
j'aimerais bien trouver une solution :slight_smile:

Le mardi, 21 jan 2003, à 02:56 America/Montreal, Bernard Martin-Rabaud
a écrit :

Ben non. Tu fais simplement dans ton squelette :

{(#TEXTE|tronquer_titre)]<a href="#URL_ARTICLE">(Lire la suite)</a>

où tronquer_titre est le filtre qui coupe le texte

Bernard Martin-Rabaud
martinrabo@wanadoo.fr

-----Message d'origine-----
De : spip-bounces@rezo.net [mailto:spip-bounces@rezo.net]De la part de
Patrick Moisan
Envoyé : mardi 21 janvier 2003 00:28
À : Sylvain
Cc : spip@rezo.net
Objet : Re: [Spip] Filtre spécial : tronquer le texte

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?

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;
}

_______________________________________________
liste spip
spip@rezo.net - désabonnement : spip-off@rezo.net
Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Documentation de SPIP : http://www.uzine.net/spip