Le langage de forum de la v5 - Lightscript (RFC)
Posté le 02/01/2018 14:50
Salut à tous ! Je voudrais vous présenter le draft actuel du langage de forum de la v5 - nommé
Lightscript, un gentil dérivé de Markdown conçu pour Planète Casio. J'ai noté RFC (
Request For Comments) dans le titre, c'est une manière fun de dire que vous êtes invités à donner votre avis !
2018-02-06 : La spécification est freezée jusqu'à nouvel ordre ; j'implémente. Vous pouvez quand même faire des remarques ou proposer des extensions, elles sont bienvenues !
Ce langage servira à écrire tout ce qui existera sur la v5 ou presque : les messages sur le forum, les descriptions et commentaires de programmes, les tutoriels, les messages privés, etc etc. Les seules exceptions notables que je puisse déjà évoquer sont les tutoriels, que l'on pourra aussi écrire (au choix) en LaTeX, et l'IRC qui fait bien ce qui lui plaît.
Je tiens à préciser que je suis en train d'implémenter le programme de conversion (vers HTML), mais je débute encore. Rien n'est définitif, tout est discutable.
La description du langage est ci-dessous : vous pouvez réagir sur l'ensemble ou pointer des conflits de syntaxe, des oublis, des fonctionnalités manquantes qui vous sembleraient intéressantes. Il y a des choses que j'ai éliminées volontairement ; je les ai citées tout à la fin avec un argumentaire. N'hésitez pas à en discuter. Je compte sur vous !
Le modèle « théorique »
Sans rentrer dans les détails compliqués, un message en Lightscript c'est une suite de
blocs : paragraphes, citations, listes à puces, titres par exemple. La fin d'un bloc est soit marquée explicitement par la syntaxe (comme les citations qui se terminent toutes par
>>>), soit marquée par un
retour à la ligne ou par une
ligne vide. C'est important, donc soyez attentifs !
Beaucoup de blocs contiennent du texte interprété (par exemple les paragraphes ; mais pas les blocs de code, dont le contenu est recopié tel quel dans le HTML). Le texte interprété peut contenir des
objets textuels, par exemple un passage de texte en gras, un lien hypertexte, ou une référence à un programme dans la base de données.
Passons maintenant aux réjouissances.
Détail des blocs
Les paragraphes sont exactement ce que vous pensez. Un paragraphe représente une unité de texte « par défaut », et se termine habituellement sur une
ligne vide. Il peut contenir des retours à la ligne, qui sont alors fidèlement reproduits (ce qu'on fait actuellement dans la v42). Quand vous sautez une ligne, un nouveau paragraphe commence. Savoir si plusieurs lignes vides sont fusionnées en une seule n'est pas encore décidé !
Comme en Markdown, je vous propose deux styles de titre : soit avec des
#, soit soulignés. Le premier type, c'est un ou plusieurs
# suivis d'un paragraphe. Ça va donc jusqu'à la prochaine ligne vide. Le second type (décoratif), consiste en un paragraphe souligné par des
= ou des
-. La ligne qui souligne indique très naturellement la fin du bloc de titre.
# Titre de page
## Titre de catégorie. On a le droit de le
prolonger sur plusieurs lignes
...
###### Titre de niveau 6
Titre de page alternatif
========================
Titre de catégorie alternatif
-----------------------------
Les citations et les blocs de code ont une syntaxe commune : ils commencent par trois symboles ouvrants sur une ligne (avec des options facultatives) et se terminent par trois symboles fermants sur une ligne. Les symboles doivent être placés au tout début de la ligne, sinon ça fait un paragraphe !
>>> DarkStorm
Oui. Il suffit de la coder. :waza:
>>>
``` basic lines
Getkey→G
G=47⇒Goto 9
G=27⇒X-1→X
G=37⇒X+1→X
```
Niveau listes, je propose des listes à puces et des listes ordonnées. Pour les listes ordonnées, la numérotation commence par le nombre indiqué sur la première ligne puis incrémente les numéros en ignorant les valeurs suivantes (c'est classique) ; ça vous évite de tout renuméroter chaque fois que vous insérez un truc.
- Ceci est une liste à puces
* Elle continue même quand on change de puces
+ On peut y mettre du `code`, du *formatage*...
0. Real developers count from 0
1. No, real developers use butterflies!
2. Ah, yes, there's good ol' C-x M-c M-butterfly for that.
3. Damn, Emacs...
Il me reste les définitions de références. Parfois les liens de la forme
[label](url) sont lourds à lire parce que l'URL est longue, parfois vous voulez utiliser plusieurs fois la même URL. Dans ce cas, vous pourrez écrire
[label][ref-name] et définir plus loin la valeur de
ref-name. C'est ce que j'appelle une définition de référence !
[ref_name]: http://www.example.com
Une définition de référence tient sur une unique ligne. Je reviendrai sur ces liens dans la section suivante !
Les objets textuels
C'est là qu'on s'amuse à mettre n'importe quoi dans nos phrases. Commençons par les options de formatage :
*emphasis* (italique)
**strong** (gras)
~striked~ (barré)
`code` ou `code`[lang] (code inline)
$math$ (formules KaTeX)
Je pense que tout est à peu près explicite. Le cas
`code`[langage] permet de mettre du code coloré dans une phrase. Il ne faut pas d'espace entre la backtick fermante et le premier crochet !
Les liens sont toujours une question délicate. La détection automatique des URLs dans les messages (autolinking) est compliquée à écrire
et à utiliser, donc je vous propose de simplifier votre vie (et la mienne !) en mettant des chevrons (
<url>). De façon générale, prenez le temps de mettre des noms sur vos liens, ce sera toujours supérieur !
Des liens, il y en a plusieurs types : certains sans noms, d'autres avec. En spécifiant un
# au début de l'URL, vous pouvez référencer une section de votre article/tutoriel, ça enverra vers le titre associé !
<http://example.org>
[lien externe](http://example.org)
[lien interne](#compilation-manuelle)
Vous pouvez également décider de spécifier l'URL plus tard, à l'aide d'une référence (rappelez-vous, le bloc de définition de référence sert à ça !). Vous pouvez aussi utiliser une ressource (voyez plus loin) comme cible, ou tout simple une page de Casio Universal Wiki.
[lien par référence][ref-name]
[lien vers ressource][:uLephenixnoir]
[lien vers le wiki][[Basic Fx-CG]]
Comme avant, il y aura des médias. La syntaxe pour les utiliser est assez générale :
[[image:http://url.png 640 480]]
[[video:youtube.com/watch?v=deadbeef]]
[[wiki:Fxlib.h]]
Je n'ai pas encore fixé le type de choses qu'on pourrait utiliser avec ; je vous invite à suggérer. Le comportement pourra être différent si cet objet est utilisé en plein milieu d'une phrase ou tout seul sur un paragraphe. Par exemple, on aura envie de centrer les images si elles sont toutes seules.
Viennent ensuite les spoilers. Les discussions ont été longues et compliquées. Pour tenter de concilier les partis, je vous propose un spoiler volontairement moins puissant que l'original. C'est un spoiler
inline, et vous ne pouvez donc mettre que quelques phrases dedans. Vous pouvez le tester
sur jsfiddle.net :
And then they (((all die)))!
Il reste les choses les plus fun. D'abord les notes de bas de page (pour l'humour dans les articles en page d'accueil ^-^ ), et ensuite les références aux objets de Planète Casio :
Oui, mais c'est impossible ! [^Sauf si P=NP.] (note de bas de page)
:m2451 (référence au message numéro 2451)
:f234 (topic numéro 234)
:t32 (tutoriel numéro 32)
:rLephe/gint (dépôt Gitlab `Lephe/gint`)
...
Toutes les références de Planète Casio utiliseront la syntaxe
:[a-z][^ :]+ (c'est-à-dire, "
:" suivi d'une lettre minuscule suivi d'un mot non vide qui ne contient ni espace ni
":") et elle leur est strictement réservée. Cela n'interfère pas avec nos smileys !
On peut aussi utiliser ces références dans des liens (quand c'est approprié). Par exemple :
[Profil de Ne0tux][:uNe0tux]
Vous avez aussi les mentions : de gens, ou de groupes. L'usage des mentions de groupe trop larges type
@@all sera probablement réservé à l'équipe pour éviter des problèmes :
Je pense que @Cakeisalie5 connaît la solution à ce problème.
Topic à nettoyer (@@mod).
@<pseudo>
@@all @@admin @@mod @@redac etc.
Il me reste, finalement, les smileys. Vous les connaissez assez bien pour ne pas avoir besoin d'une description.
Je ne vous cache pas que j'aimerais bien remplacer les grands par des choses de taille raisonnable, ou les supprimer. Dans tous les cas, il y auras probablement de légères retouches de design sur les smileys habituels (presque rien).
Subtilités de syntaxe
Si vous n'avez pas envie de vous casser la tête, sautez cette section. Si vous pensez que la syntaxe ne va pas tenir le coup, lisez-la ; vous aurez peut-être des réponses. Si non, prévenez-moi dans les commentaires !
Pour le formatage des objets textuels, vous pouvez avoir envie de mettre un backtick dans le code. Pour ça, doublez les backticks sur le côté. Tout ce qu'il faut c'est que le code intérieur ne contienne pas la marque de fin. S'il apparaît des backticks, mais pas en même nombre, ce n'est pas grave :
``$ cat `find -iname *.c` | grep MACRO``
`function(``args``);`
```function(``args``, `arg`);```
-- ` et `` sont tous deux présents dans le code, donc on triple
Pour le gras et l'italique, c'est pareil, sauf qu'une fois tous les comptes terminés c'est la parité du nombre d'étoiles qui détermine le type de formatage que vous demandez (impair : emphasis, pair : strong). Ça marche aussi pour les citations imbriquées (et le code, comme vous vous en doutez) :
>>>> DarkStorm
>>> Eragon
Ok sinon il y a un moyen de tester la V5?
>>>
Oui. Il suffit de la coder. :waza:
>>>>
Je prévois que le bouton « Citer » calcule automatiquement un nombre satisfaisant de chevrons si le message à citer contient lui-même des citations. Faut pas déconner non plus !
Éléments à potentiellement ajouter
J'en ai déjà cité quelques-uns. Il me vient à l'esprit :
– De quoi centrer ou justifier le texte (
paramètre du message)
– Des tableaux pour faire des statistiques *o*
– Les barres horizontales (facile à faire ça)
Éléments intentionnellement omis
Avec les discussions, j'ai mis à jour cette section. Voilà ce qui en reste ; les objets qui sont pour l'instant éliminés... avec explications.
Les spoilers ont été réduits à des objets inlines pour éviter qu'ils soient utilisés pour
structurer les descriptions de programmes ou des grosses docs qui devraient être séparées en plusieurs pages. Le gameplay d'un jeu ne devrait pas être caché dans une boîte ! C'est le plus important. Les titres sont plus appropriés pour structurer et les grandes images seront redimensionnées automatiquement, donc cette restriction ne devrait pas gêner outre mesure. J'ai pu oublier des cas.
Le soulignement et le texte barré sont rarement utilisés. Le gras remplit efficacement le rôle de mise en avant prévu par le soulignement, et comme Lightscript ne précise pas ce que
<strong> donne comme formatage, on peut aussi opter pour italique/soulignement sans gras. Le texte barré est difficile à lire. Honnêtement, j'ai surtout éliminé ces deux-là pour des raisons de syntaxe. J'ai eu trop de mal à trouver des moyens honnêtes de les introduire dans la définition du langage.
Les liens vers une page de profil et les barres de progression étaient compliqués à intégrer à la syntaxe, mais je peux réfléchir au premier avec la syntaxe réservée, par exemple
:uLephenixnoir. Le second n'a à ma connaissance jamais été utilisé de façon productive, à part pour poster des commentaires de programmes qui balançaient un chiffre au lieu de donner des éléments intéressants sur l'état de développement des projets. On s'en passera sans peine, je pense.
Conclusion
C'est un très long post, je vous remercie de l'avoir lu jusque-là. Vous avez certainement des remarques à faire : j'y répondrai de mon mieux. Merci de votre aide !
Citer : Posté le 05/01/2018 09:27 | #
Actuellement ; pas du tout :
Edit : Mais c'est une idée très intéressante et ça m'a l'air tout à fait faisable.
Citer : Posté le 05/01/2018 17:45 | #
Donc si on veut un truc du genre Le tuto se trouve <a href="…/tuto/1234>ici</a>, faut passer par un lien complet ?
Citer : Posté le 05/01/2018 17:51 | #
Non, je peux implémenter ce que tu proposes ; ça me paraît largement intéressant pour cette raison, en fait. La forme originelle existe surtout parce qu'elle est brève et qu'on gagnerait sans doute à multiplier les références entre les différentes parties du site.
C'est ce que mon edit suggérait. Je pense que je vais faire ça.
Citer : Posté le 05/01/2018 18:57 | #
Si t'arrive à faire cohabiter les deux, c'est top. Mais sinon, mon système à l'avantage de ne pas rentrer en conflit avec les smiley quoi qu'il arrive
Citer : Posté le 05/01/2018 20:36 | #
Facile !
Citer : Posté le 28/01/2018 21:55 | #
Un peu tard mais on pourrait pas utiliser #f432, #t123, #p6543 ?
Comme ça on utilise la même syntaxe que pour les numéros des messages, et ça entre pas en conflit avec les smileys.
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 28/01/2018 22:04 | #
En fait je préférerais faire l'inverse : utiliser deux points pour tous les éléments. Ça m'évite les emmerdes avec les conflits possibles avec les titres.
Du coup ça répondrait à l'uniformisation, qui est bienvenue. Pour les smileys, je ne me fais pas de souci. J'ai bien regardé ce qu'on avait, ça m'a paru vraiment improbable qu'il y ait conflit. Après, on peut utiliser un autre caractère sinon (genre % ou $ - suggestions ?).
Citer : Posté le 28/01/2018 23:23 | #
Question bête, mais y a-t-il moyen d'« échapper » un terminateur de citation ? Par exemple, supposons que j'aie dit ça :
>>>
Y a-t-il moyen de faire en sorte avec un <<< Cakeisalie5 de garder ça, ou dois-je utiliser un nombre de chevrons différent ?
(de même pour inclure ``` dans un code multi-ligne)
Mon blog ⋅ Mes autres projets
Citer : Posté le 29/01/2018 06:37 | #
A priori c'était à faire avec un nombre de chevrons différents. Car que faire le jour où tu dis la chose suivante ?
>>> Cakeisalie5
Ce serait sans fin, n'est-ce pas ? Heureusement, l'ensemble des entiers aussi, donc on arrivera toujours à s'en sortir.
Blague mise à part, il te faut en effet une infinité de terminateurs la citation si tu veux toujours en avoir un valide peu importe ce que tu mets dedans.
Citer : Posté le 29/01/2018 11:08 | #
Ouais 'fin, le bouton « Citer » n'est pas si facile à implémenter en Lightscript que ça du coup. (mais ok)
Mon blog ⋅ Mes autres projets
Citer : Posté le 29/01/2018 14:15 | #
C'est pas vrai : il suffit de chercher le plus grand nombre de chevrons consécutifs dans le message cité, et ajouter 1.
Citer : Posté le 29/01/2018 18:53 | #
Donc si mon message c'est :
Tu vas utiliser 50 chevrons ? Et si j'en avais mis 100 ? 1000 ?
Mon blog ⋅ Mes autres projets
Citer : Posté le 29/01/2018 18:57 | #
Un tel message ne serait pas syntaxiquement correct, mais pourquoi pas ? Je n'ai pas dit que je calculais la forme optimale du message. On peut le faire, si tu veux. Il me suffit de produire un entier dans les méta-données du message une fois que lightscript est passé pour formater ton message.
Ce qui risque de se passer c'est que le message source sera envoyé également au client pour éviter de faire une requête supplémentaire en cas de clic sur le bouton « Citer ». Il ne coûtera alors pas grand-chose de plus au programme lightscript d'ajouter un petit nombre indiquant le nombre de chevrons maximal qu'il a rencontré dans une quote pendant la traduction. Et là il connaît clairement l'optimal, lui.
Edit : Je peux aussi faire un match à égalité parfaite, ie. si ton message contient une marque fermante mais trop longue, je la refuse... x)
Citer : Posté le 29/01/2018 20:52 | #
Cake, si ton message c'est ça je pense que t'aura clairement autre chose à faire. Tant que les cas particuliers mais non utilisés ne provoquent pas de faille de sécu, osef.
Citer : Posté le 01/02/2018 22:41 | #
J'ai mis à jour le document. Si vous pouviez le relire pour reprendre la discussion, ce serait sympa !
L'update dans les grandes lignes :
- Plus de fidélité sur les retours à la ligne, un paragraphe c'est une unique ligne dans l'éditeur (comme actuellement)
- J'ai ajouté les spoilers inline que j'avais proposés
- J'ai ajouté le barré avec la syntaxe ~
- Les références peuvent être utilisées dans les liens (eg. [Profil de Darks][:uDarkStorm])
- J'ai ajouté les mentions (eg. @DarkStorm ou @@admin)
Du reste, @Zezombye, pour tes touches mortes on pourra ajouter une petite fonctionnalité à l'éditeur qui te permettra de configurer un raccourci clavier à ta convenance (juste pour toi). Tu pourras utiliser le raccourci de ton choix !
Et, désolé @Dark Storm, tes supers spoilers peuvent pas s'inliner... et je préfère encore recourir à Javascript que devoir revenir sur les débats incessants de comment les utiliser. Je doute que ce soit conciliable
Citer : Posté le 02/02/2018 08:49 | #
un paragraphe c'est une unique ligne dans l'éditeur (comme actuellement)
Beh pas vraiment. De ce que j'en sais (même si c'est dégeulasse et c'est pourquoi je réimplémente ça), y a pas vraiment de logique de paragraphes dans le BBcode actuel, c'est juste des retours à la ligne de type <br />. Dans ma réimplémentation, je suis en train de faire que \n c'est un <br /> et \n{2,} c'est une séparation de paragraphes (espacés, donc), histoire de garder la même logique visuelle d'espacement entre les lignes qu'actuellement — mais si tu souhaites vraiment switcher à du une ligne = un paragraphe (avec espacement donc), hésites pas à me le dire qu'on se synchro dessus - puisque comme tu le sais, je fais du BBcode -> Lightscript actuellement aussi
Du reste, mokay ! C'est pas aussi straightforward à produire que du HTML, mais c'est sans doute parce que c'est pas fait pour ça aussi
Ajouté le 02/02/2018 à 09:16 :
Aussi, si j'ai envie de juste écrire :u<machin> sans inline code (donc backquotes) et sans que le traducteur Lightscript l'interprète, comment je fais ? Est-ce que je l'escape du genre \:u<machin> ?
S'il y a un jour des références avec des espaces, du genre des références avec argument (thème, ordre des posts, ou tout simplement identifiant avec espaces, que sais-je !), comment ça sera implémenté ? :u[machin truc] ?
Et est-ce que des trucs type :u"><script>alert(1)</script> sont considérés valides par ton traducteur actuel ?
Mon blog ⋅ Mes autres projets
Citer : Posté le 02/02/2018 10:01 | #
Pour les paragraphes, j'hésite. La question est : dans le code suivant, les deux lignes sont-elles séparées par un line break ou forment-elles un nouveau paragraphe ?
Deuxième ligne
J'aimerais tenter le nouveau paragraphe, quand même. On a discuté avec Zezombye de la fidélité des retours à la ligne mais je ne suis pas convaincu de l'utilité du line break simple... par défaut, je ne sais pas.
Si tu as des exemples pour argumenter dans un sens ou dans l'autre, je suis preneur.
Un escape serait bienvenu, oui. Je n'y avais pas pensé. Que dis-tu de ::u<machin> tout simplement ?
Faut pas abuser. :3
Plus précisément, un username c'est [a-zA-Z0-9_.-]+ donc non. Pour les autres éléments (et il y en a beaucoup), normalement tu n'as pas besoin de chaînes arbitraires. Je pense que je peux interdire les chevrons. Ou alors je me contente de les échapper (n'exagérons rien).
Merci pour tes retours !
Citer : Posté le 02/02/2018 12:00 | #
Ouais, tout bon pour moi, sauf le coup comme Cake du retour ligne/changement de paragraphe.
Perso j'aurai bien fait comme Cake, c'est à dire un \n → <br />, deux ou plus → nouveau paragraphe. J'argumente en disant que visuellement deux paragraphes sont toujours espacés, donc c'est plus fidèle si y'a une ligne entre les deux dans l'éditeur.
Sans compter le fait qu'on peut faire un retour ligne sans forcément vouloir un nouveau paragraphe.
Sinon j'aime beaucoup l'idée des mentions de groupe.
Citer : Posté le 02/02/2018 13:26 | #
D'accord, puisque vous insistez, je vais implémenter des retours à la ligne fidèles. Que fait-on pour trois, quatre... ?
Essayons d'utiliser des paragraphes quand c'est possible, tout de même.
Citer : Posté le 02/02/2018 14:28 | #
C'est vraiment bien ce que tu as fait, j'adore surtout le système des # pour les titres, et surtout le fait de rajouter autant de # que le niveau du titre.
Cependant, le reste sur les liens et les notes c'est indigeste
C'est beaucoup trop compliqué, je trouve qu'il y a beaucoup de combinaison, je n'ai pas tout saisi à la première lecture.
Je n'ai pas compris l'histoire des espaces et des retours à la ligne ? Qu'est ce qui change ?
L'utilisation du backtits
Tu ne peux pas nous proposer un autre caractère ?
Et pour aller plus loin, il ne serait pas possible de se passer du texte "caché" ? Faire comme dans Word ?
Je veux dire par là que dans Word, quand on augmente la taille de police, on a le rendu final à l'écran. On ne voit pas toute la machinerie caché derrière. Là ce que tu nous proposes ne change rien au BBcode hormis de changer la syntaxe des balises...
L'idéal serait d'avoir dans notre boite de texte (là où je tape actuellement) le même rendu qu'un message publié.
On clic sur le bouton citation, une boite de citation s'ajoute à la suite du texte, on remplie cette boite comme on veut.
Ajouté le 02/02/2018 à 14:29 :
Où là le backtit fou le bordel dans mon message ^^'
Citer : Posté le 02/02/2018 15:20 | #
D'accord, puisque vous insistez, je vais implémenter des retours à la ligne fidèles. Que fait-on pour trois, quatre... ?
Essayons d'utiliser des paragraphes quand c'est possible, tout de même.
Un retour à la ligne :
Deux retours à la ligne :
Trois retours à la ligne :
Quatre retours à la ligne :
C'est pas compliqué
Ajouté le 02/02/2018 à 16:01 :
Aussi il faudrait que le texte soit en normal par défaut, et non en justifié, tout simplement parce que le justifié ça change la largeur des espaces, et ça peut être chiant. Par exemple :
Ici la 3ème ligne en partant de la fin a des espaces trop grands.
(je vois d'ailleurs pas pourquoi tu veux mettre en justifié, sachant que je n'ai jamais vu un forum utiliser le justifié, y compris stackoverflow, ZdS, reddit qui eux utilisent le markdown)
Ecrivez vos programmes basic sur PC avec BIDE