[spip-dev] [spip-commit] r12416 - spip/ecrire/public

passer des arguments à une chaine internationalisee sous la forme :
<:chaine{argument1=texte,argument2=#BALISE}:>

l'ecriture la plus complexe devient <:module:chaine{argument1=texte,argument2=#BALISE}|filtre1{texte,#BALISE}|filtre2:>

Génial !

Remarque : on ne peut pas utiliser les caracteres ':' ni '>' en parametre des filtres (trop nul en regexp pour corriger ca, il faudrait retoucher (\|[^:>]*)? pour interdire la sequence ':>' et non les 2 caracteres)

Pourquoi pas simplement (\|[^>]*?)?

Details: http://trac.rezo.net/trac/spip/changeset/12416

-- Fil

Fil a écrit :

Remarque : on ne peut pas utiliser les caracteres ':' ni '>' en parametre des filtres (trop nul en regexp pour corriger ca, il faudrait retoucher (\|[^:>]*)? pour interdire la sequence ':>' et non les 2 caracteres)
    
Pourquoi pas simplement (\|[^>]*?)?
  

ca interdirait l'utilisation du filtre sioui sinon ? je me trompe ?

Yoann Nogues a écrit :

Fil a écrit :

Remarque : on ne peut pas utiliser les caracteres ':' ni '>' en parametre des filtres (trop nul en regexp pour corriger ca, il faudrait retoucher (\|[^:>]*)? pour interdire la sequence ':>' et non les 2 caracteres)
    
Pourquoi pas simplement (\|[^>]*?)?
  

ca interdirait l'utilisation du filtre sioui sinon ? je me trompe ?

non, non, à ce stade, ca récupère juste tout ce qu'il y a à partir du |
ca interdit uniquement |> et l'utilisation de '>' dans les chaines passées en parametres aux filtres.

mais je me demande en fait si c'est necessaire tout simplement :

define('BALISE_IDIOMES',',<:(([a-z0-9_]+):)?([a-z0-9_]+)({([^}]*)})?((\|.*)?:>),iS');
devrait faire l'affaire, non ?
vu que la capture englobante doit finir par :>

du coup, le seul truc interdit, c'est ':>' dans les chaines passées aux filtres.

je teste un peu et je corrige si c'est bon

@++

je teste un peu et je corrige si c'est bon

Je n'ai pas réussi à passer {login=#SESSION{login}} ni même {login=#GET{truc}}

Fil a écrit :

je teste un peu et je corrige si c'est bon
    
Je n'ai pas réussi à passer {login=#SESSION{login}} ni même {login=#GET{truc}}

ah ben oui, j'avais pas pensé à ca, j'ai fait qu'avec des #BALISES

je revois ma copie...

Fil a écrit :

je teste un peu et je corrige si c'est bon
    
Je n'ai pas réussi à passer {login=#SESSION{login}} ni même {login=#GET{truc}}

ca doit etre mieux maintenant...

Je n'ai pas réussi à passer {login=#SESSION{login}} ni même
{login=#GET{truc}}

Ca y est ça marche. Au passage une petite fragilité (mais je ne sais
pas si elle vient de là) :

ça casse :
  #SET{login, hop}
  <:pass_rappel_login{login=#GET{login}}:>

ça passe :
  [(#SET{login, hop})]
  <:pass_rappel_login{login=#GET{login}}:>

Fil a écrit :

Je n'ai pas réussi à passer {login=#SESSION{login}} ni même
{login=#GET{truc}}
      
Ca y est ça marche. Au passage une petite fragilité (mais je ne sais
pas si elle vient de là) :

ça casse :
  #SET{login, hop}
  <:pass_rappel_login{login=#GET{login}}:>

ça passe :
  [(#SET{login, hop})]
  <:pass_rappel_login{login=#GET{login}}:>

chez moi les 2 marchent

Stephane a écrit :

Fil a écrit :

ça casse :
  #SET{login, hop}
  <:pass_rappel_login{login=#GET{login}}:>

ça passe :
  [(#SET{login, hop})]
  <:pass_rappel_login{login=#GET{login}}:>

chez moi les 2 marchent

SPIP 2.0.0 dev SVN [12415] sur Apache/2.2.4 (Win32) PHP/5.2.4 mod_python/3.3.1 Python/2.5
install toute neuve

j'ai testé aussi
#SET{login, hop}<:pass_rappel_login{login=#GET{login}}:>

tu n'aurais pas des caractères bizarres dans ton squelette ?

@++

tu n'aurais pas des caractères bizarres dans ton squelette ?

Ah j'ai compris. C'est parce que j'avais juste au-dessus un autre test
(faux, celui-là) :

<:taille_en_octets{5000}:>
#SET{login, hop}
<:pass_rappel_login{login=#GET{login}}:>

à ce moment-là la sanction est terrible (mais au fond on s'en fiche un peu) :
Parse error: syntax error, unexpected '}', expecting ')' in
/Users/fil/Sites/spip/ecrire/public/composer.php(64) : eval()'d code
on line 19

Bon c'est bien cool cette évolution. Si ça ne casse rien, faudrait
l'intégrer dans la branche 2.0

-- Fil

Si on en vient à intégrer des concepts nouveaux comme cela, qui ont un risque de bug collatéral assez important, au dernier moment avant une sortie de stable, je comprends pas bien le principe de la beta...

Si on en vient à intégrer des concepts nouveaux comme cela, qui ont un
risque de bug collatéral assez important, au dernier moment avant une sortie
de stable, je comprends pas bien le principe de la beta...

oui tu as raison

-- Fil

cedric.morin@yterium.com a écrit :

tu n'aurais pas des caractères bizarres dans ton squelette ?

Ah j'ai compris. C'est parce que j'avais juste au-dessus un autre test
(faux, celui-là) :

<:taille_en_octets{5000}:>
#SET{login, hop}
<:pass_rappel_login{login=#GET{login}}:>

à ce moment-là la sanction est terrible (mais au fond on s'en fiche un peu) :
Parse error: syntax error, unexpected '}', expecting ')' in
/Users/fil/Sites/spip/ecrire/public/composer.php(64) : eval()'d code
on line 19

c'est corrigé (j'avais un peu trop simplifié...)
du coup, le caractère '>' n'est utilisable ni dans les arguments, ni dans les filtres.

Bon c'est bien cool cette évolution. Si ça ne casse rien, faudrait
l'intégrer dans la branche 2.0

Si on en vient à intégrer des concepts nouveaux comme cela, qui ont un risque de bug collatéral assez important, au dernier moment avant une sortie de stable, je comprends pas bien le principe de la beta...

ben c'est pas vraiment un concept nouveau, c'est juste un petit manque qui est comblé.
J'avais jamais vu les filtres sur ca, j'utilisais [(#REM|concate{:module:chaine:}|_T)] et je suppose qu'on pouvait ecrire[(#REM|concate{:module:chaine:}|_T{#ARRAY{...
(surement un poil plus compliqué pour passer le bon tableau)

Maintenant c'est clair que ca merite d'etre blindé (fais je pense...) et bien testé (surtout que les regexp, c'est vraiment pas mon truc...) et que ca peut en plus pousser à faire des modifs sur certaines chaines internationalisées (coupées en 2, de memoire il y en a 2 ou 3).

Donc s'il n'y a pas de beta2 au programme, mieux vaut effectivement attendre la prochaine, mais les risques sont quand meme assez limités maintenant je pense.

@++

PS : <:chaine{xxx}:> n'est plus reconnu comme une chaine internationalisée, ce qui me parait plus logique et devrait facilité le repérage des erreurs de syntaxe
<:chaine{xxx=}:> est par contre valide (argument xxx à vide => @xxx@ disparait de la chaine)
et <:chaine{=}:> aussi (equivalent à <:chaine:>)

j'ai poussé le concept un poil plus loin, pour pouvoir aussi choisir le module ou la chaine dynamiquement.
en gros le but, c'est de pouvoir faire par exemple:
<:#ENV{module_lang}:#GET{message,message_defaut}:>
au lieu de #ENV{module_lang}|concate{:,#GET{message,message_defaut}}|_T
et pouvoir du coup passer simplement des arguments.

j'ai fait ca en passant une couche de phraser_champs (dans phraser_html.php) / calculer_liste (dans compiler.php) sur le nom du module et de la chaine.
au niveau regexp, j'ai fait betement :
<:(([a-z0-9_]+|#[A-Z0-9_]+{?[^}]*}?):)?([a-z0-9_]+|#[A-Z0-9_]+{?[^}]*}?)({([^\|=>]*=[^\|>]*)})?((\|[^>]*)?:>)
c'est assez limité et sans doute moins robuste, mais ca marche pour les balises simples sans trop perturber l'existant

ca vous interesse ?
en plugin ? dans le corps ?
j'ai aussi fait le report en 1.9.2, idem, ca interesse qqun ?

@++

Phraser_champs est capable de repérer des champs imbriqués (comme #ENV{x,#ENV{z}} par exemple) or, comme tu le signales, ta Regexp na va laisser passer que des champs simples. Je trouve ennuyeux de faire croire que <:#ENV{x,#ENV{z}}:> serait disponible alors que ça ne l'est pas. Vu que ça n'apporte qu'un peu de concision (le concate dans ton exemple ci-dessus) ça ne me parait pas fondamental.

En revanche, je serais assez partisan de mettre là où tu en arrivé hier dans la beta, parce ce que ça rationalise l'existant: il n'était pas normal de ne pas pouvoir fournit le 2e argument de _T().

Committo,Ergo:Sum

S'lt

Je serais partisan d'attendre avant de la passer dans la branche 2.
A l'instant où il y a un doute meme minime, je crois que ça peux
valoir le coup de patienter un peu.

Je ne pense pas que ce soit pénalisant pour le moment. Rien n'empeche
d'intégrer dans une RC2 ou de faire une mise à jour "mineure" par la
suite.

Km

Committo,Ergo:sum a écrit :

j'ai poussé le concept un poil plus loin, pour pouvoir aussi choisir le module ou la chaine dynamiquement.
en gros le but, c'est de pouvoir faire par exemple:
<:#ENV{module_lang}:#GET{message,message_defaut}:>
au lieu de #ENV{module_lang}|concate{:,#GET{message,message_defaut}}|_T
et pouvoir du coup passer simplement des arguments.

j'ai fait ca en passant une couche de phraser_champs (dans phraser_html.php) / calculer_liste (dans compiler.php) sur le nom du module et de la chaine.
au niveau regexp, j'ai fait betement :
<:(([a-z0-9_]+|#[A-Z0-9_]+{?[^}]*}?):)?([a-z0-9_]+|#[A-Z0-9_]+{?[^}]*}?)({([^\|=>]*=[^\|>]*)})?((\|[^>]*)?:>)

c'est assez limité et sans doute moins robuste, mais ca marche pour les balises simples sans trop perturber l'existant

ca vous interesse ?

Phraser_champs est capable de repérer des champs imbriqués (comme #ENV{x,#ENV{z}} par exemple) or, comme tu le signales, ta Regexp na va laisser passer que des champs simples. Je trouve ennuyeux de faire croire que <:#ENV{x,#ENV{z}}:> serait disponible alors que ça ne l'est pas.

ben ce qui est surtout embetant, c'est que c'est juste un probleme de regexp, moi je suis incapable de faire mieux.

bon, d'un autre coté, c'est pas bloquant dans la mesure ou on peut toujours faire un #SET avant et utiliser le #GET, ca merite juste d'etre documenté.

Vu que ça n'apporte qu'un peu de concision (le concate dans ton exemple ci-dessus) ça ne me parait pas fondamental.

oui, c'est surtout ca la question, est-ce utile ???
perso je n'en ai pas l'utilité, j'ai un choix dynamique du module mais je passe par un filtre car c'est un peu specifique (recherche dans le module puis dans le local renvoyant vide ou une valeur par defaut passée au filtre)
je me disais par contre qu'un truc du genre :
#SET{module,local#ID_SECTEUR}
<:#GET{module}:chaine{titre=#TITRE}:> pouvait avoir une utilité pour faire l'équivalent d'un local_fr par secteur
ou des trucs du genre : <:#GET{erreur}{contexte=#ENV{contexte}}:> pour afficher les erreurs dans des squelettes (pour la gestion d'accès restreint par exemple)

Le seul avantage par rapport à l'ecriture filtre, c'est d'eviter de se construire un tableau des arguments.
Mais c'est peut etre plus vite fait de fournir un filtre du genre (pas testé) :
function T(){
   $numargs = func_num_args();
   $arg_list = func_get_args();
   $args=array();
   for ($i = 1; $i < $numargs; $i++) {
       $arg=explode('=',$arg_list[$i]);
       if ($arg[0]) $args[$arg[0]]=$arg[1];
   }
   return _T($arg_list[0],$args);
}

ce qui permettrait d'ecrire :
#GET{module}|concate{:chaine}|T{titre=#TITRE}
et
#GET{erreur}|T{contexte=#ENV{contexte},argument=valeur}

non ?

En revanche, je serais assez partisan de mettre là où tu en arrivé hier dans la beta, parce ce que ça rationalise l'existant: il n'était pas normal de ne pas pouvoir fournit le 2e argument de _T().

je pense aussi que ca ne devrait pas poser de problemes, mais c'est toi qui connait le mieux cette partie du code, moi j'ai juste survolé ca et copié/modifié un peu betement (ce que je fais assez bien en general, mais pas trop sur les regexp auquelles je ne comprend pas grand chose).
Il n'y a à priori pas de risque de regression, la regexp etant plus selective, et je ne vois pas ce qui pourrait ouvrir une faille de securité, mais bon, c'est vrai que c'est pas forcement le bon moment pour faire des modifs dans le compilo, et visiblement la fonctionnalité n'est pas très attendue...

@++