Valider c934c0d1 rédigé par Glop's avatar Glop Validation de cerdic
Parcourir les fichiers

fix: Filtre `|couper`, cas où l'on coupe dès le premier mot

Le filtre tente de ne pas tronquer le dernier mot si la coupe
tombe au milieu de celui-ci. Pour cela, il essaie de couper
au mot précédent.

Mais lorsque le premier mot est long (ou que la longueur de
coupe est courte), il se peut que l'on coupe au milieu du
premier mot, auquel cas il ne faut pas couper au mot précédent
mais carrément en début de chaîne. Les mécanismes suivants
pour s'assurer que la chaîne coupée n'est pas trop courte
feront ensuite en sorte que la coupe se fasse au caractère,
si nécessaire.

Ainsi, par exemple, lorsque le mot long n'est pas le premier :
```
[(#VAL{A supercalifragilisticexpialidocious}|couper{22})]
```
renvoie correctement `A supercalifragilistic` (22 caractères).
La coupure est faite au caractère, sans ajouter les points de
suite.

Par contre, si le mot long est en premier :
```
[(#VAL{Supercalifragilisticexpialidocious}|couper{20})]
```
renvoie
* jusqu'à eebacfbe inclus :
  `Supercalifragili (...)` (22 caractères → KO) ;
* après ce correctif :
  `Supercalifragilistic` (20 caractères → OK).

Ce correctif rétablit un comportement cohérent de la coupe,
que le mot long soit en premier ou non.

Refs: #5422
parent 9980f342
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+3 −3
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -419,10 +419,10 @@ function couper($texte, $taille = 50, $suite = null) {
	$texte = trim(str_replace("\n", ' ', $texte));
	$texte .= "\n";  // marquer la fin

	// couper au mot precedent
	// couper au mot precedent (ou au début de la chaîne si c'est le premier mot)
	$long = spip_substr($texte, 0, max($taille - 4, 1));
	$u = $GLOBALS['meta']['pcre_u'];
	$court = preg_replace("/([^\s][\s]+)[^\s]*\n?$/" . $u, "\\1", $long);
	$court = preg_replace("/(^|[^\s][\s]+)[^\s]*\n?$/" . $u, "\\1", $long);
	if (is_null($suite)) {
		$suite = (defined('_COUPER_SUITE') ? _COUPER_SUITE : ' (...)');
	}
@@ -432,7 +432,7 @@ function couper($texte, $taille = 50, $suite = null) {
	if (spip_strlen($court) < max(0.75 * $taille, 2)) {
		$points = '';
		$long = spip_substr($texte, 0, $taille);
		$texte = preg_replace("/([^\s][\s]+)[^\s]*\n?$/" . $u, "\\1", $long);
		$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;