"Update Char(13) by ""\r"""

Hi,

I try to update in all methods by replacement CHAR(13) by “\r”.
For that, I use the following pattern (and it doesn’t work at all :cry:):

<code 4D>
$pattern:="(?mi-s)(.)("+Command name(90)+"\(13\))(.)"
</code 4D>

Any idea?

Patrick

You can test your regex with tools like:
https://www.debuggex.com/
or
https://regexr.com/

Example in Regexr: http://regexr.com/3gt3q
in Debuggex: https://www.debuggex.com/r/0Cz0EVMRCU_4T6x4

Please have in mind Regexr is a bit limited regarding the regex flags, but you can test substitution too.

HTH
Lutz

Bonjour,

Si le soucis est de remplacer

<code 4D>
$a:=“test”+char(13)+“blabla”

</code 4D>
par

<code 4D>
$a:=“test”+"\r"+“blabla”

</code 4D>
cela ne sert à rien

En effet il faut faire :

<code 4D>
$a:=“test\rblabla”

</code 4D>
Et pour faire cela, le composant de Blue Company le fait de manière cohérente.

Cordialement,

Bonjour Olivier,

L’exemple que tu prends est le bon, mais vu que j’ai mon propre composant qui fait aussi pas mal de chose (et qui est gratuit), je suis en train d’essayer de l’implémenter.

Je souhaite donc remplacer les :
+char(13)+ par \r
:=char(13) par :="/r"

mais avant d’arriver à cela, il m’est nécessaire d’arriver à “capturer” la chaine “char(13)”.

Patrick

Hi Lutz,

I will have a look on all links.
Thanks

Bonjour,

Gratuit ou payant n’est pas le problème. En effet, si un produit qui coûte environ le salaire d’une journée homme d’un côté et qu’elle me fait gagner une dizaine de jour sur mon premier projet, pour moi le prix est quantité négligeable. Au deuxième projet, j’ai une aide totalement gratuite de fait.
J’ai personnellement écrit ces méthodes de remplacement il y a longtemps, mais je ne les utilise plus car je n’ai pas le temps nécessaire pour ré-inventer la roue d’une part, mais surtout d’autre part je n’ai pas le recul nécessaire pour envisager tous les cas possible.
Par exemple vous dites :
:=char(13) par :="/r"
Ce n’est pas bon, ou plus exactement ce n’est pas suffisant. Tout dépend si il y a quelque chose après le char(13). Si c’est + variable, c’est ok. Si c’est + chaine, alors il faut fondre les chaines. Si c’est un retour chariot, alors il faut déduire que c’est une affectation simple et li faut remplacer les usages de la variable elle même par \r
En effet, ce qui est problématique ce n’est pas Char(13) en lui même, mais la concaténation de chaine.
Donc le problème est bien plus compliqué et ce n’est pas une simple regex qui va résoudre le soucis. Et pour résoudre cela, je suis heureux de payer un composant qui fait le job.

“If it’s free, you’re the product”

Cordialement,

Effectivement gratuit ou payant n’est pas le problème, ni même la question.
Je n’ai rien contre ce qui est payant, mais vu que j’ai déjà mon composant me fait pas mal de choses que le composant que tu cites, ainsi que d’autres choses, je préfère le faire faire par mon code.

Les exemples que j’ai fournis ne sont que des exemples et ne correspondent pas tous les cas que je souhaite traiter.

Encore une fois, j’ai une idée de ce que je veux faire au travers d’un Regex, c’est bien pour cela que j’ai posté dans le forum idoine.

Donc, si quelqu’un peut me mettre sur la voie :pray: :pray:

Voici ma contribution :

Code :
“(?m-si)”\+Char\((?:13|Carriage return)\)\+""

ce qui donne en remplaçant par “\r”

[]21050483;“Your comment here…”[/]

Il n’y a plus qu’à ajouter la localisation…

Merci Vincent,

je regarde cela.

Patrick

Bonjour Patrick,
je te le fais “en déroulé”, comme je l’ai testé (textEdit ou BBEdit sur mac, notepad++ sur pécé) :

^\w(13)”

  • [^\w] = pas un mot
  • (Char|Caract[èe]re) = Char ou Caractère (*)
  • (13) = 13 entre parenthèses

on ajoute la capture de Tab et LF (9 et 10)
^\w((10|9|13))

après, tu peux aussi ajouter les constantes Retour chariot, Tabulation, Retour à la ligne… qu’il va te falloir traduire :-/
(remarque : 4D n’est ni ancien ni moderne mais les deux pour l’orthographe de “Chariot” - orthographe réformée de 1990)
[]21049694;“Your comment here…”[/]

tu as peut-être intérêt à dissocier car la regex-qui-fait-tout, on y parvient quand on a la tête dans le guidon mais elle fait mal quand on doit y revenir. Comme dissociation possible, 1/ chercher la commande et capturer le contenu des parenthèses, 2/ examiner ce contenu.

(*) le langage fr agonise, mais ses soubresauts sont redoutables : des accents dans des commandes de langage, non mais j’vous jure…

Bonjour Arnaud,

Effectivement, cela m’aide aussi dans ce que je souhaite faire car Char(13) n’était que le début :wink:

Mon pattern devient alors internationnal avec (suis en US language): “[^\w](”+command name(90)+")((10|9|13))"

Mais je suis de ton avis de décomposer par type de constante, car le truc qui fait tout en un coup est un peu indigeste à la reprise (et à l’écriture).
Je préfère le faire molo-molo, mais surement.

Bien à toi

Patrick

Pistes pour les constantes…
trouver les valeurs :
http://forums.4d.com/Post/FR/17961130/1/17961209#17961209
les convertir :
<code 4D>
//K4D_textGet (ID_t) -> txt
//retourne le libellé d’une constante 4D d’après son ID
//l’ID est constitué de :
// numéro du groupe+underscore+numéro dans groupe
//exemple : groupe 51, trans-unit 2 = “51_2”
//note : on peut aussi extraire la valeur :
// $tag_t:=""
// TRAITER BALISES 4D($tag_t;$txt_t)
// $txt = “1”
C_TEXTE($0)
C_TEXTE($1)

C_TEXTE($in_t)
C_TEXTE($langue_t)
C_TEXTE($out_t)
C_TEXTE($path_t)
C_TEXTE($ref_t)
C_TEXTE($refElem_t)

Si (Faux)
C_TEXTE(K4D_textGet ;$0)
C_TEXTE(K4D_textGet ;$1)
Fin de si //_
//_
$out_t:=""
$in_t:=$1
Si (Nom commande(1)=“Sum”)
$langue_t:=“en”
Sinon
$langue_t:=“fr”
Fin de si

$path_t:=Fichier application+
Séparateur dossier+
“Contents”+
Séparateur dossier+
“Resources”+
Séparateur dossier+
$langue_t+".lproj"+
Séparateur dossier+
“4D_Constants”+$langue_t+".xlf"

Si (Tester chemin acces($path_t)=Est un document)
$ref_t:=DOM Analyser source XML($path_t)
Si (ok=1)
//$Xpath_t:=“xliff/file/body/group/trans-unit/”
$refElem_t:=DOM Chercher element XML par ID($ref_t;$in_t)
Si (ok=1)
$refElem_t:=DOM Lire element XML($refElem_t;“target”;1;$out_t)
$0:=$out_t
Fin de si
DOM FERMER XML($ref_t)
Fin de si
Fin de si
//_
</code 4D>
Test, éditeur de code, saisir :K51:2 et retour. Avec 4D, tu peux en foutre plein la vue à un cador du terminal.

Merci.
J’utilise aussi le même mécanisme pour obtenir la liste des commandes :wink:

Pour les commandes, http://forums.4d.com/Post/FR/16080071/3/16455667#16455667une boucle suffit>… sauf si tu veux les avoir dans d’autres parfums que l’hôte : pour ce que je pensais être mon petit module de conversion, j’avais dû me taper de produire des fichiers csv des commandes, des constantes, de la v11 à la v14, en fr et en us. Ça finit par faire du boulot et du monde. Et j’ai laissé tomber les plugins.

N’empêche, ça converti vachement mieux que 4DBB.

Ceci étant dit, mon module de traduction fonctionne pas si mal que cela avec les commandes de 4D. Par contre, j’ai pris le parti de ne pas m’attaquer aux plug-in.
Peut-être plus tard.

Bonjour,

Voici un exemple de regex

<code 4D>
C_TEXTE($vt_pattern;$vt_text)

$vt_text:="$vt_chaine:=caractère(9)+caractère(13)+caractère(10)+caractère(39)"
$vt_pattern:="(?mi-s)("+Nom commande(90)+"\((9|10|13|39)\))"

Si (Longueur($vt_text)>0)
C_ENTIER LONG($vl_start)
$vl_start:=1

TABLEAU ENTIER LONG($tl_pos;0)
TABLEAU ENTIER LONG($tl_len;0)

C_ENTIER LONG($vl_ascii)
C_TEXTE($vt_expression)
Tant que (Trouver regex($vt_pattern;$vt_text;$vl_start;$tl_pos;$tl_len))
$vt_expression:=Sous chaîne($vt_text;$tl_pos{1};$tl_len{1})
$vl_ascii:=Num(Sous chaîne($vt_text;$tl_pos{2};$tl_len{2}))
Au cas ou
: ($vl_ascii=9)
$vt_litteral:="\t"

: ($vl_ascii=10)
$vt_litteral:="\n"

: ($vl_ascii=13)
$vt_litteral:="\r"

: ($vl_ascii=39)
$vt_litteral:="\"+"""
Fin de cas
$vt_litteral:="""+$vt_litteral+"""
//ALERTE($vt_litteral)

$vt_text:=Supprimer chaîne($vt_text;$tl_pos{1};$tl_len{1})
$vt_text:=Insérer chaîne($vt_text;$vt_litteral;$tl_pos{1})

$vl_start:=$tl_pos{1}+Longueur($vt_litteral)
Fin tant que
Fin de si
ALERTE($vt_text)

</code 4D>

Merci Bruno.