Comment ping-t-on un avion ?

Un pseudo avec un tiret, un espace...

Le problème exposé dans ce sujet a été résolu.

Si quelqu’un veut rendre ça échappable avec \, je suis pas contre.

[edit] Je vais aussi partir du principe que si y’a pas de nouvelles ici d’ici quelques jours, je ferme : https://github.com/zestedesavoir/zmarkdown/issues/242

+0 -0

Est-ce que ce serait :

  1. simple
  2. sans effets de bord graves

d’améliorer la fonction qui détecte les pseudos à pinguer pour la rendre directement compatible avec la majorité des pseudos de ZdS, à savoir : prendre en compte comme étant « un pseudo » tout ce qui n’est pas un espace (au sens large), mais qui est compris entre un espace et un @ et un espace ? Les délimitations arbitraires avec les ** ne seraient plus nécessaires que pour les pseudos à espaces.

En regex, ça donnerait : on détecte \s@(\S+)\s et le pseudo est ce qui est capturé par les parenthèses.

C’est un comportement qui me paraît sensiblement plus logique et libéral que l’actuel, et en première approche je ne vois pas de cas de régression. En fait, d’un point de vue utilisateur, je ne vois pas pourquoi A et 3 n’ont pas besoin de délimiteurs, mais - en impose un, ça ressemble à une limitation technique présentée à l’utilisateur.

Notez que comme je ne sait pas exactement comment c’est fait aujourd’hui (avec un AST je pense, et probablement pas avec une regex) je ne sais pas si c’est vraiment faisable, ni s’il y a des impacts à côté desquels je passe.

Pourquoi pas en effet, mais il y a un risque de problèmes avec la ponctuation qu’il faudrait peut-être exclure de la regex. Aussi, ça ne marchera apparemment pas si le message commence ou se termine par un ping.

>>> import re
>>> r = re.compile("\s@(\S+)\s")
>>> r.findall("@nickname : Salut !")
[]
>>> r.findall("Bonjour @nickname !")
['nickname']
>>> r.findall("Bonjour @nickname!")
[]
>>> r.findall("Bonjour @nickname1, @nickname2 et @nickname3 !")
['nickname1,', 'nickname3']
>>> r.findall("Bonjour @nickname1, @nickname2 et @nickname3!")
['nickname1,']

Cela dit, je plussoie. Mais apparemment, il y a moyen d’obtenir un comportement semblable en modifiant la configuration de `remark-ping (#242), si j’ai bien compris.

+1 -0

J’ajouterai aussi (pour ce que ça vaut) que je trouve que la syntaxe des pings de "pseudos complexe" n’est pas la plus judicieuse.

J’aurai préféré quelque chose a base de @[A-312] ou encore @(A-312), car ça me semble plus intuitif à la lecture et ça m’évite de devoir taper trop de caractères en plus. Aujourd’hui , pour pinguer un pseudo complexe, on doit taper 5 caractères en plus.

Est-ce que ce serait :

  1. simple
  2. sans effets de bord graves

Simple oui et non, faut trouver la bonne regex. Sans effets de bord graves certainement, sans effets de bord tout court oui et non, faut trouver les bons tests. :)

En regex, ça donnerait : on détecte \s@(\S+)\s et le pseudo est ce qui est capturé par les parenthèses.

La regex actuelle : /\B@(?:\*\*([^*]+)\*\*|(\w+))/ et la doc.

Notez que comme je ne sait pas exactement comment c’est fait aujourd’hui (avec un AST je pense, et probablement pas avec une regex) je ne sais pas si c’est vraiment faisable, ni s’il y a des impacts à côté desquels je passe.

SpaceFox

(En fait l’AST représente le document et permet de le manipuler, les regex sont juste un outil à disposition lorsqu’on veut créer l’AST représentant un document. ;) )

Bref, si quelqu’un fait une PR pour modifier la config de zmarkdown et ajoute à zmarkdown la bonne batterie de tests qui évitent de tomber dans les cas typiques présentés par @rezemika, c’est volontiers !

@firm1 : on n’est pas les premiers à avoir réfléchi à ça ou à avoir implémenté une syntaxe de ping pour markdown, j’ai choisi la même syntaxe que les autres utilisent déjà et elle me semble judicieuse pour plusieurs raisons. Déjà parce qu’elle est utilisée ailleurs alors que je connais pas d’occurrences des syntaxes que tu proposes. Ensuite parce qu’elle est très lisible sur tu l’utilises là où le markdown ne supporte pas la syntaxe.

Aujourd’hui , pour pinguer un pseudo complexe, on doit taper 5 caractères en plus.

C’est un peu mensonger non ? :D Aujourd’hui pour pinger un pseudo complexe, on doit taper 2 caractères de plus que la syntaxe que tu proposes. (En nombre de caractères. La syntaxe que tu proposes demande de taper un caractère de plus que la syntaxe actuelle en nombre de caractères différents. La syntaxe actuelle demande de taper 4 caractères de plus que la syntaxe pour pseudo 'simple’.)

+1 -0

Je pense que j’en ai une pas mal, je vous la soumets avant de tenter une PR :

@(\S*(?:(?![\.:,;!?%"«»\(\)\[\]{}])\S))

Je prends 0 ou plus n’importe quoi qui est un caractère « imprimable » (= pas un séparateur de mots, pour que ça gère l’Unicode…) suivi d’exactement 1 (n’importe quoi qui est un caractère sauf l’une des ponctuations décrites). Ça permet de gérer nativement les pseudos qui contiennent n’importe quel caractère unicode, y compris de la ponctuation (y’a au moins des pseudos avec des . et des -) tout en évitant de prendre la ponctuation naturellement liée au ping, comme dans les exemples de @rezemika.

Je pense que dans les pseudos qu’on a et les cas d’utilisation « normaux » que je vois, les seuls pseudos qui nécessiteront encore la syntaxe avancée seront ceux avec des espaces.

Si vous ça vous va, je l’intègrerai dans la regex complète et tenterai une MR.

PS : les regex JS sont pourries, il manque les 3/4 des classes de caractères utiles !

Trop bien !

Note que t’as des échappements en trop :

- @(\S*(?:(?![\.:,;!?%"«»\(\)\[\]{}])\S))
+ @(\S*(?:(?![.:,;!?%"«»()[\]{}])\S))

Au final ça va faire un sacré monstre, vive les regex ! :D

/\B@(?:\*\*([^*]+)\*\*|(\S*(?:(?![.:,;!?%"«»()[\]{}])\S)))/

[edit oubli] et j’ai pas compris l’histoire d’unicode. Le flag /…/u ne gère pas bien ça ? En tout cas ça m’a l’air de fonctionner.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte