#5 text_truncate : mettre l'option `html` à true par défaut

Open
opened 10 months ago by tcharlss · 4 comments
Owner

Quand on utilise text_truncate sans passer aucune option, par défaut ça ne prend pas en compte les balises html, l'option html afférente est à mise à false :

$default = array(
	'ending' => '...', 'exact' => true, 'html' => false
);

Du coup quand le texte contient des balises html, ça coupe brut de pomme en laissant les balises ouvertes :

[(#TEXTE|text_truncate{30})]

Résultat :

`<p>Bonjour <strong>les enfa...`

Avec l'option qui va bien, tout est ok bien sûr :

[(#TEXTE|text_truncate{30, #ARRAY{html,oui}})]

Résultat :

`<p>Bonjour <strong>les enfants</strong>.</p>`

Je ne vois pas pourquoi ce n'est pas sa valeur par défaut :

  • Cette fonction est une alternative à couper(), si on l'utilise à la place c'est précisément parcequ'on veut garder les balises html.
  • 99% du temps c'est un filtre qu'on applique sur des textes de contenus éditoriaux qui contiennent donc potentiellement des balises html.

Et aussi, si ça doit passer dans le noyau il faudrait réfléchir à harmoniser le nom et la signature avec couper() je trouve, qu'on puisse passer facilement de l'une à l'autre.

Quand on utilise text_truncate sans passer aucune option, par défaut ça ne prend pas en compte les balises html, [l'option `html` afférente est à mise à `false`](https://git.spip.net/spip-contrib-extensions/spip-bonux/src/branch/master/spip_bonux_options.php#L209) : ```php $default = array( 'ending' => '...', 'exact' => true, 'html' => false ); ``` Du coup quand le texte contient des balises html, ça coupe brut de pomme en laissant les balises ouvertes : ```html [(#TEXTE|text_truncate{30})] Résultat : `<p>Bonjour <strong>les enfa...` ``` Avec l'option qui va bien, tout est ok bien sûr : ```html [(#TEXTE|text_truncate{30, #ARRAY{html,oui}})] Résultat : `<p>Bonjour <strong>les enfants</strong>.</p>` ``` Je ne vois pas pourquoi ce n'est pas sa valeur par défaut : * Cette fonction est une alternative à `couper()`, si on l'utilise à la place c'est précisément parcequ'on veut garder les balises html. * 99% du temps c'est un filtre qu'on applique sur des textes de contenus éditoriaux qui contiennent donc potentiellement des balises html. ---- Et aussi, si ça doit passer dans le noyau il faudrait réfléchir à harmoniser le nom et la signature avec `couper()` je trouve, qu'on puisse passer facilement de l'une à l'autre.
Poster
Owner

cc @rastapopoulos, t'es pas dans les watchers

cc @rastapopoulos, t'es pas dans les watchers
Poster
Owner

Et donc pour faire suite à la dernière remarque, ça pourrait prendre la forme d'un filtre intermédiaire couper_html() qui complémenterait couper() : nom apparenté, même signature avec un paramètre supplémentaire à la fin.

function couper_html($texte, $taille = 50, $suite = null, $options = array()) {

    $defaut = array(
        'html' => true,
    );
    if ($suite) {
    	$defaut['ending'] = $suite;
    }
    $options_truncate = array_merge($defaut, $options);

    return text_truncate($texte, $taille, $options_truncate);
}

(Code vite fait pour montrer, pas testé hein...)

Et donc pour faire suite à la dernière remarque, ça pourrait prendre la forme d'un filtre intermédiaire `couper_html()` qui complémenterait `couper()` : nom apparenté, même signature avec un paramètre supplémentaire à la fin. ```php function couper_html($texte, $taille = 50, $suite = null, $options = array()) { $defaut = array( 'html' => true, ); if ($suite) { $defaut['ending'] = $suite; } $options_truncate = array_merge($defaut, $options); return text_truncate($texte, $taille, $options_truncate); } ``` (Code vite fait pour montrer, pas testé hein...)

Je ne vois pas pourquoi ce n'est pas sa valeur par défaut :

Et bien tout simplement parce que cette fonction vient d'ailleurs et est maintenue, et que quand on veut la mettre à jour (ce qu'il faudrait apparemment depuis) c'est quand même mieux de pouvoir alors la copier telle quelle sans refaire des modifs à l'intérieur.

Et c'est bien ce que tu décris là qui était prévu, avoir une autre fonction par dessus, qui peut avoir des meilleures valeurs par défaut.

couper_html parait le plus simple à comprendre pour l'instant, si quelqu'un trouve mieux…

Attention il faut aussi mettre "exact" à false, comme c'était indiqué dans le log de commit qui l'ajoutait. Car par défaut c'est "exact" et ça veut dire que ça peut couper au milieu d'un mot ou pire d'une balise.

Il faudrait 1) mettre à jour la fonction, 2) faire une fonction englobante, et 3) faire une PR avec tout ça.

> Je ne vois pas pourquoi ce n'est pas sa valeur par défaut : Et bien tout simplement parce que cette fonction vient d'ailleurs et est maintenue, et que quand on veut la mettre à jour (ce qu'il faudrait apparemment depuis) c'est quand même mieux de pouvoir alors la copier telle quelle sans refaire des modifs à l'intérieur. Et c'est bien ce que tu décris là qui était prévu, avoir une autre fonction par dessus, qui peut avoir des meilleures valeurs par défaut. couper_html parait le plus simple à comprendre pour l'instant, si quelqu'un trouve mieux… Attention il faut aussi mettre "exact" à false, comme c'était indiqué dans le log de commit qui l'ajoutait. Car par défaut c'est "exact" et ça veut dire que ça peut couper au milieu d'un mot ou pire d'une balise. Il faudrait 1) mettre à jour la fonction, 2) faire une fonction englobante, et 3) faire une PR avec tout ça.
JLuc commented 10 months ago
Collaborator

Lors de ma gafouille, j'ai eu le temps de voir que les paramètres des options sont différents avec la mise à jour. Il faudra donc gérer une phase de compatibilité.

Lors de ma gafouille, j'ai eu le temps de voir que les paramètres des options sont différents avec la mise à jour. Il faudra donc gérer une phase de compatibilité.
Sign in to join this conversation.
No Label
No Milestone
No Assignees
3 Participants
Notifications
Due Date

No due date set.

Dependencies

This issue currently doesn't have any dependencies.

Loading…
There is no content yet.