[Spip] Fonction pour couper le texte SPIP en plusieurs parties dans un flux spip

120 views
Skip to first unread message

telemake .

unread,
Dec 20, 2011, 8:39:36 AM12/20/11
to sp...@rezo.net
Bonjour,

je cherche depuis quelques temps une fonction SPIP permettant de couper le texte en plusieurs parties.

Habituellement, j'utilise la balise [(#TEXTE|couper1000)]

Reste que je souhaite dire à cette fonction, à l'instar de celle de l'affichage des articles ({0,3} {3,3} par exemple), tu coupes le texte du caractère 0 à 1000 puis la 2e partie de 1000 à 2000 etc...

La fonction peut paraitre un peu inutile quand on connait le découpage en page avec les fameux -----
Reste que c'est pour intégrer dans un flux XML (SPIP) bien précis d'un partenaire qui souhaite que la première partie du texte fasse 1000 caractères puis passe à la page 2 jusqu'au 1000 prochains ainsi de suite....

En conclusion, existe t-il ou y'a t-il un moyen d'avoir une fonction du genre [(#TEXTE|couper{0,1000})] [(#TEXTE|couper{1000,2000})] etc....


Merci pour votre grande aide !

A bientôt


YannX

unread,
Dec 20, 2011, 8:50:35 AM12/20/11
to telemake ., sp...@rezo.net
Bonjour,

Le 20/12/2011 14:39, telemake . a écrit :
> Bonjour,
>
> je cherche depuis quelques temps une fonction SPIP permettant de couper
> le texte en plusieurs parties.
>

> Habituellement, j'utilise la balise[(#/TEXTE/|couper1000)]


>
> Reste que je souhaite dire à cette fonction, à l'instar de celle de
> l'affichage des articles ({0,3} {3,3} par exemple), tu coupes le texte
> du caractère 0 à 1000 puis la 2e partie de 1000 à 2000 etc...
>
> La fonction peut paraitre un peu inutile quand on connait le découpage
> en page avec les fameux -----
> Reste que c'est pour intégrer dans un flux XML (SPIP) bien précis d'un
> partenaire qui souhaite que la première partie du texte fasse 1000
> caractères puis passe à la page 2 jusqu'au 1000 prochains ainsi de suite....
>
> En conclusion, existe t-il ou y'a t-il un moyen d'avoir une fonction du

> genre [(#/TEXTE/|couper{0,1000})] [(#/TEXTE/|couper{1000,2000})] etc....

Je ne connais pas de système ou plutot de fonction déjà existente ;
personnellement j'ai dérivé une version de couper() en couper_court()
dans mes_options.php ; mais ces deux fonctions ne gèrent pas la césure,
les espaces entre mots, encore moins la ponctuation !
Est-ce nécessaire dans le cadre de ton besoin ?
Par ailleurs, avoir un filtre de modélisation de #TEXTE*
qui nous ressortirait par Blocs (pour les nouveaux itérateurs)
le #TEXTE fragmenté par :
- les traditionnels ----
- les alinéa de sommaire (définis par {{{ )
- les séparateurs de pages (comme les ++++ du CS)
- la longueur absolue (format fixe à -1000, et le n° de fragment)
- la longueur mise-en-forme (approximativement, et len° de fragment)
serait un outil qui généraliserait/factoriserait du code qui doit
exister dans plein de fonctions de SPIP, et ouvrirait par ailleurs
la voie à une extension de CRAYONS à la mode MediaWiki ...
Mais j'ai dû rever : je ne maitrise pas assez les regexp pour....
(car je n'ai que les idées, mais pas le savoir-faire suffisant...dslé)
@+
YannX
_______________________________________________
liste spip
sp...@rezo.net - désabonnement : envoyer un mail à spip...@rezo.net

Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
http://archives.rezo.net/spip.mbox/

Documentation de SPIP : http://www.spip.net/

Irc : de l'aide à toute heure : http://spip.net/irc

Vincent

unread,
Dec 20, 2011, 8:55:37 AM12/20/11
to sp...@rezo.net
Bonjour,

ca ressemble furieusement a la fonction substr de php ce dont tu parles
... De mémoire, il est possible d'appeller des fonctions php direct si
leur premier paramètre est le texte. Du coup,
[(#TEXTE|substr{1000,2000})] devrait faire l'affaire ... ( attention,
c'est brut de décoffrage: ça coupera à 1000 caractères pile, sans
fioritures... )

Sinon, couper est définie dans ecrire/inc/texte.php , cela peut servir
de base à la création d'un filtre maison à placer dans le fichier
mes_fonctions.php du squelette par exemple.

YannX

unread,
Dec 20, 2011, 9:23:41 AM12/20/11
to Vincent, sp...@rezo.net
Le 20/12/2011 14:55, Vincent a écrit :
> Bonjour,
>
> ca ressemble furieusement a la fonction substr de php ce dont tu parles
> .... De mémoire, il est possible d'appeller des fonctions php direct si

> leur premier paramètre est le texte. Du coup,
> [(#TEXTE|substr{1000,2000})] devrait faire l'affaire ... ( attention,
> c'est brut de décoffrage: ça coupera à 1000 caractères pile, sans
> fioritures... )
>
> Sinon, couper est définie dans ecrire/inc/texte.php , cela peut servir
> de base à la création d'un filtre maison à placer dans le fichier
> mes_fonctions.php du squelette par exemple.
>
Le 20/12/2011 15:00, telemake . a écrit :
> Bonjour Yann,
>
> merci pour ta réponse.
>
> J'ai également multiplié la fonction couper mais cela me coupe que le
début du texte (exemple les 100 premiers caractères)
> Parviens-tu à dire à ta fonction couper coupe de 0 à 100 (par
exemple) puis à l'autre fonction coupe de 100 à 200, quitte à multiplier
les fonctions ?
> Césure ou non, ce serait déjà un joli pas pour moi :)
En fait, je pensais simplement a rajouter un argument supplémentaire
indiquant le numéro de fragment, du genre couperec
function couperec($texte, $taille=50, $ifrag = 0, $suite =
' (...)')
(avec une valeur par défaut à zero pour le premier...)
qui se récurserait.... c'est-à-dire qui après le premier appel,
(nécessaire eventuellement pour avoir la longueur exacte du fragment
retourné),
renverrait le résultat du ifrag-1 appel .....

[[Cf. post de Vincent : effectivement, c'est la meme idée (plutot
SUBSTR$ du Basic ;-))
mais en gérant les bonnes cesures (si couper le fait, et donc les
fragments..) ]]
function couperec($texte, $taille=50, $ifrag = 0, $suite = '') {
if ($ifrag==0) {
return couper($texte, $taille, $suite); }
else return couperrec( substr($texte, strlen(couperec($texte,
$taille=50, $ifrag = 0, $suite = '') ), $offset), $ifrag-1, $taille,
$suite); } // a peu prêt !!
}
// atttention, c'est parfaitement goret comme ecriture......
// exceed time limitation garantie.....


Mais enn recherchant la syntaxe exacte, je m'apercois que
nous sommes un peu coincés par la syntaxe d'origine :
- d'une part la taille est-elle prévue pour utiliser d'autres
séparateurs comme je l'indiquais ?
- d'autre par les caractères de suite empechent de générer facilement le
n°de fragment,
donc cela impose -je crains- de rajouter une fonction nouvelle, au core
ou en plugin ou mes_options...

J'avoue ne pas regarder plus avant le code :
70 lignes, dans inc\texte.php c'est bcp !
Mais peut-etre que Cedric s'il voit cela, aurait la bonne formulation

Denis Chenu

unread,
Dec 20, 2011, 10:57:17 AM12/20/11
to sp...@rezo.net
Salut,

En se basant sur #INTRODUCTION{1000} ( ou sur couper{1000}}

Faire un truc du genre:

#SET{nbcar,#INTRODUCTION{1000}|strlen}

Puis un
[(#TEXTE|substr{#GET{nbcar},2000})]

Ça ne gère pas les #DESCRIPTIF ni les #CHAPO, mais si c'est que du
texte, pourquoi pas.

Denis


Le 20/12/2011 14:55, Vincent a écrit :

telemake .

unread,
Dec 20, 2011, 11:26:07 AM12/20/11
to shno...@spip.org, sp...@rezo.net
Merci pour votre aide à tous les 3,

je m'attèle à tester ça,

A bientôt

> Date: Tue, 20 Dec 2011 16:57:17 +0100
> From: shno...@spip.org
> To: sp...@rezo.net
> Subject: Re: [Spip] Fonction pour couper le texte SPIP en plusieurs parties dans un flux spip

telemake .

unread,
Jan 8, 2012, 11:00:00 AM1/8/12
to sp...@rezo.net
Bonjour,

j'ai mise en place cette fonction pour couper le texte dans mon flux spip

----------
function coupepropre1($texte, $taille=1000) {
    $texte = substr($texte, 0, 1000);
   
    $long = spip_substr($texte, 0, max($taille-4,1));
    $court = ereg_replace("([^[:space:]][[:space:]]+)[^[:space:]]*\n?$", "\\1", $long);
    $points = ' (...)';

  if (spip_strlen($court) < max(0.75 * $taille,2)) {
    $long = spip_substr($texte, 0, $taille);
    $texte = preg_replace("/([^\s][\s]+)[^\s]*\n?$/".$u, "\\1", $long);
    if (spip_strlen($texte) < 0.75 * $taille)
      $texte = $long;
  } else
    $texte = $court;

   $texte = preg_replace('/&#?[a-z0-9]*$/', '', $texte);

    return trim($texte).$points;
}
---------------------------------

Elle fonctionne.
J'ai dupliqué cette fonction en "couperpropre2" pour couper 1000, 1000 "couperpropre3" pour 2000, 1000 etc..
Je ne sais pas si c'est la solution la plus appropriée d'autant que sur certaines parties il me manque quelques lettres en début de partie suivante !

Quelqu'un a t-il une judicieuse idée ? ;)

Merci d'avance,



From: tele...@hotmail.com
To: shno...@spip.org; sp...@rezo.net
Date: Tue, 20 Dec 2011 17:26:07 +0100
_______________________________________________ liste spip sp...@rezo.net - d�sabonnement : envoyer un mail � spip...@rezo.net Infos et archives : http://listes.rezo.net/mailman/listinfo/spip http://archives.rezo.net/spip.mbox/ Documentation de SPIP : http://www.spip.net/ Irc : de l'aide � toute heure : http://spip.net/irc
Reply all
Reply to author
Forward
0 new messages