Carnet Trucs et Astuces

|couper autrement

SPIP-Contrib :: Carnet Wiki :: Carnet Trucs et Astuces :: Recherche :

|couper autrement

La fonction de Nicolas...

  1. function mon_couper($texte, $taille=50, $suite = ' (...)')
  2. {
  3.   if (!($length=strlen($texte)) OR $taille <= 0) return '';
  4.   $offset = 400 + 2*$taille;
  5.   while ($offset<$length
  6.     AND strlen(preg_replace(",<[^>]+>,Uims","",substr($texte,0,$offset)))<$taille)
  7.     $offset = 2*$offset;
  8.   if (  $offset<$length
  9.       && ($p_tag_ouvrant = strpos($texte,'<',$offset))!==NULL){
  10.     $p_tag_fermant = strpos($texte,'>',$offset);
  11.     if ($p_tag_fermant<$p_tag_ouvrant)
  12.       $offset = $p_tag_fermant+1; // prolonger la coupe jusqu'au tag fermant suivant eventuel
  13.   }
  14.   $texte = substr($texte, 0, $offset); /* eviter de travailler sur 10ko pour extraire 150 caracteres */
  15.   // on utilise les \r pour passer entre les gouttes
  16.   $texte = str_replace("\r\n", "\n", $texte);
  17.   $texte = str_replace("\r", "\n", $texte);
  18.   // sauts de ligne et paragraphes
  19.   $texte = preg_replace("/\n\n+/", "\r", $texte);
  20.   $texte = preg_replace("/<(p|br)( [^>]*)?".">/", "\r", $texte);
  21.   // supprimer les traits, lignes etc
  22.   $texte = preg_replace("/(^|\r|\n)(-[-#\*]*|_ )/", "\r", $texte);
  23.   // supprimer les tags
  24.   $texte = supprimer_tags($texte);
  25.   $texte = trim(str_replace("\n"," ", $texte));
  26.   $texte .= "\n"; // marquer la fin
  27.   // travailler en accents charset
  28.   $texte = unicode2charset(html2unicode($texte, /* secure */ true));
  29.   $texte = nettoyer_raccourcis_typo($texte);
  30.   $flag = 0;
  31.   // corriger la longueur de coupe
  32.   // en fonction de la presence de caracteres utf
  33.   if ($GLOBALS['meta']['charset']=='utf-8'){
  34.     $long = charset2unicode($texte);
  35.     $sv_len = spip_strlen($long);
  36.     $long = spip_substr($long, 0, max($taille,1));
  37.     if (spip_strlen($long) != $sv_len)
  38.       $flag = 1;
  39.     $nbcharutf = preg_match_all('/(&#[0-9]{3,5};)/S', $long, $matches);
  40.     $taille += $nbcharutf;
  41.   }
  42.   // couper au mot precedent
  43.   $long = spip_substr($texte, 0, max($taille-4,1));
  44.   $u = $GLOBALS['meta']['pcre_u'];
  45.   $court = preg_replace("/([^\s][\s]+)[^\s]*\n?$/".$u, "\\1", $long);
  46.   $points = $suite;
  47.   // ne pas faire de (...) si pas de coupe
  48.   if ($flag == 0) {
  49.     $points = '';}
  50.   // trop court ?
  51.   if (spip_strlen($court) < max(0.75 * $taille,2)) {
  52.     $long = spip_substr($texte, 0, $taille);
  53.     $texte = preg_replace("/([^\s][\s]+)[^\s]*\n?$/".$u, "\\1", $long);
  54.     // encore trop court ? couper au caractere
  55.     if (spip_strlen($texte) < 0.75 * $taille)
  56.       $texte = $long;
  57.   } else
  58.     $texte = $court;
  59.   //if (strpos($texte, "\n")) // la fin est encore la : c'est qu'on n'a pas de texte de suite
  60.   //  $points = '';
  61.   // remettre les paragraphes
  62.   $texte = preg_replace("/\r+/", "\n\n", $texte);
  63.   // supprimer l'eventuelle entite finale mal coupee
  64.   $texte = preg_replace('/&#?[a-z0-9]*$/S', '', $texte);
  65.   return quote_amp(trim($texte)).$points;
  66.  
  67.  
  68. }

A mettre dans /squelettes/mes_fonctions.php et appeler par #TEXTE|mon_couper

Je sais pas où mettre ça mais c’est une question qui revient alors...