Gras / Pas Gras

Résolu
cs_PaTaTe Messages postés 2126 Date d'inscription mercredi 21 août 2002 Statut Contributeur Dernière intervention 19 février 2021 - 4 janv. 2007 à 11:29
cs_PaTaTe Messages postés 2126 Date d'inscription mercredi 21 août 2002 Statut Contributeur Dernière intervention 19 février 2021 - 7 janv. 2007 à 05:12
Je cherche depuis un moment la mthode la plus simple pour ecrire en alternance de gras ou pas.

Seulement je n'y arrive pas.

Quelqu'un pourrait-il m'aider ?

Merci

[PaTaTe]

28 réponses

cs_TropNul Messages postés 340 Date d'inscription dimanche 18 septembre 2005 Statut Membre Dernière intervention 22 octobre 2009
5 janv. 2007 à 17:07
Areuh :)

Je n'ai pas trouvé de solution en utilisant les expressions rationnelles. Donc je te conseille d'utiliser l'alias de Panthouffle qui fonctionne correctement !

Le seul bug que je n'arrive pas à régler est sur les mots de taille impair. (J'ai encore beaucoup à apprendre en regex lol)

Néanmoins, je vais poster l'alias 'final' que j'ai fait et qui 'ignore' les espaces de la chaîne de caractère

ALIAS BUB {
  VAR %Z , %X = $regsub($1-,/([^[:space:]])([^[:space:]])/g,$+($chr(2),\1,$chr(2),\2),%Z)
  RETURN %Z
}

Sa méthode d'utilisation est la même que pour l'ancien :o)

Comme Wims l'a fait remarqué, ce n'est certainement pas évident au premier abord ce langage que sont Les Expressions Rationnelles.

En résumé, une boucle est faite sur une chaîne selon un modèle qu'on lui précise, afin de chercher dans la chaîne donnée, quelque chose qui vérifierait le modèle fournit :)

Ici, j'ai utilisé le $regsub pour faire une substitution sur la chaîne donnée, de ce qui serait vérifié par le premier modèle, par un second modèle de substitution. Puis finalement, le résultat de la 'boucle' est mis dans une variable, à savoir %Z !

Le modèle est /([^[:space:]])([^[:space:]])/g
Le modèle pour substituer est $+($chr(2),\1,$chr(2),\2)

Explication: S'il trouve 2 caractères se suivant et qui ne sont pas des espaces, procéder à la substitution !

Afin de mieux comprendre les Expressions Rationnelles, je vous conseille fortement de lire complètement le tutoriel de Sax, qui est excéllent pour débuter ou de lire le fichier pcre.txt, ou de faire les 2 :p

En bref:

[^[:space:]] correspond à une classe de caractères qui ne sont PAS(à cause du ^) des espaces.
A contrario, vous avez compris que la classe [[:space:]] correspond elle a toutes les espaces possibles.
Rq: $chr(160) n'est pas contenu dans cette classe lol :p

Continuons:

le modèle est de la forme suivante:

/()()/g

Toute paire de () en regex, est appelée un groupement. Ici, j'en ai mis 2.
Dans chaque groupement, j'ai imposé qu'il devait contenir un caractère qui n'est pas un espace.
A chaque fois que ce modèle sera vérifié, le modèle de substitution est utilisé $+($chr(2),\1,$chr(2),\2) , ou \1 correspond à un rappel du premier groupement et ou le \2 correspond à un rappel du second groupement. d'ou la subsitution en intercalant des $chr(2)

Bref, c'est en très peu de mots que j'éssaye d'expliquer le fonctionnement de ce bazar lol.  donc très difficile à tout dire. surtout que je ne sais pas tout mdr :s

bon courage pour la suite si vous entreprennez ce long voyage qu'est la compréhension des regex !!!



TropNul
3
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
5 janv. 2007 à 18:31
Que test tu ? le code qui marche reelement est la while de panthouffle, elle s'utilise en alias :

alias gras { var %l 1 ,%c 1 ,%text ,%2 = $len($1-)
  while (%l <= %2) {
  var %m = $mid($1-,%l,1)
  if (%m != $chr(32)) {   if ($calc(%c % 2) 1) { %text $+(%text,$chr(2),%m,$chr(2)) }
  else { %text = %text $+ %m }
   inc %c
   }
   else { %text = %text $+ $chr(160) }
    inc %l
  }
  return %text
}

j'ai pas testé mais utilise $gras(Texte)
3
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
4 janv. 2007 à 15:50
En alternance de gras ? Du gras une lettre sur deux ? si oui il te suffit de faire une boucle sur chaque charactere et une fois sur deux, tu ajoute le gras ou non.
0
cs_PaTaTe Messages postés 2126 Date d'inscription mercredi 21 août 2002 Statut Contributeur Dernière intervention 19 février 2021 2
4 janv. 2007 à 16:24
c'est effectivement ce que je veux mais tous mes essais se sont révélés infrutueux ...

[PaTaTe]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_TropNul Messages postés 340 Date d'inscription dimanche 18 septembre 2005 Statut Membre Dernière intervention 22 octobre 2009
4 janv. 2007 à 17:40
Hello ^^

Je pense que tu peux faire cela à l'aide du petit alias qui suit.

Alias BUB { VAR %S , %R = $regsub($1-,/(.)(.)/g,$+($chr(2),\1,$chr(2),\2),%S) | RETURN %S }

Utilisation:

$BUB(Le texte)

Exemples:

//echo -s > $BUB(This is a test to make bold then not bold ^^)



TropNul
0
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
4 janv. 2007 à 18:51
hi TropNul :)

Les regex sont geniaux mais tu aurais pu détaillé parce balancé le regsub comme ca, le type va rien pigé :]
En plus j'ai testé mais ton regex zape les espaces parce $bub(Ga is Ga) retourne Ga isGa.
Ca devrait pas retourné Ga is Ga car il veux alterné une lettres sur deux et non un char sur deux =)
0
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
4 janv. 2007 à 18:55
Ma derniere ligne plus comprehensible :
Ca devrait pas retourné Ga is Ga ? car il veux alterné une lettres sur deux et non un char sur deux =)
0
cs_PaTaTe Messages postés 2126 Date d'inscription mercredi 21 août 2002 Statut Contributeur Dernière intervention 19 février 2021 2
4 janv. 2007 à 19:30
wims > c'est vrai, moi qui devellope rarement dans ce language, je suis un peu paumé la :)

Tu aurais une solution avec une lttre sur 2 (et non un caractere sur 2 comme indiqué) ?

[PaTaTe]
0
Panthouffle Messages postés 281 Date d'inscription jeudi 21 juillet 2005 Statut Membre Dernière intervention 14 avril 2008
4 janv. 2007 à 21:13
pour les sockets j'm'y connais pas donc ça reste à voir mais pour les boucles wims la déjà dit , /help while !
bon la j'avoue c'est vraiment pas fameux :))

alias b {

  var %l 1, %c 1, %text

  while (%l <= $len($1-)) {

    var %m = $mid($1-,%l,1)

    if (%m != $chr(32)) {

      if ($calc(%c % 2) 1) { %text $+(%text,$chr(2),%m,$chr(2)) }

      else { %text = %text $+ %m }

      inc %c

    }

    else { %text = %text $+ $chr(160) }

    inc %l

  }

  return %text

}


alias text var %a bonjour tout le monde je test mon truc pour le gras alterné :) | return $b(%a)


bon là vivement les regex !
0
Panthouffle Messages postés 281 Date d'inscription jeudi 21 juillet 2005 Statut Membre Dernière intervention 14 avril 2008
4 janv. 2007 à 21:13
pour les regex* pardon j'ai le mot socket en tête xD
0
cs_PaTaTe Messages postés 2126 Date d'inscription mercredi 21 août 2002 Statut Contributeur Dernière intervention 19 février 2021 2
5 janv. 2007 à 14:31
Ca n'a pas l'air de fonctionner :s

[PaTaTe]
0
cs_TropNul Messages postés 340 Date d'inscription dimanche 18 septembre 2005 Statut Membre Dernière intervention 22 octobre 2009
5 janv. 2007 à 17:16
petit oubli , mais nécessaire.

Les / / entourant le modèle sont des délimiteurs pour être sure d'être dans un modèle. le g est une "option" qu'on active lors de l'éxécution de la bète lol.

Ce g , correspond à global et il va faire en sorte de rebalayer la chaîne sans arrêt tant qu'il n'est pas arrivé à la fin de cette dernière.

En effet, pour une expression rationnelle, si on ne lui précise pas de rebalayer, dès la première fois que le modèle est vérifié, il s'arrête. ce qui est très utile lorsque l'on veut faire que vérifié mais très balot si on veut faire des subsitutions partout :o).

voilou



TropNul
0
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
5 janv. 2007 à 18:11
Lol belle explication mais c'est expression reguliere non ? ou on dit les deux ?

Un ptit truc : "Explication: S'il trouve 2 caractères se suivant et qui ne sont pas des espaces, procéder à la substitution !"

Ce n'est pas comme ca qu'il faut voir les choses j'pense, il faudrait que le regex alterne du gras un char sur deux sauf sur un espace.
Apparament tu peux exclure les espaces avec [^[:space:]]
ensuite suffit de lui dire d'alterné, c'est pas possible ?
0
cs_PaTaTe Messages postés 2126 Date d'inscription mercredi 21 août 2002 Statut Contributeur Dernière intervention 19 février 2021 2
5 janv. 2007 à 18:14
Pourquoi n'ai-je aucun retour quand je teste ?

[PaTaTe]
0
cs_PaTaTe Messages postés 2126 Date d'inscription mercredi 21 août 2002 Statut Contributeur Dernière intervention 19 février 2021 2
5 janv. 2007 à 18:55
Merci ... En fait 'avis fais une erreur de frappe en utilisant le code :)

Merci à tous :)

[PaTaTe]
0
cs_TropNul Messages postés 340 Date d'inscription dimanche 18 septembre 2005 Statut Membre Dernière intervention 22 octobre 2009
5 janv. 2007 à 21:24
Areuh² ^^

L'anglicisme des Expressions Rationnelles est " Regular Expressions " et au fil du temps, beaucoup ont traduits littéralement par " Expressions Régulières " alors que ça n'a pas vraiment de sens de traduire " Regular " par " Régulière " dans ce cas précis. Mais ce terme est tellement répandu, qu'il est admissible :)



TropNul
0
cs_TropNul Messages postés 340 Date d'inscription dimanche 18 septembre 2005 Statut Membre Dernière intervention 22 octobre 2009
5 janv. 2007 à 22:35
Grâce à toi Wims, j'ai tout repensé et j'ai trouvé !
\o/
Je ne sais pas s'il est plus lent ou plus rapide que ton alias Panthouffle, mais il fonctionne ^^.

Je ne vais pas réexpliqué les regex mais je vais quand même commenté.

ALIAS BUB {
  ; Déclaration des variables  VAR %V 0 ,%W , %X , %Y , %Z , %R /(.)(.)/g , %S = /(.)/g
  ; Boucle sur chaque mot
  WHILE $regex(GtWrd,$1-,/([^[:space:]]+)/i) {
    ; Récupération du mot
    %W = $regml(GtWrd,1)
    ; Si le mot est de taille impair    IF ($calc($len(%W) % 2) 1) { %X $iif((%V == 0),$regsub(%W,%S,$+($chr(2),\1,$chr(2),$chr(2)),%Y),$regsub(%W,%S,$+(\1,$chr(2),\2,$chr(2)),%Y)) }
    ; Cas ou le mot est de taille paire    ELSE { %X $iif((%V 0),$regsub(%W,%R,$+($chr(2),\1,$chr(2),\2),%Y),$regsub(%W,%R,$+(\1,$chr(2),\2,$chr(2)),%Y)) }
    %Z = %Z $+ $chr(32) $+ %Y
    ; Je tokenize sur $2- pour ne pas reboucler à chaque fois sur la phrase entière mais sur (LaPhrase - lePremierMot)
    TOKENIZE 32 $2-
  }
  RETURN %Z
}

/*
La variable %V est utilisée dans tout l'alias pour vérifier le 'sens' de la substitution. En effet, là ou je bloquais, était le cas ou ça tombe sur un mot de taille impair. il est évident que la dernière lettre sera en gras, et ainsi pour les prochains mots, faudra faire en sorte de mettre du NonGras puis du Gras au lieu de mettre du Gras puis du NonGras.
*/

Voilou :)

Ce fût dur mais bon. Il doit surement exister un moyen plus rapide de faire cela toujours avec les regex.

Vous avez maintenant le choix. (faites des bench par exemple, chui creuvé X_x, fini de réfléchir pour aujourd'hui)

:o)



TropNul
0
cs_PaTaTe Messages postés 2126 Date d'inscription mercredi 21 août 2002 Statut Contributeur Dernière intervention 19 février 2021 2
5 janv. 2007 à 22:47
Merci TropNul :)

[PaTaTe]
0
Panthouffle Messages postés 281 Date d'inscription jeudi 21 juillet 2005 Statut Membre Dernière intervention 14 avril 2008
5 janv. 2007 à 23:13
j'ai tester ton code Tropnul et il semble transformer seulement le premier mot, sinon un détail à ne pas oublier (dans les deux codes d'ailleurs), il faut absolument mettre le texte dans une variable avant de le transformer tout ça acause des caractère "(" et ")" xD
0
cs_TropNul Messages postés 340 Date d'inscription dimanche 18 septembre 2005 Statut Membre Dernière intervention 22 octobre 2009
5 janv. 2007 à 23:17
dr ;o)

(plus court. j'avais même pas vu que ça se faisait sans le %V mdr)

ALIAS BUB {  VAR %W , %X , %Y , %Z , %R /(.)(.)/g , %S /(.)/g
  WHILE $regex(GtWrd,$1-,/([^[:space:]]+)/i) {
    %W = $regml(GtWrd,1)    IF ($calc($len(%W) % 2) 1) { %X $regsub(%W,%S,$+($chr(2),\1,$chr(2),$chr(2)),%Y) }
    ELSE { %X = $regsub(%W,%R,$+($chr(2),\1,$chr(2),\2),%Y) }
    %Z = %Z $+ $chr(32) $+ %Y
    TOKENIZE 32 $2-
  }
  RETURN %Z
}
TropNul
0
Rejoignez-nous