[spip-dev] bug inserer_attribut (vu dans image_reduire)

Salut,
tiens, en verifiant mes histoire de plugin diapo, je tombe sur un truc pas net avec image_reduire.
Le modèle diapo contient une image (load ajax) mais le tag est ecrit sans espace avant le /> final :
<img class="diapo_loading" alt="<:diapo:loading:>" style="display:none" src="[(#CHEMIN{'img_pack/loading.gif'})]"/>

après passage dans #TEXTE|image_reduire{500,0}
il devient :
<img class='diapo_loading' alt="Chargement en cours..." style='height:16px;width:16px;display:none' src="local/cache-vignettes/L16xH16/loading-e0cb4.gif"/ width='16' height='16' >

en fait, ca vient du inserer_attribut fait à la fin car dans inserer_attribut, on a :

        // preferer une balise " />" (comme <img />)
        if (preg_match(',[[:space:]]/>,S', $balise))
            $balise = preg_replace(",[[:space:]]/>,S", $insert."/>", $balise, 1);
        // sinon une balise <a ...> ... </a>
        else
            $balise = preg_replace(",>,", $insert.">", $balise, 1);
    }
, non ?

Pourquoi pas tout simplement :
        if (preg_match(',/>,S', $balise))

@++

bref, normal, mais c'est un peu génant que inserer_attribut pete les tag quand on a pas mis d'espace avant le />

Je reformule :
inserer_attribut sur un tag de la forme <tag attribut="valeur"/> ne marche pas (donne <tag attribut="valeur"/ attibut2='valeur2'> ), les tags doivent obligatoire contenir un espace avant le />
Je demande donc : cette contrainte (qui ne concerne à priori que le XHTML strict) est-elle vraiment nécessaire ?
ne peut-on pas faire sauter [[:space:]] dans le preg_match et le preg_replace ?

@++

Stephane a écrit :

Essaie peut-être avec "\s?" à la place de "[[:space:]]", et si si ça
marche pour les trois cas-tests, commite :slight_smile:

Faire sauter c'est trop radical car c'est pas beau d'avoir
attr="toto"/> sans espace.

Fil a écrit :

Essaie peut-être avec "\s?" à la place de "[[:space:]]",

oui c'est mieux, ca evite d'avoir 2 espaces.

et si si ça
marche pour les trois cas-tests, commite :slight_smile:
  

ok, je teste un peu avant de commiter

Faire sauter c'est trop radical car c'est pas beau d'avoir
attr="toto"/> sans espace.
  

ca de toutes facons, ca ne risque pas : $insert = " $attribut='$val' ";

Essaie peut-être avec "\s?" à la place de "[[:space:]]", et si si ça
marche pour les trois cas-tests, commite :slight_smile:

Faire sauter c'est trop radical car c'est pas beau d'avoir
attr="toto"/> sans espace.

C'est surtout que les navigateurs qui ne savent pas interpréter le XHTML peuvent comprendre que la valeur de « attr » est « "toto"/ » ...

Bon, finalement, je propose :

@@ -1502,7 +1502,7 @@
     if ($vider AND strlen($val)==0)
         $insert = '';
     else
- $insert = " $attribut='$val' ";
+ $insert = " $attribut='$val'";
      list($old, $r) = extraire_attribut($balise, $attribut, true);
@@ -1512,11 +1512,11 @@
     }
     else {
         // preferer une balise " />" (comme <img />)
- if (preg_match(',[[:space:]]/>,S', $balise))
- $balise = preg_replace(",[[:space:]]/>,S", $insert."/>", $balise, 1);
+ if (preg_match(',/>,', $balise))
+ $balise = preg_replace(",\s?/>,S", $insert." />", $balise, 1);
         // sinon une balise <a ...> ... </a>
         else
- $balise = preg_replace(",>,", $insert.">", $balise, 1);
+ $balise = preg_replace(",\s?>,S", $insert.">", $balise, 1);
     }
      return $balise;

=> on supprime l'espace après le insert pour ne le mettre que dans les tags fermés
=> sur le test du tag, la presence de l'espace ou non ne joue pas
=> pour le remplacement dans un tag fermé, on supprime l'espace eventuel et on le remet systematiquement
=> pour un tag ouvrant, on supprime l'espace eventuel et on ne le remet pas
=> les S ne sont utiles que pour les regexp commencant par un caractère optionnel.

J'ai bon ?

Chez moi ca marche en tous cas, donc sauf contre ordre, je commite ca ce soir en 2.0 et 2.1 (est-ce que je passe ca aussi en 1.9.2 ?)

Par contre, je voulais ajouter un test unitaire et... bon, ben je vais faire quelques betises, c'est sur, j'ai pas tout compris aux tests unitaires....
la il y a un test de inserer_attribut dans extraire_attribut ?
Je fais un inserer_attibut.php avec une batterie de cas ?
bon, je vais déjà essayer de comprendre comment ca marche.

Stephane a écrit :