[spip-dev] Syntaxe et Spip dynamique

Hello

Je réponds à toute les questions par un seul mail.

D'une part j'ai mis sur le site de SVP
http://spip21.smellup.net/spip.php?article17
un article reprenant le contenu du diaporama présenté avec spip-S5 à Avignon en 2009. C'est le texte initial (moins qq fautes d'orthographe) mais j'ai galéré pour passer de l'un à l'autre car il y a eu un dégradation dans les dump de SPIP: il transforme excessivement les < en < etc ça pète tous les textes comme celui-là où on veut montrer du code. Au passage c'est un autre exemple de mauvaise qualité de SPIP en matière de la syntaxe. Je crois que j'ai tout rétabli, n'hésitez pas à signaler des scories éventuelles. Kent1, ce serait bien, si tu ne peux remettre sur pied video-spip, d'attacher à cette article la video correspondante.

Le code de SPIP prévoit que les fichiers de squelettes ont une extension indiquée par le constante EXTENSION_SQUELETTE, pour l'instant toujours définie à "html". Si la distribution officielle de SPIP passe un jour à une autre extension (reflétant bien sûr un changement de syntaxe) en changeant la valeur de cette constante, on a deux scénarios possibles en tant que développeurs, qui impliquent chacun 2 scénarios pour les auteurs de squelettes.

Premier scénario, on ne change rien d'autre au code. Les auteurs de squelettes ont alors deux choix:

- en faire un maximum en appliquant sur leurs propres squelettes le traducteur qu'on leur fournira. Dans plus de 99% des cas ça marchera sans intervention manuelle, il leur faudra juste, quand ils voudront continuer à développer leur code, s'habituer à cette réforme de l'orthographe. Mais le but est justement qu'ils puissent utiliser le mode XML des éditeurs de texte, ça aidera.

- en faire un minimum en remettant "html" comme valeur d'extension. S'ils n'utilisaient AUCUN des squelettes std, ça marchera et ils profiteront des autres nouveautés des nouvelles versions de SPIP. S'ils en utilisaient, il leur faudra aller les chercher dans la version précédente et ça devrait marcher aussi, ils perdront juste les améliorations éventuelles dans les squelettes en nouvelle syntaxe.

Deuxième scénario: on améliore le code pour qu'il puisse SIMULTANEMENT accepter deux syntaxes. En gros, c'est remplacer les qq endroits où on fait
find_in_path($fond. EXTENSION_SQUELETTE)
par un code qui, si ce premier appel échoue, va essayer un 2e find_in_path sur la vieille extension "html" et en cas de réussite va appeler l'ancien analyseur.
Je dis "en gros" parce que dans parametrer/styliser le find_in_path est un peu caché, il y a un peu de réécriture à faire mais ce n'est pas un gros chantier.

Pour les auteurs de squelettes, ils profitent de toutes les nouveautés, peuvent traduire leur squelettes maintenant ou plus tard, sachant qu'il y aura une perte de temps à l'exécution si le 2e find_in_path est nécessaire.

Puisqu'on parle de perf, la discussion sur les perfs des modifs de l'analyseur syntaxique me parait assez oiseuse: la compilation n'a pas lieu souvent et les modifs invoquées sont négligeables, c'est un faux problème. Ce qui est en jeu c'est le temps d'apprentissage de la nouvelle syntaxe par chacun, avec le risque de rejet bien connu dans l'histoire des réformes de l'orthographe. Quant à vouloir rationnaliser l'existant, ce serait une totale perte de temps.

Enfin, sur le caractère inachevé de ce que j'avais exposé, j'avais effectivement donné seulement un cadre général à discuter, en montrant en revanche que l'outil de migration était, lui, parfaitement achevé. Mais il faut bien voir que ce cadre général fixe vraiment peu de chose: il dit seulement ce qu'il faut faire pour avoir la conformité XML (et discute un peu la possibilité d'avoir la validité, mais ça n'est pas obligatoire). A l'intérieur du cadre on peut soit essayer de rester au plus près de l'ancienne syntaxe, soit profiter de l'occasion pour aller plus loin (par exemple autoriser à écrire du SQL pur plutôt que la structure en "criteres" de SPIP qui mélangent les différentes clauses SQL). Je n'ai pas vraiment d'avis sur la question pour le moment.

Ah, encore une chose: la doc sur spipnet. J'avais regardé tous les exemples et par bonheur ils sont repérables par seulement 2 RegExp MySQL. Je pense que le bon plan est d'en faire des fichiers .txt à part, et de leur appliquer l'outil de migration pour avoir un 2e jeu de fichiers, d'extension .spip. Ensuite,
on remplace le texte dans le corps des articles par un modèle d'incrustation utilisant un bout de JavaScript permettant de visualiser l'un ou l'autre ou les deux fichiers référencés par le modèle.

J'espère avoir répondu à tout.

esj

Ça me parait la meilleure idée... voire pouvoir utiliser X syntaxes.
Par exemple avec un tableau de recherche array('spip'=>'public/parseur/spip', 'html'=>'public/parseur/html')... de telle sorte que pour des vieux sites, on puisse demander à chercher d'abords l'ancienne syntaxe avant la nouvelle... ou encore créer sa propre syntaxe sans toucher au code de spip.

Hello

Hello …

Je réponds à toute les questions par un seul mail.

Moi je répond qu’à une ça suffira bien :wink:

Kent1, ce serait bien, si tu ne peux remettre sur pied video-spip, d’attacher à cette article la video correspondante.

Non je ne peux pas dans l’immédiat … pas parce que je n’en ai pas envie mais parce qu’il n’est pas temps (je travaille constamment dessus et il me reste quelques semaines de boulot encore et je ne souhaite pas que ce soit pour l’instant avec le branding « spip.org » car non fini, instable et co) …

mais les contenus sont là :

http://spip.arscenic.tv

et donc dans ton cas :

http://spip.arscenic.tv/videos/evenements/spip-party-avignon-2009/article/des-squelettes-xml-lisibles-c-est

Les contenus resteront accessibles à cette adresse par routage au final et que donc les embed continueront de fonctionner … ainsi on peut faire ce que je viens de faire à la fin de l’article (je te laisse modifier à ta guise) :

http://blog.smellup.net/spip.php?article17

Voili voilou il suffit de demander…

Attentions aux effets de bords :

si les formats ont une hiérarchie (genre si on ne trouve rien en format1, on cherche dans le formar2),
c'est susceptible de provoquer des effets indésirables dans les surcharges (ie tout d'un coup le squelette d'un plugin reprend la main sur ma surcharge parce qu'il est passé en nouveau format alors que ma surcharge est toujours dans l'ancien).

Ce point est peut être un peu délicat à gérer, mais sinon supporter deux formats me parait en effet le mieux dans un scénario de migration.

Cédric

27/11/10, Emmanuel:

D'une part j'ai mis sur le site de SVP
http://spip21.smellup.net/spip.php?article17
un article reprenant le contenu du diaporama présenté avec spip-S5 à
Avignon en 2009.

C'est une bonne base de travail.

Pour avancer à partir de ça, en plus (ou au lieu) de la liste, on peut
peut-être commencer à transformer cet article général en documentation
technique plus formelle, découpée en chapitres (avec bien sûr quand
même une introduction à chacun). Le découpage en chapitres et en pages
permettra de discuter de chaque point séparément.

Dans ce document, il faudra bien rester sur une spécification technique
pure, sans même s'appuyer sur une critique de la syntaxe actuelle, ou
alors brièvement en introduction, et encore. Donner plein de mauvais
exemples n'a au mieux qu'un effet rhétorique. Bien sûr, cela n'empêche
pas de donner des équivalents en ancienne syntaxe lorsque des exemples
sont fournis, à titre d'illustration.

Les descriptions des langages Python, PHP et HTML (toutes versions) ne
sont pas parfaites mais sont de très bons exemples de forme, notamment
la spec Python : The Python Language Reference — Python 3.13.1 documentation

Le code de SPIP prévoit que les fichiers de squelettes ont une
extension indiquée par le constante EXTENSION_SQUELETTE, pour
l'instant toujours définie à "html". Si la distribution officielle
de SPIP passe un jour à une autre extension (reflétant bien sûr un
changement de syntaxe) en changeant la valeur de cette constante, on
a deux scénarios possibles en tant que développeurs, qui impliquent
chacun 2 scénarios pour les auteurs de squelettes.

[...]

Pareil, je propose de poser cette discussion technique sur un endroit
stable (un chapitre de la doc : "Migration"). Sinon, même si un
consensus se dégage, il faudra recompiler des semaines d'échanges de
mail pour le reconstituer. Non merci.

Si cette proposition d'outil de travail convient, ça serait donc a
priori un SPIP classique avec découpage en articles et sections (ou
peut-être un wiki dans un premier temps pour poser le plan ?).
Où est-ce que ça serait plus pertinent ?
- programmer.spip.org (à éviter je dirais, tant que c'est un projet)
- doc.spip.org (je comprends toujours pas comment ça marche, mais
   c'est personnel)
- un espace dédié (un peu dommage dans un sens, mais pourquoi pas)

Ça va peut-être sans dire, mais ça va mieux en le disant: on fait bien
une distinction entre le langage de SPIP (ce dont on parle ici) et SPIP
en tant que bibliothèque (ce que documente programmer.spip.org).
Chez Python, cette séparation est bien faite par exemple :
- Langage: The Python Language Reference — Python 3.13.1 documentation
- Bibliothèque: The Python Standard Library — Python 3.13.1 documentation

Ah, encore une chose: la doc sur spipnet. J'avais regardé tous les
exemples et par bonheur ils sont repérables par seulement 2 RegExp
MySQL. Je pense que le bon plan est d'en faire des fichiers .txt à
part, et de leur appliquer l'outil de migration pour avoir un 2e jeu
de fichiers, d'extension .spip. Ensuite,
on remplace le texte dans le corps des articles par un modèle
d'incrustation utilisant un bout de JavaScript permettant de
visualiser l'un ou l'autre ou les deux fichiers référencés par le
modèle.

Pas compris.

Yop,

Hello

D'abord merci à Kent1 pour la vidéo.

Pour le fait d'avoir les 2 syntaxes simultanément, j'ai commencé à regarder plus profondément les occurrences du find_in_path(X, EXTENSION_SQUELETTE), je pense donc effectivement que c'est faisable, mais je ne suis pas convaincu de l'intérêt. Le contre-exemple de Cédric est intéressant de ce point de vue. On pourrait plutôt créer des répertoires dédiés où on copierait tous les plugins de la zone auxquels on appliquerait le migrateur, et on y changerait
d'autorité leur plugin.xml pour mettre necessite=SPIP3. Les anciennes versions resteraient dispo et le développement pourrait continuer à s'y faire, en relançant le migrateur ensuite. Le chargeur de plugin de SPIP3 n'irait taper que dans ces répertoires, pas les autres. Je ne vois pas l'intérêt d'alourdir une nouvelle version de SPIP par des vieilleries traitables en amont.

Le code de SPIP prévoit que les fichiers de squelettes ont une
extension indiquée par le constante EXTENSION_SQUELETTE,

Pareil, je propose de poser cette discussion technique

Il n'y a pas vraiment de discussion à avoir, juste du code à rationnaliser un peu plus.

Si cette proposition d'outil de travail convient, ça serait donc a
priori un SPIP classique avec découpage en articles et sections (ou
peut-être un wiki dans un premier temps pour poser le plan ?).
Où est-ce que ça serait plus pertinent ?

Il y avait déjà eu un Wiki mis en place à l'époque de mon exposé:
http://www.spip-contrib.net/Syntaxes-Alternatives-pour-SPIP

On peut aussi utiliser le forum de
http://spip21.smellup.net/spip.php?article17

Ah, encore une chose: la doc sur spipnet.

Pas compris.

Une des grosses objections à cette nouveauté était la mise à jour de la doc.
Ce que je dis c'est que sa réécriture n'est pas si folle. D'une part on repère facilement les bouts de squelettes dans les articles de spipnet. Partant, il est relativement facile de faire une moulinette qui remplace (par sql_update) chaque séquence de code par un modele <skelNNN>, et qui créé dans IMG/txt/ un document numéroté NNN comportant ce qu'on a trouvé. Dans un premier temps le modèle fait juste une incrustation du fichier, et la doc n'a ainsi pas bougé extérieurement. Ensuite, si on change de syntaxe, il suffit d'appliquer le migrateur sur chacun des fichiers. Si en plus on veut pouvoir afficher les 2 versions, il suffit de conserver le premier jeu de fichier et complexifier un peu le modèle.

esj

Les anciennes
versions resteraient dispo et le développement pourrait continuer à s'y
faire, en relançant le migrateur ensuite. Le chargeur de plugin de SPIP3
n'irait taper que dans ces répertoires, pas les autres. Je ne vois pas
l'intérêt d'alourdir une nouvelle version de SPIP par des vieilleries
traitables en amont.

Je vois que ce nouvel échange de mail ne t'a pas convaincu.

C'est sans doute parce que tu n'as pas autant de sites dispersés dans
autant de recoins, mais aussi, plus ennuyeux, parce que tu
sous-estimes le travail mental que tu vas exiger de ceux qui vont
suivre cette migration. Si la migration n'est pas "soft", si elle
implique de devoir à un moment donné tout réinstaller, en passant des
scripts de migration, en changeant des chemins, en chargeant des trucs
nouveaux, en supprimant des squelettes que je connais pour les confier
à une syntaxe que je découvre, et donc que je ne maîtrise pas encore
très bien, etc... et en m'obligeant à faire une inévitable batterie de
tests dessus, personnellement ça signifie que soit je prends un mois
pour m'y consacrer, soit je ne la fais pas.

De plus cette voie de migration (disons de basculement) implique de
*tout* forker. Bonjour la maintenance.

Je suis peut-être le seul dans ce cas-là, auquel cas il ne faut pas
m'écouter. Mais dans le cas contraire, si on veut pouvoir faire
embarquer tout le monde sur le nouveau bateau, il faut que la
transition soit douce, qu'elle puisse se faire chacun à son rythme, se
faire la main sur un petit site, puis sur un plugin, puis sur un autre
etc, de manière éventuellement réversible, avant de décider de
franchir le pas et de passer les outils de migration *partout*. Là tu
nous demandes de brûler nos vaisseaux alors qu'on ne connaît pas
encore la syntaxe moderne, et que nos compétences sur sur le patois,
et c'est là-dessus que je coince.

J'ai proposé une autre voie de migration, qui permettrait à la fois de
commencer à migrer doucement ET de prévoir que le nouveau formalisme
sera transitoire et rapidement remplacé par un formalisme définitif.
Le cas problématique signalé par Cédric ne me paraît pas
insurmontable, il suffit d'avoir une règle de priorités intelligible.
Bien sûr les gens qui sont le plus en confiance, ou qui débutent avec
SPIP, ou qui démarrent un nouveau projet, pourraient zapper cette
partie en disant "chez moi pas de html, que du spipa". Mais ne
décroche pas les autres.

-- Fil

Quoting Fil <fil@rezo.net>:

Je vois que ce nouvel échange de mail ne t'a pas convaincu.

Si si, je me suis mal exprimé.

Ce que je me demande c'est s'il faut vraiment alourdir le code en prévoyant les 2 cas à chaque compil, alors qu'il y a une autre stratégie qui est d'utiliser le migrateur non pas une fois pour toutes et après adieu les vieux sources, mais au contraire de laisser chacun continuer à développer dans l'ancienne syntaxe, et quand ils passent en prod, ils appliquent le migrateur afin de n'installer que des squelletes en nouvelle syntaxe, qu'ils n'ont pas besoin de lire.

C'est là que je situe l'alternative. Pour le fait que l'acclimation à un nouvelle syntaxe est toujours difficile, c'est ce que je n'arrêtai pas de dire dans mon premier mail.

esj

Yop,

Quoting Eric Lupinacci <smellup@gmail.com>:

Pourquoi ce ne serait pas plutôt une option de configuration

Pour éviter de développer du code qui risque de tomber sur des cas comme ceux décrit par Cédric. J'ai regardé en détail donc, la solution à double syntaxe impose de changer la signature de la fonction inc_styliser_dist, et le pipeline qu'elle contient devrait être appelé autant de fois que de syntaxes autorisées. Tout ça n'est pas dramatique, mais on devine qu'il va y avoir des plugins pour qui ça peut être un problème. Il faut faire bouger le moins de choses possibles à la fois. Dire aux gens: vous pouvez continuer à développer dans l'ancienne syntaxe, mais appliquer le migrateur ensuite, c'est un peu contraignant mais ça permet de conserver le même modèle d'exécution.

Cela dit, ce n'est pas fondamental, on peut passer à la double syntaxe si vraiment la demande est forte, mais je serai alors pour déclarer que c'est le genre de choses qui finira par disparaitre dans une version ultérieure.

esj

Disparaître dans une version ultérieure de spip,
ou dés le début, sur demande explicite de configuration dans la partie privée d'un site.

JLuc