Carnet Wiki

|couper autrement

La fonction de Nicolas...

function mon_couper($texte, $taille=50, $suite = ' (...)')
{
  if (!($length=strlen($texte)) OR $taille <= 0) return '';
  $offset = 400 + 2*$taille;
  while ($offset<$length
    AND strlen(preg_replace(",<[^>]+>,Uims","",substr($texte,0,$offset)))<$taille)
    $offset = 2*$offset;
  if (  $offset<$length
      && ($p_tag_ouvrant = strpos($texte,'<',$offset))!==NULL){
    $p_tag_fermant = strpos($texte,'>',$offset);
    if ($p_tag_fermant<$p_tag_ouvrant)
      $offset = $p_tag_fermant+1; // prolonger la coupe jusqu'au tag fermant suivant eventuel
  }
  $texte = substr($texte, 0, $offset); /* eviter de travailler sur 10ko pour extraire 150 caracteres */

  // on utilise les \r pour passer entre les gouttes
  $texte = str_replace("\r\n", "\n", $texte);
  $texte = str_replace("\r", "\n", $texte);

  // sauts de ligne et paragraphes
  $texte = preg_replace("/\n\n+/", "\r", $texte);
  $texte = preg_replace("/<(p|br)( [^>]*)?".">/", "\r", $texte);

  // supprimer les traits, lignes etc
  $texte = preg_replace("/(^|\r|\n)(-[-#\*]*|_ )/", "\r", $texte);

  // supprimer les tags
  $texte = supprimer_tags($texte);
  $texte = trim(str_replace("\n"," ", $texte));
  $texte .= "\n"; // marquer la fin

  // travailler en accents charset
  $texte = unicode2charset(html2unicode($texte, /* secure */ true));
  $texte = nettoyer_raccourcis_typo($texte);
  $flag = 0;
  // corriger la longueur de coupe 
  // en fonction de la presence de caracteres utf
  if ($GLOBALS['meta']['charset']=='utf-8'){
    $long = charset2unicode($texte);
    $sv_len = spip_strlen($long);
    $long = spip_substr($long, 0, max($taille,1));
    if (spip_strlen($long) != $sv_len)
      $flag = 1;
    $nbcharutf = preg_match_all('/(&#[0-9]{3,5};)/S', $long, $matches);
    $taille += $nbcharutf;
  }


  // couper au mot precedent
  $long = spip_substr($texte, 0, max($taille-4,1));
  $u = $GLOBALS['meta']['pcre_u'];
  $court = preg_replace("/([^\s][\s]+)[^\s]*\n?$/".$u, "\\1", $long);
  $points = $suite;

  // ne pas faire de (...) si pas de coupe
  if ($flag == 0) {
    $points = '';}
  // trop court ?
  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);
    // encore trop court ? couper au caractere
    if (spip_strlen($texte) < 0.75 * $taille)
      $texte = $long;
  } else
    $texte = $court;

  //if (strpos($texte, "\n")) // la fin est encore la : c'est qu'on n'a pas de texte de suite
  //  $points = '';

  // remettre les paragraphes
  $texte = preg_replace("/\r+/", "\n\n", $texte);

  // supprimer l'eventuelle entite finale mal coupee
  $texte = preg_replace('/&#?[a-z0-9]*$/S', '', $texte);

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

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...

Suske - Mise à jour :22 juin 2010 à 09h34min

Toutes les versions