Complément du filtre couper

Bonjour,

Je souhaite séparer le champ #TEXTE en 2 parties, chaque partie gardant son formatage (gras, etc.). La première partie a un nombre fixé de caractères (par exemple 500) et s'affiche dans une zone, la suite du texte dans une autre.
J'ai bien noté le filtre couper mais 2 questions :
- comment garder le formatage ?
- quelle est la syntaxe pour afficher la deuxième partie ? (qui doit donc démarrer juste après la partie coupée)

Merci

Pascale

On 21 nov, 10:51, Pascale <techni...@sdcinfo.com> wrote:

Bonjour,

Je souhaite séparer le champ #TEXTE en 2 parties, chaque partie
gardant son formatage (gras, etc.). La première partie a un nombre
fixé de caractères (par exemple 500) et s'affiche dans une zone, la
suite du texte dans une autre.
J'ai bien noté le filtre couper mais 2 questions :
- comment garder le formatage ?
- quelle est la syntaxe pour afficher la deuxième partie ? (qui doit
donc démarrer juste après la partie coupée)

Le filtre "couper" ne fera pas ton affaire. Le problème dans ton cas
est qu'il faut faire attention à ce que le texte formatté ne soit pas
coupé entre deux balises, sans quoi ta mise en page risque de partir
en vrille. Bref, il faut écrire un filtre spécifique (en PHP).

Mes deux centimes...

bruno desthuilliers <bruno.desthuilliers@gmail.com> wrote:

On 21 nov, 10:51, Pascale <techni...@sdcinfo.com> wrote:
> Bonjour,
>
> Je souhaite séparer le champ #TEXTE en 2 parties, chaque partie
> gardant son formatage (gras, etc.). La première partie a un nombre
> fixé de caractères (par exemple 500) et s'affiche dans une zone, la
> suite du texte dans une autre.
> J'ai bien noté le filtre couper mais 2 questions :
> - comment garder le formatage ?
> - quelle est la syntaxe pour afficher la deuxième partie ? (qui doit
> donc démarrer juste après la partie coupée)

Le filtre "couper" ne fera pas ton affaire. Le problème dans ton cas
est qu'il faut faire attention à ce que le texte formatté ne soit pas
coupé entre deux balises, sans quoi ta mise en page risque de partir
en vrille. Bref, il faut écrire un filtre spécifique (en PHP).

Une piste possible en adaptant cette contrib ?

--
Dominique
http://wojylac.free.fr

Avant de disposer du filtre "couper", j'ai écrit un filtre qui devrait répondre à tes questions.

Il suffit de mettre le code dans ton fichier "mes_fonctions.php".

Je le copie ci-dessous car je ne crois pas que les pj passent...
A+
    François

<?php
///====================================================================================
/// => tronquerTexte
//====================================================================================
/// Tronquer un texte
///
/// Retourne un tableau
/// table[0] = texte tronqué (en fin de mot et hors balise html)
/// table[1] = ce qui a été supprimé
///
//====================================================================================
/// function tronquerTexte(&$texte, $maxTexte=0) {
    function tronquerTexte(&$texte, $maxTexte=0) {

       if($maxTexte && strlen($texte)>$maxTexte) {

/// => Rechercher $maxtexte caractères hors balises
         $i = 0; // Pour balayer le texte
         $j = 0; // Pour compter les caractères affichés
         while ($i<strlen($texte) && $j<$maxTexte) {
           $car = substr($texte, $i, 1); // Sauter les balises
           if ($car=='<') {
             $i++;
             while ($i<strlen($texte)) {
               $car = substr($texte, $i, 1);
               if ($car=='>') break;
               $i++;
             }
           } elseif ($car=='&') { // Sauter les car. spéciaux
             $i++;
             while ($i<strlen($texte)) {
               $car = substr($texte, $i, 1);
               if ($car==';') break;
               $i++;
             }
           }

           $i++;
           $j++;
         }

         if ($j>=$maxTexte) {
/// => Tronquer
           $texte1 = substr($texte, 0, $i-1);

/// => Rechercher le dernier séparateur...
           $i = 0;
           foreach(array('&nbsp;', ',', '. ', '; ', ' ', "\n") as $sep) {
             if($j=strrpos($texte1, $sep)) $i = max($i,$j);
           }

/// ... et tronquer le texte
           if($i) $texte1 = substr($texte1, 0, $i);

/// => Ne pas couper à l'intérieur d'une balise HTML (cf. mise en page Spip)
           $i = strrpos($texte1,'<');
           $j = strrpos($texte1,'>');
           if($i>0 && (!$j || $j<$i)) $texte1 = substr($texte1, 0, $i);
           $i = strlen($texte1);

/// => Rechercher le dernier retour à la ligne dans la dernière ligne (50 car.)
           $i0 = max(0, $i - 50);
           $i = $i0;
           foreach(array('<br>', '<br />', '<p>', '<p ', '<BR>', '<BR />', '<P>', '<P ') as $sep) {
             if($j=strrpos($texte1, $sep)) $i = max($j,$i);
           }

/// ... et tronquer le texte again
           if($i != $i0) $texte1 = substr($texte1, 0, $i);

/// => Traiter le cas d'un double retour à la ligne
           $texte1 = eregi_replace("<br[ /]*>[ \n]*$", '', $texte1);
           $texte1 = eregi_replace("<p>[ \n]*$", '', $texte1);

/// => Supprimer les espaces en fin de chaine
           $texte1 = eregi_replace("[ \n]*$", '', $texte1);

/// => Récupérer la partie tronquée
           $texte2 = substr($texte, strlen($texte1));

         } else {
           $texte1 = $texte;
           $texte2 = '';
         }

       } else {
         $texte1 = $texte;
         $texte2 = '';
       }

       return array($texte1,$texte2);
    }
?>

Merci pour cette contribution, cela me semble effectivement très adapté. Je vais le tester et je donnerai des nouvelles.

Le 21 nov. 07 à 15:19, FGH a écrit :

Avant de disposer du filtre "couper", j'ai écrit un filtre qui devrait
répondre à tes questions.

Il suffit de mettre le code dans ton fichier "mes_fonctions.php".

Je le copie ci-dessous car je ne crois pas que les pj passent...
A+
    François

<?php
///====================================================================================
/// => tronquerTexte
//====================================================================================
/// Tronquer un texte
///
/// Retourne un tableau
/// table[0] = texte tronqué (en fin de mot et hors balise html)
/// table[1] = ce qui a été supprimé
///
//====================================================================================
/// function tronquerTexte(&$texte, $maxTexte=0) {
    function tronquerTexte(&$texte, $maxTexte=0) {

       if($maxTexte && strlen($texte)>$maxTexte) {

/// => Rechercher $maxtexte caractères hors balises
         $i = 0; // Pour balayer le texte
         $j = 0; // Pour compter les caractères affichés
         while ($i<strlen($texte) && $j<$maxTexte) {
           $car = substr($texte, $i, 1); // Sauter les balises
           if ($car=='<') {
             $i++;
             while ($i<strlen($texte)) {
               $car = substr($texte, $i, 1);
               if ($car=='>') break;
               $i++;
             }
           } elseif ($car=='&') { // Sauter les car. spéciaux
             $i++;
             while ($i<strlen($texte)) {
               $car = substr($texte, $i, 1);
               if ($car==';') break;
               $i++;
             }
           }

           $i++;
           $j++;
         }

         if ($j>=$maxTexte) {
/// => Tronquer
           $texte1 = substr($texte, 0, $i-1);

/// => Rechercher le dernier séparateur...
           $i = 0;
           foreach(array('&nbsp;', ',', '. ', '; ', ' ', "\n") as $sep) {
             if($j=strrpos($texte1, $sep)) $i = max($i,$j);
           }

/// ... et tronquer le texte
           if($i) $texte1 = substr($texte1, 0, $i);

/// => Ne pas couper à l'intérieur d'une balise HTML (cf. mise en page
Spip)
           $i = strrpos($texte1,'<');
           $j = strrpos($texte1,'>');
           if($i>0 && (!$j || $j<$i)) $texte1 = substr($texte1, 0, $i);
           $i = strlen($texte1);

/// => Rechercher le dernier retour à la ligne dans la dernière ligne
(50 car.)
           $i0 = max(0, $i - 50);
           $i = $i0;
           foreach(array('<br>', '<br />', '<p>', '<p ', '<BR>', '<BR
/>', '<P>', '<P ') as $sep) {
             if($j=strrpos($texte1, $sep)) $i = max($j,$i);
           }

/// ... et tronquer le texte again
           if($i != $i0) $texte1 = substr($texte1, 0, $i);

/// => Traiter le cas d'un double retour à la ligne
           $texte1 = eregi_replace("<br[ /]*>[ \n]*$", '', $texte1);
           $texte1 = eregi_replace("<p>[ \n]*$", '', $texte1);

/// => Supprimer les espaces en fin de chaine
           $texte1 = eregi_replace("[ \n]*$", '', $texte1);

/// => Récupérer la partie tronquée
           $texte2 = substr($texte, strlen($texte1));

         } else {
           $texte1 = $texte;
           $texte2 = '';
         }

       } else {
         $texte1 = $texte;
         $texte2 = '';
       }

       return array($texte1,$texte2);
    }
?>

_______________________________________________
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.spip.net/
irc://irc.freenode.net/spip
FAQ : FAQ webmestre - SPIP