[spip-dev] Syntaxe alternative de spip : proposition

Rappel : projet de normalisation de la syntaxe de spip.
Tout ce qu'il y a à voir et à savoir (en particulier la vidéo de l'intervention en Avignon d'ESJ) se trouve là : http://www.spip-contrib.net/Syntaxes-Alternatives-pour-SPIP

Remarque : Ce message n'est pas destiné à troller, à dire "ma solution lave plus blanc" ou autres querelles de clocher, mais simplement à apporter des éléments de réflexion à ce débat car j'adore utiliser mon temps de cerveau disponible sur ce genre de questions :slight_smile:
Il est fort probable que mes propositions contiennent des zones d'ombre, des manques, voire de grosses bêtises, elles ne demandent donc qu'à être améliorées.

@ESJ : ce message peut donner l'impression inverse, mais je suis d'accord avec toi en de nombreux points. Simplement, pour aller à l'essentiel car le problème est complexe, je me concentre sur ce que je vois différemment. Dans tous les cas merci beaucoup d'avoir lancé le débat, et merci aussi pour tout le travail déjà accompli.

Ceci étant dit, allons-y :

///////////////////////////////////////////////////////////////////////////////////////////////////
I) Réflexions préliminaires (suite au visionnage de la vidéo d'ESJ)
///////////////////////////////////////////////////////////////////////////////////////////////////

I.1) Conformité XML

Salut, c'est moi le cheveu sur la soupe, alors je débarque, n'ai pas
assisté aux discussions précédentes, etc., mais peut-être je peux
apporter un œil neuf (avec les avantages et inconvénients que ça
comporte).

Ma première interrogation, c'est pourquoi autant d'importance accordée à
la validité XML ? Il se trouve que les caractères magiques dans SPIP
c'est <>, mais ça aurait pu être {}, (), ou n'importe quoi... Tout comme
du code PHP n'est évidemment pas valide XML, je ne comprends pas
pourquoi perdre autant d'énergie à chercher à ce que du code SPIP le
soit.
Le coup du <?spip ?> ça règle le souci de la validité d'un document, si
tant est que ça ait une quelconque importance ; passé ce cap, vouloir
amener la validité à l'intérieur du langage, pourquoi pas y penser avant
de s'endormir mais honnêtement je vois pas trop l'intérêt.
Je rappelle que c'est juste une interrogation naïve, n'ayant pas assisté
aux discussions.

////////////////////////////////////////////////
III) Solution alternative : php !
////////////////////////////////////////////////

Finalement c'est pas bête du tout, et avec une API bien choisie, ça peut
simplifier plein de choses. Pareil, réaction aussi naïve que spontanée.

Affectivement, en me mettant à leur place, j'imagine que ça ferait un peu
mal à tous ceux qui ont passé toutes ces années à développer des
interpréteurs, analyseurs lexicaux et autres dans SPIP, mais si le but
est de prendre le taureau par les cornes et d'obtenir une syntaxe clean
et simple d'accès, ça matche. C'est peut-être un dur cap à passer...
deux-trois cuites et hop.

Sinon, il m'est venu une autre idée. Ça fait un moment que je me dis que
SPIP est en fait un langage fonctionnel (genre haskell et compagnie),
par opposition à un langage impératif, dans le sens où il produit
simplement une "valeur" (du code HTML). (parenthèse pour perdre du
temps: d'ailleurs, vu d'un certain angle, ce n'est pas le cas de PHP,
qui lui fait des "echo", mais au niveau au-dessus, c'est le cas d'une
balise <?php ... ?>, qui produit bien une valeur.)

Du coup, avec cette idée de langage fonctionnel, en regardant bien du
code haskell, je ne vois pas trop de piste. Par contre, si on regarde
XSLT, j'ai l'intuition que les similarités d'objectifs et d'outils sont
assez grandes. Je ne connais que très peu XSLT, mais quand je vois
for-each, ça me rappelle étrangement quelque chose. Évidemment, for-each
et la plupart de XSLT s'appliquent à une entrée XML, et nous on a une
entrée "base de données", mais bon, ça serait pas la première fois que
XML et SQL montrent leur parenté.

Je pense à ça parce que le rôle de XSLT est de prendre une donnée lambda
(aucun lien) en entrée, de traiter, et de produire du HTML (et même du
XML, que demande le peuple), et SPIP ben pareil.

Alors je ne parle pas forcément de résumer un squelette SPIP à une
feuille XSLT (de toute façon pas besoin, le traitement est fait côté
serveur)... simplement d'en piocher les bonnes idées, tant en termes de
syntaxe que d'approche.

davux a écrit :

Ma première interrogation, c'est pourquoi autant d'importance accordée à la validité XML ? Il se trouve que les caractères magiques dans SPIP c'est <>, mais ça aurait pu être {}, (), ou n'importe quoi... Tout comme du code PHP n'est évidemment pas valide XML, je ne comprends pas pourquoi perdre autant d'énergie à chercher à ce que du code SPIP le soit.
  

C'est bien ce que je dis : la validité importe peu

Le coup du <?spip ?> ça règle le souci de la validité d'un document

Eh bien non justement, voir les deux exemples qui prouvent le contraire dans le I.1)

Du coup, avec cette idée de langage fonctionnel, en regardant bien du code haskell, je ne vois pas trop de piste. Par contre, si on regarde XSLT, j'ai l'intuition que les similarités d'objectifs et d'outils sont assez grandes. Je ne connais que très peu XSLT, mais quand je vois
for-each, ça me rappelle étrangement quelque chose. Évidemment, for-each et la plupart de XSLT s'appliquent à une entrée XML, et nous on a une entrée "base de données", mais bon, ça serait pas la première fois que XML et SQL montrent leur parenté.

Je pense à ça parce que le rôle de XSLT est de prendre une donnée lambda (aucun lien) en entrée, de traiter, et de produire du HTML (et même du XML, que demande le peuple), et SPIP ben pareil.

Alors je ne parle pas forcément de résumer un squelette SPIP à une feuille XSLT (de toute façon pas besoin, le traitement est fait côté serveur)... simplement d'en piocher les bonnes idées, tant en termes de syntaxe que d'approche.

Pour avoir dû maintenir un projet en xslt pendant 8 mois, je peux dire que c'est plein de contraintes que l'on ne voit pas au premier abord, à commencer par la NECESSITE ABSOLUE que ton source xslt soit conforme xml
=> plein de cas où tu dois répéter du code dans des parties alternatives de if, des contorsions aberrantes pour arriver à un résultat simple à cause de cette logique purement arborescente, et à l'arrivée un niveau de verbosité dément.

Mais en effet, certains petits trucs peuvent être intéressants et je m'en suis d'ailleurs inspiré dans ma proposition.

A bientôt

Simon

Bonjour Simon,

Merci pour tes réflexions et le temps pris à les exposer aussi précisément. Quelques réponses.

1. La différence entre langages avec et sans déclarations de type montre bien que les gens sont prêts à écrire un peu plus de choses (une déclaration) s'il y a un service à la clé (un compilateur signalant une incohérence de type, avant même l'exécution). En particulier, que chaque squelette déclare d'une manière ou d'une autre (on peut introduire des abréviations ou des conventions de nommage) son DOCTYPE, est tolérable si le compilateur signale des problèmes de validation avant même l'exécution.

2. Plus généralement, allonger le temps de rédaction peut être librement accepté si on sait que ça réduit le temps de mise au point et de maintenance. Pour ton exemple

  #EXPOSE{<div>,<a href="#URL_RUBRIQUE">}#TITRE#EXPOSE{</div>,</a>}

remarque que l'écriture

  #EXPOSE{<div>#TITRE</div>,<a href="#URL_RUBRIQUE">#TITRE</a>}

n'est pas moins lisible (elle est aussi plus courte), et si ça permet au compilateur de signaler plus de fautes,
ce n'est pas cher payé. Même remarque pour ton deuxième exemple, qui est de plus beaucoup moins crédible (qui écrit de telles horreurs ?). Je suis d'accord qu'il ne faut pas tomber dans les contorsions de XLST (que je supporte encore moins que toi), mais grace aux inclusions de SPIP on peut éviter les répétitions trop verbeuses de XSLT.

3. A la question de fond:

est-il vraiment nécessaire de distinguer le passage du monde spip au monde du langage produit

tu réponds "non", mais tu déplores le pb des espaces et lignes vides dans le code produit par SPIP,
qui découle directement de cette indistinction. Tu penses le résoudre par une 2e passe sur le résultat, avec une analyse non triviale ("sauf bien sur pour Pre" dis-tu), c'est-dire fondée sur une DTD (mais tu as dit que tu ne voulais pas la donner) et une connaissance de la sémantique associée. Tu vois le prix que tu payes à refuser de répondre "oui".

4. L'argument qu'il suffit de qq RegExp pour faire colorer comme il faut les squelettes SPIP par n'importe quel éditeur est faux, et en théorie (les RegExp ne peuvent pas analyser les structures parenthétiques de profondeur quelconque) et en pratique (depuis 8 ans que SPIP existe, on a eu là-dessus que des solutions rares et incomplètes). Je suis plutôt d'accord avec toi que la notation <? ... ? > est "moche", et qu'effectivement on en vient facilement à les écrire systématiquement en début de ligne pour s'y retrouver. Mais la question de fond est la suivante: quand on mélange 2 langages voire plus (un pré-processeur, que ce soit SPIP, PHP ou autres, et un langage conforme XML plus éventuellement son langage de script et ses styles CSS), peut-on espérer une syntaxe "belle" ? Adopter la solution syntaxique de XML a au moins l'avantage de pouvoir profiter des outils qui essayent que la réponse soit "oui", alors que cet amalgame est un handicap initial énorme.

5. D'accord pour souhaiter une

Normalisation des différents parenthésages

mais tu juges bien vite ce qui reste pour moi un exemple parmi d'autres possibles. Dans la grande majorité des langages de programmation, les accolades délimitent des blocs d'instructions, je trouve donc assez normal que les boucles de SPIP soient délimitées par elles (on peut toujours ajouter en commentaire après "}" le nom de la boucle fermée, voire obliger à le faire). Si on veut absolument que les accolades n'aient qu'une seule signification, c'est plutôt leur utilisation dans les criteres et les listes d'arguments des filtres qu'on devrait les remettre en question, l'usage étant plutôt d'employer des parenthèses. Mais cet impératif de signification unique d'un caractère me semble une contrainte apportant plus d'inconvénients que d'avantages.

6. L'idee de se rabattre sur PHP n'est pas recevable, parce que ça effrairait d'avance les non programmeurs, et que c'est un des langages les plus mal conçus qui soit. Tu dis toi-même qu'il est déplorable qu'on puisse y écrire des choses comme:
<<?php echo 'i>'; ?>
pour produire une balise "<i>", le rôle d'un langage de "templates" en général est justement de ne pas donner toute la puissance d'un langage de programmation, pour éviter de partir sur des fausses pistes et fournir un aide à la mise au point plus précise que les outils de debug std du programmeur.

7. Demander à des utilisateurs de changer de syntaxe n'a de chance de succès que si cela leur amène des fonctionnalités supplémentaires, sinon ils refuseront d'entrée, et avec raison. Je ne discuterai donc pas plus ta proposition alternative que je ne l'ai fait sur le Wiki, parce je pense que, beaucoup plus que la mienne, elle:

serait une erreur car on y perdrait finalement beaucoup en souplesse au profit d'une beauté mathématique purement formelle.

8. Tout à fait d'accord en revanche avec ta remarque,

si nouvelle syntaxe il doit y avoir, celle-ci doit pouvoir permettre à un idéaliste motivé de pondre du code conforme (ce qui est aujourd'hui impossible avec la syntaxe actuelle des boucles), cependant ça ne doit en aucun cas être une obligation pour que le squelette s'exécute

et je rappelle que le compilateur est prévu depuis le début pour accepter plusieurs syntaxes, autrement dit que cette nouvelle syntaxe ne serait de toutes façons pas imposée, juste proposée.

Committo,Ergo:Sum

Ma première interrogation, c'est pourquoi autant d'importance accordée à
la validité XML ?

Parce qu'une page HTML, RSS etc valides sont une assurance qu'un site produit
du code compréhensible par les navigateurs et autres clients Web.
Partant, qu'un générateur de pages comme l'est un squelette puisse fournir l'assurance
qu'il produira de telles pages ferait gagner un temps considérable de mise au point:
plus besoin de contrôler chaque page.

III) Solution alternative : php !

j'imagine que ça ferait un peu
mal à tous ceux qui ont passé toutes ces années à développer des
interpréteurs, analyseurs lexicaux et autres dans SPIP, mais si le but
est de prendre le taureau par les cornes et d'obtenir une syntaxe clean
et simple d'accès, ça matche.

La syntaxe de PHP n'est pas clean, elle n'est pas simple d'accès pour les non programmeurs,
et elle ne prend abolument pas le taureau de la validation par les cornes,
cf les "<<?php echo 'i>'> et autres horreurs.

Sinon, il m'est venu une autre idée. Ça fait un moment que je me dis que
SPIP est en fait un langage fonctionnel (genre haskell et compagnie),
par opposition à un langage impératif, dans le sens où il produit
simplement une "valeur" (du code HTML). (parenthèse pour perdre du
temps: d'ailleurs, vu d'un certain angle, ce n'est pas le cas de PHP,
qui lui fait des "echo",

Oui, le langage de squelettes est à la base un langage fonctionnel,
ce qui veut dire en particulier qu'il est plus facile que dans un langage impératif
de démontrer certaines propriétés de ce qu'on y écrit, notamment la validité par rapport à une DTD.
Plutôt que de réécrire PHP (qui n'est pas fonctionnel, et pas seulement à cause de echo)
dans la syntaxe des balises SPIP, il est à mon avis plus porteur de nouveautés d'accentuer
son côté fonctionnel pour offrir des démonstrations automatiques de propriétés
(au-delà de la validité, je pense évidemment à certaines exigences d'accessibilité).

Committo,Ergo:Sum

Le Friday 04 September 2009 06:44:20 :

Partant, qu'un générateur de pages comme l'est un squelette puisse
fournir l'assurance
qu'il produira de telles pages ferait gagner un temps considérable de
mise au point:
plus besoin de contrôler chaque page.

C'est cette étape dans le raisonnement que je trouve illogique : la
validité XML du texte du langage générateur n'est ni nécessaire ni
suffisante pour que le texte produit soit valide XML. Ça se passe à deux
niveaux bien différents : ça serait comme prétendre que le texte produit
tiendra sur 25 lignes puisque c'est le cas du code générateur...
Même en termes de clarté, je ne suis pas sûr du tout que ça aide, en
tout cas, comme dit par Simon, pas sans le payer très cher en
contorsions.

Oui, le langage de squelettes est à la base un langage fonctionnel,
ce qui veut dire en particulier qu'il est plus facile que dans un
langage impératif
de démontrer certaines propriétés de ce qu'on y écrit, notamment la
validité par rapport à une DTD.

Oui, pouvoir prouver son code sans avoir à le tester est le rêve de tout
geek, et les langages fonctionnels y aident... Il serait excellent de
trouver une technique dans la façon de définir le langage de squelettes
pour y parvenir, mais je ne crois pas que ça passe par la validité du
squelette lui-même.

Ceci dit, j'adhère au point sur la non-pertinence d'une surcouche à PHP
(sous forme d'API) pour le langage de squelettes : ça ne serait une
bonne idée que si on pouvait fournir un ensemble de moins de 20
fonctions enfantines, ce qui ne sera jamais le cas. À défaut, ça se
rapprochera asymptotiquement du cauchemar syntaxique qu'est PHP.

Quelques remarques secondaires à la lecture de ton mail :

- Utilisation des minuscules possibles pour les mots-clés spip

attention en HTML on a besoin de pouvoir faire #ffeee sans se prendre
le chou, ou d'indiquer des noms de div en javascript (#toto) ; la
distinction min/maj s'avère bien utile dans ces cas (on a aussi
implémenté, pour les couleurs, la reconnaissance auto des #FFEEE ).

* les boucles CONDITION deviennent des : <si condition="code de la
condition" et="code de la deuxième condition" etc.></si>

Ca j'aime bien, mieux que la BOUCLE(CONDITION) de Bonux (même chose
pour POUR). Cependant si dans Bonux c'est fait avec une
BOUCLE(CONDITION) ce n'est pas par amour de la syntaxe mais parce que
ça permettait d'ajouter au compilo (phraseur) sans le forker. Mais si
on doit officialiser CONDITION et POUR (et je suis ... pour), on
pourrait peut-être le faire sans attendre dans cette syntaxe-là.

* ajout d'un "switch" :
<choix test="#LANG">
<cas valeur="fr"> </cas>
<cas valeur="en"> </cas>
<defaut> </defaut>
</choix>

POUR, CONDITION et CHOIX pourraient s'écrire en anglais d'entrée de jeu.

- gestion également de la notation préfixée des filtres (appel classique de
fonction) pour les cas où on en a besoin :
* dans cette notation, l'exemple précédent s'écrit :
#|filtre{#balise,param1,param2}
* on peut les enchaîner de la manière suivante : #|filtre1{ |filtre2{
>filtre3{ #balise } } }
* on peut également les appeler sans balise, sur des chaînes de caractères
statiques si on veut (remplacer #balise par "chaine")

Je trouve ça super, et là aussi j'aimerais qu'on voie si on ne peut
pas l'intégrer dès maintenant à la syntaxe existante de SPIP.

- Je pense, qu'il faudrait vraiment rajouter un post-process à la création
des caches pour supprimer toutes les lignes vides et les espaces et
tabulations en fin de ligne dans le code produit (sauf bien sûr dans les
balises <pre>).

Une fonction à écrire, qu'il serait aisé d'appeler avec #FILTRE. Mais
outre les <pre> et autres, attention à ne pas "nettoyer" ainsi les
squelettes qui produisent des fragments de txt (pour envoi par email
par exemple).

On peut alors imaginer de débrayer ce système, soit par la présence d'une
balise dans le squelette (par exemple #laisse_espaces), ou encore par une
balise #strict{ \n } forçant l'insertion stricte du contenu des
accolades dans le fichier final.

Si, une fois méchamment testé, ça devient un #FILTRE par défaut, il
faudrait que ce soit désactivable. Mais dans un premier temps ça peut
être un #FILTRE à préciser à la main :slight_smile:

- Au passage et par pitié : interdiction des espaces dans les noms de
critères comme "num titre" => num_titre pour pouvoir trier par
table.num_titre

ça n'a pas le même sens : num_titre serait le nom d'un champ, alors
que num titre c'est un opérateur (0+titre). De toutes façons ce
système de {par num X} est un pis-aller, faute de système de gestion
de l'ordre par défaut des objets.

Je me pose aussi la question : serait-il pertinent de permettre également
l'écriture de squelettes avec une syntaxe purement php ?
Spip se comporterait alors simplement comme une API, et serait plus
facilement accessible aux développeurs php "durs" qui n'auraient pas à
apprendre une nouvelle syntaxe.

Oui, super, mais pour ça pas besoin de parler de "syntaxe" : il suffit
d'utiliser recuperer_fond('squelette', $contexte) !

Par exemple on pourrait alors imaginer qu'une boucle s'écrive :
<?php
boucle("nomdelaboucle", "objet", array('lang' => 'fr, 'id_rubrique' =>
$id_rubrique), $avant, $repete, $apres, $sinon);
?>

recuperer_fond() là encore, mais en passant en argument le contenu du
squelette et non pas son "fichier". Ca demande une petite adaptation
du moteur, mais rien d'énorme. Là non plus ça n'a pas grand chose à
voir avec la question de la syntaxe.

-- Fil

Tu ne peux affirmer cela de manière générale, tout dépend du langage générateur.
Le problème est à poser à l'envers: quel langage aurait comme propriété de pouvoir
calculer si un générateur écrit dans ce langage (i.e. un squelette) assurerait la validité
relative à une DTD quelles que soient les données d'entrée.

Un contre-exemple à ton affirmation, évidemment insatisfaisante en pratique,
serait les langages des squelettes actuels mais où tous les #X seraient passés in fine au filtre textebrut:
les seules balises de la page seraient donc exclusivement celles présentes dans le squelette,
la validité du squelette serait donc une condition suffisante à celles des pages produites avec
(suffisante et même nécessaire si on supprime quelques scories de la syntaxe actuelle).

Evidemment c'est trop contraignant, d'où l'idée de typer les filtres d'une manière ou d'une autre
(par exemple en adoptant un système de nommage, genre "div_XXXX()" est un filtre produisant une div bien formée).
Il y aurait du coup à écrire un meta-validateur plutôt que d'utilise un validateur XML standard, mais c'est assez facile
si déjà le squelette est conforme XML (j'ai pas dit valide hein).

Committo,Ergo:Sum

  1. La différence entre langages avec et sans déclarations de type montre bien que les gens sont prêts à écrire un peu plus de choses (une déclaration) s’il y a un service à la clé (un compilateur signalant une incohérence de type, avant même l’exécution). En particulier, que chaque squelette déclare d’une manière ou d’une autre (on peut introduire des abréviations ou des conventions de nommage) son DOCTYPE, est tolérable si le compilateur signale des problèmes de validation avant même l’exécution.

Oui, c’est tolérable, et potentiellement intéresant pour certaines utilisations mais est-ce indispensable ?

  1. Plus généralement, allonger le temps de rédaction peut être librement accepté si on sait que ça réduit le temps de mise au point et de maintenance. Pour ton exemple

#EXPOSE{

,}

remarque que l’écriture

#EXPOSE{

#TITRE
,#TITRE}

n’est pas moins lisible (elle est aussi plus courte), et si ça permet au compilateur de signaler plus de fautes,
ce n’est pas cher payé. Même remarque pour ton deuxième exemple, qui est de plus beaucoup moins crédible (qui écrit de telles horreurs ?). Je suis d’accord qu’il ne faut pas tomber dans les contorsions de XLST (que je supporte encore moins que toi), mais grace aux inclusions de SPIP on peut éviter les répétitions trop verbeuses de XSLT.

Alors pour mon premier exemple : j’ai volontairement raccourci le contenu de la div à #TITRE pour clarifier l’exposé, mais dans le cas réel qui me concernait, il y avait une quinzaine de lignes de code, dont une boucle qui rendait ta solution impossible (pour info, mon est en display:block).

On retombe alors dans le travers classique de la conformité xml : devoir recopier du code en double (ou plus) pour les parties alternatives des conditions.

Ce simple problème démontre qu’on peut tomber dans des cas où la validation du squelette oblige à des contorsions sans gain.
Je pense, avec encore une fois les longues heures de XSLT que j’ai dues subir en tête, que dans le cas moyen la complication du code dépasse le gain qu’on a en prévisibilité : la facilité accrue de maintenance du code n’est alors qu’illusoire car sa taille augmente rapidement du fait de la verbosité inévitable de toute syntaxe conforme xml (ce que tu ne cesses d’ailleurs de répéter).

Quant à mon deuxième exemple, qui écrit de telles horreurs ? Moi ! :slight_smile:

Le problème :

  • J’ai trois boucles successives que l’on ne peut pas résumer en une seule.
  • Le résultat de ces trois boucles doit s’afficher dans un div unique
  • Le div en question ne doit être ouvert que si l’une des trois boucles renvoie du contenu
  • Le tout en étant optimal par rapport à la base de données : pas de requête supplémentaire

=> j’ai choisi en toute connaissance de cause d’utiliser un bon vieux flag, ça a l’avantage d’être clair et économique en ressources. Là encore c’est un cas typique où j’ai choisi de sacrifier la beauté mathématique de mon code à son efficacité, ce que, à mon avis, un langage de template web devrait toujours faire : on n’est pas en train de construire des IA auto-adaptatives, on produit des sites internet, un haut niveau de formalisme n’est donc pas forcément nécessaire.

  1. A la question de fond:

est-il vraiment nécessaire de distinguer le passage du monde spip au monde du langage produit

tu réponds « non », mais tu déplores le pb des espaces et lignes vides dans le code produit par SPIP,
qui découle directement de cette indistinction. Tu penses le résoudre par une 2e passe sur le résultat, avec une analyse non triviale (« sauf bien sur pour Pre » dis-tu), c’est-dire fondée sur une DTD (mais tu as dit que tu ne voulais pas la donner) et une connaissance de la sémantique associée. Tu vois le prix que tu payes à refuser de répondre « oui ».

J’applique la règle des 80% de gain pour 20% d’emmerdement qu’on m’a citée ici :slight_smile:
Je constate que dans la quasi-totalité des cas, les espaces laissés par spip après le passage du compilateur sont non signifiants => je propose donc qu’on les supprime systématiquement en post-processing par un simple jeu de règle :

  • substitution de ([\t ]+\n[\t ]+)+ par \n
  • substitution de [\t ]+ par " "

On laisse ensuite les outils au développeur de squelette pour désactiver ce filtre pour tout un squelette par la simple présence d’une balise du type #laisser_espaces, ou encore potentiellement par un #strict{ } (plus difficile à coder au niveau du compilo, certes).

Pour info, j’ai essayé de développer un filtre appelé par #FILTRE pour ça, mais je n’ai pas réussi. Je ne sais pas d’où vient le bug, mais le filtre n’est apparemment pas appelé au bon moment pour produire l’effet escompté. Bon, en même temps j’ai pas cherché trois jours…

Je cite le cas de

 car il est facile de mettre en œuvre une exception pour cette balise qui est présente dans la dtd de 95+% des données produites par les squelettes spip.

Encore une fois, je raisonne en terme d’optimisation possible pour simplifier la vie de l’utilisateur (ici le webmestre qui pond ses squelettes) tout en produisant un résultat le plus propre possible. De toute manière, si l’utilisateur fait des efforts, il produit du code xhtml qui sera indenté par sax et n’aura que très peu besoin de ce filtre (uniquement dans les feuilles de l’arbre xml de la page produite), alors à quoi bon lui imposer une discipline de fer pour un résultat finalement peu éloigné de ce qu’il peut avoir simplement ?

Au passage, une idée vient subitement de me traverser l’esprit : suivant comment le compilateur est construit, la compression des \s peut aussi se faire pendant la compilation du code.
Pendant la phase de repérage des marqueurs spécifiques des boucles, le compilateur peut décider de supprimer tous les caractères non signifiants précédant et suivant immédiatement un marqueur de boucle reconnu
=> disparition du problème puisque les boucles imbriquées verront les \s de séparation ignorés à la compilation.
C’est même plus propre que le post-processing, et ça ne nécessite pas la séparation formelle des deux mondes dans le source.
Alors je ne connais pas exactement les entrailles du compilo de spip, et mes cours de compilation remontent à quelques temps, mais vu ce dont je me souviens des processus d’analyse lexicale, ça doit être faisable, non ?

  1. L’argument qu’il suffit de qq RegExp pour faire colorer comme il faut les squelettes SPIP par n’importe quel éditeur est faux, et en théorie (les RegExp ne peuvent pas analyser les structures parenthétiques de profondeur quelconque) et en pratique (depuis 8 ans que SPIP existe, on a eu là-dessus que des solutions rares et incomplètes). Je suis plutôt d’accord avec toi que la notation <? ... ?> est « moche », et qu’effectivement on en vient facilement à les écrire systématiquement en début de ligne pour s’y retrouver. Mais la question de fond est la suivante: quand on mélange 2 langages voire plus (un pré-processeur, que ce soit SPIP, PHP ou autres, et un langage conforme XML plus éventuellement son langage de script et ses styles CSS), peut-on espérer une syntaxe « belle » ? Adopter la solution syntaxique de XML a au moins l’avantage de pouvoir profiter des outils qui essayent que la réponse soit « oui », alors que cet amalgame est un handicap initial énorme.

Je parlais de coloration possible facilement dans le cadre de la proposition de langage « xml ou presque » que je propose, pas avec la structure actuelle des boucles.
I.e. : la syntaxe de boucles que je propose étant conforme xml, elle est déjà correctement colorée par les analyseurs.
Il ne reste plus alors qu’à rajouter quelques règles pour colorer les et autres mots clés propres à spip (il y en a finalement très peu) d’une autre couleur pour les faire ressortir, de même pour les #\w+
Ce n’est pas une coloration complète au sens mathématique, mais elle suffirait à mon avis amplement à faciliter la vie des développeurs de squelettes.

Parfois, le mieux est simplement l’ennemi du bien…

  1. D’accord pour souhaiter une

Normalisation des différents parenthésages

mais tu juges bien vite ce qui reste pour moi un exemple parmi d’autres possibles. Dans la grande majorité des langages de programmation, les accolades délimitent des blocs d’instructions, je trouve donc assez normal que les boucles de SPIP soient délimitées par elles (on peut toujours ajouter en commentaire après « } » le nom de la boucle fermée, voire obliger à le faire). Si on veut absolument que les accolades n’aient qu’une seule signification, c’est plutôt leur utilisation dans les criteres et les listes d’arguments des filtres qu’on devrait les remettre en question, l’usage étant plutôt d’employer des parenthèses. Mais cet impératif de signification unique d’un caractère me semble une contrainte apportant plus d’inconvénients que d’avantages

Pour ma part, je suis très attaché à la signification unique du signe de parenthésage : ça évite des confusions.

Par contre j’avais conservé les accolades dans ma proposition par souci « historique », mais tu as raison, je pense qu’à changer autant le langage en profondeur, il vaut mieux utiliser les parenthèses pour passer les paramètres et rentrer dans la norme que le plus grand nombre connait (et ça a l’avantage d’être plus facile à taper en azerty :).

Du coup, faudrait permuter les parenthèses et les accolades dans ma proposition, je le ferai le jour où je la mettrai sur le wiki.

  1. L’idee de se rabattre sur PHP n’est pas recevable, parce que ça effrairait d’avance les non programmeurs, et que c’est un des langages les plus mal conçus qui soit. Tu dis toi-même qu’il est déplorable qu’on puisse y écrire des choses comme:
    <<?php echo 'i>'; ?>
    pour produire une balise «  », le rôle d’un langage de « templates » en général est justement de ne pas donner toute la puissance d’un langage de programmation, pour éviter de partir sur des fausses pistes et fournir un aide à la mise au point plus précise que les outils de debug std du programmeur.

C’était une proposition alternative à peine esquissée, je n’y ai pas encore trop réfléchi.

L’idée m’est venue car je trouve parfois que ta proposition part tellement dans cette direction qu’il vaudrait mieux carrément sauter le pas en fournissant une boîte à outil réduite, bien conçue et parfaitement documentée pour les débutants, tout en permettant de fait aux codeurs confirmés d’utiliser directement leurs compétences en php.

Je trouve qu’elle est recevable dans ce cadre, et le fait que php permette des horreurs n’est pas vraiment un argument pour le coup : il est déjà utilisable directement dans les squelettes et le restera dans tous les cas, donc quelqu’un qui veut faire du moche avec le fera.

Et cette proposition n’est incompatible avec aucune syntaxe, elle peut très bien exister en plus de la tienne, ou même l’actuelle, puisque le code php est évalué par spip.

  1. Demander à des utilisateurs de changer de syntaxe n’a de chance de succès que si cela leur amène des fonctionnalités supplémentaires, sinon ils refuseront d’entrée, et avec raison. Je ne discuterai donc pas plus ta proposition alternative que je ne l’ai fait sur le Wiki, parce je pense que, beaucoup plus que la mienne, elle:

serait une erreur car on y perdrait finalement beaucoup en souplesse au profit d’une beauté mathématique purement formelle.

Dire que la syntaxe que je propose n’amène pas de nouvelle fonctionnalité est faux :

  • la syntaxe des boucles est conforme xml donc colorable
  • elle est aussi simplifiée : nom de boucle facultatif, nouvelle syntaxe des et
  • le balisage est simplifié par la suppression des [()] dans la majorité des cas où ils sont utilisés aujourd’hui
  • les filtres permettent de faire des choses qu’ils ne permettaient pas avant
  • la gestion des inclusions est simplifiée et automatisée
  • les blocs multi n’utilisent plus qu’un seul concept => plus facile à expliquer aux contributeurs
  • les chaînes de traduction passent dans le monde des balises où elles devraient être => clarté et utilisation de filtres facilitée

De plus je ne suis absolument pas à la recherche de beauté mathématique, mais justement des seules fonctionnalités (peu nombreuses !) qui me manquent au quotidien dans le développement de squelette le plus terre à terre qui soit.

  1. Tout à fait d’accord en revanche avec ta remarque,

si nouvelle syntaxe il doit y avoir, celle-ci doit pouvoir permettre à un idéaliste motivé de pondre du code conforme (ce qui est aujourd’hui impossible avec la syntaxe actuelle des boucles), cependant ça ne doit en aucun cas être une obligation pour que le squelette s’exécute

et je rappelle que le compilateur est prévu depuis le début pour accepter plusieurs syntaxes, autrement dit que cette nouvelle syntaxe ne serait de toutes façons pas imposée, juste proposée.

idem :slight_smile:

A bientôt

Simon

Quelques remarques secondaires à la lecture de ton mail :

  • Utilisation des minuscules possibles pour les mots-clés spip

attention en HTML on a besoin de pouvoir faire #ffeee sans se prendre
le chou, ou d’indiquer des noms de div en javascript (#toto) ; la
distinction min/maj s’avère bien utile dans ces cas (on a aussi
implémenté, pour les couleurs, la reconnaissance auto des #FFEEE ).

Oui, en effet, je vais réfléchir à ce point pour voir si je peux améliorer.

  • Je pense, qu’il faudrait vraiment rajouter un post-process à la création
    des caches pour supprimer toutes les lignes vides et les espaces et
    tabulations en fin de ligne dans le code produit (sauf bien sûr dans les
    balises
    ).

Une fonction à écrire, qu’il serait aisé d’appeler avec #FILTRE. Mais
outre les

 et autres, attention à ne pas « nettoyer » ainsi les
squelettes qui produisent des fragments de txt (pour envoi par email
par exemple).

On peut alors imaginer de débrayer ce système, soit par la présence d’une
balise dans le squelette (par exemple #laisse_espaces), ou encore par une
balise #strict{ \n } forçant l’insertion stricte du contenu des
accolades dans le fichier final.

Si, une fois méchamment testé, ça devient un #FILTRE par défaut, il
faudrait que ce soit désactivable. Mais dans un premier temps ça peut
être un #FILTRE à préciser à la main :slight_smile:

Comme je disais à ESJ dans mon précédent mail, j’ai testé mais pas réussi.
Je me penche dessus à nouveau dès que j’ai un moment.

  • Au passage et par pitié : interdiction des espaces dans les noms de
    critères comme « num titre » => num_titre pour pouvoir trier par
    table.num_titre

ça n’a pas le même sens : num_titre serait le nom d’un champ, alors
que num titre c’est un opérateur (0+titre). De toutes façons ce
système de {par num X} est un pis-aller, faute de système de gestion
de l’ordre par défaut des objets.

Le problème c’est que ça interdit par {table.num titre} qui ne passe pas.
Les critères utilisent déjà un bon paquet d’exceptions qui ne sont pas directement des champs de BDD mais des traitements complexes, on pourrait en ajouter une afin de rendre leur comportement cohérent dans ce cas.
Et une balise #NUM_TITRE au passage :slight_smile:

Ou alors si on veut la cohérence parfaite : il faut ajouter un champ num_titre dans la base pour tous les objets ayant un titre, et le remplir au moment de la saisie de l’article si un numéro est présent.

<?php boucle("nomdelaboucle", "objet", array('lang' => 'fr, 'id_rubrique' => $id_rubrique), $avant, $repete, $apres, $sinon); ?>

Par exemple on pourrait alors imaginer qu’une boucle s’écrive :
recuperer_fond() là encore, mais en passant en argument le contenu du
squelette et non pas son « fichier ». Ca demande une petite adaptation
du moteur, mais rien d’énorme. Là non plus ça n’a pas grand chose à
voir avec la question de la syntaxe.

Oui, mais si je comprends bien, tu passes du code spip à recuperer_fond.
Ce que je propose dans cette syntaxe « ultra-alternative », c’est justement d’abolir toute forme de syntaxe spécifique en fournissant juste une boîte à outil php minimaliste qui fait ce que le langage spip fait aujourd’hui.

A bientôt
Simon

Ou alors si on veut la cohérence parfaite : il faut ajouter un champ
num_titre dans la base pour tous les objets ayant un titre, et le remplir au
moment de la saisie de l'article si un numéro est présent.

oui c'est l'idée du champ `rang` ; mais c'est insuffisant car on peut
vouloir trier les articles d'une rubrique selon un certain classement,
et les articles liés à un mot-clé selon un classement incompatible
avec le précédent.

> <?php
> boucle("nomdelaboucle", "objet", array('lang' => 'fr, 'id_rubrique' =>
> $id_rubrique), $avant, $repete, $apres, $sinon);
> ?>

> Par exemple on pourrait alors imaginer qu'une boucle s'écrive :
recuperer_fond() là encore, mais en passant en argument le contenu du
squelette et non pas son "fichier". Ca demande une petite adaptation
du moteur, mais rien d'énorme. Là non plus ça n'a pas grand chose à
voir avec la question de la syntaxe.

Oui, mais si je comprends bien, tu passes du code spip à recuperer_fond.

oui

Ce que je propose dans cette syntaxe "ultra-alternative", c'est justement
d'abolir toute forme de syntaxe spécifique en fournissant juste une boîte à
outil php minimaliste qui fait ce que le langage spip fait aujourd'hui.

ok, ça m'a l'air aussi bien intéressant comme approche

-- Fil

En particulier, que chaque squelette déclare d'une manière ou d'une autre (on peut introduire des abréviations ou des conventions de nommage) son DOCTYPE, est tolérable si le compilateur signale des problèmes de validation avant même l'exécution.

Oui, c'est tolérable, et potentiellement intéresant pour certaines utilisations mais est-ce indispensable ?

Si ça aide à mise au point oui.

2. Plus généralement, allonger le temps de rédaction peut être librement accepté si on sait que ça réduit le temps de mise au point et de maintenance.

...

Je suis d'accord qu'il ne faut pas tomber dans les contorsions de XLST (que je supporte encore moins que toi), mais grace aux inclusions de SPIP on peut éviter les répétitions trop verbeuses de XSLT.

Alors pour mon premier exemple : j'ai volontairement raccourci le contenu de la div à #TITRE

...

=> j'ai choisi en toute connaissance de cause d'utiliser un bon vieux flag, ça a l'avantage d'être clair et économique en ressources. Là encore c'est un cas typique où j'ai choisi de sacrifier la beauté mathématique de mon code à son efficacité, ce que, à mon avis, un langage de template web devrait toujours faire

Tu omets complètement de répondre à mon argument que SPIP possède un mécanisme d'inclusion: si c'est trop long, on fait un #INCLUDE, et dans les deux cas ça répond à ton pb (pour le 2e: [<div>(#INCLUDE...)</

)], pas besoin de sombrer dans les horreurs impératives.

est-il vraiment nécessaire de distinguer le passage du monde spip au monde du langage produit
tu réponds "non", mais tu déplores le pb des espaces et lignes vides dans le code produit par SPIP,
qui découle directement de cette indistinction. Tu penses le résoudre par une 2e passe sur le résultat, avec une analyse non triviale ("sauf bien sur pour Pre" dis-tu), c'est-dire fondée sur une DTD (mais tu as dit que tu ne voulais pas la donner) et une connaissance de la sémantique associée. Tu vois le prix que tu payes à refuser de répondre "oui".

J'applique la règle des 80% de gain pour 20% d'emmerdement qu'on m'a citée ici :slight_smile:
Je constate que dans la *quasi-totalité* des cas,

Tout est dans ce "quasi", qui veut dire jamais. Une inclusion, une balise dynamique, un PHP interpolé dans le squelette pouvant rendre n'importe quoi de mal formé, tu ne peux pas dire quels espaces seront signifiants. Répondre "oui" à la question ci-dessus, c'est appliquer le principe "mieux vaut prévenir que guérir" qui est particulièrement vrai en informatique.

Pour info, j'ai essayé de développer un filtre appelé par #FILTRE pour ça, mais je n'ai pas réussi. Je ne sais pas d'où vient le bug, mais le filtre n'est apparemment pas appelé au bon moment pour produire l'effet escompté.

Peut-être parce que tu as des balises dynamiques ou du PHP interpolé, qui fait qu'il n'est pas appelé quand tu le crois, et qu'il ne s'appliquera de toutes façons pas à ces ajouts ultérieurs.

quoi bon lui imposer une discipline de fer pour un résultat finalement peu éloigné de ce qu'il peut avoir simplement ?

Avoir du code certifé, c'est une tendance de fond. On n'est pas à la NASA parce que les enjeux financiers ne sont pas les mêmes, mais ce sera de plus en plus souvent demandé.

Au passage, une idée vient subitement de me traverser l'esprit : suivant comment le compilateur est construit, la compression des \s peut aussi se faire pendant la compilation du code.

NON, cf pourquoi ci-dessus.

6. L'idee de se rabattre sur PHP n'est pas recevable,

L'idée m'est venue car je trouve parfois que ta proposition part tellement dans cette direction

Mon idée est au contraire de s'éloigner le plus possible de PHP. Ce n'est pas parce que SPIP se mettrait à utiliser "<?" pour ses besoins propres qu'il se mettrait à lui ressembler.

Dire que la syntaxe que je propose n'amène pas de nouvelle fonctionnalité est faux :
- la syntaxe des boucles est conforme xml donc colorable
- elle est aussi simplifiée : nom de boucle facultatif, nouvelle syntaxe des <si> <pour> et <choix>
- le balisage est simplifié par la suppression des [()] dans la majorité des cas où ils sont utilisés aujourd'hui
- les filtres permettent de faire des choses qu'ils ne permettaient pas avant
- la gestion des inclusions est simplifiée et automatisée
- les blocs multi n'utilisent plus qu'un seul concept => plus facile à expliquer aux contributeurs
- les chaînes de traduction passent dans le monde des balises où elles devraient être => clarté et utilisation de filtres facilitée

Une fois que les gens se sont habitués à quelque chose, ils trouvent difficile et compliqué de perdre leurs habitudes, même si on leur propose qqch d'objectivement plus simple et plus facile. Je ne connais aucun changement d'habitudes qui ne soit pas lié à l'absence d'une fonctionnalité soudain indispensable et absente des habitudes antérieures. Un changement de syntaxe de SPIP ne sera accepté que si la garantie de validation ou qqch du même ordre est un besoin fort.

De plus je ne suis absolument pas à la recherche de beauté mathématique

Je ne comprends pourquoi tu as tellement besoin de te défendre tout le temps là-dessus. Chercher la laideur mathématique est-elle un gage de pragmatisme informatique ? Pour ma part, je dis seulement que si on respecte certaines hypothèses, on pourra écrire des programmes ayant certaines propriétés intéressantes. Pas de quoi hurler au bourbakisme ayatollesque.

Committo,Ergo:Sum

El Saturday 05 September 2009 12:58:21 Fil va escriure:

> Ou alors si on veut la cohérence parfaite : il faut ajouter un
> champ num_titre dans la base pour tous les objets ayant un titre,
> et le remplir au moment de la saisie de l'article si un numéro est
> présent.

oui c'est l'idée du champ `rang` ; mais c'est insuffisant car on peut
vouloir trier les articles d'une rubrique selon un certain
classement, et les articles liés à un mot-clé selon un classement
incompatible avec le précédent.

Une table spip_rangs ? Avec pour champs :
- type du référent / contenant / motquivabien (rubrique, mot-clé, etc.)
- id du contenant
- type de l'item / élément contenu (idem, typiquement article)
- id de l'item
- rang de l'item dans le contenant

Ensuite en termes d'interface, plusieurs solutions.
Soit un champ rang : quand un objet est logiquement un contenant
(rubrique ou mot-clé notamment), dans l'interface d'ajout on propose un
champ de formulaire "rang" où les gens mettent ce qu'ils veulent (genre
100, 200, etc.), sachant que l'important sera la valeur _relative_ des
rangs les uns par rapport aux autres. Idem quand l'ajout se fait depuis
l'élément contenu (par exemple ajout de mot-clé à un objet).
- Soit une interface de type "monter/descendre" dans la zone d'édition
du contenant.

C'est juste une idée comme ça, pas mûrie etc., et ça fait peut-être
doublon total avec quelque chose de déjà discuté et (in)validé...

Une table spip_rangs ? Avec pour champs :

paie ton plugin :slight_smile:

-- Fil

Il y a déjà un plugin Rang de débuté.

D’accord, dans ce cas ça devient plus compliqué : il faut pondérer les associations d’articles avec les mots clés danns la base et prévoir une interface efficace pour le faire.

Mais ça n’empêche pas la pertinence du champ num_titre (ou rang, c’est synonyme) dans la table article : il pondèrerait alors les associations articles / rubriques puisqu’elles sont gérées dans cette table.

A bientôt
Simon

  1. Plus généralement, allonger le temps de rédaction peut être librement accepté si on sait que ça réduit le temps de mise au point et de maintenance.

Je suis d’accord qu’il ne faut pas tomber dans les contorsions de XLST (que je supporte encore moins que toi), mais grace aux inclusions de SPIP on peut éviter les répétitions trop verbeuses de XSLT.

Alors pour mon premier exemple : j’ai volontairement raccourci le contenu de la div à #TITRE

=> j’ai choisi en toute connaissance de cause d’utiliser un bon vieux flag, ça a l’avantage d’être clair et économique en ressources. Là encore c’est un cas typique où j’ai choisi de sacrifier la beauté mathématique de mon code à son efficacité, ce que, à mon avis, un langage de template web devrait toujours faire

Tu omets complètement de répondre à mon argument que SPIP possède un mécanisme d’inclusion: si c’est trop long, on fait un #INCLUDE, et dans les deux cas ça répond à ton pb (pour le 2e: [

(#INCLUDE…)
)], pas besoin de sombrer dans les horreurs impératives.

En effet, j’avais oublié l’argument de l’include.

Pour moi un include sert à découper mon script (et donc souvent ma page produite) en unités pertinentes dans le but de les réutiliser ailleurs ou de faciliter le debug, pas à pallier aux limitations imposées par une syntaxe trop rigide qui me force à répéter du code alors qu’il est facile de ne pas le faire si l’on s’affranchit un peu de la contrainte de conformité.

On est ici dans le cas d’école de la contorsion dans le seul but de rendre le source conforme.

est-il vraiment nécessaire de distinguer le passage du monde spip au monde du langage produit
tu réponds « non », mais tu déplores le pb des espaces et lignes vides dans le code produit par SPIP,
qui découle directement de cette indistinction. Tu penses le résoudre par une 2e passe sur le résultat, avec une analyse non triviale (« sauf bien sur pour Pre » dis-tu), c’est-dire fondée sur une DTD (mais tu as dit que tu ne voulais pas la donner) et une connaissance de la sémantique associée. Tu vois le prix que tu payes à refuser de répondre « oui ».

J’applique la règle des 80% de gain pour 20% d’emmerdement qu’on m’a citée ici :slight_smile:
Je constate que dans la quasi-totalité des cas,

Tout est dans ce « quasi », qui veut dire jamais. Une inclusion, une balise dynamique, un PHP interpolé dans le squelette pouvant rendre n’importe quoi de mal formé, tu ne peux pas dire quels espaces seront signifiants. Répondre « oui » à la question ci-dessus, c’est appliquer le principe « mieux vaut prévenir que guérir » qui est particulièrement vrai en informatique.

C’est pour ça que le développeur aurait le contrôle sur la désactivation de ce dispositif pour les rares cas où ça lui servirait.
Par contre on éviterait d’embêter de manière certaine les gens dans les 95% de cas où cette spécificité n’est absolument pas pertinente.

Si on applique le principe de précaution systématiquement, et on ne fait plus jamais rien.

Pour info, j’ai essayé de développer un filtre appelé par #FILTRE pour ça, mais je n’ai pas réussi. Je ne sais pas d’où vient le bug, mais le filtre n’est apparemment pas appelé au bon moment pour produire l’effet escompté.

Peut-être parce que tu as des balises dynamiques ou du PHP interpolé, qui fait qu’il n’est pas appelé quand tu le crois, et qu’il ne s’appliquera de toutes façons pas à ces ajouts ultérieurs.

Comme je le disais, je n’ai pas encore cherché en profondeur par manque de temps (mais je vais le faire).
Mais il ne faut pas raisonner dans la situation actuelle de spip, on est ici dans le cadre d’une hypothèse.
Dans une situation où il serait intégré à spip, un tel filtre pourrait être assuré d’être appelé en tout dernier lieu, si ce choix est jugé pertinent, rendant donc l’effet escompté.

Au passage, une idée vient subitement de me traverser l’esprit : suivant comment le compilateur est construit, la compression des \s peut aussi se faire pendant la compilation du code.

NON, cf pourquoi ci-dessus.

Comme je t’ai dit, je ne connais pas encore par coeur les entrailles de spip, mais tout code est évalué à un moment ou à un autre, et spip renvoit bien une sortie.
Dans le pire des cas, le filtre en question peut être appelé sur cette sortie.
Je sais, ça coûte, mais il n’est pas impossible qu’un fonctionnement plus fin soit possible pour l’appeler en amont lorsqu’il est pertinent, et profiter ainsi du cache pour une partie des résultats afin d’améliorer les perfs. Le post-processing ne se faisant que sur ce qui reste.

Encore une fois, je sais qu’il y aurait des cas où on oublierait des espaces, mais je ne cesse de le répéter : je ne recherche pas la perfection mathématique, la complétude, juste éliminer les scories qui gênent tous les utilisateurs de spip quand elles peuvent l’être assez facilement.
Ca simplifierait la vie de plein de monde à peu de frais.

Une fois que les gens se sont habitués à quelque chose, ils trouvent difficile et compliqué de perdre leurs habitudes, même si on leur propose qqch d’objectivement plus simple et plus facile. Je ne connais aucun changement d’habitudes qui ne soit pas lié à l’absence d’une fonctionnalité soudain indispensable et absente des habitudes antérieures. Un changement de syntaxe de SPIP ne sera accepté que si la garantie de validation ou qqch du même ordre est un besoin fort.

Eh bien je n’ai pas prétention à parler pour tout le monde : ma proposition n’engage que moi, mais elle se base uniquement sur des fonctionnalités absentes aujourd’hui de spip qui m’ont parues indispensables depuis deux ans que je ponds des squelettes 8 heures par jour.
Ensuite, et c’est là l’objet du débat public sur cette liste puis sur la page collaborative, on verra si je suis tout seul à trouver tout ça important ou pas.

Pour moi :

  • pouvoir colorer et indenter à peu près correctement mon code est une fonctionnalité indispensable
  • simplifier autant que possible les principales lourdeurs actuelles de spip, tant au niveau des boucles (déclaration du nom de boucle…) que des balises (crochets et parenthèses à tout va…) est une fonctionnalité indispensable
  • permettre à la syntaxe des filtres d’utiliser directement n’importe quelle fonction php quel que soit l’ordre de ses arguments est une fonctionnalité indispensable
  • ne plus avoir à me poser la question sur les includes statiques ou dynamiques alors que c’est automatisable dans la plupart des cas est une fonctionnalité indispensable

Par contre :

  • comme tout développeur je passe mon temps à réfléchir à comment avoir le résultat que je veux en sortie de mes squelettes, si on rajoute la contrainte absolue de la conformité XML du code générateur je vais m’arracher les cheveux qui me restent. C’est peut-être pour ça qu’il y a finalement plus de gens qui codent en php qu’en xslt.
  • dans la quasi-totalité des cas, quand le code produit par mes squelettes est invalide, c’est parce qu’un contributeur a glissé un
    ou autres joyeusetés dans les données, ce contre quoi aucune syntaxe ne peut quoi que ce soit. Les garanties apportées par ta proposition sont donc toutes relatives au vu des contraintes qu’elle m’imposerait.

De plus je ne suis absolument pas à la recherche de beauté mathématique

Je ne comprends pourquoi tu as tellement besoin de te défendre tout le temps là-dessus. Chercher la laideur mathématique est-elle un gage de pragmatisme informatique ? Pour ma part, je dis seulement que si on respecte certaines hypothèses, on pourra écrire des programmes ayant certaines propriétés intéressantes. Pas de quoi hurler au bourbakisme ayatollesque.

C’est bien là la différence d’approche : je ne recherche pas de propriétés abstraites dans le langage, mais sa capacité à répondre à un besoin concret (pas si) simple : monter efficacement et avec souplesse des sites web bien personnalisés, pas des clones de templates téléchargé ici où là, ce qui me semble être le but initial et final de spip (et par ailleurs je ne hurle à rien, j’écris, et même pas en majuscules (^_^) ).

Traite-moi de terre-à-terre si tu veux, mais j’apprécie justement le côté « artisanal » de spip car c’est exactement ce qui le rend intuitif et facile à prendre en main, ce que je souhaite qu’il reste.

Et tiens, au passage, plus on discute de tout ça, plus je réfléchis au problème, et moins je suis choqué par le fait que php accepte la syntaxe <<?php echo "i";?>> : si un codeur pond un tel code, c’est qu’il est soit mauvais, soit coincé par une contrainte tordue que personne n’a prévue à l’origine et il doit alors certainement remercier php d’y répondre contre toute attente…

J’ai pour ma part parfois été dans ce dernier cas et j’ai remercié spip (ou l’un de ses plugins) d’être plus permissif que prévu car ça m’a évité des jours de galère.

A bientôt
Simon

Il y a par ailleurs des cas ou cela n'est pas possible.
Je ne retrouve pas le code, mais je cite l'exemple classique et bien pénible à écrire ou l'on veut construire une liste d'évenements datés en ul/li sous la forme :
<ul>
  <li>Jour 1
    <ul>
      <li>evenement 1</li>
      <li>evenement 2</li>
    </ul>
  </li>
  <li>Jour 2
    <ul>
      <li>evenement 3</li>
      <li>evenement 4</li>
    </ul>
  </li>
...
</ul>

Et ou construire une liste conforme, valide etc oblige à jouer des #SET et #GET pour n'ouvrir les ul et li que quand c'est necessaire.

Cédric

Tu peux très bien déjà le faire.
Lorsque qu'une balise dynamique dans ton squelette ne doit être placé qu'en deuxième argument, tu peux utiliser la balise #VAL pour le premier. Cette balise renvoie la valeur qu'on lui donne.

[(#VAL{ce que tu veux}|filtre{#AUTRE_BALISE, #TRUC})]

Il est mathématiquement prouvé que langages fonctionnels et langages impératifs ont le même pouvoir expressif (sinon on ne pourrait pas compiler les uns vers les autres), cette affirmation est donc fausse. Ce qui est vrai en revanche, c'est que certaines constructions s'expriment plus aisément dans une de ces deux familles, et que pour d'autres c'est l'inverse (idem pour les perfomances). Il ne sert donc à rien de se balancer à la figure des exemples, chacun va trouver celui qui l'arrange. En pratique, on sait bien à quoi cette discussion sur les langages a abouti: des langages hybrides où on a la fois du fonctionnel et de l'impératif quelle que soit la famille initiale dont on se réclame, et #SET a consacré chez SPIP cette évolution mille fois refaite.

Le pb n'est donc pas à poser ainsi, mais dans le rapport entre le coût d'une contrainte qu'on s'impose au départ, et les bénéfices qu'on en retirera. Exemple standard: la déclaration de type. Dans le cadre d'un petit programme, la déclaration de type grèvera lourdement le temps de rédaction, et signalera un bug certes avant exécution, mais celle-ci serait si courte que le gain sera pratiquement nul. Dans le cas d'un gros programme, le rapport coût/bénéfice s'inverse. C'est la raison pour laquelle Unix a deux langages: le Shell, non typé, pour les petits programmes, le C, typé, pour les gros.

Dans le cas qui nous occupe, la question est de savoir le prix à payer pour garantir qu'un squelette respectera toujours une DTD donnée. L'exemple que j'ai donné où aucun filtre ne retournerait de balises est clairement trop élevé. Peut-on baisser ce prix pour le rendre acceptable ? Ce n'est pas avec des exemples ad hoc qu'on répond à une question aussi générale.

Committo,Ergo:Sum