[spip-dev] Limitation de |inserer_attribut{attribut,valeur}

Bonjour,

Quand l’attribut à insérer est une class, il faudrait ajouter la valeur aux éventuelles class déjà présentes, et non les remplacer.

Constaté avec SPIP 2.0.12 [15876]

-Nicolas

Quand l'attribut à insérer est une class, il faudrait ajouter la valeur aux
éventuelles class déjà présentes, et non les remplacer.

à toi d'écrire le filtre |ajouter_attribut qui va bien ; il y a le
même besoin pour ajouter un style="x:y" (en supprimant éventuellement
un x:z qui serait là).

-- Fil

2010/11/9 Fil <fil@rezo.net>

Quand l’attribut à insérer est une class, il faudrait ajouter la valeur aux
éventuelles class déjà présentes, et non les remplacer.

à toi d’écrire le filtre |ajouter_attribut qui va bien

Tu veux dire patcher inserer_attribut, plutôt, non ?

il y a le même besoin pour ajouter un style=« x:y » (en supprimant éventuellement
un x:z qui serait là).

Effectivement, mais un peu plus chaud.

S’il y a déjà style=« padding: 10px », inserer_attribut(‹ style ›, ‹ padding-top: 5px ›) doit être un peu subtil.

-Nicolas

à toi d'écrire le filtre |ajouter_attribut qui va bien

Tu veux dire patcher inserer_attribut, plutôt, non ?

non, inserer un attribut remplace l'attribut existant le cas échéant ;
si tu changes ça tu risques de créer des incompatibilités.

S'il y a déjà style="padding: 10px", inserer_attribut('style', 'padding-top:
5px') doit être un peu subtil.

je vois que tu as de l'ambition ! :slight_smile:

-- Fil

10/11/10, Nicolas:

S'il y a déjà style="padding: 10px", inserer_attribut('style',
'padding-top: 5px') doit être un peu subtil.

Non. Ça c'est des surcharges qui sont gérées par le langage CSS. Il est
tout à fait correct d'avoir :

machin {
  padding: 10px;
  padding-top: 5px;
}

Ensuite, même si la propriété est exactement la même, ce n'est pas non
plus la peine de la remplacer, pour une raison similaire : il est
possible de laisser :

chose {
  padding: 10px;
  padding: 20px;
}

C'est certes mieux si on le détecte, mais vraiment ce n'est pas la
peine ; les browsers savent gérer. D'ailleurs, dans certains cas ça peut
même être contre-productif. Exemple :

truc {
  background-color: rgb(1, 2, 3);
  background-color: rgba(1, 2, 3, 0.2);
}

Ça fera que les browsers qui connaissent rgba() écraseront la première
définition par la 2e, les autres non. Du coup, on on ne veut *pas* que
la première définition disparaisse.

Pour les attributs class, par contre, on peut en effet détecter les
doublons, mais là encore ce n'est pas la peine.

En tout cas, l'idée de concaténer les attributs style et class
intelligemment au lieu de remplacer, c'est chouette.

oui et non...
il faut penser à gérer le ;

vite fait sur le coin de la table là tout de suite devant un café.
si l'attribut existe, ça ajoute la nouvelle valeur,
si l'attribut n'existe pas, ça le crée :

function ajouter_attribut($balise, $attribut, $val) {
   list($old, $r) = extraire_attribut($balise, $attribut, true);
   if ($old !== NULL) {
     $sep = " ";
     if ($attribut == 'style') {
       $old = rtrim($old, ";");
       $sep = ";";
     }
     $val = $old . $sep . $val;

   }
   balise = inserer_attribut($balise, $attribut, $val);
   return $balise;
}

pas testé avec des onclick et autres, juste des choses simples...

2010/11/10 Fil <fil@rezo.net>

à toi d’écrire le filtre |ajouter_attribut qui va bien

Tu veux dire patcher inserer_attribut, plutôt, non ?

non, inserer un attribut remplace l’attribut existant le cas échéant ;
si tu changes ça tu risques de créer des incompatibilités.

Du coup il faudra changer de filtre selon l’attribut qu’on veut toucher, bof bof… :frowning:

S’il y a déjà style=« padding: 10px », inserer_attribut(‹ style ›, ‹ padding-top:
5px ›) doit être un peu subtil.

je vois que tu as de l’ambition ! :slight_smile:

Toujours ! :wink:

-Nicolas

2010/11/10 davux <da@weeno.net>

10/11/10, Nicolas:

S’il y a déjà style=« padding: 10px », inserer_attribut(‹ style ›,
‹ padding-top: 5px ›) doit être un peu subtil.

Non. Ça c’est des surcharges qui sont gérées par le langage CSS. Il est
tout à fait correct d’avoir :

machin {
padding: 10px;
padding-top: 5px;
}

Je sais bien tout ce que tu dis. Mon exemple n’était pas pertinent, ok.

Il faut au moins faire l’ajout à la suite, plutôt qu’avant, pour que la surcharge se fasse.

Pour les attributs class, par contre, on peut en effet détecter les
doublons, mais là encore ce n’est pas la peine.

Je veux surtout que les class déjà là ne soient pas supprimées.

En tout cas, l’idée de concaténer les attributs style et class
intelligemment au lieu de remplacer, c’est chouette.

A tel point que j’ai du mal à croire que ce ne soit pas le comportement actuel, et que Fil me propose de faire une autre fonction, plutôt que corriger inserer_attribut…

-Nicolas

A tel point que j'ai du mal à croire que ce ne soit pas le comportement
actuel, et que Fil me propose de faire une autre fonction, plutôt que
corriger inserer_attribut...

"corriger" signifierait qu'il y a un bug, or c'est discutable.

A tout le moins il faut permettre par défaut d'écraser l'atttribut
eventuellement déjà présent.

Je fais souvent #TRUC{inserer_attribut{#TRUC|extraire_attribut{x}|concat{y}}}

-- Fil

2010/11/10 denisb <denisb@laposte.net>

Non. Ça c’est des surcharges qui sont gérées par le langage CSS.

oui et non…
il faut penser à gérer le ;

Effectivement.

vite fait sur le coin de la table là tout de suite devant un café.
si l’attribut existe, ça ajoute la nouvelle valeur,
si l’attribut n’existe pas, ça le crée :

function ajouter_attribut($balise, $attribut, $val) {
list($old, $r) = extraire_attribut($balise, $attribut, true);
if ($old !== NULL) {
$sep = " ";
if ($attribut == ‹ style ›) {
$old = rtrim($old, « ; »);
$sep = « ; »;
}
$val = $old . $sep . $val;

}
balise = inserer_attribut($balise, $attribut, $val);
return $balise;
}

Génial !

(même si je préfèrerais vraiment pour ma part que cette gestion soit intégrée à inserer_attribut)

Par contre, je me dis qu’il faut aussi gérer proprement le retrait d’une classe ou d’un style, sans virer complètement l’attribut.

pas testé avec des onclick et autres, juste des choses simples…

Oui, enfin, les onclick, c’est un peu obsolète… :wink:

-Nicolas

2010/11/10 Fil <fil@rezo.net>

A tel point que j’ai du mal à croire que ce ne soit pas le comportement
actuel, et que Fil me propose de faire une autre fonction, plutôt que
corriger inserer_attribut…

« corriger » signifierait qu’il y a un bug, or c’est discutable.

Discutons en alors… :wink:

A tout le moins il faut permettre par défaut d’écraser l’atttribut
eventuellement déjà présent.

Pour préserver l’existant, je comprends bien.

Je fais souvent #TRUC{inserer_attribut{#TRUC|extraire_attribut{x}|concat{y}}}

En gros ce qu’on essaie de faire là de façon élégante, ok.

A la réflexion, je reviens sur mon idée de « corriger » inserer_attribut, je pense qu’il faudrait peut-être faire des filtres spécialisés pour les classes et les styles, avec des comportements bien spécifiques.

inserer_class{« toto »} → n’ajoute la class « toto » que si elle n’est pas déjà là

supprimer_class{« class »} → supprimer la class « toto » si présente, et l’attribut class s’il devient alors vide

inserer_style{« selecteur », « valeur »} → ajoute « selecteur: valeur » s’il n’y était pas déjà, à la fin des styles

supprimer_style{« selecteur »} → supprime toute occurrence du sélecteur

supprimer_style{« selecteur », « valeur »} → supprime uniquement l’occurrence du sélecteur avec cette valeur

Qu’en dites-vous ?

-Nicolas